Module: Erubis::InterpolationEnhancer

Included in:
FastEruby, InterpolationEruby
Defined in:
lib/erubis/enhancer.rb

Overview

convert “<h1><%=title%></h1>” into “_buf << %Q`<h1>#title</h1>‘”

this is only for Eruby.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.descObject

:nodoc:



594
595
596
# File 'lib/erubis/enhancer.rb', line 594

def self.desc   # :nodoc:
  "convert '<p><%=text%></p>' into '_buf << %Q`<p>\#{text}</p>`'"
end

Instance Method Details

#_add_text_to_str(str, text) ⇒ Object



664
665
666
667
668
# File 'lib/erubis/enhancer.rb', line 664

def _add_text_to_str(str, text)
  return if !text || text.empty?
  text.gsub!(/['\#\\]/, '\\\\\&')
  str << text
end

#add_expr_escaped(str, code) ⇒ Object



670
671
672
# File 'lib/erubis/enhancer.rb', line 670

def add_expr_escaped(str, code)
  str << "\#{#{escaped_expr(code)}}"
end

#add_expr_literal(str, code) ⇒ Object



674
675
676
# File 'lib/erubis/enhancer.rb', line 674

def add_expr_literal(str, code)
  str << "\#{#{code}}"
end

#add_text(src, text) ⇒ Object



653
654
655
656
657
658
659
660
661
662
# File 'lib/erubis/enhancer.rb', line 653

def add_text(src, text)
  return if !text || text.empty?
  #src << " _buf << %Q`" << text << "`;"
  if text[-1] == ?\n
    text[-1] = "\\n"
    src << " _buf << %Q`" << text << "`\n"
  else
    src << " _buf << %Q`" << text << "`;"
  end
end

#convert_input(src, input) ⇒ Object



598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
# File 'lib/erubis/enhancer.rb', line 598

def convert_input(src, input)
  pat = @pattern
  regexp = pat.nil? || pat == '<% %>' ? Basic::Converter::DEFAULT_REGEXP : pattern_regexp(pat)
  pos = 0
  is_bol = true     # is beginning of line
  str = ''
  input.scan(regexp) do |indicator, code, tailch, rspace|
    match = Regexp.last_match()
    len  = match.begin(0) - pos
    text = input[pos, len]
    pos  = match.end(0)
    ch   = indicator ? indicator[0] : nil
    lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol)
    is_bol = rspace ? true : false
    _add_text_to_str(str, text)
    ## * when '<%= %>', do nothing
    ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
    if ch == ?=              # <%= %>
      rspace = nil if tailch && !tailch.empty?
      str << lspace if lspace
      add_expr(str, code, indicator)
      str << rspace if rspace
    elsif ch == ?\#          # <%# %>
      n = code.count("\n") + (rspace ? 1 : 0)
      if @trim && lspace && rspace
        add_text(src, str)
        str = ''
        add_stmt(src, "\n" * n)
      else
        str << lspace if lspace
        add_text(src, str)
        str = ''
        add_stmt(src, "\n" * n)
        str << rspace if rspace
      end
    else                     # <% %>
      if @trim && lspace && rspace
        add_text(src, str)
        str = ''
        add_stmt(src, "#{lspace}#{code}#{rspace}")
      else
        str << lspace if lspace
        add_text(src, str)
        str = ''
        add_stmt(src, code)
        str << rspace if rspace
      end
    end
  end
  #rest = $' || input                       # ruby1.8
  rest = pos == 0 ? input : input[pos..-1]  # ruby1.9
  _add_text_to_str(str, rest)
  add_text(src, str)
end