hamli 0.2.0 → 0.3.0

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: b8051356e999f363969f3ccd7c937b17e70ea6e58c283e5836e5ccc0f3163e2a
4
- data.tar.gz: 6d08f7c25aa75ebd8fc5e64e009533bf02154521329e2de01789eee469462e86
3
+ metadata.gz: bfe5c703b08f1580b7b3bf603b45984d68c1ccaff5675b0243a838a190597366
4
+ data.tar.gz: b5af88cc968267fdbc9ae35806a0d6fef3fb749b1939ce42a19d635b00f0c767
5
5
  SHA512:
6
- metadata.gz: e4c6d223febbf5aec1aaccaa30ef9599aebf32903a8de3afe9fe62ffd8b1b928bfb5eef519551952c6a41d43c0be8b325af4436ad95d69a429949950772cf454
7
- data.tar.gz: a78ba804bc6b81fce03df6a85ea885ec809dba8f4c09ea5aed0d80007941149798dda64037ca3f68dbb3ea6d339fe362706ddfb530ada457b53a98a0a14dd6b5
6
+ metadata.gz: a29fe320a9c23065a6d897eab4acaf1e97b2303c11e0ec28854eb37bd50507a95247edee7a315dfa8b1e91af0be39ec79a1e4ec996220905084e9efa051fc285
7
+ data.tar.gz: cfcee2c4310365319915007a790d2962a88913180f21baae95857db5493c911fb09da9d152ac0993e01de4f684e141c73646466d1b31181fde85a8dbcde5196e
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.0 - 2022-01-26
6
+
7
+ ### Added
8
+
9
+ - Support output block in tag line.
10
+ - Support HTML comment line.
11
+ - Support HTML conditional comment line.
12
+ - Support Haml comment line.
13
+ - Support output line.
14
+ - Support control line.
15
+
5
16
  ## 0.2.0 - 2022-01-25
6
17
 
7
18
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hamli (0.2.0)
4
+ hamli (0.3.0)
5
5
  temple
6
6
 
7
7
  GEM
data/lib/hamli/parser.rb CHANGED
@@ -25,6 +25,16 @@ module Hamli
25
25
  parse_tag_line
