class Slimi::Filters::Interpolation

Public Instance Methods

on_slimi_interpolate(begin_, _end_, string) click to toggle source

@param [Integer] begin_ @param [Integer] end_ @return [Array] S-expression.

# File lib/slimi/filters/interpolation.rb, line 11
def on_slimi_interpolate(begin_, _end_, string)
  block = [:multi]
  scanner = ::StringScanner.new(string)
  until scanner.eos?
    charpos = scanner.charpos
    if (value = scanner.scan(/\\#\{/))
      block << [:static, value]
    elsif scanner.scan(/#\{((?>[^{}]|(\{(?>[^{}]|\g<1>)*\}))*)\}/)
      code = scanner[1]
      begin2 = begin_ + charpos + 2
      if code.start_with?('{') && code.end_with?('}')
        escape = true
        code = code[1..-2]
        begin2 -= 1
      else
        escape = false
      end
      block << [:slimi, :position, begin2, begin2 + code.length, [:slimi, :output, escape, code, [:multi]]]
    elsif (value = scanner.scan(/([#\\]?[^#\\]*([#\\][^\\\#{][^#\\]*)*)/)) # rubocop:disable Lint/DuplicateBranch
      block << [:static, value]
    end
  end
  block
end