hamlit 2.9.4 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +1 -1
- data/benchmark/dynamic_merger/benchmark.rb +25 -0
- data/benchmark/dynamic_merger/hello.haml +50 -0
- data/benchmark/dynamic_merger/hello.string +50 -0
- data/bin/bench +3 -3
- data/hamlit.gemspec +3 -1
- data/lib/hamlit/compiler/tag_compiler.rb +0 -4
- data/lib/hamlit/dynamic_merger.rb +67 -0
- data/lib/hamlit/engine.rb +5 -6
- data/lib/hamlit/filters/plain.rb +0 -3
- data/lib/hamlit/string_splitter.rb +9 -78
- data/lib/hamlit/template.rb +1 -1
- data/lib/hamlit/version.rb +1 -1
- metadata +36 -5
- data/lib/hamlit/hamlit.su +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: cc231a76a98c6d527ca80a30385e3161a207814e9e1d3abe593929910e222795
         | 
| 4 | 
            +
              data.tar.gz: 21a57103fa4f6ac2df5ff712a8c1e2bc6f799cb59ec06d39769518b251d60139
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 95b3596d2f44759d90c3c02065c0986cf107179513bf31a8bb1116d35064cf2049e2ad342c30b884e938fef1a2c228f11ce15c5f4350bb09143d5d19dcf753ff
         | 
