5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/rblade/compiler/compiles_injections.rb', line 5
def compile!(tokens)
tokens.map! do |token|
next(token) if token.type != :unprocessed
current_match_id = nil
segments = []
token.value.split(/
(?<escape_unsafe_rblade>@?)\{!!(?<unsafe_rblade>(?:[^!}]++|[!}])+?)!!}
|
(?<escape_safe_rblade>@?) \{\{ (?<safe_rblade>(?:[^!}]++|[!}])+?) }}
|
\s?(?<![\w@])@ruby\s++(?<ruby>(?:[^@]++|[@])+?)(?<!\w)@end_?ruby(?!\w)\s?
|
(?<escaped_erb_start><%%)
|
(?<escaped_erb_end>%%>)
|
(?<erb_tag><%(?!%)=?=?)\s*+(?<erb_tag_content>(?:[^%]++|[%])+?)(?<!%)%?>
/xi) do |before_match|
next if current_match_id == $~.object_id
current_match_id = $~.object_id
unless before_match == ""
RBlade::Utility.append_unprocessed_string_segment!(token, segments, before_match)
end
next if $~.nil?
if $~[:unsafe_rblade].present? || $~[:erb_tag] == "<%=="
if $~[:escape_unsafe_rblade] == "@"
RBlade::Utility.append_unprocessed_string_segment!(token, segments, $&.delete_prefix("@"))
else
start_offset = segments.last&.end_offset || token.start_offset
segments << create_token(
($~[:unsafe_rblade] || $~[:erb_tag_content]).strip,
false,
start_offset,
start_offset + $&.length,
)
end
elsif $~[:safe_rblade].present? || $~[:erb_tag] == "<%="
if $~[:escape_safe_rblade] == "@"
RBlade::Utility.append_unprocessed_string_segment!(token, segments, $&.delete_prefix("@"))
else
start_offset = segments.last&.end_offset || token.start_offset
segments << create_token(
($~[:safe_rblade] || $~[:erb_tag_content]).strip,
true,
start_offset,
start_offset + $&.length,
)
end
elsif $~[:ruby].present? || $~[:erb_tag] == "<%"
value = ($~[:ruby] || $~[:erb_tag_content]).strip
value << ";" unless value.end_with?(";")
start_offset = segments.last&.end_offset || token.start_offset
segments << Token.new(
type: :ruby,
value: value,
start_offset: start_offset,
end_offset: start_offset + $&.length,
)
elsif $~[:escaped_erb_start].present?
RBlade::Utility.append_unprocessed_string_segment!(token, segments, +"<%")
elsif $~[:escaped_erb_end].present?
RBlade::Utility.append_unprocessed_string_segment!(token, segments, +"%>")
end
end
segments
end.flatten!
end
|