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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00278629939c45cb0b99bb33b4804a1632fe9e2b
4
- data.tar.gz: 8c70078e0c7da99320775bd7b1e9fbadae654aa3
3
+ metadata.gz: da0d5a40e368fd95bce13511a6c083c338a79698
4
+ data.tar.gz: 5835483174f686095295d5a93dcd00decd5c1e49
5
5
  SHA512:
6
- metadata.gz: 0d4a3d25800c968bd0499386817e64293bd8bc99cfe2df3d8bc05d827c2fee83e663f9d7b793429a3f0ded1f8d2b662e656ed89dc76ae801c0084394506f3bb1
7
- data.tar.gz: aacf989f3c254913503803e8596cb05c90fcc839f43344bcca6a3379132a06ccfac92a62db9738dd7886cbc54928d12c2e5703c5a298c3cbd0b244a7b08009fe
6
+ metadata.gz: dc1faad685fd051a3a2fcbd63f4dc6059b300d6e66a57aad98e77662f13da0bcc4205bd261f2d90bfa9bb5f9abf23ba504be2c988e168ef9f282a90ec7dd6c09
7
+ data.tar.gz: 1cf54d88358b06fdd8f9b2c78a2415820fc83a0f806ab16bd4a98b076b03fcc8bbf93e069d0f3cb5fc1337c8b5a682acbeca952c35b33df612200386a2ff0b68
data/.travis.yml CHANGED
@@ -11,7 +11,7 @@ gemfile:
11
11
  - gemfiles/rails_4.2.gemfile
12
12
  - gemfiles/rails_edge.gemfile
13
13
  after_script:
14
- - bundle exec rake benchmark:rendering
14
+ - bundle exec rake benchmark
15
15
  matrix:
16
16
  allow_failures:
17
17
  - rvm: ruby-head
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
@@ -5,7 +5,8 @@ module Faml
5
5
  class CLI < Thor
6
6
  desc 'render FILE', 'Render haml template'
7
7
  def render(file)
8
- puts eval(compile_file(file))
8
+ code = compile_file(file)
9
+ puts instance_eval(code, file)
9
10
  end
10
11
 
11
12
  desc 'compile FILE', 'Compile haml template'
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
- return [:html, :attrs, *attrs]
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])
@@ -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 << ' ' << @line_parser.next_line
125
+ text << "\n" << @line_parser.next_line
126
126
  else
127
127
  syntax_error!('Unmatched paren')
128
128
  end
@@ -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
- line = @line_parser.next_line
27
- if !@ast.is_a?(Ast::HamlComment) && @filter_parser.enabled?
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')
@@ -6,7 +6,7 @@ module Faml
6
6
  current_text = line_parser.next_line
7
7
  buf << current_text
8
8
  end
9
- buf.join(' ')
9
+ buf.join("\n")
10
10
  end
11
11
 
12
12
  # `text' is a Ruby multiline block if it:
@@ -14,7 +14,9 @@ module Faml
14
14
  end
15
15
 
16
16
  def parse(text)
17
- parser = ::Parser::CurrentRuby.new
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
@@ -1,3 +1,3 @@
1
1
  module Faml
2
- VERSION = "0.2.8"
2
+ VERSION = "0.2.9"
3
3
  end
@@ -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")
@@ -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
@@ -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.8
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-02 00:00:00.000000000 Z
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.2.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.