Class: SlimLint::Filters::Interpolation Private
- Inherits:
-
SlimLint::Filter
- Object
- Temple::HTML::Filter
- SlimLint::Filter
- SlimLint::Filters::Interpolation
- Defined in:
- lib/slim_lint/filters/interpolation.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Alternative implementation of Slim::Interpolation that operates without destroying the Sexp position data.
Instance Method Summary collapse
-
#on_slim_interpolate(string) ⇒ Array
private
Handle interpolate expression ‘[:slim, :interpolate, string]`.
Methods included from SlimLint::Filter::Overrides
#on_escape, #on_html_attr, #on_html_attrs, #on_html_comment, #on_html_condcomment, #on_html_js, #on_html_tag, #on_multi, #on_slim_control, #on_slim_embedded, #on_slim_output, #on_slim_text
Instance Method Details
#on_slim_interpolate(string) ⇒ Array
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Handle interpolate expression ‘[:slim, :interpolate, string]`
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/slim_lint/filters/interpolation.rb', line 12 def on_slim_interpolate(string) # Interpolate variables in text (#{variable}). # Split the text into multiple dynamic and static parts. block = Sexp.new(:multi, start: @self.start, finish: @self.finish) line, column = string.start string = string.to_s loop do case string when /\A\\#\{/ # Escaped interpolation block << Sexp.new(:static, '#{', start: [line, column], finish: [line, (column += 2)]) string = $' when /\A#\{((?>[^{}]|(\{(?>[^{}]|\g<1>)*\}))*)\}/ # Interpolation _, string, code = $&, $', $1 escape = code !~ /\A\{.*\}\Z/ column += 2 unless escape code = code[1..-2] column += 1 end start = [line, column] finish = [line, column + code.size] block << Sexp.new( :slim, :output, escape, Sexp.new( :multi, Sexp.new(:interpolated, code, start: start, finish: finish), start: start, finish: finish ), Sexp.new(:multi, start: start, finish: finish), start: start, finish: finish ) column += code.size + 1 column += 1 unless escape when /\A([#\\]?[^#\\]*([#\\][^\\{#][^#\\]*)*)/ # Static text text, string = $&, $' text_lines = text.count("\n") block << Sexp.new(:static, text, start: [line, column], finish: [(line + text_lines), (text_lines == 0 ? column + text.size : 1)]) line += text_lines column = (text_lines == 0 ? column + text.size : 1) end break if string.empty? end block end |