hamlit 1.6.0 → 1.6.1

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: 7a47c046855e5faac3109a4e63a42c5502b9acbd
4
- data.tar.gz: 2ea9635b5945fd898e6f42f7f32646bc7e038a6b
3
+ metadata.gz: 4848cd3ee1ccb8ba77acac4389eaadeca802b145
4
+ data.tar.gz: 13c163d9c67e46d506686337b09979a65020cf62
5
5
  SHA512:
6
- metadata.gz: abfde39c2619670875b887f41700a4b0f7335f9b724f12ede0fcbfe833acff62dd100781e1fb9be2b3023c2826cb67f7f053f0d261199548f7925e09f9252291
7
- data.tar.gz: 4782d6de4f657b871ab423e6af14b4f8d2f72ab82a6b8e6c903dfeec5fa264b02f4499ac72eabd6c588f89d3c24f5b013f43302fc67c4881850e57aa048e3269
6
+ metadata.gz: babb6f83c927734400646d758cf9c2e412ceeb416e77613031b97465b93cf71158d5f0549c940e81c58bec086634e7968d23b3d2b8649bb6b1f32cc48b3a6e94
7
+ data.tar.gz: a7afb822afce6b75d1fffd69d292146c3d2b86edc0b66a57ff3b865a9847d8f1eab291fe733f9216a8e39ce6fa5ec18b819244eef8234852b858ca9377a931c4
@@ -1,7 +1,13 @@
1
+ ## v1.6.1
2
+
3
+ - Parse N-space indentation
4
+
1
5
  ## v1.6.0
2
6
 
3
7
  - Fix line number of compiled code for new attributes
4
8
  - Render HTML entities normally for plain text
9
+ - https://github.com/k0kubun/hamlit/issues/27
10
+ - Thanks to @jeffblake
5
11
 
6
12
  ## v1.5.9
7
13
 
@@ -22,3 +22,32 @@
22
22
 
23
23
  ```
24
24
 
25
+
26
+ # [indent\_spec.rb:28](/spec/hamlit/engine/indent_spec.rb#L28)
27
+ ## Input
28
+ ```haml
29
+ %p
30
+ %span
31
+ foo
32
+
33
+ ```
34
+
35
+ ## Output
36
+ ### Haml, Hamlit
37
+ ```html
38
+ <p>
39
+ <span>
40
+ foo
41
+ </span>
42
+ </p>
43
+
44
+ ```
45
+
46
+ ### Faml
47
+ ```html
48
+ <p></p>
49
+ %span
50
+ foo
51
+
52
+ ```
53
+
@@ -50,7 +50,7 @@ Haml::SyntaxError: Illegal element: classes and ids must have values.
50
50
  ```
51
51
 
52
52
  ## Output
53
- ### Haml
53
+ ### Haml, Hamlit
54
54
  ```html
55
55
  &nbsp;
56
56
  &nbsp;
@@ -59,7 +59,7 @@ Haml::SyntaxError: Illegal element: classes and ids must have values.
59
59
 
60
60
  ```
61
61
 
62
- ### Faml, Hamlit
62
+ ### Faml
63
63
  ```html
64
64
  nbsp;
65
65
  &nbsp;
@@ -22,3 +22,32 @@
22
22
 
23
23
  ```
24
24
 
25
+
26
+ # [indent\_spec.rb:28](/spec/hamlit/engine/indent_spec.rb#L28)
27
+ ## Input
28
+ ```haml
29
+ %p
30
+ %span
31
+ foo
32
+
33
+ ```
34
+
35
+ ## Output
36
+ ### Faml
37
+ ```html
38
+ <p></p>
39
+ %span
40
+ foo
41
+
42
+ ```
43
+
44
+ ### Hamlit
45
+ ```html
46
+ <p>
47
+ <span>
48
+ foo
49
+ </span>
50
+ </p>
51
+
52
+ ```
53
+
@@ -33,3 +33,33 @@
33
33
 
34
34
  ```
35
35
 
36
+
37
+ # [text\_spec.rb:118](/spec/hamlit/engine/text_spec.rb#L118)
38
+ ## Input
39
+ ```haml
40
+ &nbsp;
41
+ \&nbsp;
42
+ !hello
43
+ \!hello
44
+
45
+ ```
46
+
47
+ ## Output
48
+ ### Faml
49
+ ```html
50
+ nbsp;
51
+ &nbsp;
52
+ hello
53
+ !hello
54
+
55
+ ```
56
+
57
+ ### Hamlit
58
+ ```html
59
+ &nbsp;
60
+ &nbsp;
61
+ !hello
62
+ !hello
63
+
64
+ ```
65
+
@@ -27,33 +27,3 @@ Haml::SyntaxError: Illegal element: classes and ids must have values.
27
27
 
28
28
  ```
29
29
 
