herb 0.4.3-arm-linux-musl → 0.6.0-arm-linux-musl

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.
data/src/parser_helpers.c CHANGED
@@ -8,6 +8,7 @@
8
8
  #include "include/lexer.h"
9
9
  #include "include/parser.h"
10
10
  #include "include/token.h"
11
+ #include "include/token_matchers.h"
11
12
 
12
13
  #include <stdio.h>
13
14
  #include <strings.h>
@@ -54,6 +55,43 @@ bool parser_in_svg_context(const parser_T* parser) {
54
55
  return false;
55
56
  }
56
57
 
58
+ // ===== Foreign Content Handling =====
59
+
60
+ foreign_content_type_T parser_get_foreign_content_type(const char* tag_name) {
61
+ if (tag_name == NULL) { return FOREIGN_CONTENT_UNKNOWN; }
62
+
63
+ if (strcasecmp(tag_name, "script") == 0) { return FOREIGN_CONTENT_SCRIPT; }
64
+ if (strcasecmp(tag_name, "style") == 0) { return FOREIGN_CONTENT_STYLE; }
65
+
66
+ return FOREIGN_CONTENT_UNKNOWN;
67
+ }
68
+
69
+ bool parser_is_foreign_content_tag(const char* tag_name) {
70
+ return parser_get_foreign_content_type(tag_name) != FOREIGN_CONTENT_UNKNOWN;
71
+ }
72
+
73
+ const char* parser_get_foreign_content_closing_tag(foreign_content_type_T type) {
74
+ switch (type) {
75
+ case FOREIGN_CONTENT_SCRIPT: return "script";
76
+ case FOREIGN_CONTENT_STYLE: return "style";
77
+ default: return NULL;
78
+ }
79
+ }
80
+
81
+ void parser_enter_foreign_content(parser_T* parser, foreign_content_type_T type) {
82
+ if (parser == NULL) { return; }
83
+
84
+ parser->state = PARSER_STATE_FOREIGN_CONTENT;
85
+ parser->foreign_content_type = type;
86
+ }
87
+
88
+ void parser_exit_foreign_content(parser_T* parser) {
89
+ if (parser == NULL) { return; }
90
+
91
+ parser->state = PARSER_STATE_DATA;
92
+ parser->foreign_content_type = FOREIGN_CONTENT_UNKNOWN;
93
+ }
94
+
57
95
  void parser_append_unexpected_error(parser_T* parser, const char* description, const char* expected, array_T* errors) {
58
96
  token_T* token = parser_advance(parser);
59
97
 
@@ -166,3 +204,11 @@ void parser_handle_mismatched_tags(
166
204
  );
167
205
  }
168
206
  }
