hamlit 2.12.0-java → 2.13.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -1
- data/CHANGELOG.md +14 -1
- data/LICENSE.txt +26 -23
- data/bin/update-haml +125 -0
- data/lib/hamlit/compiler/comment_compiler.rb +1 -0
- data/lib/hamlit/filters/escaped.rb +1 -1
- data/lib/hamlit/filters/markdown.rb +1 -0
- data/lib/hamlit/filters/preserve.rb +1 -1
- data/lib/hamlit/filters/text_base.rb +1 -1
- data/lib/hamlit/filters/tilt_base.rb +1 -1
- data/lib/hamlit/parser.rb +6 -2
- data/lib/hamlit/parser/haml_attribute_builder.rb +1 -1
- data/lib/hamlit/parser/haml_buffer.rb +20 -130
- data/lib/hamlit/parser/haml_compiler.rb +1 -553
- data/lib/hamlit/parser/haml_error.rb +29 -25
- data/lib/hamlit/parser/haml_escapable.rb +1 -0
- data/lib/hamlit/parser/haml_generator.rb +1 -0
- data/lib/hamlit/parser/haml_helpers.rb +35 -59
- data/lib/hamlit/parser/{haml_xss_mods.rb → haml_helpers/xss_mods.rb} +14 -12
- data/lib/hamlit/parser/haml_options.rb +53 -66
- data/lib/hamlit/parser/haml_parser.rb +73 -64
- data/lib/hamlit/parser/haml_temple_engine.rb +123 -0
- data/lib/hamlit/parser/haml_util.rb +10 -40
- data/lib/hamlit/rails_template.rb +1 -1
- data/lib/hamlit/string_splitter.rb +1 -0
- data/lib/hamlit/version.rb +1 -1
- metadata +7 -5
- data/lib/hamlit/parser/MIT-LICENSE +0 -20
- data/lib/hamlit/parser/README.md +0 -30
@@ -1,11 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'strscan'
|
2
|
-
require 'hamlit/parser/haml_util'
|
3
|
-
require 'hamlit/parser/haml_error'
|
4
|
-
require 'hamlit/parser/haml_attribute_builder'
|
5
4
|
|
6
5
|
module Hamlit
|
7
6
|
class HamlParser
|
8
|
-
include
|
7
|
+
include Hamlit::HamlUtil
|
9
8
|
|
10
9
|
attr_reader :root
|
11
10
|
|
@@ -62,7 +61,7 @@ module Hamlit
|
|
62
61
|
SILENT_SCRIPT,
|
63
62
|
ESCAPE,
|
64
63
|
FILTER
|
65
|
-
]
|
64
|
+
].freeze
|
66
65
|
|
67
66
|
# The value of the character that designates that a line is part
|
68
67
|
# of a multiline string.
|
@@ -76,8 +75,8 @@ module Hamlit
|
|
76
75
|
#
|
77
76
|
BLOCK_WITH_SPACES = /do\s*\|\s*[^\|]*\s+\|\z/
|
78
77
|
|
79
|
-
MID_BLOCK_KEYWORDS = %w[else elsif rescue ensure end when]
|
80
|
-
START_BLOCK_KEYWORDS = %w[if begin case unless]
|
78
|
+
MID_BLOCK_KEYWORDS = %w[else elsif rescue ensure end when].freeze
|
79
|
+
START_BLOCK_KEYWORDS = %w[if begin case unless].freeze
|
81
80
|
# Try to parse assignments to block starters as best as possible
|
82
81
|
START_BLOCK_KEYWORD_REGEX = /(?:\w+(?:,\s*\w+)*\s*=\s*)?(#{START_BLOCK_KEYWORDS.join('|')})/
|
83
82
|
BLOCK_KEYWORD_REGEX = /^-?\s*(?:(#{MID_BLOCK_KEYWORDS.join('|')})|#{START_BLOCK_KEYWORD_REGEX.source})\b/
|
@@ -91,14 +90,16 @@ module Hamlit
|
|
91
90
|
ID_KEY = 'id'.freeze
|
92
91
|
CLASS_KEY = 'class'.freeze
|
93
92
|
|
94
|
-
def initialize(
|
95
|
-
@options
|
93
|
+
def initialize(options)
|
94
|
+
@options = HamlOptions.wrap(options)
|
96
95
|
# Record the indent levels of "if" statements to validate the subsequent
|
97
96
|
# elsif and else statements are indented at the appropriate level.
|
98
97
|
@script_level_stack = []
|
99
98
|
@template_index = 0
|
100
99
|
@template_tabs = 0
|
100
|
+
end
|
101
101
|
|
102
|
+
def call(template)
|
102
103
|
match = template.rstrip.scan(/(([ \t]+)?(.*?))(?:\Z|\r\n|\r|\n)/m)
|
103
104
|
# discard the last match which is always blank
|
104
105
|
match.pop
|
@@ -107,16 +108,14 @@ module Hamlit
|
|
107
108
|
end
|
108
109
|
# Append special end-of-document marker
|
109
110
|
@template << Line.new(nil, '-#', '-#', @template.size, self, true)
|
110
|
-
end
|
111
111
|
|
112
|
-
def parse
|
113
112
|
@root = @parent = ParseNode.new(:root)
|
114
113
|
@flat = false
|
115
114
|
@filter_buffer = nil
|
116
115
|
@indentation = nil
|
117
116
|
@line = next_line
|
118
117
|
|
119
|
-
raise
|
118
|
+
raise HamlSyntaxError.new(HamlError.message(:indenting_at_start), @line.index) if @line.tabs != 0
|
120
119
|
|
121
120
|
loop do
|
122
121
|
next_line
|
@@ -139,7 +138,7 @@ module Hamlit
|
|
139
138
|
end
|
140
139
|
|
141
140
|
if !flat? && @next_line.tabs - @line.tabs > 1
|
142
|
-
raise
|
141
|
+
raise HamlSyntaxError.new(HamlError.message(:deeper_indenting, @next_line.tabs - @line.tabs), @next_line.index)
|
143
142
|
end
|
144
143
|
|
145
144
|
@line = @next_line
|
@@ -147,7 +146,7 @@ module Hamlit
|
|
147
146
|
# Close all the open tags
|
148
147
|
close until @parent.type == :root
|
149
148
|
@root
|
150
|
-
rescue
|
149
|
+
rescue Hamlit::HamlError => e
|
151
150
|
e.backtrace.unshift "#{@options.filename}:#{(e.line ? e.line + 1 : @line.index + 1) + @options.line - 1}"
|
152
151
|
raise
|
153
152
|
end
|
@@ -159,7 +158,7 @@ module Hamlit
|
|
159
158
|
@indentation = line.whitespace
|
160
159
|
|
161
160
|
if @indentation.include?(?\s) && @indentation.include?(?\t)
|
162
|
-
raise
|
161
|
+
raise HamlSyntaxError.new(HamlError.message(:cant_use_tabs_and_spaces), line.index)
|
163
162
|
end
|
164
163
|
|
165
164
|
@flat_spaces = @indentation * (@template_tabs+1) if flat?
|
@@ -170,17 +169,17 @@ module Hamlit
|
|
170
169
|
return tabs if line.whitespace == @indentation * tabs
|
171
170
|
return @template_tabs + 1 if flat? && line.whitespace =~ /^#{@flat_spaces}/
|
172
171
|
|
173
|
-
message =
|
172
|
+
message = HamlError.message(:inconsistent_indentation,
|
174
173
|
human_indentation(line.whitespace),
|
175
174
|
human_indentation(@indentation)
|
176
175
|
)
|
177
|
-
raise
|
176
|
+
raise HamlSyntaxError.new(message, line.index)
|
178
177
|
end
|
179
178
|
|
180
179
|
private
|
181
180
|
|
182
181
|
# @private
|
183
|
-
|
182
|
+
Line = Struct.new(:whitespace, :text, :full, :index, :parser, :eod) do
|
184
183
|
alias_method :eod?, :eod
|
185
184
|
|
186
185
|
# @private
|
@@ -196,14 +195,14 @@ module Hamlit
|
|
196
195
|
end
|
197
196
|
|
198
197
|
# @private
|
199
|
-
|
198
|
+
ParseNode = Struct.new(:type, :line, :value, :parent, :children) do
|
200
199
|
def initialize(*args)
|
201
200
|
super
|
202
201
|
self.children ||= []
|
203
202
|
end
|
204
203
|
|
205
204
|
def inspect
|
206
|
-
%Q[(#{type} #{value.inspect}#{children.each_with_object('') {|c, s| s << "\n#{c.inspect.gsub!(/^/, ' ')}"}})]
|
205
|
+
%Q[(#{type} #{value.inspect}#{children.each_with_object(''.dup) {|c, s| s << "\n#{c.inspect.gsub!(/^/, ' ')}"}})].dup
|
207
206
|
end
|
208
207
|
end
|
209
208
|
|
@@ -218,7 +217,7 @@ module Hamlit
|
|
218
217
|
self[:old] = value
|
219
218
|
end
|
220
219
|
|
221
|
-
# This will be a literal for
|
220
|
+
# This will be a literal for Hamlit::HamlBuffer#attributes's last argument, `attributes_hashes`.
|
222
221
|
def to_literal
|
223
222
|
[new, stripped_old].compact.join(', ')
|
224
223
|
end
|
@@ -290,7 +289,7 @@ module Hamlit
|
|
290
289
|
end
|
291
290
|
|
292
291
|
def block_keyword(text)
|
293
|
-
return unless keyword = text.scan(BLOCK_KEYWORD_REGEX)[0]
|
292
|
+
return unless (keyword = text.scan(BLOCK_KEYWORD_REGEX)[0])
|
294
293
|
keyword[0] || keyword[1]
|
295
294
|
end
|
296
295
|
|
@@ -301,20 +300,20 @@ module Hamlit
|
|
301
300
|
|
302
301
|
def plain(line, escape_html = nil)
|
303
302
|
if block_opened?
|
304
|
-
raise
|
303
|
+
raise HamlSyntaxError.new(HamlError.message(:illegal_nesting_plain), @next_line.index)
|
305
304
|
end
|
306
305
|
|
307
306
|
unless contains_interpolation?(line.text)
|
308
307
|
return ParseNode.new(:plain, line.index + 1, :text => line.text)
|
309
308
|
end
|
310
309
|
|
311
|
-
escape_html = @options.escape_html if escape_html.nil?
|
312
|
-
line.text =
|
310
|
+
escape_html = @options.escape_html && @options.mime_type != 'text/plain' if escape_html.nil?
|
311
|
+
line.text = unescape_interpolation(line.text)
|
313
312
|
script(line, false).tap { |n| n.value[:escape_interpolation] = true if escape_html }
|
314
313
|
end
|
315
314
|
|
316
315
|
def script(line, escape_html = nil, preserve = false)
|
317
|
-
raise
|
316
|
+
raise HamlSyntaxError.new(HamlError.message(:no_ruby_code, '=')) if line.text.empty?
|
318
317
|
line = handle_ruby_multiline(line)
|
319
318
|
escape_html = @options.escape_html if escape_html.nil?
|
320
319
|
|
@@ -326,12 +325,12 @@ module Hamlit
|
|
326
325
|
end
|
327
326
|
|
328
327
|
def flat_script(line, escape_html = nil)
|
329
|
-
raise
|
328
|
+
raise HamlSyntaxError.new(HamlError.message(:no_ruby_code, '~')) if line.text.empty?
|
330
329
|
script(line, escape_html, :preserve)
|
331
330
|
end
|
332
331
|
|
333
332
|
def silent_script(line)
|
334
|
-
raise
|
333
|
+
raise HamlSyntaxError.new(HamlError.message(:no_end), line.index) if line.text[1..-1].strip == 'end'
|
335
334
|
|
336
335
|
line = handle_ruby_multiline(line)
|
337
336
|
keyword = block_keyword(line.text)
|
@@ -340,7 +339,7 @@ module Hamlit
|
|
340
339
|
|
341
340
|
if ["else", "elsif", "when"].include?(keyword)
|
342
341
|
if @script_level_stack.empty?
|
343
|
-
raise
|
342
|
+
raise Hamlit::HamlSyntaxError.new(HamlError.message(:missing_if, keyword), @line.index)
|
344
343
|
end
|
345
344
|
|
346
345
|
if keyword == 'when' and !@script_level_stack.last[2]
|
@@ -351,8 +350,8 @@ module Hamlit
|
|
351
350
|
end
|
352
351
|
|
353
352
|
if @script_level_stack.last[1] != @line.tabs
|
354
|
-
message =
|
355
|
-
raise
|
353
|
+
message = HamlError.message(:bad_script_indent, keyword, @script_level_stack.last[1], @line.tabs)
|
354
|
+
raise Hamlit::HamlSyntaxError.new(message, @line.index)
|
356
355
|
end
|
357
356
|
end
|
358
357
|
|
@@ -389,7 +388,6 @@ module Hamlit
|
|
389
388
|
|
390
389
|
preserve_tag = @options.preserve.include?(tag_name)
|
391
390
|
nuke_inner_whitespace ||= preserve_tag
|
392
|
-
preserve_tag = false if @options.ugly
|
393
391
|
escape_html = (action == '&' || (action != '!' && @options.escape_html))
|
394
392
|
|
395
393
|
case action
|
@@ -398,7 +396,7 @@ module Hamlit
|
|
398
396
|
when '='
|
399
397
|
parse = true
|
400
398
|
if value[0] == ?=
|
401
|
-
value =
|
399
|
+
value = unescape_interpolation(value[1..-1].strip)
|
402
400
|
escape_interpolation = true if escape_html
|
403
401
|
escape_html = false
|
404
402
|
end
|
@@ -407,28 +405,27 @@ module Hamlit
|
|
407
405
|
parse = true
|
408
406
|
preserve_script = (value[0] == ?~)
|
409
407
|
if value[1] == ?=
|
410
|
-
value =
|
408
|
+
value = unescape_interpolation(value[2..-1].strip)
|
411
409
|
escape_interpolation = true if escape_html
|
412
410
|
escape_html = false
|
413
411
|
else
|
414
412
|
value = value[1..-1].strip
|
415
413
|
end
|
416
414
|
elsif contains_interpolation?(value)
|
417
|
-
value =
|
415
|
+
value = unescape_interpolation(value)
|
418
416
|
escape_interpolation = true if escape_html
|
419
417
|
parse = true
|
420
418
|
escape_html = false
|
421
419
|
end
|
422
420
|
else
|
423
421
|
if contains_interpolation?(value)
|
424
|
-
value =
|
425
|
-
escape_interpolation = true if escape_html
|
422
|
+
value = unescape_interpolation(value, escape_html)
|
426
423
|
parse = true
|
427
424
|
escape_html = false
|
428
425
|
end
|
429
426
|
end
|
430
427
|
|
431
|
-
attributes =
|
428
|
+
attributes = HamlParser.parse_class_and_id(attributes)
|
432
429
|
dynamic_attributes = DynamicAttributes.new
|
433
430
|
|
434
431
|
if attributes_hashes[:new]
|
@@ -443,12 +440,12 @@ module Hamlit
|
|
443
440
|
dynamic_attributes.old = attributes_hashes[:old] unless static_attributes || @options.suppress_eval
|
444
441
|
end
|
445
442
|
|
446
|
-
raise
|
447
|
-
raise
|
448
|
-
raise
|
443
|
+
raise HamlSyntaxError.new(HamlError.message(:illegal_nesting_self_closing), @next_line.index) if block_opened? && self_closing
|
444
|
+
raise HamlSyntaxError.new(HamlError.message(:no_ruby_code, action), last_line - 1) if parse && value.empty?
|
445
|
+
raise HamlSyntaxError.new(HamlError.message(:self_closing_content), last_line - 1) if self_closing && !value.empty?
|
449
446
|
|
450
447
|
if block_opened? && !value.empty? && !is_ruby_multiline?(value)
|
451
|
-
raise
|
448
|
+
raise HamlSyntaxError.new(HamlError.message(:illegal_nesting_line, tag_name), @next_line.index)
|
452
449
|
end
|
453
450
|
|
454
451
|
self_closing ||= !!(!block_opened? && value.empty? && @options.autoclose.any? {|t| t === tag_name})
|
@@ -486,13 +483,13 @@ module Hamlit
|
|
486
483
|
|
487
484
|
if contains_interpolation?(text)
|
488
485
|
parse = true
|
489
|
-
text =
|
486
|
+
text = unescape_interpolation(text)
|
490
487
|
else
|
491
488
|
parse = false
|
492
489
|
end
|
493
490
|
|
494
491
|
if block_opened? && !text.empty?
|
495
|
-
raise
|
492
|
+
raise HamlSyntaxError.new(Hamlit::HamlError.message(:illegal_nesting_content), @next_line.index)
|
496
493
|
end
|
497
494
|
|
498
495
|
ParseNode.new(:comment, @line.index + 1, :conditional => conditional, :text => text, :revealed => revealed, :parse => parse)
|
@@ -500,13 +497,13 @@ module Hamlit
|
|
500
497
|
|
501
498
|
# Renders an XHTML doctype or XML shebang.
|
502
499
|
def doctype(text)
|
503
|
-
raise
|
500
|
+
raise HamlSyntaxError.new(HamlError.message(:illegal_nesting_header), @next_line.index) if block_opened?
|
504
501
|
version, type, encoding = text[3..-1].strip.downcase.scan(DOCTYPE_REGEX)[0]
|
505
502
|
ParseNode.new(:doctype, @line.index + 1, :version => version, :type => type, :encoding => encoding)
|
506
503
|
end
|
507
504
|
|
508
505
|
def filter(name)
|
509
|
-
raise
|
506
|
+
raise HamlError.new(HamlError.message(:invalid_filter_name, name)) unless name =~ /^\w+$/
|
510
507
|
|
511
508
|
if filter_opened?
|
512
509
|
@flat = true
|
@@ -543,7 +540,7 @@ module Hamlit
|
|
543
540
|
|
544
541
|
# Post-process case statements to normalize the nesting of "when" clauses
|
545
542
|
return unless node.value[:keyword] == "case"
|
546
|
-
return unless first = node.children.first
|
543
|
+
return unless (first = node.children.first)
|
547
544
|
return unless first.type == :silent_script && first.value[:keyword] == "when"
|
548
545
|
return if first.children.empty?
|
549
546
|
# If the case node has a "when" child with children, it's the
|
@@ -555,7 +552,7 @@ module Hamlit
|
|
555
552
|
|
556
553
|
alias :close_script :close_silent_script
|
557
554
|
|
558
|
-
# This is a class method so it can be accessed from {
|
555
|
+
# This is a class method so it can be accessed from {Hamlit::HamlHelpers}.
|
559
556
|
#
|
560
557
|
# Iterates through the classes and ids supplied through `.`
|
561
558
|
# and `#` syntax, and returns a hash with them as attributes,
|
@@ -564,7 +561,7 @@ module Hamlit
|
|
564
561
|
attributes = {}
|
565
562
|
return attributes if list.empty?
|
566
563
|
|
567
|
-
list.scan(/([#.])([-:_a-zA-Z0-9]+)/) do |type, property|
|
564
|
+
list.scan(/([#.])([-:_a-zA-Z0-9\@]+)/) do |type, property|
|
568
565
|
case type
|
569
566
|
when '.'
|
570
567
|
if attributes[CLASS_KEY]
|
@@ -579,16 +576,22 @@ module Hamlit
|
|
579
576
|
attributes
|
580
577
|
end
|
581
578
|
|
579
|
+
# This method doesn't use Hamlit::HamlAttributeParser because currently it depends on Ripper and Rubinius doesn't provide it.
|
580
|
+
# Ideally this logic should be placed in Hamlit::HamlAttributeParser instead of here and this method should use it.
|
581
|
+
#
|
582
|
+
# @param [String] text - Hash literal or text inside old attributes
|
583
|
+
# @return [Hash,nil] - Return nil if text is not static Hash literal
|
582
584
|
def parse_static_hash(text)
|
583
585
|
attributes = {}
|
584
586
|
return attributes if text.empty?
|
585
587
|
|
588
|
+
text = text[1...-1] # strip brackets
|
586
589
|
scanner = StringScanner.new(text)
|
587
590
|
scanner.scan(/\s+/)
|
588
591
|
until scanner.eos?
|
589
|
-
return unless key = scanner.scan(LITERAL_VALUE_REGEX)
|
592
|
+
return unless (key = scanner.scan(LITERAL_VALUE_REGEX))
|
590
593
|
return unless scanner.scan(/\s*=>\s*/)
|
591
|
-
return unless value = scanner.scan(LITERAL_VALUE_REGEX)
|
594
|
+
return unless (value = scanner.scan(LITERAL_VALUE_REGEX))
|
592
595
|
return unless scanner.scan(/\s*(?:,|$)\s*/)
|
593
596
|
attributes[eval(key).to_s] = eval(value).to_s
|
594
597
|
end
|
@@ -597,13 +600,13 @@ module Hamlit
|
|
597
600
|
|
598
601
|
# Parses a line into tag_name, attributes, attributes_hash, object_ref, action, value
|
599
602
|
def parse_tag(text)
|
600
|
-
match = text.scan(/%([-:\w]+)([-:\w
|
601
|
-
raise
|
603
|
+
match = text.scan(/%([-:\w]+)([-:\w.#\@]*)(.+)?/)[0]
|
604
|
+
raise HamlSyntaxError.new(HamlError.message(:invalid_tag, text)) unless match
|
602
605
|
|
603
606
|
tag_name, attributes, rest = match
|
604
607
|
|
605
608
|
if !attributes.empty? && (attributes =~ /[.#](\.|#|\z)/)
|
606
|
-
raise
|
609
|
+
raise HamlSyntaxError.new(HamlError.message(:illegal_element))
|
607
610
|
end
|
608
611
|
|
609
612
|
new_attributes_hash = old_attributes_hash = last_line = nil
|
@@ -648,14 +651,17 @@ module Hamlit
|
|
648
651
|
nuke_inner_whitespace, action, value, last_line || @line.index + 1]
|
649
652
|
end
|
650
653
|
|
654
|
+
# @return [String] attributes_hash - Hash literal starting with `{` and ending with `}`
|
655
|
+
# @return [String] rest
|
656
|
+
# @return [Integer] last_line
|
651
657
|
def parse_old_attributes(text)
|
652
658
|
text = text.dup
|
653
659
|
last_line = @line.index + 1
|
654
660
|
|
655
661
|
begin
|
656
662
|
attributes_hash, rest = balance(text, ?{, ?})
|
657
|
-
rescue
|
658
|
-
if text.strip[-1] == ?, && e.message ==
|
663
|
+
rescue HamlSyntaxError => e
|
664
|
+
if text.strip[-1] == ?, && e.message == HamlError.message(:unbalanced_brackets)
|
659
665
|
text << "\n#{@next_line.text}"
|
660
666
|
last_line += 1
|
661
667
|
next_line
|
@@ -668,6 +674,9 @@ module Hamlit
|
|
668
674
|
return attributes_hash, rest, last_line
|
669
675
|
end
|
670
676
|
|
677
|
+
# @return [Array<Hash,String,nil>] - [static_attributes (Hash), dynamic_attributes (nil or String starting with `{` and ending with `}`)]
|
678
|
+
# @return [String] rest
|
679
|
+
# @return [Integer] last_line
|
671
680
|
def parse_new_attributes(text)
|
672
681
|
scanner = StringScanner.new(text)
|
673
682
|
last_line = @line.index + 1
|
@@ -679,9 +688,9 @@ module Hamlit
|
|
679
688
|
break if name.nil?
|
680
689
|
|
681
690
|
if name == false
|
682
|
-
scanned =
|
691
|
+
scanned = Hamlit::HamlUtil.balance(text, ?(, ?))
|
683
692
|
text = scanned ? scanned.first : text
|
684
|
-
raise
|
693
|
+
raise Hamlit::HamlSyntaxError.new(HamlError.message(:invalid_attribute_list, text.inspect), last_line - 1)
|
685
694
|
end
|
686
695
|
attributes[name] = value
|
687
696
|
scanner.scan(/\s*/)
|
@@ -695,7 +704,7 @@ module Hamlit
|
|
695
704
|
end
|
696
705
|
|
697
706
|
static_attributes = {}
|
698
|
-
dynamic_attributes = "{"
|
707
|
+
dynamic_attributes = "{".dup
|
699
708
|
attributes.each do |name, (type, val)|
|
700
709
|
if type == :static
|
701
710
|
static_attributes[name] = val
|
@@ -710,7 +719,7 @@ module Hamlit
|
|
710
719
|
end
|
711
720
|
|
712
721
|
def parse_new_attribute(scanner)
|
713
|
-
unless name = scanner.scan(/[-:\w]+/)
|
722
|
+
unless (name = scanner.scan(/[-:\w]+/))
|
714
723
|
return if scanner.scan(/\)/)
|
715
724
|
return false
|
716
725
|
end
|
@@ -719,8 +728,8 @@ module Hamlit
|
|
719
728
|
return name, [:static, true] unless scanner.scan(/=/) #/end
|
720
729
|
|
721
730
|
scanner.scan(/\s*/)
|
722
|
-
unless quote = scanner.scan(/["']/)
|
723
|
-
return false unless var = scanner.scan(/(@@?|\$)?\w+/)
|
731
|
+
unless (quote = scanner.scan(/["']/))
|
732
|
+
return false unless (var = scanner.scan(/(@@?|\$)?\w+/))
|
724
733
|
return name, [:dynamic, var]
|
725
734
|
end
|
726
735
|
|
@@ -735,7 +744,7 @@ module Hamlit
|
|
735
744
|
|
736
745
|
return name, [:static, content.first[1]] if content.size == 1
|
737
746
|
return name, [:dynamic,
|
738
|
-
%!"#{content.each_with_object('') {|(t, v), s| s << (t == :str ? inspect_obj(v)[1...-1] : "\#{#{v}}")}}"!]
|
747
|
+
%!"#{content.each_with_object(''.dup) {|(t, v), s| s << (t == :str ? inspect_obj(v)[1...-1] : "\#{#{v}}")}}"!]
|
739
748
|
end
|
740
749
|
|
741
750
|
def next_line
|
@@ -803,7 +812,7 @@ module Hamlit
|
|
803
812
|
end
|
804
813
|
|
805
814
|
def balance(*args)
|
806
|
-
|
815
|
+
Hamlit::HamlUtil.balance(*args) or raise(HamlSyntaxError.new(HamlError.message(:unbalanced_brackets)))
|
807
816
|
end
|
808
817
|
|
809
818
|
def block_opened?
|