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:



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

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



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

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

#add_expr_escaped(str, code) ⇒ Object



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

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

#add_expr_literal(str, code) ⇒ Object



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

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

#add_text(src, text) ⇒ Object



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

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



597
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
# File 'lib/erubis/enhancer.rb', line 597

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