30
-
31
- # [text\_spec.rb:118](/spec/hamlit/engine/text_spec.rb#L118)
32
- ## Input
33
- ```haml
34
- &nbsp;
35
- \&nbsp;
36
- !hello
37
- \!hello
38
-
39
- ```
40
-
41
- ## Output
42
- ### Haml
43
- ```html
44
- &nbsp;
45
- &nbsp;
46
- !hello
47
- !hello
48
-
49
- ```
50
-
51
- ### Hamlit
52
- ```html
53
- nbsp;
54
- &nbsp;
55
- hello
56
- !hello
57
-
58
- ```
59
-
@@ -8,12 +8,14 @@ module Hamlit
8
8
  include Concerns::Error
9
9
 
10
10
  def reset_indent
11
+ @indent_logs = []
11
12
  @current_indent = 0
12
13
  end
13
14
 
14
15
  # Return nearest line's indent level since next line. This method ignores
15
16
  # empty line. It returns -1 if next_line does not exist.
16
17
  def next_indent
18
+ return 1 if !@indent_space && fetch_indent(next_line).length > 0
17
19
  count_indent(next_line)
18
20
  end
19
21
 
@@ -28,19 +30,16 @@ module Hamlit
28
30
  @current_indent -= 1
29
31
  end
30
32
 
31
- def count_indent(line, strict: false)
33
+ def count_indent(line)
32
34
  return EOF unless line
33
- width = count_width(line)
35
+ return 0 if indent_rule == 0
34
36
 
35
- return (width + 1) / 2 unless strict
36
- compile_error!('Expected to count even-width indent') if width.odd?
37
-
38
- width / 2
37
+ line.match(/\A[ \t]+/).to_s.length / indent_rule
39
38
  end
40
39
 
41
40
  def count_width(line)
42
41
  return EOF unless line
43
- line[/\A +/].to_s.length
42
+ line[/\A[ \t]+/].to_s.length
44
43
  end
45
44
 
46
45
  def same_indent?(line)
@@ -50,31 +49,30 @@ module Hamlit
50
49
 
51
50
  # Validate current line's indentation
52
51
  def validate_indentation!(ast)
53
- width = next_width
54
- return false if width == @current_indent * 2
55
-
56
- if width != Hamlit::EOF && (width > @current_indent * 2 || width.odd?)
57
- ast << [:newline]
58
- ast << syntax_error(
59
- "inconsistent indentation: #{2 * @current_indent} spaces used for indentation, "\
60
- "but the rest of the document was indented using #{width} spaces"
61
- )
52
+ return true unless next_line
53
+
54
+ indent = fetch_indent(next_line)
55
+ if indent.include?(' ') && indent.include?("\t")
56
+ syntax_error!("Indentation can't use both tabs and spaces.")
57
+ end
58
+ @indent_logs << indent
59
+
60
+ if !@indent_space && @indent_logs.last != ''
61
+ @indent_space = @indent_logs.last
62
62
  end
63
- true
63
+ validate_indentation_consistency!(indent)
64
+
65
+ next_indent != @current_indent
64
66
  end
65
67
 
66
68
  # Validate the template is using consitent indentation, 2 spaces or a tab.