26
26
  elsif @scanner.match?(/[#.]/)
27
27
  parse_div_line
28
+ elsif @scanner.match?(%r{/\[})
29
+ parse_html_conditional_comment_line
30
+ elsif @scanner.match?(%r{/})
31
+ parse_html_comment_line
32
+ elsif @scanner.match?(/-#/)
33
+ parse_haml_comment_line
34
+ elsif @scanner.match?(/-/)
35
+ parse_control_line
36
+ elsif @scanner.match?(/=/)
37
+ parse_output_line
28
38
  else
29
39
  parse_text_line
30
40
  end
@@ -110,10 +120,19 @@ module Hamli
110
120
  content = [:multi]
111
121
  tag << content
112
122
  @stacks << content
113
- elsif @scanner.scan(/[ \t]*=([<>])*/)
114
- # TODO
123
+ elsif @scanner.scan(/[ \t]*([<>]*)=/)
124
+ # white_space_marker = @scanner[1]
125
+ # without_outer_white_space = white_space_marker.include?('>') # TODO
126
+ # without_inner_white_space = white_space_marker.include?('<') # TODO
127
+ @scanner.skip(/[ \t]+/)
128
+ begin_ = @scanner.charpos
129
+ content = parse_broken_lines
130
+ end_ = @scanner.charpos
131
+ block = [:multi]
132
+ tag << [:hamli, :position, begin_, end_, [:hamli, :output, content, block]]
133
+ @stacks << block
115
134
  elsif @scanner.scan(%r{[ \t]*/[ \t]*})
116
- # TODO
135
+ # Does nothing.
117
136
  else
118
137
  @scanner.scan(/[ \t]+/)
119
138
  tag << [:hamli, :text, parse_text_block]
@@ -295,6 +314,49 @@ module Hamli
295
314
  [:hamli, :ruby_attributes, [:hamli, :position, begin_, @scanner.charpos, value]]
296
315
  end
297
316
 
317
+ # Parse HTML comment part.
318
+ # e.g. /[if IE]
319
+ # ^^^^^^^^
320
+ def parse_html_conditional_comment_line
321
+ @scanner.pos += 1
322
+ condition = @scanner.scan(
323
+ /
324
+ (?<brackets>
325
+ \[
326
+ (?:[^\[\]] | \g<brackets>)*
327
+ \]
328
+ )
329
+ /x
330
+ )
331
+ block = [:multi]
332
+ @stacks.last << [:html, :condcomment, condition, block]
333
+ @stacks << block
334
+ parse_line_ending
335
+ end
336
+
337
+ # Parse HTML comment part.
338
+ # e.g. / abc
339
+ # ^^^^^
340
+ def parse_html_comment_line
341
+ @scanner.pos += 1
342
+ block = [:multi]
343
+ block << [:static, @scanner.scan(/[^\r\n]*/)]
344
+ @stacks.last << [:html, :comment, block]
345
+ @stacks << block
346
+ parse_line_ending
347
+ end
348
+
349
+ # Parse Haml comment part.
350
+ # e.g. -# abc
351
+ # ^^^^^^
352
+ def parse_haml_comment_line
353
+ @scanner.pos += 2
354
+ while !@scanner.eos? && (@scanner.match?(/[ \t]*(?=\r|$)/) || peek_indent > @indents.last)
355
+ @scanner.skip(/[^\r\n]*/)
356
+ parse_line_ending
357
+ end
358
+ end
359
+
298
360
  # Parse text block part.
299
361
  # e.g. %div abc
300
362
  # ^^^^
@@ -334,6 +396,42 @@ module Hamli
334
396
  [:hamli, :interpolate, begin_, end_, value]
335
397
  end
336
398
 
399
+ # Parse output line part.
400
+ # e.g. = abc
401
+ # ^^^^^
402
+ def parse_output_line
403
+ parse_control_line(name: :output)
404
+ end
405
+
406
+ # Parse control line part.
407
+ # e.g. - abc
408
+ # ^^^^^
409
+ def parse_control_line(name: :control)
410
+ @scanner.pos += 1
411
+ @scanner.scan(/[ \t]*/)
412
+ block = [:multi]
413
+ begin_ = @scanner.charpos
414
+ content = parse_broken_lines
415
+ end_ = @scanner.charpos
416
+ @stacks.last << [:hamli, :position, begin_, end_, [:hamli, name, content, block]]
417
+ @stacks << block
418
+ end
419
+
420
+ # @note Broken line means line-breaked lines, separated by trailing "," or "|".
421
+ # @return [String]
422
+ def parse_broken_lines
423
+ result = +''
424
+ result << @scanner.scan(/[^\r\n]*/)
425
+ while result.end_with?(',') || result.end_with?('|')
426
+ syntax_error!(Errors::UnexpectedEosError) unless @scanner.scan(/\r?\n/)
427
+
428
+ result.delete_suffix('|')
429
+ result << "\n"
430
+ result << @scanner.scan(/[^\r\n]*/)
431
+ end
432
+ result
433
+ end
434
+
337
435
  # @param [Class] syntax_error_class A child class of Hamli::Errors::HamlSyntaxError.
338
436
  # @raise [Hamli::Errors::HamlSyntaxError]
339
437
  def syntax_error!(syntax_error_class)
@@ -364,5 +462,11 @@ module Hamli
364
462
  def expecting_indentation?
365
463
  @stacks.length > @indents.length
366
464
  end
465
+
466
+ # @return [Integer] Indent level.
467
+ def peek_indent
468
+ @scanner.match?(/[ \t]*/)
469
+ indent_from_last_match
470
+ end
367
471
  end
368
472
  end
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.2.0'
4
+ VERSION = '0.3.0'
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.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-25 00:00:00.000000000 Z
11
+ date: 2022-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: temple