hamlit 1.6.3 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2fcdd736eed726e665a108fc41bad6d5525bedca
4
- data.tar.gz: a6bd7ab15f0a06995eef5704105ea272288314e7
3
+ metadata.gz: cc6af6b57be662141cab0bb717a24bdaf2e2406f
4
+ data.tar.gz: 65ce818ede5672f94b126ec19cc3a210a28c705e
5
5
  SHA512:
6
- metadata.gz: f2727bfa9938f2aa332f160bcf716b91f70a14b6a4f1562bc21a0a94f5ff23285aa9f033928149f6ffdfe91a1570073569d5d92422ab28830a2f0eafdf688a3c
7
- data.tar.gz: f50b2affcf6a6a0b6150f7f6ac729aaeed8c8821126a5e654cf1f8220b7c7ec5e1989ee51e3da202feeb3415048645cd42d79257ac592014f086d7bbe5282836
6
+ metadata.gz: b1e3e8153d7f4978de1ab3992d46b67dd00399d7bb789a93a8d2b6e7c6c91a20e7662d93d99369f7f7faf4f7f12b260b499d98c34dea286fede0177ee81548e0
7
+ data.tar.gz: 04d290e8d75dc51ecd31e5c0f404bdb200b7d42fb528f2612054a05efeb59f8fb09c37b9297c780bf22087de3174070a5e51d1febca667c2a45080fd73eec1b1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## v1.6.4
2
+
3
+ - Show human-friendly error messages
4
+ - Fix line number of runtime syntax error
5
+ - Increase the number of checked cases for illegal nesting
6
+ - Thanks to @eagletmt
7
+
1
8
  ## v1.6.3
2
9
 
3
10
  - Fix ! and & parsing inside a tag
@@ -52,8 +52,9 @@ module Hamlit
52
52
  @indent_space = @indent_logs.last
53
53
  end
54
54
  validate_indentation_consistency!(indent)
55
+ reject_too_deep_indentation!
55
56
 
56
- next_indent != @current_indent
57
+ next_indent < @current_indent
57
58
  end
58
59
 
59
60
  def has_block?
@@ -70,12 +71,30 @@ module Hamlit
70
71
  return false if indent.empty?
71
72
  return false if !@indent_space || @indent_space.empty?
72
73
 
73
- if indent[0] != @indent_space[0] || indent.length < @indent_space.length
74
+ unless acceptable_indent?(indent)
74
75
  syntax_error!("Inconsistent indentation: #{indent_label(indent)} used for indentation, "\
75
76
  "but the rest of the document was indented using #{indent_label(@indent_space)}.")
76
77
  end
77
78
  end
78
79
 