67
- def validate_indentation_consistency!(template)
68
- last_indent = ''
69
-
70
- indents = template.scan(/^[ \t]+/)
71
- indents.each do |indent|
72
- if last_indent.include?(' ') && indent.include?("\t") ||
73
- last_indent.include?("\t") && indent.include?(' ')
74
- syntax_error!(%Q{Inconsistent indentation: #{indent_label(indent)} used for indentation, but the rest of the document was indented using #{indent_label(last_indent)}.})
75
- end
69
+ def validate_indentation_consistency!(indent)
70
+ return false if indent.empty?
71
+ return false if !@indent_space || @indent_space.empty?
76
72
 
77
- last_indent = indent
73
+ if indent[0] != @indent_space[0] || indent.length < @indent_space.length
74
+ syntax_error!("Inconsistent indentation: #{indent_label(indent)} used for indentation, "\
75
+ "but the rest of the document was indented using #{indent_label(@indent_space)}.")
78
76
  end
79
77
  end
80
78
 
@@ -87,20 +85,44 @@ module Hamlit
87
85
  "#{length} #{label}#{'s' if length > 1}"
88
86
  end
89
87
 
90
- # Replace hard tabs into 2 spaces
91
- def replace_hard_tabs(template)
92
- lines = []
93
- template.each_line do |line|
94
- lines << line.gsub(/^\t+/) do |match|
95
- ' ' * (match.length * 2)
96
- end
97
- end
98
- lines.join
99
- end
100
-
101
88
  def has_block?
89
+ return false unless next_line
90
+ return fetch_indent(next_line).length > 0 unless @indent_space
91
+
102
92
  next_indent > @current_indent
103
93
  end
94
+
95
+ private
96
+
97
+ def indent_label(indent)
98
+ return %Q{"#{indent}"} if indent.include?(' ') && indent.include?("\t")
99
+
100
+ label = indent.include?(' ') ? 'space' : 'tab'
101
+ length = indent.match(/[ \t]+/).to_s.length
102
+
103
+ "#{length} #{label}#{'s' if length > 1}"
104
+ end
105
+
106
+ def count_width(line)
107
+ return EOF unless line
108
+ line[/\A +/].to_s.length
109
+ end
110
+
111
+ def next_space
112
+ next_line[/\A +/].to_s
113
+ end
114
+
115
+ def next_width
116
+ count_width(next_line)
117
+ end
118
+
119
+ def indent_rule
120
+ (@indent_space || '').length
121
+ end
122
+
123
+ def fetch_indent(str)
124
+ str.match(/^[ \t]+/).to_s
125
+ end
104
126
  end
105
127
  end
106
128
  end
@@ -25,7 +25,7 @@ module Hamlit
25
25
  end
26
26
 
27
27
  def skip_lines
28
- while next_indent >= @current_indent
28
+ while next_line && next_indent >= @current_indent
29
29
  @current_lineno += 1
30
30
  end
31
31
  end
@@ -47,7 +47,8 @@ module Hamlit
47
47
  end
48
48
 
49
49
  def read_line?
50
- return true if count_indent(next_line, strict: false) >= @current_indent
50
+ return false unless next_line
51
+ return true if next_line.index(/^#{@indent_logs.last}[ \t]/)
51
52
 
52
53
  line = @lines[@current_lineno + 1]
53
54
  return false unless line
@@ -38,7 +38,6 @@ module Hamlit
38
38
  # Reset the parser state.
39
39
  def reset(template)
40
40
  validate_indentation_consistency!(template)
41
- template = replace_hard_tabs(template)
42
41
  template = preprocess_multilines(template)
43
42
 
44
43
  reset_lines(template.split("\n"))
@@ -62,6 +61,9 @@ module Hamlit
62
61
  ast << [:static, "\n"] unless skip_newline?(node)
63
62
  end
64
63
  ast
64
+ rescue => e
65
+ ast << syntax_error(e.message)
66
+ ast
65
67
  end
66
68
 
67
69
  # Parse current line and return AST.
@@ -69,7 +71,7 @@ module Hamlit
69
71
  return [:multi] if empty_line?(line)
70
72
 
71
73
  scanner = wrap_scanner(line)
72
- scanner.scan(/ +/)
74
+ scanner.scan(/[ \t]+/)
73
75
 
74
76
  unless inline
75
77
  ast = parse_outer_line(scanner)
@@ -1,3 +1,3 @@
1
1
  module Hamlit
2
- VERSION = "1.6.0"
2
+ VERSION = "1.6.1"
3
3
  end
@@ -11,16 +11,18 @@ describe Hamlit::Engine do
11
11
  expect { render_string(<<-HAML.unindent) }.
12
12
  %a
13
13
  %b
14
+ %a
14
15
  HAML
15
- to raise_error(Hamlit::SyntaxError, 'inconsistent indentation: 2 spaces used for indentation, but the rest of the document was indented using 4 spaces')
16
+ to raise_error(Hamlit::SyntaxError, 'Inconsistent indentation: 1 space used for indentation, but the rest of the document was indented using 4 spaces.')
16
17
  end
17
18
 
18
19
  it 'raises syntax error for illegal indentation' do
19
20
  expect { render_string(<<-HAML.unindent) }.
20
21
  %a
21
- %b
22
+ \t\t%a
23
+ \t%a
22
24
  HAML
23
- to raise_error(Hamlit::SyntaxError, 'inconsistent indentation: 2 spaces used for indentation, but the rest of the document was indented using 1 spaces')
25
+ to raise_error(Hamlit::SyntaxError, 'Inconsistent indentation: 1 tab used for indentation, but the rest of the document was indented using 2 tabs.')
24
26
  end
25
27
 
26
28
  it 'raises syntax error which has correct line number in backtrace' do
@@ -59,5 +61,13 @@ describe Hamlit::Engine do
59
61
  HAML
60
62
  to raise_error(Hamlit::SyntaxError, 'Unbalanced brackets.')
61
63
  end
64
+
65
+ it 'raises syntax error for an inconsistent indentation' do
66
+ expect { render_string(<<-HAML.unindent) }.
67
+ %p
68
+ \t %span
69
+ HAML
70
+ to raise_error(Hamlit::SyntaxError, "Indentation can't use both tabs and spaces.")
71
+ end
62
72
  end
63
73
  end
@@ -10,5 +10,33 @@ describe Hamlit::Engine do
10
10
  </p>
11
11
  HTML
12
12
  end
13
+
14
+ it 'accepts N-space indentation' do
15
+ assert_render(<<-HAML, <<-HTML)
16
+ %p
17
+ %span
18
+ foo
19
+ HAML
20
+ <p>
21
+ <span>
22
+ foo
23
+ </span>
24
+ </p>
25
+ HTML
26
+ end
27
+
28
+ it 'accepts N-tab indentation' do
29
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
30
+ %p
31
+ \t%span
32
+ \t\tfoo
33
+ HAML
34
+ <p>
35
+ <span>
36
+ foo
37
+ </span>
38
+ </p>
39
+ HTML
40
+ end
13
41
  end
14
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamlit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-10 00:00:00.000000000 Z
11
+ date: 2015-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -603,3 +603,4 @@ test_files:
603
603
  - spec/spec_helper/document_generator.rb
604
604
  - spec/spec_helper/render_helper.rb
605
605
  - spec/spec_helper/test_case.rb
606
+ has_rdoc: