class BetterHtml::Tokenizer::BaseErb

Constants

EXPR_TRIM_MATCHER
REGEXP_WITHOUT_TRIM
STMT_TRIM_MATCHER

Attributes

current_position[R]
tokens[R]

Public Class Methods

new(buffer) click to toggle source
Calls superclass method
# File lib/better_html/tokenizer/base_erb.rb, line 16
def initialize(buffer)
  raise ArgumentError, 'first argument must be Parser::Source::Buffer' unless buffer.is_a?(::Parser::Source::Buffer)
  @buffer = buffer
  @tokens = []
  @current_position = 0
  super(buffer.source, regexp: REGEXP_WITHOUT_TRIM, trim: false)
end

Private Instance Methods

add_code(code) click to toggle source
# File lib/better_html/tokenizer/base_erb.rb, line 30
def add_code(code)
  if code[0] == '%'
    add_erb_tokens(nil, '%', code[1..-1], nil)
    append("<%#{code}%>")
  else
    _, ltrim_or_comment, code, rtrim = *STMT_TRIM_MATCHER.match(code)
    ltrim = ltrim_or_comment if ltrim_or_comment == '-'
    indicator = ltrim_or_comment if ltrim_or_comment == '#'
    add_erb_tokens(ltrim, indicator, code, rtrim)
    append("<%#{ltrim}#{indicator}#{code}#{rtrim}%>")
  end
end
add_erb_tokens(ltrim, indicator, code, rtrim) click to toggle source
# File lib/better_html/tokenizer/base_erb.rb, line 49
def add_erb_tokens(ltrim, indicator, code, rtrim)
  pos = current_position

  add_token(:erb_begin, pos, pos + 2)
  pos += 2

  if ltrim
    add_token(:trim, pos, pos + ltrim.length)
    pos += ltrim.length
  end

  if indicator
    add_token(:indicator, pos, pos + indicator.length)
    pos += indicator.length
  end

  add_token(:code, pos, pos + code.length)
  pos += code.length

  if rtrim
    token = add_token(:trim, pos, pos + rtrim.length)
    pos += rtrim.length
  end

  add_token(:erb_end, pos, pos + 2)
end
add_expression(indicator, code) click to toggle source
# File lib/better_html/tokenizer/base_erb.rb, line 43
def add_expression(indicator, code)
  _, code, rtrim = *EXPR_TRIM_MATCHER.match(code)
  add_erb_tokens(nil, indicator, code, rtrim)
  append("<%#{indicator}#{code}#{rtrim}%>")
end
add_token(type, begin_pos, end_pos) click to toggle source
# File lib/better_html/tokenizer/base_erb.rb, line 76
def add_token(type, begin_pos, end_pos)
  token = Token.new(
    type: type,
    loc: Location.new(@buffer, begin_pos, end_pos)
  )
  @tokens << token
  token
end
append(text) click to toggle source
# File lib/better_html/tokenizer/base_erb.rb, line 26
def append(text)
  @current_position += text.length
end