Sha256: b3ef3648664972c692a4a1dfa962cd54c777a73665e788eab38f078968e207a0

Contents?: true

Size: 1.17 KB

Versions: 67

Compression:

Stored size: 1.17 KB

Contents

require 'parslet'

module ExpressTemplates
  class Interpolator < Parslet::Parser
    rule(:lbrace)         { str('{{') }
    rule(:rbrace)         { str('}}') }
    rule(:delim)          { lbrace | rbrace }
    rule(:lpart)          { (lbrace.absnt? >> any).repeat.as(:lpart) }
    rule(:rpart)          { (rbrace.absnt? >> any).repeat.as(:rpart) }
    rule(:expression)     { (text_with_interpolations).as(:expression) }
    rule(:interpolation)  { (lbrace>>expression>>rbrace).as(:interpolation) }
    rule(:text)           { (delim.absnt? >> any).repeat(1) }
    rule(:text_with_interpolations) { (text.as(:text) | interpolation).repeat }
    root(:text_with_interpolations)

    def self.transform(s)
      begin
        Transformer.new.apply(new.parse(s)).flatten.join
      rescue Parslet::ParseFailed => failure
        puts s
        puts failure.cause.ascii_tree
        raise failure
      end
    end
  end

  class Transformer < Parslet::Transform
    rule(:interpolation => simple(:expression)) {
      '#{'+expression+'}'
    }
    rule(:expression => sequence(:exp))      do
      exp.map(&:to_s).join.gsub('\\"', '"')
    end
    rule(:text => simple(:s)) { s.to_s }
  end
end

Version data entries

67 entries across 67 versions & 2 rubygems

Version Path
express_templates-0.11.10 lib/express_templates/interpolator.rb
express_templates-0.11.9 lib/express_templates/interpolator.rb
express_templates-0.11.8 lib/express_templates/interpolator.rb
express_templates-0.11.7 lib/express_templates/interpolator.rb
express_templates-0.11.6 lib/express_templates/interpolator.rb
express_templates-0.11.5 lib/express_templates/interpolator.rb
express_templates-0.11.4 lib/express_templates/interpolator.rb
express_admin-1.7.5 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.7.4 vendor/gems/express_templates/express_templates/lib/express_templates/interpolator.rb
express_admin-1.7.3 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.7.2 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.7.1 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.13 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.12 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.11 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.10 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.9 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.8 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_admin-1.6.7 vendor/gems/express_templates/lib/express_templates/interpolator.rb
express_templates-0.11.3 lib/express_templates/interpolator.rb