faml 0.2.8 → 0.2.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/README.md +4 -0
- data/Rakefile +20 -3
- data/benchmark/compiling.rb +23 -0
- data/lib/faml/cli.rb +2 -1
- data/lib/faml/compiler.rb +8 -1
- data/lib/faml/element_parser.rb +2 -2
- data/lib/faml/line_parser.rb +3 -3
- data/lib/faml/parser.rb +14 -2
- data/lib/faml/ruby_multiline.rb +1 -1
- data/lib/faml/static_hash_parser.rb +3 -1
- data/lib/faml/version.rb +1 -1
- data/spec/compiler_newline_spec.rb +40 -0
- data/spec/render/attribute_spec.rb +7 -0
- data/spec/render/doctype_spec.rb +7 -0
- data/spec/render/multiline_spec.rb +9 -0
- data/spec/render/plain_spec.rb +7 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da0d5a40e368fd95bce13511a6c083c338a79698
|
4
|
+
data.tar.gz: 5835483174f686095295d5a93dcd00decd5c1e49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc1faad685fd051a3a2fcbd63f4dc6059b300d6e66a57aad98e77662f13da0bcc4205bd261f2d90bfa9bb5f9abf23ba504be2c988e168ef9f282a90ec7dd6c09
|
7
|
+
data.tar.gz: 1cf54d88358b06fdd8f9b2c78a2415820fc83a0f806ab16bd4a98b076b03fcc8bbf93e069d0f3cb5fc1337c8b5a682acbeca952c35b33df612200386a2ff0b68
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.2.9 (2015-04-04)
|
2
|
+
- Keep code newlines with multiline
|
3
|
+
- https://github.com/eagletmt/faml/issues/18
|
4
|
+
- Disable haml multiline syntax within filter
|
5
|
+
- Fix `__LINE__` and `__FILE__` in attribute lists
|
6
|
+
|
1
7
|
## 0.2.8 (2015-04-02)
|
2
8
|
- Allow empty silent script body
|
3
9
|
- For compatibility with haml
|
data/README.md
CHANGED
@@ -58,6 +58,10 @@ is always rendered as
|
|
58
58
|
|
59
59
|
It's equivalent to haml's "ugly" mode.
|
60
60
|
|
61
|
+
### No Haml::Helpers except for preserve
|
62
|
+
I won't provide helper methods of Haml::Helpers except for `preserve` .
|
63
|
+
If you really need other helper methods, please open an issue.
|
64
|
+
|
61
65
|
### Others
|
62
66
|
If you find other incompatibility, please report it to me :-p.
|
63
67
|
|
data/Rakefile
CHANGED
@@ -10,24 +10,41 @@ end
|
|
10
10
|
require 'rspec/core/rake_task'
|
11
11
|
RSpec::Core::RakeTask.new(:spec)
|
12
12
|
|
13
|
+
task :benchmark => ['benchmark:rendering', 'benchmark:compiling']
|
14
|
+
|
13
15
|
namespace :benchmark do
|
14
16
|
task :rendering => ['benchmark:rendering:haml', 'benchmark:rendering:attributes', 'benchmark:rendering:slim']
|
15
17
|
namespace :rendering do
|
16
|
-
desc "Run benchmark with Haml's standard template"
|
18
|
+
desc "Run rendering benchmark with Haml's standard template"
|
17
19
|
task :haml do
|
18
20
|
haml_gem = Gem::Specification.find_by_name('haml')
|
19
21
|
standard_haml_path = File.join(haml_gem.gem_dir, 'test', 'templates', 'standard.haml')
|
20
22
|
sh 'ruby', 'benchmark/rendering.rb', standard_haml_path
|
21
23
|
end
|
22
24
|
|
23
|
-
desc "Run benchmark for attribute builder"
|
25
|
+
desc "Run rendering benchmark for attribute builder"
|
24
26
|
task :attributes do
|
25
27
|
sh 'ruby', 'benchmark/rendering.rb', 'benchmark/attribute_builder.haml', 'benchmark/attribute_builder.slim'
|
26
28
|
end
|
27
29
|
|
28
|
-
desc "Run slim's benchmark"
|
30
|
+
desc "Run slim's rendering benchmark"
|
29
31
|
task :slim do
|
30
32
|
sh 'ruby', 'benchmark/slim.rb'
|
31
33
|
end
|
32
34
|
end
|
35
|
+
|
36
|
+
task :compiling => ['benchmark:compiling:haml', 'benchmark:compiling:slim']
|
37
|
+
namespace :compiling do
|
38
|
+
desc "Run compiling benchmark with Haml's standard template"
|
39
|
+
task :haml do
|
40
|
+
haml_gem = Gem::Specification.find_by_name('haml')
|
41
|
+
standard_haml_path = File.join(haml_gem.gem_dir, 'test', 'templates', 'standard.haml')
|
42
|
+
sh 'ruby', 'benchmark/compiling.rb', standard_haml_path
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Run slim's compiling benchmark"
|
46
|
+
task :slim do
|
47
|
+
sh 'ruby', 'benchmark/compiling.rb', 'benchmark/view.haml', 'benchmark/view.slim'
|
48
|
+
end
|
49
|
+
end
|
33
50
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'benchmark/ips'
|
3
|
+
require 'haml'
|
4
|
+
require 'faml'
|
5
|
+
require 'slim'
|
6
|
+
require 'escape_utils/html/haml'
|
7
|
+
|
8
|
+
unless ARGV[0]
|
9
|
+
$stderr.puts "Usage: #{$0} template.haml [template.slim]"
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
haml_code = File.read(ARGV[0])
|
14
|
+
slim_code = ARGV[1] ? File.read(ARGV[1]) : nil
|
15
|
+
|
16
|
+
Benchmark.ips do |x|
|
17
|
+
x.report('Haml') { Haml::Engine.new(haml_code, ugly: true, escape_html: true) }
|
18
|
+
x.report('Faml') { Faml::Engine.new.call(haml_code) }
|
19
|
+
if slim_code
|
20
|
+
x.report('Slim') { Slim::Engine.new.call(slim_code) }
|
21
|
+
end
|
22
|
+
x.compare!
|
23
|
+
end
|
data/lib/faml/cli.rb
CHANGED
data/lib/faml/compiler.rb
CHANGED
@@ -228,7 +228,8 @@ module Faml
|
|
228
228
|
end
|
229
229
|
|
230
230
|
if attrs = try_optimize_attributes(text, static_id, static_class)
|
231
|
-
|
231
|
+
line_count = text.count("\n")
|
232
|
+
return [:multi, [:html, :attrs, *attrs]].concat([[:newline]] * line_count)
|
232
233
|
end
|
233
234
|
|
234
235
|
# Slow version
|
@@ -278,6 +279,12 @@ module Faml
|
|
278
279
|
return nil
|
279
280
|
end
|
280
281
|
|
282
|
+
if text.include?("\n") && !dynamic_attributes.empty?
|
283
|
+
# XXX: Quit optimization to keep newlines
|
284
|
+
# https://github.com/eagletmt/faml/issues/18
|
285
|
+
return nil
|
286
|
+
end
|
287
|
+
|
281
288
|
(static_attributes.keys + dynamic_attributes.keys).sort.flat_map do |k|
|
282
289
|
if static_attributes.has_key?(k)
|
283
290
|
compile_static_attribute(k, static_attributes[k])
|
data/lib/faml/element_parser.rb
CHANGED
@@ -99,7 +99,7 @@ module Faml
|
|
99
99
|
return [attr[1, attr.size-2], s.rest]
|
100
100
|
else
|
101
101
|
if /,\s*\z/ === text && @line_parser.has_next?
|
102
|
-
text << @line_parser.next_line
|
102
|
+
text << "\n" << @line_parser.next_line
|
103
103
|
else
|
104
104
|
syntax_error!('Unmatched brace')
|
105
105
|
end
|
@@ -122,7 +122,7 @@ module Faml
|
|
122
122
|
return [new_attributes, s.rest]
|
123
123
|
else
|
124
124
|
if @line_parser.has_next?
|
125
|
-
text <<
|
125
|
+
text << "\n" << @line_parser.next_line
|
126
126
|
else
|
127
127
|
syntax_error!('Unmatched paren')
|
128
128
|
end
|
data/lib/faml/line_parser.rb
CHANGED
@@ -8,9 +8,9 @@ module Faml
|
|
8
8
|
@lineno = 0
|
9
9
|
end
|
10
10
|
|
11
|
-
def next_line
|
11
|
+
def next_line(in_filter: false)
|
12
12
|
line = move_next
|
13
|
-
if is_multiline?(line)
|
13
|
+
if !in_filter && is_multiline?(line)
|
14
14
|
next_multiline(line)
|
15
15
|
else
|
16
16
|
line
|
@@ -61,7 +61,7 @@ module Faml
|
|
61
61
|
break
|
62
62
|
end
|
63
63
|
end
|
64
|
-
buf.join
|
64
|
+
buf.join("\n")
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
data/lib/faml/parser.rb
CHANGED
@@ -23,15 +23,21 @@ module Faml
|
|
23
23
|
@filter_parser = FilterParser.new(@indent_tracker)
|
24
24
|
|
25
25
|
while @line_parser.has_next?
|
26
|
-
|
27
|
-
|
26
|
+
in_filter = !@ast.is_a?(Ast::HamlComment) && @filter_parser.enabled?
|
27
|
+
line = @line_parser.next_line(in_filter: in_filter)
|
28
|
+
if in_filter
|
28
29
|
ast = @filter_parser.append(line)
|
29
30
|
if ast
|
30
31
|
@ast << ast
|
31
32
|
end
|
32
33
|
end
|
33
34
|
unless @filter_parser.enabled?
|
35
|
+
line_count = line.count("\n")
|
36
|
+
line.delete!("\n")
|
34
37
|
parse_line(line)
|
38
|
+
line_count.times do
|
39
|
+
@ast << create_node(Ast::Empty)
|
40
|
+
end
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
@@ -165,6 +171,12 @@ module Faml
|
|
165
171
|
end
|
166
172
|
@stack.push(@ast)
|
167
173
|
@ast = @ast.children.last
|
174
|
+
case @ast
|
175
|
+
when Ast::Text
|
176
|
+
syntax_error!('nesting within plain text is illegal')
|
177
|
+
when Ast::Doctype
|
178
|
+
syntax_error!('nesting within a header command is illegal')
|
179
|
+
end
|
168
180
|
@ast.children = empty_lines
|
169
181
|
if @ast.is_a?(Ast::Element) && @ast.self_closing
|
170
182
|
syntax_error!('Illegal nesting: nesting within a self-closing tag is illegal')
|
data/lib/faml/ruby_multiline.rb
CHANGED
@@ -14,7 +14,9 @@ module Faml
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse(text)
|
17
|
-
|
17
|
+
builder = ::Parser::Builders::Default.new
|
18
|
+
builder.emit_file_line_as_literals = false
|
19
|
+
parser = ::Parser::CurrentRuby.new(builder)
|
18
20
|
parser.diagnostics.consumer = nil
|
19
21
|
buffer = ::Parser::Source::Buffer.new('(faml)')
|
20
22
|
buffer.source = text
|
data/lib/faml/version.rb
CHANGED
@@ -155,6 +155,46 @@ HAML
|
|
155
155
|
}
|
156
156
|
|
157
157
|
%span= raise LineVerifier
|
158
|
+
HAML
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'with multiline' do
|
163
|
+
it 'keeps newlines in static attributes' do
|
164
|
+
expect { render_string(<<HAML) }.to raise_error(LineVerifier, raised_at(3))
|
165
|
+
%span{a: 1,
|
166
|
+
b: 2}
|
167
|
+
= raise LineVerifier
|
168
|
+
HAML
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'keeps newlines in dynamic attributes' do
|
172
|
+
expect { render_string(<<HAML) }.to raise_error(LineVerifier, raised_at(2))
|
173
|
+
%span{a: 1,
|
174
|
+
b: raise(LineVerifier)}
|
175
|
+
hello
|
176
|
+
HAML
|
177
|
+
expect { render_string(<<HAML) }.to raise_error(LineVerifier, raised_at(3))
|
178
|
+
%span{a: 1,
|
179
|
+
b: 2 + 3}
|
180
|
+
= raise LineVerifier
|
181
|
+
HAML
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'keeps newlines in ruby attributes' do
|
185
|
+
expect { render_string(<<HAML) }.to raise_error(LineVerifier, raised_at(2))
|
186
|
+
%span{[1,
|
187
|
+
raise(LineVerifier)]}
|
188
|
+
hello
|
189
|
+
HAML
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'keeps newlines in haml multiline' do
|
193
|
+
expect(render_string(<<HAML)).to eq("foo bar 1\n4\n")
|
194
|
+
= 'foo ' + |
|
195
|
+
'bar ' + |
|
196
|
+
__LINE__.to_s |
|
197
|
+
= __LINE__
|
158
198
|
HAML
|
159
199
|
end
|
160
200
|
end
|
@@ -175,6 +175,13 @@ HAML
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
+
it 'renders __LINE__ correctly' do
|
179
|
+
expect(render_string(<<HAML)).to eq("<span a='2' b='1'></span>\n")
|
180
|
+
%span{b: __LINE__,
|
181
|
+
a: __LINE__}
|
182
|
+
HAML
|
183
|
+
end
|
184
|
+
|
178
185
|
describe 'with HTML-style attributes' do
|
179
186
|
it 'parses simple values' do
|
180
187
|
expect(render_string('%span(foo=1 bar=3) hello')).to eq("<span bar='3' foo='1'>hello</span>\n")
|
data/spec/render/doctype_spec.rb
CHANGED
@@ -54,4 +54,11 @@ RSpec.describe 'Doctype rendering', type: :render do
|
|
54
54
|
expect(render_string('!!! 5', format: :xhtml)).to eq(%Q|<!DOCTYPE html>\n|)
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
it 'raises error when doctype has children' do
|
59
|
+
expect { render_string(<<HAML) }.to raise_error(Faml::SyntaxError, /nesting within a header command/)
|
60
|
+
!!!
|
61
|
+
hello
|
62
|
+
HAML
|
63
|
+
end
|
57
64
|
end
|
@@ -41,6 +41,15 @@ HAML
|
|
41
41
|
expect(render_string(<<HAML)).to eq("<div bar='2' foo='1'></div>\n")
|
42
42
|
%div{foo: 1, |
|
43
43
|
bar: 2}
|
44
|
+
HAML
|
45
|
+
end
|
46
|
+
|
47
|
+
it "isn't enabled in filter" do
|
48
|
+
expect(render_string(<<HAML)).to eq("<script>\n hello |\n world |\n</script>\n4\n")
|
49
|
+
:javascript
|
50
|
+
hello |
|
51
|
+
world |
|
52
|
+
= __LINE__
|
44
53
|
HAML
|
45
54
|
end
|
46
55
|
end
|
data/spec/render/plain_spec.rb
CHANGED
@@ -17,4 +17,11 @@ HAML
|
|
17
17
|
it 'raises error when interpolation is unterminated' do
|
18
18
|
expect { render_string('%span foo#{1 + 2') }.to raise_error(Faml::TextCompiler::InvalidInterpolation)
|
19
19
|
end
|
20
|
+
|
21
|
+
it 'raises error when text has children' do
|
22
|
+
expect { render_string(<<HAML) }.to raise_error(Faml::SyntaxError, /nesting within plain text/)
|
23
|
+
hello
|
24
|
+
world
|
25
|
+
HAML
|
26
|
+
end
|
20
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kohei Suzuki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -269,6 +269,7 @@ files:
|
|
269
269
|
- Rakefile
|
270
270
|
- benchmark/attribute_builder.haml
|
271
271
|
- benchmark/attribute_builder.slim
|
272
|
+
- benchmark/compiling.rb
|
272
273
|
- benchmark/context.rb
|
273
274
|
- benchmark/rendering.rb
|
274
275
|
- benchmark/slim.rb
|
@@ -432,7 +433,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
432
433
|
version: '0'
|
433
434
|
requirements: []
|
434
435
|
rubyforge_project:
|
435
|
-
rubygems_version: 2.
|
436
|
+
rubygems_version: 2.4.5
|
436
437
|
signing_key:
|
437
438
|
specification_version: 4
|
438
439
|
summary: Faster implementation of Haml template language.
|