hamlit 2.9.5 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +1 -1
- data/REFERENCE.md +9 -0
- 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/comment_compiler.rb +7 -5
- 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 -4
- data/lib/hamlit/html.rb +8 -0
- 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: ea5913914011f369b96f45e350597bd102cd21adaa708c71bdd78e48a9d0379f
|
4
|
+
data.tar.gz: 1e02820e534617ffe3df742ac06aa28b2c8ff49e3bf7d6b22d67bac36017e6f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cb42767eb9b77de2c881d7c0b3546b086dd97f65a05a4cd81d525ff3428e5065c33a41bd0dbddf19045682181fd3eaf73fb541dbf930554d3bbe80c7fee77aa
|
7
|
+
data.tar.gz: 47fe8b4b28777a5aaa84f37049b163625b24f1d111cb41e20df6275c2c49d3755cd8231aa81311019e0b961668c19f6ad43512d7eef6a7ff89dd26c38e6741ed
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,30 @@ 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.11.0](https://github.com/k0kubun/hamlit/compare/v2.10.0...v2.10.1) - 2019-12-12
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- Support Haml's _revealed_ conditional comment feature on `/![if !IE]` [#153](https://github.com/k0kubun/hamlit/issues/153).
|
12
|
+
*Thanks to @esb*
|
13
|
+
|
14
|
+
## [2.10.1](https://github.com/k0kubun/hamlit/compare/v2.10.0...v2.10.1) - 2019-11-28
|
15
|
+
|
16
|
+
### Added
|
17
|
+
|
18
|
+
- Register `Hamlit::Template` to Tilt as :hamlit as well, in addition to :haml
|
19
|
+
|
20
|
+
## [2.10.0](https://github.com/k0kubun/hamlit/compare/v2.9.5...v2.10.0) - 2019-09-15
|
21
|
+
|
22
|
+
### Added
|
23
|
+
|
24
|
+
- Optimize template rendering by string interpolation [#146](https://github.com/k0kubun/hamlit/issues/146)
|
25
|
+
- Exploiting pre-allocation of string interpolation introduced in Ruby 2.5 [ruby/ruby#1626](https://github.com/ruby/ruby/pull/1626)
|
26
|
+
|
27
|
+
### Changed
|
28
|
+
|
29
|
+
- Require temple.gem >= 0.8.2
|
30
|
+
|
7
31
|
## [2.9.5](https://github.com/k0kubun/hamlit/compare/v2.9.4...v2.9.5) - 2019-09-08
|
8
32
|
|
9
33
|
### 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'
|
data/REFERENCE.md
CHANGED
@@ -57,6 +57,7 @@ for full features in original implementation.
|
|
57
57
|
- [x] :plain
|
58
58
|
- [x] :preserve
|
59
59
|
- [x] :ruby
|
60
|
+
- `haml_io` API is not supported. Use [hamlit-haml\_io.gem](https://github.com/hamlit/hamlit-haml_io) if you need.
|
60
61
|
- [x] :sass
|
61
62
|
- [x] :scss
|
62
63
|
- [ ] :textile
|
@@ -224,6 +225,14 @@ Hamlit::RailsTemplate.set_options attr_quote: '"'
|
|
224
225
|
set :haml, { attr_quote: '"' }
|
225
226
|
```
|
226
227
|
|
228
|
+
## Ruby module
|
229
|
+
|
230
|
+
`Hamlit::Template` is a module registered to `Tilt`. You can use it like:
|
231
|
+
|
232
|
+
```rb
|
233
|
+
Hamlit::Template.new { "%strong Yay for HAML!" }.render
|
234
|
+
```
|
235
|
+
|
227
236
|
## Creating a custom filter
|
228
237
|
|
229
238
|
Currently it doesn't have filter registering interface compatible with Haml.
|
@@ -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
|
@@ -25,11 +25,13 @@ module Hamlit
|
|
25
25
|
condition = $1
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
content =
|
29
|
+
if node.children.empty?
|
30
|
+
[:static, " #{node.value[:text]} "]
|
31
|
+
else
|
32
|
+
yield(node)
|
33
|
+
end
|
34
|
+
[:html, :condcomment, condition, content, node.value[:revealed]]
|
33
35
|
end
|
34
36
|
end
|
35
37
|
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
@@ -14,10 +14,6 @@ module Hamlit
|
|
14
14
|
|
15
15
|
def compile_plain(text)
|
16
16
|
string_literal = ::Hamlit::HamlUtil.unescape_interpolation(text)
|
17
|
-
unless Ripper.respond_to?(:lex) # truffleruby doesn't have Ripper.lex
|
18
|
-
return [[:escape, false, [:dynamic, string_literal]]]
|
19
|
-
end
|
20
|
-
|
21
17
|
StringSplitter.compile(string_literal).map do |temple|
|
22
18
|
type, str = temple
|
23
19
|
case type
|
data/lib/hamlit/html.rb
CHANGED
@@ -10,5 +10,13 @@ module Hamlit
|
|
10
10
|
end
|
11
11
|
super(opts)
|
12
12
|
end
|
13
|
+
|
14
|
+
# This dispatcher supports Haml's "revealed" conditional comment.
|
15
|
+
def on_html_condcomment(condition, content, revealed = false)
|
16
|
+
on_html_comment [:multi,
|
17
|
+
[:static, "[#{condition}]>#{'<!-->' if revealed}"],
|
18
|
+
content,
|
19
|
+
[:static, "#{'<!--' if revealed}<![endif]"]]
|
20
|
+
end
|
13
21
|
end
|
14
22
|
end
|
@@ -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.11.0
|
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-12-13 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
|