haml 6.0.0.beta.1-java → 6.0.0.beta.2-java
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 +4 -4
- data/CHANGELOG.md +1 -0
- data/lib/haml/compiler.rb +1 -1
- data/lib/haml/error.rb +52 -2
- data/lib/haml/parser.rb +34 -29
- data/lib/haml/version.rb +1 -1
- metadata +2 -3
- data/lib/haml/haml_error.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2322a046f4730787bbca00088c2bd6068617768a1184a0e78c50d3062f011ac4
|
4
|
+
data.tar.gz: f68acb48034434b2da559fa0b2cfc0de158c26d9d6f73fa991345d12e5adb672
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c4e60d1a78c55ff590ecb118c3f4f547499141717313cc86a7419199271c9284e433f38cd9f3f2675d865806c53fff32411376383dee9afbc167e0131d7e9f8
|
7
|
+
data.tar.gz: 0d73d345ce0a24282e735648089cf0435ebfac56a4dc1f9a2b8f6fd9586b121ef31cf0202eac9f16eaf41ecba5361c611cc61750ce22371c5a9000d99dd717b8
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,7 @@ Not released yet
|
|
8
8
|
* Replace the implementation with Hamlit
|
9
9
|
* Haml 6 is about 1.7x faster than Haml 5 in [this benchmark](benchmark/slim/run-benchmarks.rb).
|
10
10
|
* The parser is kept as is, but everything else is replaced.
|
11
|
+
* The `haml` CLI interface was also replaced.
|
11
12
|
* All Haml helpers except for `preserve` are removed.
|
12
13
|
* Some legacy Rails integration is removed.
|
13
14
|
|
data/lib/haml/compiler.rb
CHANGED
data/lib/haml/error.rb
CHANGED
@@ -1,16 +1,66 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Haml
|
3
|
-
# TODO: unify Haml::Error (former Hamlit::Error) and Haml::HamlError (former Haml::Error)
|
4
3
|
class Error < StandardError
|
4
|
+
MESSAGES = {
|
5
|
+
bad_script_indent: '"%s" is indented at wrong level: expected %d, but was at %d.',
|
6
|
+
cant_run_filter: 'Can\'t run "%s" filter; you must require its dependencies first',
|
7
|
+
cant_use_tabs_and_spaces: "Indentation can't use both tabs and spaces.",
|
8
|
+
deeper_indenting: "The line was indented %d levels deeper than the previous line.",
|
9
|
+
filter_not_defined: 'Filter "%s" is not defined.',
|
10
|
+
gem_install_filter_deps: '"%s" filter\'s %s dependency missing: try installing it or adding it to your Gemfile',
|
11
|
+
illegal_element: "Illegal element: classes and ids must have values.",
|
12
|
+
illegal_nesting_content: "Illegal nesting: nesting within a tag that already has content is illegal.",
|
13
|
+
illegal_nesting_header: "Illegal nesting: nesting within a header command is illegal.",
|
14
|
+
illegal_nesting_line: "Illegal nesting: content can't be both given on the same line as %%%s and nested within it.",
|
15
|
+
illegal_nesting_plain: "Illegal nesting: nesting within plain text is illegal.",
|
16
|
+
illegal_nesting_self_closing: "Illegal nesting: nesting within a self-closing tag is illegal.",
|
17
|
+
inconsistent_indentation: "Inconsistent indentation: %s used for indentation, but the rest of the document was indented using %s.",
|
18
|
+
indenting_at_start: "Indenting at the beginning of the document is illegal.",
|
19
|
+
install_haml_contrib: 'To use the "%s" filter, please install the haml-contrib gem.',
|
20
|
+
invalid_attribute_list: 'Invalid attribute list: %s.',
|
21
|
+
invalid_filter_name: 'Invalid filter name ":%s".',
|
22
|
+
invalid_tag: 'Invalid tag: "%s".',
|
23
|
+
missing_if: 'Got "%s" with no preceding "if"',
|
24
|
+
no_ruby_code: "There's no Ruby code for %s to evaluate.",
|
25
|
+
self_closing_content: "Self-closing tags can't have content.",
|
26
|
+
unbalanced_brackets: 'Unbalanced brackets.',
|
27
|
+
no_end: <<-END
|
28
|
+
You don't need to use "- end" in Haml. Un-indent to close a block:
|
29
|
+
- if foo?
|
30
|
+
%strong Foo!
|
31
|
+
- else
|
32
|
+
Not foo.
|
33
|
+
%p This line is un-indented, so it isn't part of the "if" block
|
34
|
+
END
|
35
|
+
}.freeze
|
36
|
+
|
37
|
+
def self.message(key, *args)
|
38
|
+
string = MESSAGES[key] or raise "[HAML BUG] No error messages for #{key}"
|
39
|
+
(args.empty? ? string : string % args).rstrip
|
40
|
+
end
|
41
|
+
|
42
|
+
# The line of the template on which the error occurred.
|
43
|
+
#
|
44
|
+
# @return [Fixnum]
|
5
45
|
attr_reader :line
|
6
46
|
|
47
|
+
# @param message [String] The error message
|
48
|
+
# @param line [Fixnum] See \{#line}
|
7
49
|
def initialize(message = nil, line = nil)
|
8
50
|
super(message)
|
9
51
|
@line = line
|
10
52
|
end
|
11
53
|
end
|
12
54
|
|
55
|
+
# SyntaxError is the type of exception raised when Haml encounters an
|
56
|
+
# ill-formatted document.
|
57
|
+
# It's not particularly interesting,
|
58
|
+
# except in that it's a subclass of {Haml::Error}.
|
13
59
|
class SyntaxError < Error; end
|
14
|
-
|
60
|
+
|
61
|
+
# An invalid filter name was used.
|
15
62
|
class FilterNotFound < Error; end
|
63
|
+
|
64
|
+
# InternalError means that you hit a bug of Haml itself.
|
65
|
+
class InternalError < Error; end
|
16
66
|
end
|
data/lib/haml/parser.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'ripper'
|
4
4
|
require 'strscan'
|
5
|
-
require 'haml/
|
5
|
+
require 'haml/error'
|
6
6
|
require 'haml/util'
|
7
7
|
|
8
8
|
module Haml
|
@@ -103,6 +103,10 @@ module Haml
|
|
103
103
|
@script_level_stack = []
|
104
104
|
@template_index = 0
|
105
105
|
@template_tabs = 0
|
106
|
+
# When used in Haml::Engine, which gives options[:generator] to every filter
|
107
|
+
# in the engine, including Haml::Parser, we don't want to throw exceptions.
|
108
|
+
# However, when Haml::Parser is used as a library, we want to throw exceptions.
|
109
|
+
@raise_error = !options.key?(:generator)
|
106
110
|
end
|
107
111
|
|
108
112
|
def call(template)
|
@@ -125,7 +129,7 @@ module Haml
|
|
125
129
|
@indentation = nil
|
126
130
|
@line = next_line
|
127
131
|
|
128
|
-
raise
|
132
|
+
raise SyntaxError.new(Error.message(:indenting_at_start), @line.index) if @line.tabs != 0
|
129
133
|
|
130
134
|
loop do
|
131
135
|
next_line
|
@@ -148,7 +152,7 @@ module Haml
|
|
148
152
|
end
|
149
153
|
|
150
154
|
if !flat? && @next_line.tabs - @line.tabs > 1
|
151
|
-
raise
|
155
|
+
raise SyntaxError.new(Error.message(:deeper_indenting, @next_line.tabs - @line.tabs), @next_line.index)
|
152
156
|
end
|
153
157
|
|
154
158
|
@line = @next_line
|
@@ -156,8 +160,9 @@ module Haml
|
|
156
160
|
# Close all the open tags
|
157
161
|
close until @parent.type == :root
|
158
162
|
@root
|
159
|
-
rescue Haml::
|
163
|
+
rescue Haml::Error => e
|
160
164
|
e.backtrace.unshift "#{@options.filename}:#{(e.line ? e.line + 1 : @line.index + 1) + @options.line - 1}"
|
165
|
+
raise if @raise_error
|
161
166
|
error_with_lineno(e)
|
162
167
|
end
|
163
168
|
|
@@ -168,7 +173,7 @@ module Haml
|
|
168
173
|
@indentation = line.whitespace
|
169
174
|
|
170
175
|
if @indentation.include?(?\s) && @indentation.include?(?\t)
|
171
|
-
raise
|
176
|
+
raise SyntaxError.new(Error.message(:cant_use_tabs_and_spaces), line.index)
|
172
177
|
end
|
173
178
|
|
174
179
|
@flat_spaces = @indentation * (@template_tabs+1) if flat?
|
@@ -179,11 +184,11 @@ module Haml
|
|
179
184
|
return tabs if line.whitespace == @indentation * tabs
|
180
185
|
return @template_tabs + 1 if flat? && line.whitespace =~ /^#{@flat_spaces}/
|
181
186
|
|
182
|
-
message =
|
187
|
+
message = Error.message(:inconsistent_indentation,
|
183
188
|
human_indentation(line.whitespace),
|
184
189
|
human_indentation(@indentation)
|
185
190
|
)
|
186
|
-
raise
|
191
|
+
raise SyntaxError.new(message, line.index)
|
187
192
|
end
|
188
193
|
|
189
194
|
private
|
@@ -195,7 +200,7 @@ module Haml
|
|
195
200
|
return error unless trace
|
196
201
|
|
197
202
|
line = trace.match(/\d+\z/).to_s.to_i
|
198
|
-
|
203
|
+
SyntaxError.new(error.message, line)
|
199
204
|
end
|
200
205
|
|
201
206
|
# @private
|
@@ -320,7 +325,7 @@ module Haml
|
|
320
325
|
|
321
326
|
def plain(line, escape_html = nil)
|
322
327
|
if block_opened?
|
323
|
-
raise
|
328
|
+
raise SyntaxError.new(Error.message(:illegal_nesting_plain), @next_line.index)
|
324
329
|
end
|
325
330
|
|
326
331
|
unless Util.contains_interpolation?(line.text)
|
@@ -333,7 +338,7 @@ module Haml
|
|
333
338
|
end
|
334
339
|
|
335
340
|
def script(line, escape_html = nil, preserve = false)
|
336
|
-
raise
|
341
|
+
raise SyntaxError.new(Error.message(:no_ruby_code, '=')) if line.text.empty?
|
337
342
|
line = handle_ruby_multiline(line)
|
338
343
|
escape_html = @options.escape_html if escape_html.nil?
|
339
344
|
|
@@ -345,12 +350,12 @@ module Haml
|
|
345
350
|
end
|
346
351
|
|
347
352
|
def flat_script(line, escape_html = nil)
|
348
|
-
raise
|
353
|
+
raise SyntaxError.new(Error.message(:no_ruby_code, '~')) if line.text.empty?
|
349
354
|
script(line, escape_html, :preserve)
|
350
355
|
end
|
351
356
|
|
352
357
|
def silent_script(line)
|
353
|
-
raise
|
358
|
+
raise SyntaxError.new(Error.message(:no_end), line.index) if line.text[1..-1].strip == 'end'
|
354
359
|
|
355
360
|
line = handle_ruby_multiline(line)
|
356
361
|
keyword = block_keyword(line.text)
|
@@ -359,7 +364,7 @@ module Haml
|
|
359
364
|
|
360
365
|
if ["else", "elsif", "when"].include?(keyword)
|
361
366
|
if @script_level_stack.empty?
|
362
|
-
raise Haml::
|
367
|
+
raise Haml::SyntaxError.new(Error.message(:missing_if, keyword), @line.index)
|
363
368
|
end
|
364
369
|
|
365
370
|
if keyword == 'when' and !@script_level_stack.last[2]
|
@@ -370,8 +375,8 @@ module Haml
|
|
370
375
|
end
|
371
376
|
|
372
377
|
if @script_level_stack.last[1] != @line.tabs
|
373
|
-
message =
|
374
|
-
raise Haml::
|
378
|
+
message = Error.message(:bad_script_indent, keyword, @script_level_stack.last[1], @line.tabs)
|
379
|
+
raise Haml::SyntaxError.new(message, @line.index)
|
375
380
|
end
|
376
381
|
end
|
377
382
|
|
@@ -460,12 +465,12 @@ module Haml
|
|
460
465
|
dynamic_attributes.old = attributes_hashes[:old] unless static_attributes || @options.suppress_eval
|
461
466
|
end
|
462
467
|
|
463
|
-
raise
|
464
|
-
raise
|
465
|
-
raise
|
468
|
+
raise SyntaxError.new(Error.message(:illegal_nesting_self_closing), @next_line.index) if block_opened? && self_closing
|
469
|
+
raise SyntaxError.new(Error.message(:no_ruby_code, action), last_line - 1) if parse && value.empty?
|
470
|
+
raise SyntaxError.new(Error.message(:self_closing_content), last_line - 1) if self_closing && !value.empty?
|
466
471
|
|
467
472
|
if block_opened? && !value.empty? && !is_ruby_multiline?(value)
|
468
|
-
raise
|
473
|
+
raise SyntaxError.new(Error.message(:illegal_nesting_line, tag_name), @next_line.index)
|
469
474
|
end
|
470
475
|
|
471
476
|
self_closing ||= !!(!block_opened? && value.empty? && @options.autoclose.any? {|t| t === tag_name})
|
@@ -509,7 +514,7 @@ module Haml
|
|
509
514
|
end
|
510
515
|
|
511
516
|
if block_opened? && !text.empty?
|
512
|
-
raise
|
517
|
+
raise SyntaxError.new(Haml::Error.message(:illegal_nesting_content), @next_line.index)
|
513
518
|
end
|
514
519
|
|
515
520
|
ParseNode.new(:comment, @line.index + 1, :conditional => conditional, :text => text, :revealed => revealed, :parse => parse)
|
@@ -517,13 +522,13 @@ module Haml
|
|
517
522
|
|
518
523
|
# Renders an XHTML doctype or XML shebang.
|
519
524
|
def doctype(text)
|
520
|
-
raise
|
525
|
+
raise SyntaxError.new(Error.message(:illegal_nesting_header), @next_line.index) if block_opened?
|
521
526
|
version, type, encoding = text[3..-1].strip.downcase.scan(DOCTYPE_REGEX)[0]
|
522
527
|
ParseNode.new(:doctype, @line.index + 1, :version => version, :type => type, :encoding => encoding)
|
523
528
|
end
|
524
529
|
|
525
530
|
def filter(name)
|
526
|
-
raise
|
531
|
+
raise Error.new(Error.message(:invalid_filter_name, name)) unless name =~ /^\w+$/
|
527
532
|
|
528
533
|
if filter_opened?
|
529
534
|
@flat = true
|
@@ -621,12 +626,12 @@ module Haml
|
|
621
626
|
# Parses a line into tag_name, attributes, attributes_hash, object_ref, action, value
|
622
627
|
def parse_tag(text)
|
623
628
|
match = text.scan(/%([-:\w]+)([-:\w.#\@]*)(.+)?/)[0]
|
624
|
-
raise
|
629
|
+
raise SyntaxError.new(Error.message(:invalid_tag, text)) unless match
|
625
630
|
|
626
631
|
tag_name, attributes, rest = match
|
627
632
|
|
628
633
|
if !attributes.empty? && (attributes =~ /[.#](\.|#|\z)/)
|
629
|
-
raise
|
634
|
+
raise SyntaxError.new(Error.message(:illegal_element))
|
630
635
|
end
|
631
636
|
|
632
637
|
new_attributes_hash = old_attributes_hash = last_line = nil
|
@@ -685,8 +690,8 @@ module Haml
|
|
685
690
|
# 1 more :on_embexpr_end (the last '}') than :on_embexpr_beg, and resurrects '{' afterwards.
|
686
691
|
balanced, rest = balance_tokens(text.sub(?{, METHOD_CALL_PREFIX), :on_embexpr_beg, :on_embexpr_end, count: 1)
|
687
692
|
attributes_hash = balanced.sub(METHOD_CALL_PREFIX, ?{)
|
688
|
-
rescue
|
689
|
-
if e.message ==
|
693
|
+
rescue SyntaxError => e
|
694
|
+
if e.message == Error.message(:unbalanced_brackets) && !@template.empty?
|
690
695
|
text << "\n#{@next_line.text}"
|
691
696
|
last_line += 1
|
692
697
|
next_line
|
@@ -715,7 +720,7 @@ module Haml
|
|
715
720
|
if name == false
|
716
721
|
scanned = Haml::Util.balance(text, ?(, ?))
|
717
722
|
text = scanned ? scanned.first : text
|
718
|
-
raise Haml::
|
723
|
+
raise Haml::SyntaxError.new(Error.message(:invalid_attribute_list, text.inspect), last_line - 1)
|
719
724
|
end
|
720
725
|
attributes[name] = value
|
721
726
|
scanner.scan(/\s*/)
|
@@ -837,7 +842,7 @@ module Haml
|
|
837
842
|
end
|
838
843
|
|
839
844
|
def balance(*args)
|
840
|
-
Haml::Util.balance(*args) or raise(
|
845
|
+
Haml::Util.balance(*args) or raise(SyntaxError.new(Error.message(:unbalanced_brackets)))
|
841
846
|
end
|
842
847
|
|
843
848
|
# Unlike #balance, this balances Ripper tokens to balance something like `{ a: "}" }` correctly.
|
@@ -856,7 +861,7 @@ module Haml
|
|
856
861
|
return text, buf.sub(text, '')
|
857
862
|
end
|
858
863
|
end
|
859
|
-
raise
|
864
|
+
raise SyntaxError.new(Error.message(:unbalanced_brackets))
|
860
865
|
end
|
861
866
|
|
862
867
|
def block_opened?
|
data/lib/haml/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0.beta.
|
4
|
+
version: 6.0.0.beta.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Natalie Weizenbaum
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: exe
|
14
14
|
cert_chain: []
|
15
|
-
date: 2022-08-
|
15
|
+
date: 2022-08-21 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
requirement: !ruby/object:Gem::Requirement
|
@@ -318,7 +318,6 @@ files:
|
|
318
318
|
- lib/haml/filters/text_base.rb
|
319
319
|
- lib/haml/filters/tilt_base.rb
|
320
320
|
- lib/haml/force_escapable.rb
|
321
|
-
- lib/haml/haml_error.rb
|
322
321
|
- lib/haml/helpers.rb
|
323
322
|
- lib/haml/html.rb
|
324
323
|
- lib/haml/identity.rb
|
data/lib/haml/haml_error.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Haml
|
4
|
-
# An exception raised by Haml code.
|
5
|
-
# TODO: unify Haml::Error (former Hamlit::Error) and Haml::HamlError (former Haml::Error)
|
6
|
-
class HamlError < StandardError
|
7
|
-
|
8
|
-
MESSAGES = {
|
9
|
-
bad_script_indent: '"%s" is indented at wrong level: expected %d, but was at %d.',
|
10
|
-
cant_run_filter: 'Can\'t run "%s" filter; you must require its dependencies first',
|
11
|
-
cant_use_tabs_and_spaces: "Indentation can't use both tabs and spaces.",
|
12
|
-
deeper_indenting: "The line was indented %d levels deeper than the previous line.",
|
13
|
-
filter_not_defined: 'Filter "%s" is not defined.',
|
14
|
-
gem_install_filter_deps: '"%s" filter\'s %s dependency missing: try installing it or adding it to your Gemfile',
|
15
|
-
illegal_element: "Illegal element: classes and ids must have values.",
|
16
|
-
illegal_nesting_content: "Illegal nesting: nesting within a tag that already has content is illegal.",
|
17
|
-
illegal_nesting_header: "Illegal nesting: nesting within a header command is illegal.",
|
18
|
-
illegal_nesting_line: "Illegal nesting: content can't be both given on the same line as %%%s and nested within it.",
|
19
|
-
illegal_nesting_plain: "Illegal nesting: nesting within plain text is illegal.",
|
20
|
-
illegal_nesting_self_closing: "Illegal nesting: nesting within a self-closing tag is illegal.",
|
21
|
-
inconsistent_indentation: "Inconsistent indentation: %s used for indentation, but the rest of the document was indented using %s.",
|
22
|
-
indenting_at_start: "Indenting at the beginning of the document is illegal.",
|
23
|
-
install_haml_contrib: 'To use the "%s" filter, please install the haml-contrib gem.',
|
24
|
-
invalid_attribute_list: 'Invalid attribute list: %s.',
|
25
|
-
invalid_filter_name: 'Invalid filter name ":%s".',
|
26
|
-
invalid_tag: 'Invalid tag: "%s".',
|
27
|
-
missing_if: 'Got "%s" with no preceding "if"',
|
28
|
-
no_ruby_code: "There's no Ruby code for %s to evaluate.",
|
29
|
-
self_closing_content: "Self-closing tags can't have content.",
|
30
|
-
unbalanced_brackets: 'Unbalanced brackets.',
|
31
|
-
no_end: <<-END
|
32
|
-
You don't need to use "- end" in Haml. Un-indent to close a block:
|
33
|
-
- if foo?
|
34
|
-
%strong Foo!
|
35
|
-
- else
|
36
|
-
Not foo.
|
37
|
-
%p This line is un-indented, so it isn't part of the "if" block
|
38
|
-
END
|
39
|
-
}.freeze
|
40
|
-
|
41
|
-
def self.message(key, *args)
|
42
|
-
string = MESSAGES[key] or raise "[HAML BUG] No error messages for #{key}"
|
43
|
-
(args.empty? ? string : string % args).rstrip
|
44
|
-
end
|
45
|
-
|
46
|
-
# The line of the template on which the error occurred.
|
47
|
-
#
|
48
|
-
# @return [Fixnum]
|
49
|
-
attr_reader :line
|
50
|
-
|
51
|
-
# @param message [String] The error message
|
52
|
-
# @param line [Fixnum] See \{#line}
|
53
|
-
def initialize(message = nil, line = nil)
|
54
|
-
super(message)
|
55
|
-
@line = line
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# SyntaxError is the type of exception raised when Haml encounters an
|
60
|
-
# ill-formatted document.
|
61
|
-
# It's not particularly interesting,
|
62
|
-
# except in that it's a subclass of {Haml::HamlError}.
|
63
|
-
class HamlSyntaxError < HamlError; end
|
64
|
-
|
65
|
-
class HamlInvalidAttributeNameError < HamlSyntaxError; end
|
66
|
-
end
|