Sha256: ae6685d7475bb93d59f843b3051fe466fdc3d9c8393929b5043fe9be413c17a0

Contents?: true

Size: 1.41 KB

Versions: 19

Compression:

Stored size: 1.41 KB

Contents

# Example that demonstrates how a simple erb-like parser could be constructed. 

$:.unshift File.dirname(__FILE__) + "/../lib"

require 'parslet'

class ErbParser < Parslet::Parser
  rule(:ruby) { (str('%>').absent? >> any).repeat.as(:ruby) }
  
  rule(:expression) { (str('=') >> ruby).as(:expression) }
  rule(:comment) { (str('#') >> ruby).as(:comment) }
  rule(:code) { ruby.as(:code) }
  rule(:erb) { expression | comment | code }
  
  rule(:erb_with_tags) { str('<%') >> erb >> str('%>') }
  rule(:text) { (str('<%').absent? >> any).repeat(1) }
  
  rule(:text_with_ruby) { (text.as(:text) | erb_with_tags).repeat.as(:text) }
  root(:text_with_ruby)
end

parser = ErbParser.new
p parser.parse "The value of x is <%= x %>."
p parser.parse "<% 1 + 2 %>"
p parser.parse "<%# commented %>"
 

evaluator = Parslet::Transform.new do
  
  erb_binding = binding
  
  rule(:code => { :ruby => simple(:ruby) }) { eval(ruby, erb_binding); '' }  
  rule(:expression => { :ruby => simple(:ruby) }) { eval(ruby, erb_binding) }
  rule(:comment => { :ruby => simple(:ruby) }) { '' }
  
  rule(:text => simple(:text)) { text }
  rule(:text => sequence(:texts)) { texts.join }
  
end

puts evaluator.apply(parser.parse(<<-ERB
The <% a = 2 %>not printed result of "a = 2".
The <%# a = 1 %>not printed non-evaluated comment "a = 1", see the value of a below.
The <%= 'nicely' %> printed result.
The <% b = 3 %>value of a is <%= a %>, and b is <%= b %>.
ERB
))

Version data entries

19 entries across 19 versions & 3 rubygems

Version Path
parslet-2.0.0 example/erb.rb
parslet-1.8.2 example/erb.rb
parslet-1.8.1 example/erb.rb
parslet-1.8.0 example/erb.rb
swift-pyrite-0.1.1 vendor/bundle/ruby/2.0.0/gems/parslet-1.7.1/example/erb.rb
swift-pyrite-0.1.0 vendor/bundle/ruby/2.0.0/gems/parslet-1.7.1/example/erb.rb
parslet-1.7.1 example/erb.rb
parslet-1.7.0 example/erb.rb
parslet-1.6.2 example/erb.rb
parslet-1.6.1 example/erb.rb
parslet-1.6.0 example/erb.rb
parslet-1.5.0 example/erb.rb
ghazel-parslet-1.4.0.2 example/erb.rb
ghazel-parslet-1.4.0.1 example/erb.rb
parslet-1.4.0 example/erb.rb
parslet-1.3.0 example/erb.rb
parslet-1.2.3 example/erb.rb
parslet-1.2.1 example/erb.rb
parslet-1.2.0 example/erb.rb