| 7 | 
            +
              data.tar.gz: dd36a42a6aa53e8f2b3e45865d077dc459d91ec0388a784b3ed5e2420bcaebc3f9b6c01f020d3e68acc17a9e209e8e0f1ac7ab9915390717fbcba2348fdead16
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -4,6 +4,29 @@ All notable changes to this project will be documented in this file. This | |
| 4 4 | 
             
            project adheres to [Semantic Versioning](http://semver.org/). This change log is based upon
         | 
| 5 5 | 
             
            [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog).
         | 
| 6 6 |  | 
| 7 | 
            +
            ## [2.10.1](https://github.com/k0kubun/hamlit/compare/v2.10.0...v2.10.1) - 2019-11-28
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ### Added
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            - Register `Hamlit::Template` to Tilt as :hamlit as well, in addition to :haml
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ## [2.10.0](https://github.com/k0kubun/hamlit/compare/v2.9.5...v2.10.0) - 2019-09-15
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ### Added
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            - Optimize template rendering by string interpolation [#146](https://github.com/k0kubun/hamlit/issues/146)
         | 
| 18 | 
            +
              - Exploiting pre-allocation of string interpolation introduced in Ruby 2.5 [ruby/ruby#1626](https://github.com/ruby/ruby/pull/1626)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            ### Changed
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            - Require temple.gem >= 0.8.2
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            ## [2.9.5](https://github.com/k0kubun/hamlit/compare/v2.9.4...v2.9.5) - 2019-09-08
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ### Added
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            - Supported `:plain` filter in truffleruby
         | 
| 29 | 
            +
             | 
| 7 30 | 
             
            ## [2.9.4](https://github.com/k0kubun/hamlit/compare/v2.9.3...v2.9.4) - 2019-09-08
         | 
| 8 31 |  | 
| 9 32 | 
             
            ### Added
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -14,11 +14,11 @@ end | |
| 14 14 |  | 
| 15 15 | 
             
            gem 'benchmark-ips', '2.3.0'
         | 
| 16 16 | 
             
            gem 'maxitest'
         | 
| 17 | 
            +
            gem 'pry'
         | 
| 17 18 |  | 
| 18 19 | 
             
            if /java/ === RUBY_PLATFORM # JRuby
         | 
| 19 20 | 
             
              gem 'pandoc-ruby'
         | 
| 20 21 | 
             
            else
         | 
| 21 | 
            -
              gem 'pry-byebug'
         | 
| 22 22 | 
             
              gem 'redcarpet'
         | 
| 23 23 |  | 
| 24 24 | 
             
              if RUBY_PLATFORM !~ /mswin|mingw/ && RUBY_ENGINE != 'truffleruby'
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            # Original: https://github.com/amatsuda/string_template/blob/master/benchmark.rb
         | 
| 2 | 
            +
            require 'benchmark_driver'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            Benchmark.driver(repeat_count: 8) do |x|
         | 
| 5 | 
            +
              x.prelude %{
         | 
| 6 | 
            +
                require 'rails'
         | 
| 7 | 
            +
                require 'action_view'
         | 
| 8 | 
            +
                require 'string_template'
         | 
| 9 | 
            +
                StringTemplate::Railtie.run_initializers
         | 
| 10 | 
            +
                require 'hamlit'
         | 
| 11 | 
            +
                Hamlit::Railtie.run_initializers
         | 
| 12 | 
            +
                Hamlit::RailsTemplate.set_options(escape_html: false, generator: Temple::Generators::ArrayBuffer)
         | 
| 13 | 
            +
                require 'action_view/base'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                (view = Class.new(ActionView::Base).new(ActionView::LookupContext.new(''))).instance_variable_set(:@world, 'world!')
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # compile template
         | 
| 18 | 
            +
                hello = 'benchmark/dynamic_merger/hello'
         | 
| 19 | 
            +
                view.render(template: hello, handlers: 'string')
         | 
| 20 | 
            +
                view.render(template: hello, handlers: 'haml')
         | 
| 21 | 
            +
              }
         | 
| 22 | 
            +
              x.report 'string', %{ view.render(template: hello, handlers: 'string') }
         | 
| 23 | 
            +
              x.report 'hamlit', %{ view.render(template: hello, handlers: 'haml') }
         | 
| 24 | 
            +
              x.loop_count 100_000
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            hello, #{ @world }
         | 
| 2 | 
            +
            hello, #{ @world }
         | 
| 3 | 
            +
            hello, #{ @world }
         | 
| 4 | 
            +
            hello, #{ @world }
         | 
| 5 | 
            +
            hello, #{ @world }
         | 
| 6 | 
            +
            hello, #{ @world }
         | 
| 7 | 
            +
            hello, #{ @world }
         | 
| 8 | 
            +
            hello, #{ @world }
         | 
| 9 | 
            +
            hello, #{ @world }
         | 
| 10 | 
            +
            hello, #{ @world }
         | 
| 11 | 
            +
            hello, #{ @world }
         | 
| 12 | 
            +
            hello, #{ @world }
         | 
| 13 | 
            +
            hello, #{ @world }
         | 
| 14 | 
            +
            hello, #{ @world }
         | 
| 15 | 
            +
            hello, #{ @world }
         | 
| 16 | 
            +
            hello, #{ @world }
         | 
| 17 | 
            +
            hello, #{ @world }
         | 
| 18 | 
            +
            hello, #{ @world }
         | 
| 19 | 
            +
            hello, #{ @world }
         | 
| 20 | 
            +
            hello, #{ @world }
         | 
| 21 | 
            +
            hello, #{ @world }
         | 
| 22 | 
            +
            hello, #{ @world }
         | 
| 23 | 
            +
            hello, #{ @world }
         | 
| 24 | 
            +
            hello, #{ @world }
         | 
| 25 | 
            +
            hello, #{ @world }
         | 
| 26 | 
            +
            hello, #{ @world }
         | 
| 27 | 
            +
            hello, #{ @world }
         | 
| 28 | 
            +
            hello, #{ @world }
         | 
| 29 | 
            +
            hello, #{ @world }
         | 
| 30 | 
            +
            hello, #{ @world }
         | 
| 31 | 
            +
            hello, #{ @world }
         | 
| 32 | 
            +
            hello, #{ @world }
         | 
| 33 | 
            +
            hello, #{ @world }
         | 
| 34 | 
            +
            hello, #{ @world }
         | 
| 35 | 
            +
            hello, #{ @world }
         | 
| 36 | 
            +
            hello, #{ @world }
         | 
| 37 | 
            +
            hello, #{ @world }
         | 
| 38 | 
            +
            hello, #{ @world }
         | 
| 39 | 
            +
            hello, #{ @world }
         | 
| 40 | 
            +
            hello, #{ @world }
         | 
| 41 | 
            +
            hello, #{ @world }
         | 
| 42 | 
            +
            hello, #{ @world }
         | 
| 43 | 
            +
            hello, #{ @world }
         | 
| 44 | 
            +
            hello, #{ @world }
         | 
| 45 | 
            +
            hello, #{ @world }
         | 
| 46 | 
            +
            hello, #{ @world }
         | 
| 47 | 
            +
            hello, #{ @world }
         | 
| 48 | 
            +
            hello, #{ @world }
         | 
| 49 | 
            +
            hello, #{ @world }
         | 
| 50 | 
            +
            hello, #{ @world }
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            hello, #{ @world }
         | 
| 2 | 
            +
            hello, #{ @world }
         | 
| 3 | 
            +
            hello, #{ @world }
         | 
| 4 | 
            +
            hello, #{ @world }
         | 
| 5 | 
            +
            hello, #{ @world }
         | 
| 6 | 
            +
            hello, #{ @world }
         | 
| 7 | 
            +
            hello, #{ @world }
         | 
| 8 | 
            +
            hello, #{ @world }
         | 
| 9 | 
            +
            hello, #{ @world }
         | 
| 10 | 
            +
            hello, #{ @world }
         | 
| 11 | 
            +
            hello, #{ @world }
         | 
| 12 | 
            +
            hello, #{ @world }
         | 
| 13 | 
            +
            hello, #{ @world }
         | 
| 14 | 
            +
            hello, #{ @world }
         | 
| 15 | 
            +
            hello, #{ @world }
         | 
| 16 | 
            +
            hello, #{ @world }
         | 
| 17 | 
            +
            hello, #{ @world }
         | 
| 18 | 
            +
            hello, #{ @world }
         | 
| 19 | 
            +
            hello, #{ @world }
         | 
| 20 | 
            +
            hello, #{ @world }
         | 
| 21 | 
            +
            hello, #{ @world }
         | 
| 22 | 
            +
            hello, #{ @world }
         | 
| 23 | 
            +
            hello, #{ @world }
         | 
| 24 | 
            +
            hello, #{ @world }
         | 
| 25 | 
            +
            hello, #{ @world }
         | 
| 26 | 
            +
            hello, #{ @world }
         | 
| 27 | 
            +
            hello, #{ @world }
         | 
| 28 | 
            +
            hello, #{ @world }
         | 
| 29 | 
            +
            hello, #{ @world }
         | 
| 30 | 
            +
            hello, #{ @world }
         | 
| 31 | 
            +
            hello, #{ @world }
         | 
| 32 | 
            +
            hello, #{ @world }
         | 
| 33 | 
            +
            hello, #{ @world }
         | 
| 34 | 
            +
            hello, #{ @world }
         | 
| 35 | 
            +
            hello, #{ @world }
         | 
| 36 | 
            +
            hello, #{ @world }
         | 
| 37 | 
            +
            hello, #{ @world }
         | 
| 38 | 
            +
            hello, #{ @world }
         | 
| 39 | 
            +
            hello, #{ @world }
         | 
| 40 | 
            +
            hello, #{ @world }
         | 
| 41 | 
            +
            hello, #{ @world }
         | 
| 42 | 
            +
            hello, #{ @world }
         | 
| 43 | 
            +
            hello, #{ @world }
         | 
| 44 | 
            +
            hello, #{ @world }
         | 
| 45 | 
            +
            hello, #{ @world }
         | 
| 46 | 
            +
            hello, #{ @world }
         | 
| 47 | 
            +
            hello, #{ @world }
         | 
| 48 | 
            +
            hello, #{ @world }
         | 
| 49 | 
            +
            hello, #{ @world }
         | 
| 50 | 
            +
            hello, #{ @world }
         | 
    
        data/bin/bench
    CHANGED
    
    | @@ -25,7 +25,7 @@ class Bench < Thor | |
| 25 25 | 
             
                haml = File.read(file)
         | 
| 26 26 |  | 
| 27 27 | 
             
                Benchmark.ips do |x|
         | 
| 28 | 
            -
                  x.report("haml v#{Haml::VERSION}") { Haml::Engine.new(haml, escape_html: true, escape_attrs: true | 
| 28 | 
            +
                  x.report("haml v#{Haml::VERSION}") { Haml::Engine.new(haml, escape_html: true, escape_attrs: true).precompiled }
         | 
| 29 29 | 
             
                  x.report("faml v#{Faml::VERSION}") { Faml::Engine.new.call(haml) }
         | 
| 30 30 | 
             
                  x.report("hamlit v#{Hamlit::VERSION}") { Hamlit::Engine.new.call(haml) }
         | 
| 31 31 | 
             
                  x.compare!
         | 
| @@ -43,7 +43,7 @@ class Bench < Thor | |
| 43 43 | 
             
                  object.instance_eval(File.read(ruby_file))
         | 
| 44 44 | 
             
                end
         | 
| 45 45 |  | 
| 46 | 
            -
                Haml::Engine.new(haml, escape_html: true, escape_attrs: true | 
| 46 | 
            +
                Haml::Engine.new(haml, escape_html: true, escape_attrs: true).def_method(object, :haml)
         | 
| 47 47 | 
             
                object.instance_eval "def faml; #{Faml::Engine.new.call(haml)}; end"
         | 
| 48 48 | 
             
                object.instance_eval "def hamlit; #{Hamlit::Engine.new.call(haml)}; end"
         | 
| 49 49 |  | 
| @@ -59,7 +59,7 @@ class Bench < Thor | |
| 59 59 | 
             
              def code(file)
         | 
| 60 60 | 
             
                haml = File.read(file)
         | 
| 61 61 | 
             
                puts "#{?= * 49}\n Haml Source: #{file}\n#{?= * 49}"
         | 
| 62 | 
            -
                puts Haml::Engine.new(haml, escape_html: true, escape_attrs: true | 
| 62 | 
            +
                puts Haml::Engine.new(haml, escape_html: true, escape_attrs: true).precompiled
         | 
| 63 63 | 
             
                puts "\n#{?= * 49}\n Faml Source: #{file}\n#{?= * 49}"
         | 
| 64 64 | 
             
                puts Faml::Engine.new.call(haml)
         | 
| 65 65 | 
             
                puts "\n#{?= * 49}\n Hamlit Source: #{file}\n#{?= * 49}"
         | 
    
        data/hamlit.gemspec
    CHANGED
    
    | @@ -26,10 +26,11 @@ Gem::Specification.new do |spec| | |
| 26 26 | 
             
                spec.required_ruby_version = '>= 2.1.0'
         | 
| 27 27 | 
             
              end
         | 
| 28 28 |  | 
| 29 | 
            -
              spec.add_dependency 'temple', '>= 0.8. | 
| 29 | 
            +
              spec.add_dependency 'temple', '>= 0.8.2'
         | 
| 30 30 | 
             
              spec.add_dependency 'thor'
         | 
| 31 31 | 
             
              spec.add_dependency 'tilt'
         | 
| 32 32 |  | 
| 33 | 
            +
              spec.add_development_dependency 'benchmark_driver'
         | 
| 33 34 | 
             
              spec.add_development_dependency 'bundler'
         | 
| 34 35 | 
             
              spec.add_development_dependency 'coffee-script'
         | 
| 35 36 | 
             
              spec.add_development_dependency 'erubi'
         | 
| @@ -41,5 +42,6 @@ Gem::Specification.new do |spec| | |
| 41 42 | 
             
              spec.add_development_dependency 'rake-compiler'
         | 
| 42 43 | 
             
              spec.add_development_dependency 'sass'
         | 
| 43 44 | 
             
              spec.add_development_dependency 'slim'
         | 
| 45 | 
            +
              spec.add_development_dependency 'string_template'
         | 
| 44 46 | 
             
              spec.add_development_dependency 'unindent'
         | 
| 45 47 | 
             
            end
         | 
| @@ -55,10 +55,6 @@ module Hamlit | |
| 55 55 |  | 
| 56 56 | 
             
                  # We should handle interpolation here to escape only interpolated values.
         | 
| 57 57 | 
             
                  def compile_interpolated_plain(node)
         | 
| 58 | 
            -
                    unless Ripper.respond_to?(:lex) # No Ripper.lex in truffleruby
         | 
| 59 | 
            -
                      return [:multi, [:escape, node.value[:escape_interpolation], [:dynamic, "%Q[#{node.value[:value]}]"]], [:newline]]
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
             | 
| 62 58 | 
             
                    temple = [:multi]
         | 
| 63 59 | 
             
                    StringSplitter.compile(node.value[:value]).each do |type, value|
         | 
| 64 60 | 
             
                      case type
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module Hamlit
         | 
| 3 | 
            +
              # Compile [:multi, [:static, 'foo'], [:dynamic, 'bar']] to [:dynamic, '"foo#{bar}"']
         | 
| 4 | 
            +
              class DynamicMerger < Temple::Filter
         | 
| 5 | 
            +
                def on_multi(*exps)
         | 
| 6 | 
            +
                  exps = exps.dup
         | 
| 7 | 
            +
                  result = [:multi]
         | 
| 8 | 
            +
                  buffer = []
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  until exps.empty?
         | 
| 11 | 
            +
                    type, arg = exps.first
         | 
| 12 | 
            +
                    if type == :dynamic && arg.count("\n") == 0
         | 
| 13 | 
            +
                      buffer << exps.shift
         | 
| 14 | 
            +
                    elsif type == :static && exps.size > (count = arg.count("\n")) &&
         | 
| 15 | 
            +
                          exps[1, count].all? { |e| e == [:newline] }
         | 
| 16 | 
            +
                      (1 + count).times { buffer << exps.shift }
         | 
| 17 | 
            +
                    elsif type == :newline && exps.size > (count = count_newline(exps)) &&
         | 
| 18 | 
            +
                          exps[count].first == :static && count == exps[count].last.count("\n")
         | 
| 19 | 
            +
                      (count + 1).times { buffer << exps.shift }
         | 
| 20 | 
            +
                    else
         | 
| 21 | 
            +
                      result.concat(merge_dynamic(buffer))
         | 
| 22 | 
            +
                      buffer = []
         | 
| 23 | 
            +
                      result << compile(exps.shift)
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                  result.concat(merge_dynamic(buffer))
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  result.size == 2 ? result[1] : result
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                private
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def merge_dynamic(exps)
         | 
| 34 | 
            +
                  # Merge exps only when they have both :static and :dynamic
         | 
| 35 | 
            +
                  unless exps.any? { |type,| type == :static } && exps.any? { |type,| type == :dynamic }
         | 
| 36 | 
            +
                    return exps
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  strlit_body = String.new
         | 
| 40 | 
            +
                  exps.each do |type, arg|
         | 
| 41 | 
            +
                    case type
         | 
| 42 | 
            +
                    when :static
         | 
| 43 | 
            +
                      strlit_body << arg.dump.sub!(/\A"/, '').sub!(/"\z/, '').gsub('\n', "\n")
         | 
| 44 | 
            +
                    when :dynamic
         | 
| 45 | 
            +
                      strlit_body << "\#{#{arg}}"
         | 
| 46 | 
            +
                    when :newline
         | 
| 47 | 
            +
                      # newline is added by `gsub('\n', "\n")`
         | 
| 48 | 
            +
                    else
         | 
| 49 | 
            +
                      raise "unexpected type #{type.inspect} is given to #merge_dynamic"
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                  [[:dynamic, "%Q\0#{strlit_body}\0"]]
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def count_newline(exps)
         | 
| 56 | 
            +
                  count = 0
         | 
| 57 | 
            +
                  exps.each do |exp|
         | 
| 58 | 
            +
                    if exp == [:newline]
         | 
| 59 | 
            +
                      count += 1
         | 
| 60 | 
            +
                    else
         | 
| 61 | 
            +
                      return count
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                  return count
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
    
        data/lib/hamlit/engine.rb
    CHANGED
    
    | @@ -2,10 +2,10 @@ | |
| 2 2 | 
             
            require 'temple'
         | 
| 3 3 | 
             
            require 'hamlit/parser'
         | 
| 4 4 | 
             
            require 'hamlit/compiler'
         | 
| 5 | 
            +
            require 'hamlit/html'
         | 
| 5 6 | 
             
            require 'hamlit/escapable'
         | 
| 6 7 | 
             
            require 'hamlit/force_escapable'
         | 
| 7 | 
            -
            require 'hamlit/ | 
| 8 | 
            -
            require 'hamlit/string_splitter'
         | 
| 8 | 
            +
            require 'hamlit/dynamic_merger'
         | 
| 9 9 |  | 
| 10 10 | 
             
            module Hamlit
         | 
| 11 11 | 
             
              class Engine < Temple::Engine
         | 
| @@ -25,15 +25,14 @@ module Hamlit | |
| 25 25 | 
             
                use Parser
         | 
| 26 26 | 
             
                use Compiler
         | 
| 27 27 | 
             
                use HTML
         | 
| 28 | 
            -
                 | 
| 29 | 
            -
             | 
| 30 | 
            -
                  filter :StaticAnalyzer
         | 
| 31 | 
            -
                end
         | 
| 28 | 
            +
                filter :StringSplitter
         | 
| 29 | 
            +
                filter :StaticAnalyzer
         | 
| 32 30 | 
             
                use Escapable
         | 
| 33 31 | 
             
                use ForceEscapable
         | 
| 34 32 | 
             
                filter :ControlFlow
         | 
| 35 33 | 
             
                filter :MultiFlattener
         | 
| 36 34 | 
             
                filter :StaticMerger
         | 
| 35 | 
            +
                use DynamicMerger
         | 
| 37 36 | 
             
                use :Generator, -> { options[:generator] }
         | 
| 38 37 | 
             
              end
         | 
| 39 38 | 
             
            end
         | 
    
        data/lib/hamlit/filters/plain.rb
    CHANGED
    
    | @@ -5,9 +5,6 @@ module Hamlit | |
| 5 5 | 
             
              class Filters
         | 
| 6 6 | 
             
                class Plain < Base
         | 
| 7 7 | 
             
                  def compile(node)
         | 
| 8 | 
            -
                    unless Ripper.respond_to?(:lex)
         | 
| 9 | 
            -
                      raise NotImplementedError.new('This platform does not have Ripper.lex required for :plain filter')
         | 
| 10 | 
            -
                    end
         | 
| 11 8 | 
             
                    text = node.value[:text]
         | 
| 12 9 | 
             
                    text = text.rstrip unless ::Hamlit::HamlUtil.contains_interpolation?(text) # for compatibility
         | 
| 13 10 | 
             
                    [:multi, *compile_plain(text)]
         | 
| @@ -2,87 +2,18 @@ require 'ripper' | |
| 2 2 | 
             
            require 'hamlit/ruby_expression'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Hamlit
         | 
| 5 | 
            -
               | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 8 | 
            -
                   | 
| 9 | 
            -
                    [] | 
| 10 | 
            -
                      tokens = Ripper.lex(code.strip)
         | 
| 11 | 
            -
                      tokens.pop while tokens.last && %i[on_comment on_sp].include?(tokens.last[1])
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                      if tokens.size < 2
         | 
| 14 | 
            -
                        raise Hamlit::InternalError.new("Expected token size >= 2 but got: #{tokens.size}")
         | 
| 15 | 
            -
                      end
         | 
| 16 | 
            -
                      compile_tokens!(exps, tokens)
         | 
| 17 | 
            -
                    end
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  private
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def strip_quotes!(tokens)
         | 
| 23 | 
            -
                    _, type, beg_str = tokens.shift
         | 
| 24 | 
            -
                    if type != :on_tstring_beg
         | 
| 25 | 
            -
                      raise Hamlit::InternalError.new("Expected :on_tstring_beg but got: #{type}")
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    _, type, end_str = tokens.pop
         | 
| 29 | 
            -
                    if type != :on_tstring_end
         | 
| 30 | 
            -
                      raise Hamlit::InternalError.new("Expected :on_tstring_end but got: #{type}")
         | 
| 31 | 
            -
                    end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                    [beg_str, end_str]
         | 
| 34 | 
            -
                  end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                  def compile_tokens!(exps, tokens)
         | 
| 37 | 
            -
                    beg_str, end_str = strip_quotes!(tokens)
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                    until tokens.empty?
         | 
| 40 | 
            -
                      _, type, str = tokens.shift
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                      case type
         | 
| 43 | 
            -
                      when :on_tstring_content
         | 
| 44 | 
            -
                        exps << [:static, eval("#{beg_str}#{str}#{end_str}")]
         | 
| 45 | 
            -
                      when :on_embexpr_beg
         | 
| 46 | 
            -
                        embedded = shift_balanced_embexpr(tokens)
         | 
| 47 | 
            -
                        exps << [:dynamic, embedded] unless embedded.empty?
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
                    end
         | 
| 50 | 
            -
                  end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                  def shift_balanced_embexpr(tokens)
         | 
| 53 | 
            -
                    String.new.tap do |embedded|
         | 
| 54 | 
            -
                      embexpr_open = 1
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                      until tokens.empty?
         | 
| 57 | 
            -
                        _, type, str = tokens.shift
         | 
| 58 | 
            -
                        case type
         | 
| 59 | 
            -
                        when :on_embexpr_beg
         | 
| 60 | 
            -
                          embexpr_open += 1
         | 
| 61 | 
            -
                        when :on_embexpr_end
         | 
| 62 | 
            -
                          embexpr_open -= 1
         | 
| 63 | 
            -
                          break if embexpr_open == 0
         | 
| 64 | 
            -
                        end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                        embedded << str
         | 
| 67 | 
            -
                      end
         | 
| 68 | 
            -
                    end
         | 
| 5 | 
            +
              module StringSplitter
         | 
| 6 | 
            +
                # `code` param must be valid string literal
         | 
| 7 | 
            +
                def self.compile(code)
         | 
| 8 | 
            +
                  unless Ripper.respond_to?(:lex) # truffleruby doesn't have Ripper.lex
         | 
| 9 | 
            +
                    return [[:dynamic, code]]
         | 
| 69 10 | 
             
                  end
         | 
| 70 | 
            -
                end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                def on_dynamic(code)
         | 
| 73 | 
            -
                  return [:dynamic, code] unless RubyExpression.string_literal?(code)
         | 
| 74 | 
            -
                  return [:dynamic, code] if code.include?("\n")
         | 
| 75 11 |  | 
| 76 | 
            -
                   | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
                     | 
| 80 | 
            -
                      temple << [:static, content]
         | 
| 81 | 
            -
                    when :dynamic
         | 
| 82 | 
            -
                      temple << on_dynamic(content)
         | 
| 83 | 
            -
                    end
         | 
| 12 | 
            +
                  begin
         | 
| 13 | 
            +
                    Temple::Filters::StringSplitter.compile(code)
         | 
| 14 | 
            +
                  rescue Temple::FilterError => e
         | 
| 15 | 
            +
                    raise Hamlit::InternalError.new(e.message)
         | 
| 84 16 | 
             
                  end
         | 
| 85 | 
            -
                  temple
         | 
| 86 17 | 
             
                end
         | 
| 87 18 | 
             
              end
         | 
| 88 19 | 
             
            end
         | 
    
        data/lib/hamlit/template.rb
    CHANGED
    
    
    
        data/lib/hamlit/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hamlit
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.10.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Takashi Kokubun
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-11-29 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: temple
         | 
| @@ -16,14 +16,14 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: 0.8. | 
| 19 | 
            +
                    version: 0.8.2
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - ">="
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: 0.8. | 
| 26 | 
            +
                    version: 0.8.2
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: thor
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -52,6 +52,20 @@ dependencies: | |
| 52 52 | 
             
                - - ">="
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: benchmark_driver
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ">="
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ">="
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0'
         | 
| 55 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 70 | 
             
              name: bundler
         | 
| 57 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -206,6 +220,20 @@ dependencies: | |
| 206 220 | 
             
                - - ">="
         | 
| 207 221 | 
             
                  - !ruby/object:Gem::Version
         | 
| 208 222 | 
             
                    version: '0'
         | 
| 223 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 224 | 
            +
              name: string_template
         | 
| 225 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 226 | 
            +
                requirements:
         | 
| 227 | 
            +
                - - ">="
         | 
| 228 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 229 | 
            +
                    version: '0'
         | 
| 230 | 
            +
              type: :development
         | 
| 231 | 
            +
              prerelease: false
         | 
| 232 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 233 | 
            +
                requirements:
         | 
| 234 | 
            +
                - - ">="
         | 
| 235 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 236 | 
            +
                    version: '0'
         | 
| 209 237 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 210 238 | 
             
              name: unindent
         | 
| 211 239 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -247,6 +275,9 @@ files: | |
| 247 275 | 
             
            - benchmark/dynamic_attributes/data_attribute.haml
         | 
| 248 276 | 
             
            - benchmark/dynamic_attributes/id_attribute.haml
         | 
| 249 277 | 
             
            - benchmark/dynamic_boolean_attribute.haml
         | 
| 278 | 
            +
            - benchmark/dynamic_merger/benchmark.rb
         | 
| 279 | 
            +
            - benchmark/dynamic_merger/hello.haml
         | 
| 280 | 
            +
            - benchmark/dynamic_merger/hello.string
         | 
| 250 281 | 
             
            - benchmark/etc/attribute_builder.haml
         | 
| 251 282 | 
             
            - benchmark/etc/real_sample.haml
         | 
| 252 283 | 
             
            - benchmark/etc/real_sample.rb
         | 
| @@ -290,6 +321,7 @@ files: | |
| 290 321 | 
             
            - lib/hamlit/compiler/script_compiler.rb
         | 
| 291 322 | 
             
            - lib/hamlit/compiler/silent_script_compiler.rb
         | 
| 292 323 | 
             
            - lib/hamlit/compiler/tag_compiler.rb
         | 
| 324 | 
            +
            - lib/hamlit/dynamic_merger.rb
         | 
| 293 325 | 
             
            - lib/hamlit/engine.rb
         | 
| 294 326 | 
             
            - lib/hamlit/error.rb
         | 
| 295 327 | 
             
            - lib/hamlit/escapable.rb
         | 
| @@ -311,7 +343,6 @@ files: | |
| 311 343 | 
             
            - lib/hamlit/filters/text_base.rb
         | 
| 312 344 | 
             
            - lib/hamlit/filters/tilt_base.rb
         | 
| 313 345 | 
             
            - lib/hamlit/force_escapable.rb
         | 
| 314 | 
            -
            - lib/hamlit/hamlit.su
         | 
| 315 346 | 
             
            - lib/hamlit/helpers.rb
         | 
| 316 347 | 
             
            - lib/hamlit/html.rb
         | 
| 317 348 | 
             
            - lib/hamlit/identity.rb
         | 
    
        data/lib/hamlit/hamlit.su
    DELETED
    
    | Binary file |