Class: RBlade::CompilesInjections

Inherits:
Object
  • Object
show all
Defined in:
lib/rblade/compiler/compiles_injections.rb

Instance Method Summary collapse

Instance Method Details

#compile!(tokens) ⇒ Object



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