80
+ def acceptable_indent?(indent)
81
+ indent = indent.dup
82
+ while indent.match(/^#{@indent_space}/)
83
+ indent.gsub!(/^#{@indent_space}/, '')
84
+ end
85
+ indent.empty?
86
+ end
87
+
88
+ def reject_too_deep_indentation!
89
+ return if next_indent <= @current_indent
90
+
91
+ if @indent_logs.length == 1
92
+ syntax_error!('Indenting at the beginning of the document is illegal.')
93
+ else
94
+ syntax_error!("The line was indented #{next_indent - count_indent(current_line)} levels deeper than the previous line.")
95
+ end
96
+ end
97
+
79
98
  def indent_label(indent)
80
99
  return %Q{"#{indent}"} if indent.include?(' ') && indent.include?("\t")
81
100
 
data/lib/hamlit/parser.rb CHANGED
@@ -62,6 +62,7 @@ module Hamlit
62
62
  end
63
63
  ast
64
64
  rescue => e
65
+ ast << [:newline]
65
66
  ast << syntax_error(e.message)
66
67
  ast
67
68
  end
@@ -117,7 +118,7 @@ module Hamlit
117
118
  when '=', '~'
118
119
  parse_script(scanner)
119
120
  else
120
- parse_text(scanner, lstrip: true)
121
+ parse_text(scanner, lstrip: true, inline: inline)
121
122
  end
122
123
  end
123
124
 
@@ -16,6 +16,9 @@ module Hamlit
16
16
  content = with_indented { parse_lines }
17
17
  return ast << [:multi, [:static, "\n"], *content]
18
18
  elsif !text.match(/\[.*\]/)
19
+ if has_block?
20
+ syntax_error!('Illegal nesting: nesting within a tag that already has content is illegal.')
21
+ end
19
22
  return ast << [:static, " #{text} "]
20
23
  end
21
24
 
@@ -32,6 +32,7 @@ module Hamlit
32
32
  elsif scanner.match?(/\//)
33
33
  return syntax_error("Illegal nesting: nesting within a self-closing tag is illegal.")
34
34
  end
35
+ validate_content_existence!(tag, scanner)
35
36
 
36
37
  content = [:multi, [:static, "\n"]]
37
38
  if inner_removal || Helpers::DEFAULT_PRESERVE_TAGS.include?(tag)
@@ -64,6 +65,14 @@ module Hamlit
64
65
  end
65
66
  ast
66
67
  end
68
+
69
+ def validate_content_existence!(tag, scanner)
70
+ scanner.scan(/ */)
71
+
72
+ if scanner.match?(/[^ ]/)
73
+ syntax_error!("Illegal nesting: content can't be both given on the same line as %#{tag} and nested within it.")
74
+ end
75
+ end
67
76
  end
68
77
  end
69
78
  end
@@ -5,12 +5,24 @@ module Hamlit
5
5
  module Text
6
6
  include Concerns::Error
7
7
 
8
- def parse_text(scanner, lstrip: false, escape: true, scan: nil)
8
+ def parse_text(scanner, lstrip: false, escape: true, scan: nil, inline: true)
9
+ reject_text_nesting! unless inline
10
+
9
11
  scanner.scan(scan) if scan
10
12
  text = (scanner.scan(/.+/) || '')
11
13
  text = text.lstrip if lstrip
12
14
  [:haml, :text, text, escape]
13
15
  end
16
+
17
+ private
18
+
19
+ def reject_text_nesting!
20
+ return unless next_line
21
+
22
+ if next_indent > @current_indent
23
+ syntax_error!('Illegal nesting: nesting within plain text is illegal.')
24
+ end
25
+ end
14
26
  end
15
27
  end
16
28
  end
@@ -1,3 +1,3 @@
1
1
  module Hamlit
2
- VERSION = "1.6.3"
2
+ VERSION = "1.6.4"
3
3
  end
@@ -84,5 +84,52 @@ describe Hamlit::Engine do
84
84
  HAML
85
85
  to raise_error(Hamlit::SyntaxError, "Illegal nesting: nesting within a self-closing tag is illegal.")
86
86
  end
87
+
88
+ it 'rejects illegal indentation' do
89
+ expect { render_string(<<-HAML.unindent) }.
90
+ hello
91
+ world
92
+ HAML
93
+ to raise_error(Hamlit::SyntaxError, 'Illegal nesting: nesting within plain text is illegal.')
94
+ end
95
+
96
+ it 'rejects illegal indentation' do
97
+ expect { render_string(<<-HAML.unindent) }.
98
+ %span hello
99
+ world
100
+ HAML
101
+ to raise_error(Hamlit::SyntaxError, "Illegal nesting: content can't be both given on the same line as %span and nested within it.")
102
+ end
103
+
104
+ it 'rejects illegal indentation' do
105
+ expect { render_string(<<-HAML.unindent) }.
106
+ / hello
107
+ world
108
+ HAML
109
+ to raise_error(Hamlit::SyntaxError, 'Illegal nesting: nesting within a tag that already has content is illegal.')
110
+ end
111
+
112
+ it 'rejects illegal indentation' do
113
+ expect { render_string(<<-HAML.unindent) }.
114
+ %span
115
+ %span
116
+ %span
117
+ HAML
118
+ to raise_error(Hamlit::SyntaxError, 'The line was indented 2 levels deeper than the previous line.')
119
+ end
120
+
121
+ it 'rejects illegal indentation' do
122
+ expect { render_string(<<-HAML.unindent) }.
123
+ %span
124
+ %span
125
+ %span
126
+ HAML
127
+ to raise_error(Hamlit::SyntaxError, "Inconsistent indentation: 6 spaces used for indentation, but the rest of the document was indented using 4 spaces.")
128
+ end
129
+
130
+ it 'rejects illegal indentation' do
131
+ expect { render_string(' hello') }.
132
+ to raise_error(Hamlit::SyntaxError, 'Indenting at the beginning of the document is illegal.')
133
+ end
87
134
  end
88
135
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamlit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.3
4
+ version: 1.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun