hamli 0.3.0 → 0.5.1

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
  SHA256:
3
- metadata.gz: bfe5c703b08f1580b7b3bf603b45984d68c1ccaff5675b0243a838a190597366
4
- data.tar.gz: b5af88cc968267fdbc9ae35806a0d6fef3fb749b1939ce42a19d635b00f0c767
3
+ metadata.gz: 9eacc83b48fa8d222c61141db82359b6ca0ab26d0920af27ec2aa23f62737a77
4
+ data.tar.gz: ce7a4299a5b7159d8bf710c56d209c8befca34e69e8f9283026708fd29fdc1e6
5
5
  SHA512:
6
- metadata.gz: a29fe320a9c23065a6d897eab4acaf1e97b2303c11e0ec28854eb37bd50507a95247edee7a315dfa8b1e91af0be39ec79a1e4ec996220905084e9efa051fc285
7
- data.tar.gz: cfcee2c4310365319915007a790d2962a88913180f21baae95857db5493c911fb09da9d152ac0993e01de4f684e141c73646466d1b31181fde85a8dbcde5196e
6
+ metadata.gz: ed57274d0f03e3cead46b164436245c3d20d1d8c162f96db507f6b6277b18d6f984f97ae03277a83696e5b9779021da712e90ae27646a1767b629d9e38b7bcc1
7
+ data.tar.gz: 699de4de959019ac943f2b15f151f196253b045f2781519ba645175b66a0b4b8b8dbbdfe7c8098bd652dbaf890282c15697954fd345a7346082516496a3458e7
data/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.5.1 - 2022-06-29
6
+
7
+ ### Fixed
8
+
9
+ - Fix Ruby blocks parsing.
10
+
11
+ ## 0.5.0 - 2022-01-30
12
+
13
+ ### Added
14
+
15
+ - Support escaped output line.
16
+ - Support non-escaped output line.
17
+
18
+ ## 0.4.0 - 2022-01-26
19
+
20
+ ### Added
21
+
22
+ - Add :file option for better error report.
23
+
24
+ ### Fixed
25
+
26
+ - Fix error from parse_text_block on some case.
27
+ - Fix filter bug on :text node.
28
+ - Fix parse_interpolate_line bug.
29
+ - Fix haml comment parser bug.
30
+ - Fix pipe multi-line handling.
31
+
5
32
  ## 0.3.0 - 2022-01-26
6
33
 