207
+
208
+ bool parser_is_expected_closing_tag_name(const char* tag_name, foreign_content_type_T expected_type) {
209
+ const char* expected_tag_name = parser_get_foreign_content_closing_tag(expected_type);
210
+
211
+ if (expected_tag_name == NULL || tag_name == NULL) { return false; }
212
+
213
+ return strcmp(tag_name, expected_tag_name) == 0;
214
+ }
data/src/token.c CHANGED
@@ -47,6 +47,10 @@ const char* token_type_to_string(const token_type_T type) {
47
47
  case TOKEN_NEWLINE: return "TOKEN_NEWLINE";
48
48
  case TOKEN_IDENTIFIER: return "TOKEN_IDENTIFIER";
49
49
  case TOKEN_HTML_DOCTYPE: return "TOKEN_HTML_DOCTYPE";
50
+ case TOKEN_XML_DECLARATION: return "TOKEN_XML_DECLARATION";
51
+ case TOKEN_XML_DECLARATION_END: return "TOKEN_XML_DECLARATION_END";
52
+ case TOKEN_CDATA_START: return "TOKEN_CDATA_START";
53
+ case TOKEN_CDATA_END: return "TOKEN_CDATA_END";
50
54
  case TOKEN_HTML_TAG_START: return "TOKEN_HTML_TAG_START";
51
55
  case TOKEN_HTML_TAG_END: return "TOKEN_HTML_TAG_END";
52
56
  case TOKEN_HTML_TAG_START_CLOSE: return "TOKEN_HTML_TAG_START_CLOSE";
@@ -55,6 +59,8 @@ const char* token_type_to_string(const token_type_T type) {
55
59
  case TOKEN_HTML_COMMENT_END: return "TOKEN_HTML_COMMENT_END";
56
60
  case TOKEN_EQUALS: return "TOKEN_EQUALS";
57
61
  case TOKEN_QUOTE: return "TOKEN_QUOTE";
62
+ case TOKEN_BACKTICK: return "TOKEN_BACKTICK";
63
+ case TOKEN_BACKSLASH: return "TOKEN_BACKSLASH";
58
64
  case TOKEN_DASH: return "TOKEN_DASH";
59
65
  case TOKEN_UNDERSCORE: return "TOKEN_UNDERSCORE";
60
66
  case TOKEN_EXCLAMATION: return "TOKEN_EXCLAMATION";
data/src/visitor.c CHANGED
@@ -1,5 +1,5 @@
1
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-7/templates/src/visitor.c.erb
2
+ // be modified manually. See /Users/marcoroth/Development/herb-release-0.6.0/templates/src/visitor.c.erb
3
3
 
4
4
  #include <stdio.h>
5
5
 
@@ -42,12 +42,12 @@ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NO
42
42
 
43
43
  } break;
44
44
 
45
- case AST_HTML_SELF_CLOSE_TAG_NODE: {
46
- const AST_HTML_SELF_CLOSE_TAG_NODE_T* html_self_close_tag_node = ((const AST_HTML_SELF_CLOSE_TAG_NODE_T *) node);
45
+ case AST_HTML_CLOSE_TAG_NODE: {
46
+ const AST_HTML_CLOSE_TAG_NODE_T* html_close_tag_node = ((const AST_HTML_CLOSE_TAG_NODE_T *) node);
47
47
 
48
- if (html_self_close_tag_node->attributes != NULL) {
49
- for (size_t index = 0; index < array_size(html_self_close_tag_node->attributes); index++) {
50
- herb_visit_node(array_get(html_self_close_tag_node->attributes, index), visitor, data);
48
+ if (html_close_tag_node->children != NULL) {
49
+ for (size_t index = 0; index < array_size(html_close_tag_node->children); index++) {
50
+ herb_visit_node(array_get(html_close_tag_node->children, index), visitor, data);
51
51
  }
52
52
  }
53
53
 
@@ -83,6 +83,17 @@ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NO
83
83
 
84
84
  } break;
85
85
 
86
+ case AST_HTML_ATTRIBUTE_NAME_NODE: {
87
+ const AST_HTML_ATTRIBUTE_NAME_NODE_T* html_attribute_name_node = ((const AST_HTML_ATTRIBUTE_NAME_NODE_T *) node);
88
+
89
+ if (html_attribute_name_node->children != NULL) {
90
+ for (size_t index = 0; index < array_size(html_attribute_name_node->children); index++) {
91
+ herb_visit_node(array_get(html_attribute_name_node->children, index), visitor, data);
92
+ }
93
+ }
94
+
95
+ } break;
96
+
86
97
  case AST_HTML_ATTRIBUTE_NODE: {
87
98
  const AST_HTML_ATTRIBUTE_NODE_T* html_attribute_node = ((const AST_HTML_ATTRIBUTE_NODE_T *) node);
88
99
 
@@ -118,6 +129,28 @@ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NO
118
129
 
119
130
  } break;
120
131
 
132
+ case AST_XML_DECLARATION_NODE: {
133
+ const AST_XML_DECLARATION_NODE_T* xml_declaration_node = ((const AST_XML_DECLARATION_NODE_T *) node);
134
+
135
+ if (xml_declaration_node->children != NULL) {
136
+ for (size_t index = 0; index < array_size(xml_declaration_node->children); index++) {
137
+ herb_visit_node(array_get(xml_declaration_node->children, index), visitor, data);
138
+ }
139
+ }
140
+
141
+ } break;
142
+
143
+ case AST_CDATA_NODE: {
144
+ const AST_CDATA_NODE_T* cdata_node = ((const AST_CDATA_NODE_T *) node);
145
+
146
+ if (cdata_node->children != NULL) {
147
+ for (size_t index = 0; index < array_size(cdata_node->children); index++) {
148
+ herb_visit_node(array_get(cdata_node->children, index), visitor, data);
149
+ }
150
+ }
151
+
152
+ } break;
153
+
121
154
  case AST_ERB_ELSE_NODE: {
122
155
  const AST_ERB_ELSE_NODE_T* erb_else_node = ((const AST_ERB_ELSE_NODE_T *) node);
123
156
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: herb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.6.0
5
5
  platform: arm-linux-musl
6
6
  authors:
7
7
  - Marco Roth
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-08-03 00:00:00.000000000 Z
10
+ date: 2025-08-25 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: Powerful and seamless HTML-aware ERB parsing and tooling.
13
13
  email: