@herb-tools/node 0.7.5 → 0.8.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.
Files changed (117) hide show
  1. package/binding.gyp +8 -4
  2. package/dist/herb-node.esm.js +6 -6
  3. package/dist/herb-node.esm.js.map +1 -1
  4. package/extension/error_helpers.cpp +67 -9
  5. package/extension/error_helpers.h +4 -2
  6. package/extension/extension_helpers.cpp +12 -5
  7. package/extension/extension_helpers.h +4 -2
  8. package/extension/herb.cpp +10 -42
  9. package/extension/libherb/analyze.c +549 -204
  10. package/extension/libherb/analyze.h +10 -2
  11. package/extension/libherb/analyze_helpers.c +17 -4
  12. package/extension/libherb/analyze_helpers.h +3 -0
  13. package/extension/libherb/analyze_missing_end.c +147 -0
  14. package/extension/libherb/analyze_transform.c +196 -0
  15. package/extension/libherb/analyzed_ruby.c +23 -2
  16. package/extension/libherb/analyzed_ruby.h +4 -2
  17. package/extension/libherb/ast_node.c +5 -5
  18. package/extension/libherb/ast_node.h +2 -2
  19. package/extension/libherb/ast_nodes.c +180 -180
  20. package/extension/libherb/ast_nodes.h +68 -67
  21. package/extension/libherb/ast_pretty_print.c +233 -233
  22. package/extension/libherb/ast_pretty_print.h +3 -3
  23. package/extension/libherb/element_source.c +7 -6
  24. package/extension/libherb/element_source.h +3 -1
  25. package/extension/libherb/errors.c +247 -127
  26. package/extension/libherb/errors.h +31 -15
  27. package/extension/libherb/extract.c +92 -34
  28. package/extension/libherb/extract.h +4 -4
  29. package/extension/libherb/herb.c +37 -49
  30. package/extension/libherb/herb.h +6 -7
  31. package/extension/libherb/html_util.c +34 -96
  32. package/extension/libherb/html_util.h +4 -5
  33. package/extension/libherb/include/analyze.h +10 -2
  34. package/extension/libherb/include/analyze_helpers.h +3 -0
  35. package/extension/libherb/include/analyzed_ruby.h +4 -2
  36. package/extension/libherb/include/ast_node.h +2 -2
  37. package/extension/libherb/include/ast_nodes.h +68 -67
  38. package/extension/libherb/include/ast_pretty_print.h +3 -3
  39. package/extension/libherb/include/element_source.h +3 -1
  40. package/extension/libherb/include/errors.h +31 -15
  41. package/extension/libherb/include/extract.h +4 -4
  42. package/extension/libherb/include/herb.h +6 -7
  43. package/extension/libherb/include/html_util.h +4 -5
  44. package/extension/libherb/include/lexer.h +1 -3
  45. package/extension/libherb/include/lexer_peek_helpers.h +14 -14
  46. package/extension/libherb/include/lexer_struct.h +3 -2
  47. package/extension/libherb/include/macros.h +4 -0
  48. package/extension/libherb/include/parser.h +12 -6
  49. package/extension/libherb/include/parser_helpers.h +25 -15
  50. package/extension/libherb/include/pretty_print.h +38 -28
  51. package/extension/libherb/include/token.h +5 -8
  52. package/extension/libherb/include/utf8.h +3 -2
  53. package/extension/libherb/include/util/hb_arena.h +31 -0
  54. package/extension/libherb/include/util/hb_arena_debug.h +8 -0
  55. package/extension/libherb/include/util/hb_array.h +33 -0
  56. package/extension/libherb/include/util/hb_buffer.h +33 -0
  57. package/extension/libherb/include/util/hb_string.h +29 -0
  58. package/extension/libherb/include/util/hb_system.h +9 -0
  59. package/extension/libherb/include/util.h +3 -14
  60. package/extension/libherb/include/version.h +1 -1
  61. package/extension/libherb/include/visitor.h +1 -1
  62. package/extension/libherb/io.c +7 -4
  63. package/extension/libherb/lexer.c +61 -88
  64. package/extension/libherb/lexer.h +1 -3
  65. package/extension/libherb/lexer_peek_helpers.c +35 -37
  66. package/extension/libherb/lexer_peek_helpers.h +14 -14
  67. package/extension/libherb/lexer_struct.h +3 -2
  68. package/extension/libherb/macros.h +4 -0
  69. package/extension/libherb/main.c +19 -23
  70. package/extension/libherb/parser.c +280 -201
  71. package/extension/libherb/parser.h +12 -6
  72. package/extension/libherb/parser_helpers.c +46 -40
  73. package/extension/libherb/parser_helpers.h +25 -15
  74. package/extension/libherb/parser_match_tags.c +316 -0
  75. package/extension/libherb/pretty_print.c +82 -106
  76. package/extension/libherb/pretty_print.h +38 -28
  77. package/extension/libherb/token.c +18 -65
  78. package/extension/libherb/token.h +5 -8
  79. package/extension/libherb/utf8.c +4 -4
  80. package/extension/libherb/utf8.h +3 -2
  81. package/extension/libherb/util/hb_arena.c +179 -0
  82. package/extension/libherb/util/hb_arena.h +31 -0
  83. package/extension/libherb/util/hb_arena_debug.c +237 -0
  84. package/extension/libherb/util/hb_arena_debug.h +8 -0
  85. package/extension/libherb/{array.c → util/hb_array.c} +26 -27
  86. package/extension/libherb/util/hb_array.h +33 -0
  87. package/extension/libherb/util/hb_buffer.c +194 -0
  88. package/extension/libherb/util/hb_buffer.h +33 -0
  89. package/extension/libherb/util/hb_string.c +85 -0
  90. package/extension/libherb/util/hb_string.h +29 -0
  91. package/extension/libherb/util/hb_system.c +30 -0
  92. package/extension/libherb/util/hb_system.h +9 -0
  93. package/extension/libherb/util.c +29 -99
  94. package/extension/libherb/util.h +3 -14
  95. package/extension/libherb/version.h +1 -1
  96. package/extension/libherb/visitor.c +55 -55
  97. package/extension/libherb/visitor.h +1 -1
  98. package/extension/nodes.cpp +40 -40
  99. package/extension/nodes.h +2 -2
  100. package/extension/prism/include/prism/ast.h +31 -1
  101. package/extension/prism/include/prism/diagnostic.h +1 -0
  102. package/extension/prism/include/prism/version.h +3 -3
  103. package/extension/prism/src/diagnostic.c +3 -1
  104. package/extension/prism/src/prism.c +130 -71
  105. package/extension/prism/src/util/pm_string.c +6 -8
  106. package/package.json +3 -3
  107. package/extension/libherb/array.h +0 -33
  108. package/extension/libherb/buffer.c +0 -241
  109. package/extension/libherb/buffer.h +0 -39
  110. package/extension/libherb/include/array.h +0 -33
  111. package/extension/libherb/include/buffer.h +0 -39
  112. package/extension/libherb/include/json.h +0 -28
  113. package/extension/libherb/include/memory.h +0 -12
  114. package/extension/libherb/json.c +0 -205
  115. package/extension/libherb/json.h +0 -28
  116. package/extension/libherb/memory.c +0 -53
  117. package/extension/libherb/memory.h +0 -12
@@ -1,9 +1,9 @@
1
1
  #ifndef HERB_PARSER_H
2
2
  #define HERB_PARSER_H
3
3
 
4
- #include "array.h"
5
4
  #include "ast_node.h"
6
5
  #include "lexer.h"
6
+ #include "util/hb_array.h"
7
7
 
8
8
  typedef enum {
9
9
  FOREIGN_CONTENT_UNKNOWN = 0,
@@ -19,21 +19,27 @@ typedef struct PARSER_OPTIONS_STRUCT {
19
19
  bool track_whitespace;
20
20
  } parser_options_T;
21
21
 
22
+ extern const parser_options_T HERB_DEFAULT_PARSER_OPTIONS;
23
+
22
24
  typedef struct PARSER_STRUCT {
23
25
  lexer_T* lexer;
24
26
  token_T* current_token;
25
- array_T* open_tags_stack;
27
+ hb_array_T* open_tags_stack;
26
28
  parser_state_T state;
27
29
  foreign_content_type_T foreign_content_type;
28
- parser_options_T* options;
30
+ parser_options_T options;
29
31
  } parser_T;
30
32
 
31
- parser_T* herb_parser_init(lexer_T* lexer, parser_options_T* options);
33
+ size_t parser_sizeof(void);
34
+
35
+ void herb_parser_init(parser_T* parser, lexer_T* lexer, parser_options_T options);
32
36
 
33
37
  AST_DOCUMENT_NODE_T* herb_parser_parse(parser_T* parser);
34
38
 
35
- size_t parser_sizeof(void);
39
+ void herb_parser_match_html_tags_post_analyze(AST_DOCUMENT_NODE_T* document);
40
+ void herb_parser_deinit(parser_T* parser);
36
41
 
37
- void parser_free(parser_T* parser);
42
+ void match_tags_in_node_array(hb_array_T* nodes, hb_array_T* errors);
43
+ bool match_tags_visitor(const AST_NODE_T* node, void* data);
38
44
 
39
45
  #endif
@@ -1,36 +1,36 @@
1
1
  #include "include/parser_helpers.h"
2
- #include "include/array.h"
3
2
  #include "include/ast_node.h"
4
3
  #include "include/ast_nodes.h"
5
- #include "include/buffer.h"
6
4
  #include "include/errors.h"
7
5
  #include "include/html_util.h"
8
6
  #include "include/lexer.h"
9
7
  #include "include/parser.h"
10
8
  #include "include/token.h"
11
9
  #include "include/token_matchers.h"
10
+ #include "include/util/hb_array.h"
11
+ #include "include/util/hb_buffer.h"
12
+ #include "include/util/hb_string.h"
12
13
 
13
14
  #include <stdio.h>
14
- #include <strings.h>
15
15
 
16
16
  void parser_push_open_tag(const parser_T* parser, token_T* tag_name) {
17
17
  token_T* copy = token_copy(tag_name);
18
- array_push(parser->open_tags_stack, copy);
18
+ hb_array_push(parser->open_tags_stack, copy);
19
19
  }
20
20
 
21
- bool parser_check_matching_tag(const parser_T* parser, const char* tag_name) {
22
- if (array_size(parser->open_tags_stack) == 0) { return false; }
21
+ bool parser_check_matching_tag(const parser_T* parser, hb_string_T tag_name) {
22
+ if (hb_array_size(parser->open_tags_stack) == 0) { return false; }
23
23
 
24
- token_T* top_token = array_last(parser->open_tags_stack);
24
+ token_T* top_token = hb_array_last(parser->open_tags_stack);
25
25
  if (top_token == NULL || top_token->value == NULL) { return false; };
26
26
 
27
- return (strcasecmp(top_token->value, tag_name) == 0);
27
+ return hb_string_equals(hb_string(top_token->value), tag_name);
28
28
  }
29
29
 
30
30
  token_T* parser_pop_open_tag(const parser_T* parser) {
31
- if (array_size(parser->open_tags_stack) == 0) { return NULL; }
31
+ if (hb_array_size(parser->open_tags_stack) == 0) { return NULL; }
32
32
 
33
- return array_pop(parser->open_tags_stack);
33
+ return hb_array_pop(parser->open_tags_stack);
34
34
  }
35
35
 
36
36
  /**
@@ -42,13 +42,14 @@ token_T* parser_pop_open_tag(const parser_T* parser) {
42
42
  bool parser_in_svg_context(const parser_T* parser) {
43
43
  if (!parser || !parser->open_tags_stack) { return false; }
44
44
 
45
- size_t stack_size = array_size(parser->open_tags_stack);
45
+ size_t stack_size = hb_array_size(parser->open_tags_stack);
46
46
 
47
47
  for (size_t i = 0; i < stack_size; i++) {
48
- token_T* tag = (token_T*) array_get(parser->open_tags_stack, i);
48
+ token_T* tag = (token_T*) hb_array_get(parser->open_tags_stack, i);
49
49
 
50
50
  if (tag && tag->value) {
51
- if (strcasecmp(tag->value, "svg") == 0) { return true; }
51
+ hb_string_T tag_value_string = hb_string(tag->value);
52
+ if (hb_string_equals(tag_value_string, hb_string("svg"))) { return true; }
52
53
  }
53
54
  }
54
55
 
@@ -57,24 +58,24 @@ bool parser_in_svg_context(const parser_T* parser) {
57
58
 
58
59
  // ===== Foreign Content Handling =====
59
60
 
60
- foreign_content_type_T parser_get_foreign_content_type(const char* tag_name) {
61
- if (tag_name == NULL) { return FOREIGN_CONTENT_UNKNOWN; }
61
+ foreign_content_type_T parser_get_foreign_content_type(hb_string_T tag_name) {
62
+ if (hb_string_is_empty(tag_name)) { return FOREIGN_CONTENT_UNKNOWN; }
62
63
 
63
- if (strcasecmp(tag_name, "script") == 0) { return FOREIGN_CONTENT_SCRIPT; }
64
- if (strcasecmp(tag_name, "style") == 0) { return FOREIGN_CONTENT_STYLE; }
64
+ if (hb_string_equals(tag_name, hb_string("script"))) { return FOREIGN_CONTENT_SCRIPT; }
65
+ if (hb_string_equals(tag_name, hb_string("style"))) { return FOREIGN_CONTENT_STYLE; }
65
66
 
66
67
  return FOREIGN_CONTENT_UNKNOWN;
67
68
  }
68
69
 
69
- bool parser_is_foreign_content_tag(const char* tag_name) {
70
+ bool parser_is_foreign_content_tag(hb_string_T tag_name) {
70
71
  return parser_get_foreign_content_type(tag_name) != FOREIGN_CONTENT_UNKNOWN;
71
72
  }
72
73
 
73
- const char* parser_get_foreign_content_closing_tag(foreign_content_type_T type) {
74
+ hb_string_T parser_get_foreign_content_closing_tag(foreign_content_type_T type) {
74
75
  switch (type) {
75
- case FOREIGN_CONTENT_SCRIPT: return "script";
76
- case FOREIGN_CONTENT_STYLE: return "style";
77
- default: return NULL;
76
+ case FOREIGN_CONTENT_SCRIPT: return hb_string("script");
77
+ case FOREIGN_CONTENT_STYLE: return hb_string("style");
78
+ default: return hb_string("");
78
79
  }
79
80
  }
80
81
 
@@ -92,7 +93,12 @@ void parser_exit_foreign_content(parser_T* parser) {
92
93
  parser->foreign_content_type = FOREIGN_CONTENT_UNKNOWN;
93
94
  }
94
95
 
95
- void parser_append_unexpected_error(parser_T* parser, const char* description, const char* expected, array_T* errors) {
96
+ void parser_append_unexpected_error(
97
+ parser_T* parser,
98
+ const char* description,
99
+ const char* expected,
100
+ hb_array_T* errors
101
+ ) {
96
102
  token_T* token = parser_advance(parser);
97
103
 
98
104
  append_unexpected_error(
@@ -107,7 +113,7 @@ void parser_append_unexpected_error(parser_T* parser, const char* description, c
107
113
  token_free(token);
108
114
  }
109
115
 
110
- void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, array_T* errors) {
116
+ void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, hb_array_T* errors) {
111
117
  append_unexpected_token_error(
112
118
  expected_type,
113
119
  parser->current_token,
@@ -119,17 +125,17 @@ void parser_append_unexpected_token_error(parser_T* parser, token_type_T expecte
119
125
 
120
126
  void parser_append_literal_node_from_buffer(
121
127
  const parser_T* parser,
122
- buffer_T* buffer,
123
- array_T* children,
128
+ hb_buffer_T* buffer,
129
+ hb_array_T* children,
124
130
  position_T start
125
131
  ) {
126
- if (buffer_length(buffer) == 0) { return; }
132
+ if (hb_buffer_length(buffer) == 0) { return; }
127
133
 
128
134
  AST_LITERAL_NODE_T* literal =
129
- ast_literal_node_init(buffer_value(buffer), start, parser->current_token->location.start, NULL);
135
+ ast_literal_node_init(hb_buffer_value(buffer), start, parser->current_token->location.start, NULL);
130
136
 
131
- if (children != NULL) { array_append(children, literal); }
132
- buffer_clear(buffer);
137
+ if (children != NULL) { hb_array_append(children, literal); }
138
+ hb_buffer_clear(buffer);
133
139
  }
134
140
 
135
141
  token_T* parser_advance(parser_T* parser) {
@@ -143,7 +149,7 @@ token_T* parser_consume_if_present(parser_T* parser, const token_type_T type) {
143
149
  return parser_advance(parser);
144
150
  }
145
151
 
146
- token_T* parser_consume_expected(parser_T* parser, const token_type_T expected_type, array_T* array) {
152
+ token_T* parser_consume_expected(parser_T* parser, const token_type_T expected_type, hb_array_T* array) {
147
153
  token_T* token = parser_consume_if_present(parser, expected_type);
148
154
 
149
155
  if (token == NULL) {
@@ -157,8 +163,8 @@ token_T* parser_consume_expected(parser_T* parser, const token_type_T expected_t
157
163
 
158
164
  AST_HTML_ELEMENT_NODE_T* parser_handle_missing_close_tag(
159
165
  AST_HTML_OPEN_TAG_NODE_T* open_tag,
160
- array_T* body,
161
- array_T* errors
166
+ hb_array_T* body,
167
+ hb_array_T* errors
162
168
  ) {
163
169
  append_missing_closing_tag_error(
164
170
  open_tag->tag_name,
@@ -183,10 +189,10 @@ AST_HTML_ELEMENT_NODE_T* parser_handle_missing_close_tag(
183
189
  void parser_handle_mismatched_tags(
184
190
  const parser_T* parser,
185
191
  const AST_HTML_CLOSE_TAG_NODE_T* close_tag,
186
- array_T* errors
192
+ hb_array_T* errors
187
193
  ) {
188
- if (array_size(parser->open_tags_stack) > 0) {
189
- token_T* expected_tag = array_last(parser->open_tags_stack);
194
+ if (hb_array_size(parser->open_tags_stack) > 0) {
195
+ token_T* expected_tag = hb_array_last(parser->open_tags_stack);
190
196
  token_T* actual_tag = close_tag->tag_name;
191
197
 
192
198
  append_tag_names_mismatch_error(
@@ -206,10 +212,10 @@ void parser_handle_mismatched_tags(
206
212
  }
207
213
  }
208
214
 
209
- bool parser_is_expected_closing_tag_name(const char* tag_name, foreign_content_type_T expected_type) {
210
- const char* expected_tag_name = parser_get_foreign_content_closing_tag(expected_type);
215
+ bool parser_is_expected_closing_tag_name(hb_string_T tag_name, foreign_content_type_T expected_type) {
216
+ hb_string_T expected_tag_name = parser_get_foreign_content_closing_tag(expected_type);
211
217
 
212
- if (expected_tag_name == NULL || tag_name == NULL) { return false; }
218
+ if (hb_string_is_empty(tag_name) || hb_string_is_empty(expected_tag_name)) { return false; }
213
219
 
214
- return strcmp(tag_name, expected_tag_name) == 0;
220
+ return hb_string_equals(expected_tag_name, tag_name);
215
221
  }
@@ -1,47 +1,57 @@
1
1
  #ifndef HERB_PARSER_HELPERS_H
2
2
  #define HERB_PARSER_HELPERS_H
3
3
 
4
- #include "array.h"
5
4
  #include "ast_nodes.h"
6
- #include "buffer.h"
7
5
  #include "errors.h"
8
6
  #include "parser.h"
9
7
  #include "token.h"
8
+ #include "util/hb_array.h"
9
+ #include "util/hb_buffer.h"
10
+ #include "util/hb_string.h"
10
11
 
11
12
  void parser_push_open_tag(const parser_T* parser, token_T* tag_name);
12
- bool parser_check_matching_tag(const parser_T* parser, const char* tag_name);
13
+ bool parser_check_matching_tag(const parser_T* parser, hb_string_T tag_name);
13
14
  token_T* parser_pop_open_tag(const parser_T* parser);
14
15
 
15
- void parser_append_unexpected_error(parser_T* parser, const char* description, const char* expected, array_T* errors);
16
- void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, array_T* errors);
16
+ void parser_append_unexpected_error(
17
+ parser_T* parser,
18
+ const char* description,
19
+ const char* expected,
20
+ hb_array_T* errors
21
+ );
22
+ void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, hb_array_T* errors);
17
23
 
18
24
  void parser_append_literal_node_from_buffer(
19
25
  const parser_T* parser,
20
- buffer_T* buffer,
21
- array_T* children,
26
+ hb_buffer_T* buffer,
27
+ hb_array_T* children,
22
28
  position_T start
23
29
  );
24
30
 
25
31
  bool parser_in_svg_context(const parser_T* parser);
26
32
 
27
- foreign_content_type_T parser_get_foreign_content_type(const char* tag_name);
28
- bool parser_is_foreign_content_tag(const char* tag_name);
29
- const char* parser_get_foreign_content_closing_tag(foreign_content_type_T type);
33
+ foreign_content_type_T parser_get_foreign_content_type(hb_string_T tag_name);
34
+ bool parser_is_foreign_content_tag(hb_string_T tag_name);
35
+ hb_string_T parser_get_foreign_content_closing_tag(foreign_content_type_T type);
30
36
 
31
37
  void parser_enter_foreign_content(parser_T* parser, foreign_content_type_T type);
32
38
  void parser_exit_foreign_content(parser_T* parser);
33
39
 
34
- bool parser_is_expected_closing_tag_name(const char* tag_name, foreign_content_type_T expected_type);
40
+ bool parser_is_expected_closing_tag_name(hb_string_T tag_name, foreign_content_type_T expected_type);
35
41
 
36
42
  token_T* parser_advance(parser_T* parser);
37
43
  token_T* parser_consume_if_present(parser_T* parser, token_type_T type);
38
- token_T* parser_consume_expected(parser_T* parser, token_type_T type, array_T* array);
44
+ token_T* parser_consume_expected(parser_T* parser, token_type_T type, hb_array_T* array);
39
45
 
40
46
  AST_HTML_ELEMENT_NODE_T* parser_handle_missing_close_tag(
41
47
  AST_HTML_OPEN_TAG_NODE_T* open_tag,
42
- array_T* body,
43
- array_T* errors
48
+ hb_array_T* body,
49
+ hb_array_T* errors
50
+ );
51
+ void parser_handle_mismatched_tags(
52
+ const parser_T* parser,
53
+ const AST_HTML_CLOSE_TAG_NODE_T* close_tag,
54
+ hb_array_T* errors
44
55
  );
45
- void parser_handle_mismatched_tags(const parser_T* parser, const AST_HTML_CLOSE_TAG_NODE_T* close_tag, array_T* errors);
46
56
 
47
57
  #endif
@@ -0,0 +1,316 @@
1
+ // NOTE: This file is generated by the templates/template.rb script and should not
2
+ // be modified manually. See /Users/marcoroth/Development/herb-release-0.8.1/templates/src/parser_match_tags.c.erb
3
+
4
+ #include "include/parser.h"
5
+ #include "include/ast_nodes.h"
6
+ #include "include/util/hb_array.h"
7
+ #include "include/visitor.h"
8
+
9
+ bool match_tags_visitor(const AST_NODE_T* node, void* data) {
10
+ hb_array_T* errors = (hb_array_T*) data;
11
+
12
+ if (node == NULL) { return false; }
13
+
14
+ switch (node->type) {
15
+
16
+ case AST_DOCUMENT_NODE: {
17
+ const AST_DOCUMENT_NODE_T* document_node = (const AST_DOCUMENT_NODE_T*) node;
18
+
19
+ if (document_node->children != NULL) {
20
+ match_tags_in_node_array(document_node->children, errors);
21
+ }
22
+ } break;
23
+
24
+
25
+
26
+ case AST_HTML_OPEN_TAG_NODE: {
27
+ const AST_HTML_OPEN_TAG_NODE_T* html_open_tag_node = (const AST_HTML_OPEN_TAG_NODE_T*) node;
28
+
29
+ if (html_open_tag_node->children != NULL) {
30
+ match_tags_in_node_array(html_open_tag_node->children, errors);
31
+ }
32
+ } break;
33
+
34
+
35
+ case AST_HTML_CLOSE_TAG_NODE: {
36
+ const AST_HTML_CLOSE_TAG_NODE_T* html_close_tag_node = (const AST_HTML_CLOSE_TAG_NODE_T*) node;
37
+
38
+ if (html_close_tag_node->children != NULL) {
39
+ match_tags_in_node_array(html_close_tag_node->children, errors);
40
+ }
41
+ } break;
42
+
43
+
44
+ case AST_HTML_ELEMENT_NODE: {
45
+ const AST_HTML_ELEMENT_NODE_T* html_element_node = (const AST_HTML_ELEMENT_NODE_T*) node;
46
+
47
+ if (html_element_node->body != NULL) {
48
+ match_tags_in_node_array(html_element_node->body, errors);
49
+ }
50
+ if (html_element_node->open_tag != NULL) {
51
+ herb_visit_node((AST_NODE_T*) html_element_node->open_tag, match_tags_visitor, errors);
52
+ }
53
+ if (html_element_node->close_tag != NULL) {
54
+ herb_visit_node((AST_NODE_T*) html_element_node->close_tag, match_tags_visitor, errors);
55
+ }
56
+ } break;
57
+
58
+
59
+ case AST_HTML_ATTRIBUTE_VALUE_NODE: {
60
+ const AST_HTML_ATTRIBUTE_VALUE_NODE_T* html_attribute_value_node = (const AST_HTML_ATTRIBUTE_VALUE_NODE_T*) node;
61
+
62
+ if (html_attribute_value_node->children != NULL) {
63
+ match_tags_in_node_array(html_attribute_value_node->children, errors);
64
+ }
65
+ } break;
66
+
67
+
68
+ case AST_HTML_ATTRIBUTE_NAME_NODE: {
69
+ const AST_HTML_ATTRIBUTE_NAME_NODE_T* html_attribute_name_node = (const AST_HTML_ATTRIBUTE_NAME_NODE_T*) node;
70
+
71
+ if (html_attribute_name_node->children != NULL) {
72
+ match_tags_in_node_array(html_attribute_name_node->children, errors);
73
+ }
74
+ } break;
75
+
76
+
77
+ case AST_HTML_ATTRIBUTE_NODE: {
78
+ const AST_HTML_ATTRIBUTE_NODE_T* html_attribute_node = (const AST_HTML_ATTRIBUTE_NODE_T*) node;
79
+
80
+ if (html_attribute_node->name != NULL) {
81
+ herb_visit_node((AST_NODE_T*) html_attribute_node->name, match_tags_visitor, errors);
82
+ }
83
+ if (html_attribute_node->value != NULL) {
84
+ herb_visit_node((AST_NODE_T*) html_attribute_node->value, match_tags_visitor, errors);
85
+ }
86
+ } break;
87
+
88
+
89
+
90
+ case AST_HTML_COMMENT_NODE: {
91
+ const AST_HTML_COMMENT_NODE_T* html_comment_node = (const AST_HTML_COMMENT_NODE_T*) node;
92
+
93
+ if (html_comment_node->children != NULL) {
94
+ match_tags_in_node_array(html_comment_node->children, errors);
95
+ }
96
+ } break;
97
+
98
+
99
+ case AST_HTML_DOCTYPE_NODE: {
100
+ const AST_HTML_DOCTYPE_NODE_T* html_doctype_node = (const AST_HTML_DOCTYPE_NODE_T*) node;
101
+
102
+ if (html_doctype_node->children != NULL) {
103
+ match_tags_in_node_array(html_doctype_node->children, errors);
104
+ }
105
+ } break;
106
+
107
+
108
+ case AST_XML_DECLARATION_NODE: {
109
+ const AST_XML_DECLARATION_NODE_T* xml_declaration_node = (const AST_XML_DECLARATION_NODE_T*) node;
110
+
111
+ if (xml_declaration_node->children != NULL) {
112
+ match_tags_in_node_array(xml_declaration_node->children, errors);
113
+ }
114
+ } break;
115
+
116
+
117
+ case AST_CDATA_NODE: {
118
+ const AST_CDATA_NODE_T* cdata_node = (const AST_CDATA_NODE_T*) node;
119
+
120
+ if (cdata_node->children != NULL) {
121
+ match_tags_in_node_array(cdata_node->children, errors);
122
+ }
123
+ } break;
124
+
125
+
126
+
127
+
128
+
129
+ case AST_ERB_ELSE_NODE: {
130
+ const AST_ERB_ELSE_NODE_T* erb_else_node = (const AST_ERB_ELSE_NODE_T*) node;
131
+
132
+ if (erb_else_node->statements != NULL) {
133
+ match_tags_in_node_array(erb_else_node->statements, errors);
134
+ }
135
+ } break;
136
+
137
+
138
+ case AST_ERB_IF_NODE: {
139
+ const AST_ERB_IF_NODE_T* erb_if_node = (const AST_ERB_IF_NODE_T*) node;
140
+
141
+ if (erb_if_node->statements != NULL) {
142
+ match_tags_in_node_array(erb_if_node->statements, errors);
143
+ }
144
+ if (erb_if_node->subsequent != NULL) {
145
+ herb_visit_node((AST_NODE_T*) erb_if_node->subsequent, match_tags_visitor, errors);
146
+ }
147
+ if (erb_if_node->end_node != NULL) {
148
+ herb_visit_node((AST_NODE_T*) erb_if_node->end_node, match_tags_visitor, errors);
149
+ }
150
+ } break;
151
+
152
+
153
+ case AST_ERB_BLOCK_NODE: {
154
+ const AST_ERB_BLOCK_NODE_T* erb_block_node = (const AST_ERB_BLOCK_NODE_T*) node;
155
+
156
+ if (erb_block_node->body != NULL) {
157
+ match_tags_in_node_array(erb_block_node->body, errors);
158
+ }
159
+ if (erb_block_node->end_node != NULL) {
160
+ herb_visit_node((AST_NODE_T*) erb_block_node->end_node, match_tags_visitor, errors);
161
+ }
162
+ } break;
163
+
164
+
165
+ case AST_ERB_WHEN_NODE: {
166
+ const AST_ERB_WHEN_NODE_T* erb_when_node = (const AST_ERB_WHEN_NODE_T*) node;
167
+
168
+ if (erb_when_node->statements != NULL) {
169
+ match_tags_in_node_array(erb_when_node->statements, errors);
170
+ }
171
+ } break;
172
+
173
+
174
+ case AST_ERB_CASE_NODE: {
175
+ const AST_ERB_CASE_NODE_T* erb_case_node = (const AST_ERB_CASE_NODE_T*) node;
176
+
177
+ if (erb_case_node->children != NULL) {
178
+ match_tags_in_node_array(erb_case_node->children, errors);
179
+ }
180
+ if (erb_case_node->conditions != NULL) {
181
+ match_tags_in_node_array(erb_case_node->conditions, errors);
182
+ }
183
+ if (erb_case_node->else_clause != NULL) {
184
+ herb_visit_node((AST_NODE_T*) erb_case_node->else_clause, match_tags_visitor, errors);
185
+ }
186
+ if (erb_case_node->end_node != NULL) {
187
+ herb_visit_node((AST_NODE_T*) erb_case_node->end_node, match_tags_visitor, errors);
188
+ }
189
+ } break;
190
+
191
+
192
+ case AST_ERB_CASE_MATCH_NODE: {
193
+ const AST_ERB_CASE_MATCH_NODE_T* erb_case_match_node = (const AST_ERB_CASE_MATCH_NODE_T*) node;
194
+
195
+ if (erb_case_match_node->children != NULL) {
196
+ match_tags_in_node_array(erb_case_match_node->children, errors);
197
+ }
198
+ if (erb_case_match_node->conditions != NULL) {
199
+ match_tags_in_node_array(erb_case_match_node->conditions, errors);
200
+ }
201
+ if (erb_case_match_node->else_clause != NULL) {
202
+ herb_visit_node((AST_NODE_T*) erb_case_match_node->else_clause, match_tags_visitor, errors);
203
+ }
204
+ if (erb_case_match_node->end_node != NULL) {
205
+ herb_visit_node((AST_NODE_T*) erb_case_match_node->end_node, match_tags_visitor, errors);
206
+ }
207
+ } break;
208
+
209
+
210
+ case AST_ERB_WHILE_NODE: {
211
+ const AST_ERB_WHILE_NODE_T* erb_while_node = (const AST_ERB_WHILE_NODE_T*) node;
212
+
213
+ if (erb_while_node->statements != NULL) {
214
+ match_tags_in_node_array(erb_while_node->statements, errors);
215
+ }
216
+ if (erb_while_node->end_node != NULL) {
217
+ herb_visit_node((AST_NODE_T*) erb_while_node->end_node, match_tags_visitor, errors);
218
+ }
219
+ } break;
220
+
221
+
222
+ case AST_ERB_UNTIL_NODE: {
223
+ const AST_ERB_UNTIL_NODE_T* erb_until_node = (const AST_ERB_UNTIL_NODE_T*) node;
224
+
225
+ if (erb_until_node->statements != NULL) {
226
+ match_tags_in_node_array(erb_until_node->statements, errors);
227
+ }
228
+ if (erb_until_node->end_node != NULL) {
229
+ herb_visit_node((AST_NODE_T*) erb_until_node->end_node, match_tags_visitor, errors);
230
+ }
231
+ } break;
232
+
233
+
234
+ case AST_ERB_FOR_NODE: {
235
+ const AST_ERB_FOR_NODE_T* erb_for_node = (const AST_ERB_FOR_NODE_T*) node;
236
+
237
+ if (erb_for_node->statements != NULL) {
238
+ match_tags_in_node_array(erb_for_node->statements, errors);
239
+ }
240
+ if (erb_for_node->end_node != NULL) {
241
+ herb_visit_node((AST_NODE_T*) erb_for_node->end_node, match_tags_visitor, errors);
242
+ }
243
+ } break;
244
+
245
+
246
+ case AST_ERB_RESCUE_NODE: {
247
+ const AST_ERB_RESCUE_NODE_T* erb_rescue_node = (const AST_ERB_RESCUE_NODE_T*) node;
248
+
249
+ if (erb_rescue_node->statements != NULL) {
250
+ match_tags_in_node_array(erb_rescue_node->statements, errors);
251
+ }
252
+ if (erb_rescue_node->subsequent != NULL) {
253
+ herb_visit_node((AST_NODE_T*) erb_rescue_node->subsequent, match_tags_visitor, errors);
254
+ }
255
+ } break;
256
+
257
+
258
+ case AST_ERB_ENSURE_NODE: {
259
+ const AST_ERB_ENSURE_NODE_T* erb_ensure_node = (const AST_ERB_ENSURE_NODE_T*) node;
260
+
261
+ if (erb_ensure_node->statements != NULL) {
262
+ match_tags_in_node_array(erb_ensure_node->statements, errors);
263
+ }
264
+ } break;
265
+
266
+
267
+ case AST_ERB_BEGIN_NODE: {
268
+ const AST_ERB_BEGIN_NODE_T* erb_begin_node = (const AST_ERB_BEGIN_NODE_T*) node;
269
+
270
+ if (erb_begin_node->statements != NULL) {
271
+ match_tags_in_node_array(erb_begin_node->statements, errors);
272
+ }
273
+ if (erb_begin_node->rescue_clause != NULL) {
274
+ herb_visit_node((AST_NODE_T*) erb_begin_node->rescue_clause, match_tags_visitor, errors);
275
+ }
276
+ if (erb_begin_node->else_clause != NULL) {
277
+ herb_visit_node((AST_NODE_T*) erb_begin_node->else_clause, match_tags_visitor, errors);
278
+ }
279
+ if (erb_begin_node->ensure_clause != NULL) {
280
+ herb_visit_node((AST_NODE_T*) erb_begin_node->ensure_clause, match_tags_visitor, errors);
281
+ }
282
+ if (erb_begin_node->end_node != NULL) {
283
+ herb_visit_node((AST_NODE_T*) erb_begin_node->end_node, match_tags_visitor, errors);
284
+ }
285
+ } break;
286
+
287
+
288
+ case AST_ERB_UNLESS_NODE: {
289
+ const AST_ERB_UNLESS_NODE_T* erb_unless_node = (const AST_ERB_UNLESS_NODE_T*) node;
290
+
291
+ if (erb_unless_node->statements != NULL) {
292
+ match_tags_in_node_array(erb_unless_node->statements, errors);
293
+ }
294
+ if (erb_unless_node->else_clause != NULL) {
295
+ herb_visit_node((AST_NODE_T*) erb_unless_node->else_clause, match_tags_visitor, errors);
296
+ }
297
+ if (erb_unless_node->end_node != NULL) {
298
+ herb_visit_node((AST_NODE_T*) erb_unless_node->end_node, match_tags_visitor, errors);
299
+ }
300
+ } break;
301
+
302
+
303
+
304
+ case AST_ERB_IN_NODE: {
305
+ const AST_ERB_IN_NODE_T* erb_in_node = (const AST_ERB_IN_NODE_T*) node;
306
+
307
+ if (erb_in_node->statements != NULL) {
308
+ match_tags_in_node_array(erb_in_node->statements, errors);
309
+ }
310
+ } break;
311
+
312
+ default: break;
313
+ }
314
+
315
+ return false;
316
+ }