Class: StringTools::Sanitizer::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/string_tools.rb

Constant Summary collapse

TAGS_WITH_ATTRIBUTES =
{
  'p'     => %w(align style),
  'div'   => %w(align style),
  'span'  => %w(align style),
  'td'    => %w(align width valign colspan rowspan style),
  'th'    => %w(align width valign colspan rowspan style),
  'a'     => %w(href target name style),
  'table' => %w(cellpadding cellspacing width border align style),
  'img'   => %w(src width height style)
}
TAGS_WITHOUT_ATTRIBUTES =
%w(b strong i em sup sub ul ol li blockquote br tr u caption thead)

Instance Method Summary collapse

Instance Method Details

#sanitize(str, attr = {}) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/string_tools.rb', line 166

def sanitize(str, attr = {})
  # для корректного обрезания utf строчек режем через mb_chars
  # для защиты от перегрузки парсера пропускаем максимум 1 мегабайт текста
  # длина русского символа в utf-8 - 2 байта, 1Мб/2б = 524288 = 2**19 символов
  # длина по символам с перестраховкой, т.к. латинские символы(теги, например) занимают 1 байт
  str = str.mb_chars.slice(0..(2**19)).to_s

  attributes = TAGS_WITH_ATTRIBUTES

  # Мерджим добавочные теги и атрибуты
  attributes.merge!(attr)
  elements = attributes.keys | TAGS_WITHOUT_ATTRIBUTES

  transformers = [LINK_NORMALIZER]
  transformers << IframeNormalizer.new(attributes['iframe']) if attributes.key?('iframe')

  Sanitize.fragment(
    str,
    :attributes => attributes,
    :elements => elements,
    :css => {:properties => Sanitize::Config::RELAXED[:css][:properties]},
    :remove_contents => %w(style javascript),
    :allow_comments => false,
    :transformers => transformers
  )
end