7
34
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hamli (0.3.0)
4
+ hamli (0.5.1)
5
5
  temple
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  Yet another implementation for [Haml](https://github.com/haml/haml) template language.
7
7
 
8
+ Hamli is used by [Hamlcop](https://github.com/r7kamura/hamlcop).
9
+
8
10
  ## Installation
9
11
 
10
12
  Add this line to your application's Gemfile:
@@ -14,11 +14,10 @@ module Hamli
14
14
  [:hamli, :position, begin_, end_, compile(expression)]
15
15
  end
16
16
 
17
- # @param [String] type
18
17
  # @param [Array] expression
19
18
  # @return [Array]
20
- def on_hamli_text(type, expression)
21
- [:hamli, :text, type, compile(expression)]
19
+ def on_hamli_text(expression)
20
+ [:hamli, :text, compile(expression)]
22
21
  end
23
22
  end
24
23
  end
data/lib/hamli/parser.rb CHANGED
@@ -4,6 +4,15 @@ require 'temple'
4
4
 
5
5
  module Hamli
6
6
  class Parser < ::Temple::Parser
7
+ define_options(
8
+ :file
9
+ )
10
+
11
+ def initialize(_options = {})
12
+ super
13
+ @file_path = options[:file] || '(__TEMPLATE__)'
14
+ end
15
+
7
16
  # @param [String] source Haml template source.
8
17
  # @return [Array]
9
18
  def call(source)
@@ -35,6 +44,10 @@ module Hamli
35
44
  parse_control_line
36
45
  elsif @scanner.match?(/=/)
37
46
  parse_output_line
47
+ elsif @scanner.match?(/&=/)
48
+ parse_escaped_output_line
49
+ elsif @scanner.match?(/!=/)
50
+ parse_non_escaped_output_line
38
51
  else
39
52
  parse_text_line
40
53
  end
@@ -129,7 +142,7 @@ module Hamli
129
142
  content = parse_broken_lines
130
143
  end_ = @scanner.charpos
131
144
  block = [:multi]
132
- tag << [:hamli, :position, begin_, end_, [:hamli, :output, content, block]]
145
+ tag << [:hamli, :position, begin_, end_, [:hamli, :output, false, content, block]]
133
146
  @stacks << block
134
147
  elsif @scanner.scan(%r{[ \t]*/[ \t]*})
135
148
  # Does nothing.
@@ -351,8 +364,9 @@ module Hamli
351
364
  # ^^^^^^
352
365
  def parse_haml_comment_line
353
366
  @scanner.pos += 2
367
+ @scanner.scan(/[^\r\n]*/)
354
368
  while !@scanner.eos? && (@scanner.match?(/[ \t]*(?=\r|$)/) || peek_indent > @indents.last)
355
- @scanner.skip(/[^\r\n]*/)
369
+ @scanner.scan(/[^\r\n]*/)
356
370
  parse_line_ending
357
371
  end
358
372
  end
@@ -387,7 +401,7 @@ module Hamli
387
401
 
388
402
  # @return [Array, nil]
389
403
  def parse_interpolate_line
390
- return unless @scanner.match?(/[^\r\n]/)
404
+ return unless @scanner.match?(/[^\r\n]+/)
391
405
 
392
406
  begin_ = @scanner.charpos
393
407
  value = @scanner.matched
@@ -396,24 +410,51 @@ module Hamli
396
410
  [:hamli, :interpolate, begin_, end_, value]
397
411
  end
398
412
 
413
+ # Parse escaped output line part.
414
+ # e.g. != abc
415
+ # ^^^^^^
416
+ # @todo Support :escape_html option on this parser, then rethink about escaping.
417
+ def parse_non_escaped_output_line
418
+ @scanner.pos += 1
419
+ parse_output_line
420
+ end
421
+
422
+ # Parse escaped output line part.
423
+ # e.g. &= abc
424
+ # ^^^^^^
425
+ def parse_escaped_output_line
426
+ @scanner.pos += 2
427
+ @scanner.scan(/[ \t]*/)
428
+ parse_ruby_line(escaped: true, name: :output)
429
+ end
430
+
399
431
  # Parse output line part.
400
432
  # e.g. = abc
401
433
  # ^^^^^
402
434
  def parse_output_line
403
- parse_control_line(name: :output)
435
+ @scanner.pos += 1
436
+ @scanner.scan(/[ \t]*/)
437
+ parse_ruby_line(escaped: false, name: :output)
404
438
  end
405
439
 
406
440
  # Parse control line part.
407
441
  # e.g. - abc
408
442
  # ^^^^^
409
- def parse_control_line(name: :control)
443
+ def parse_control_line
410
444
  @scanner.pos += 1
445
+ @scanner.scan(/[ \t]*/)
446
+ parse_ruby_line(escaped: false, name: :control)
447
+ end
448
+
449
+ # @param [Boolean] escaped
450
+ # @param [Symbol] name
451
+ def parse_ruby_line(escaped:, name:)
411
452
  @scanner.scan(/[ \t]*/)
412
453
  block = [:multi]
413
454
  begin_ = @scanner.charpos
414
455
  content = parse_broken_lines
415
456
  end_ = @scanner.charpos
416
- @stacks.last << [:hamli, :position, begin_, end_, [:hamli, name, content, block]]
457
+ @stacks.last << [:hamli, :position, begin_, end_, [:hamli, name, escaped, content, block]]
417
458
  @stacks << block
418
459
  end
419
460
 
@@ -422,14 +463,15 @@ module Hamli
422
463
  def parse_broken_lines
423
464
  result = +''
424
465
  result << @scanner.scan(/[^\r\n]*/)
425
- while result.end_with?(',') || result.end_with?('|')
466
+ while result.end_with?(',') || (result.end_with?('|') && (result !~ /\bdo\s*\|[^|]*\|\z/))
426
467
  syntax_error!(Errors::UnexpectedEosError) unless @scanner.scan(/\r?\n/)
427
468
 
428
- result.delete_suffix('|')
429
469
  result << "\n"
430
470
  result << @scanner.scan(/[^\r\n]*/)
431
471
  end
432
- result
472
+ lines = result.lines
473
+ result.gsub!(/\|$/, '') if lines.length >= 2 && lines.all? { |line| line.end_with?("|\n") }
474
+ result.delete_suffix("\n")
433
475
  end
434
476
 
435
477
  # @param [Class] syntax_error_class A child class of Hamli::Errors::HamlSyntaxError.
@@ -446,7 +488,7 @@ module Hamli
446
488
 
447
489
  # @return [Integer]
448
490
  def indent_from_last_match
449
- @scanner.matched.chars.map do |char|
491
+ (@scanner.matched || '').chars.map do |char|
450
492
  case char
451
493
  when "\t"
452
494
  4
data/lib/hamli/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hamli
4
- VERSION = '0.3.0'
4
+ VERSION = '0.5.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-26 00:00:00.000000000 Z
11
+ date: 2022-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: temple
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description:
27
+ description:
28
28
  email:
29
29
  - r7kamura@gmail.com
30
30
  executables: []
@@ -57,7 +57,7 @@ metadata:
57
57
  source_code_uri: https://github.com/r7kamura/hamli
58
58
  changelog_uri: https://github.com/r7kamura/hamli/blob/main/CHANGELOG.md
59
59
  rubygems_mfa_required: 'true'
60
- post_install_message:
60
+ post_install_message:
61
61
  rdoc_options: []
62
62
  require_paths:
63
63
  - lib
@@ -72,8 +72,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  - !ruby/object:Gem::Version
73
73
  version: '0'
74
74
  requirements: []
75
- rubygems_version: 3.1.4
76
- signing_key:
75
+ rubygems_version: 3.3.7
76
+ signing_key:
77
77
  specification_version: 4
78
78
  summary: Yet another implementation for Haml template language.
79
79
  test_files: []