1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
# frozen_string_literal: true
module Slim
module Smart
# Perform smart entity escaping in the
# expressions `[:slim, :text, type, Expression]`.
#
# @api private
class Escaper < ::Slim::Filter
define_options smart_text_escaping: true
def call(exp)
if options[:smart_text_escaping]
super
else
exp
end
end
def on_slim_text(type, content)
[:escape, type != :verbatim, [:slim, :text, type, compile(content)]]
end
def on_static(string)
# Prevent obvious &foo; and Ӓ and ÿ entities from escaping.
block = [:multi]
until string.empty?
case string
when /\A&([a-z][a-z0-9]*|#x[0-9a-f]+|#\d+);/i
# Entity.
block << [:escape, false, [:static, $&]]
string = $'
when /\A&?[^&]*/
# Other text.
block << [:static, $&]
string = $'
end
end
block
end
end
end
end
|