@herb-tools/node 0.7.4 → 0.8.0
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.
- package/binding.gyp +8 -5
- package/dist/herb-node.esm.js +6 -6
- package/dist/herb-node.esm.js.map +1 -1
- package/extension/error_helpers.cpp +67 -9
- package/extension/error_helpers.h +4 -2
- package/extension/extension_helpers.cpp +20 -31
- package/extension/extension_helpers.h +7 -5
- package/extension/herb.cpp +10 -42
- package/extension/libherb/analyze.c +461 -249
- package/extension/libherb/analyze.h +10 -2
- package/extension/libherb/analyze_helpers.c +5 -0
- package/extension/libherb/analyze_helpers.h +3 -0
- package/extension/libherb/analyze_missing_end.c +147 -0
- package/extension/libherb/analyze_transform.c +196 -0
- package/extension/libherb/analyzed_ruby.c +23 -2
- package/extension/libherb/analyzed_ruby.h +4 -2
- package/extension/libherb/ast_node.c +14 -17
- package/extension/libherb/ast_node.h +4 -4
- package/extension/libherb/ast_nodes.c +180 -182
- package/extension/libherb/ast_nodes.h +69 -68
- package/extension/libherb/ast_pretty_print.c +233 -233
- package/extension/libherb/ast_pretty_print.h +3 -3
- package/extension/libherb/element_source.c +7 -6
- package/extension/libherb/element_source.h +3 -1
- package/extension/libherb/errors.c +273 -153
- package/extension/libherb/errors.h +43 -27
- package/extension/libherb/extract.c +92 -34
- package/extension/libherb/extract.h +4 -4
- package/extension/libherb/herb.c +37 -49
- package/extension/libherb/herb.h +6 -7
- package/extension/libherb/html_util.c +34 -96
- package/extension/libherb/html_util.h +4 -5
- package/extension/libherb/include/analyze.h +10 -2
- package/extension/libherb/include/analyze_helpers.h +3 -0
- package/extension/libherb/include/analyzed_ruby.h +4 -2
- package/extension/libherb/include/ast_node.h +4 -4
- package/extension/libherb/include/ast_nodes.h +69 -68
- package/extension/libherb/include/ast_pretty_print.h +3 -3
- package/extension/libherb/include/element_source.h +3 -1
- package/extension/libherb/include/errors.h +43 -27
- package/extension/libherb/include/extract.h +4 -4
- package/extension/libherb/include/herb.h +6 -7
- package/extension/libherb/include/html_util.h +4 -5
- package/extension/libherb/include/lexer.h +1 -3
- package/extension/libherb/include/lexer_peek_helpers.h +21 -19
- package/extension/libherb/include/lexer_struct.h +12 -10
- package/extension/libherb/include/location.h +10 -13
- package/extension/libherb/include/macros.h +4 -0
- package/extension/libherb/include/parser.h +12 -6
- package/extension/libherb/include/parser_helpers.h +26 -16
- package/extension/libherb/include/position.h +3 -14
- package/extension/libherb/include/pretty_print.h +38 -28
- package/extension/libherb/include/prism_helpers.h +1 -1
- package/extension/libherb/include/range.h +4 -13
- package/extension/libherb/include/token.h +5 -11
- package/extension/libherb/include/token_struct.h +2 -2
- package/extension/libherb/include/utf8.h +3 -2
- package/extension/libherb/include/util/hb_arena.h +31 -0
- package/extension/libherb/include/util/hb_arena_debug.h +8 -0
- package/extension/libherb/include/util/hb_array.h +33 -0
- package/extension/libherb/include/util/hb_buffer.h +34 -0
- package/extension/libherb/include/util/hb_string.h +29 -0
- package/extension/libherb/include/util/hb_system.h +9 -0
- package/extension/libherb/include/util.h +3 -14
- package/extension/libherb/include/version.h +1 -1
- package/extension/libherb/include/visitor.h +1 -1
- package/extension/libherb/io.c +7 -4
- package/extension/libherb/lexer.c +62 -88
- package/extension/libherb/lexer.h +1 -3
- package/extension/libherb/lexer_peek_helpers.c +42 -38
- package/extension/libherb/lexer_peek_helpers.h +21 -19
- package/extension/libherb/lexer_struct.h +12 -10
- package/extension/libherb/location.c +9 -37
- package/extension/libherb/location.h +10 -13
- package/extension/libherb/macros.h +4 -0
- package/extension/libherb/main.c +19 -23
- package/extension/libherb/parser.c +373 -313
- package/extension/libherb/parser.h +12 -6
- package/extension/libherb/parser_helpers.c +60 -54
- package/extension/libherb/parser_helpers.h +26 -16
- package/extension/libherb/parser_match_tags.c +316 -0
- package/extension/libherb/position.h +3 -14
- package/extension/libherb/pretty_print.c +88 -117
- package/extension/libherb/pretty_print.h +38 -28
- package/extension/libherb/prism_helpers.c +7 -7
- package/extension/libherb/prism_helpers.h +1 -1
- package/extension/libherb/range.c +2 -35
- package/extension/libherb/range.h +4 -13
- package/extension/libherb/token.c +36 -87
- package/extension/libherb/token.h +5 -11
- package/extension/libherb/token_struct.h +2 -2
- package/extension/libherb/utf8.c +4 -4
- package/extension/libherb/utf8.h +3 -2
- package/extension/libherb/util/hb_arena.c +179 -0
- package/extension/libherb/util/hb_arena.h +31 -0
- package/extension/libherb/util/hb_arena_debug.c +237 -0
- package/extension/libherb/util/hb_arena_debug.h +8 -0
- package/extension/libherb/{array.c → util/hb_array.c} +26 -27
- package/extension/libherb/util/hb_array.h +33 -0
- package/extension/libherb/util/hb_buffer.c +203 -0
- package/extension/libherb/util/hb_buffer.h +34 -0
- package/extension/libherb/util/hb_string.c +85 -0
- package/extension/libherb/util/hb_string.h +29 -0
- package/extension/libherb/util/hb_system.c +30 -0
- package/extension/libherb/util/hb_system.h +9 -0
- package/extension/libherb/util.c +29 -99
- package/extension/libherb/util.h +3 -14
- package/extension/libherb/version.h +1 -1
- package/extension/libherb/visitor.c +55 -55
- package/extension/libherb/visitor.h +1 -1
- package/extension/nodes.cpp +40 -40
- package/extension/nodes.h +2 -2
- package/extension/prism/include/prism/ast.h +31 -1
- package/extension/prism/include/prism/diagnostic.h +1 -0
- package/extension/prism/include/prism/version.h +3 -3
- package/extension/prism/src/diagnostic.c +3 -1
- package/extension/prism/src/prism.c +130 -71
- package/extension/prism/src/util/pm_string.c +6 -8
- package/package.json +3 -3
- package/extension/libherb/array.h +0 -33
- package/extension/libherb/buffer.c +0 -232
- package/extension/libherb/buffer.h +0 -39
- package/extension/libherb/include/array.h +0 -33
- package/extension/libherb/include/buffer.h +0 -39
- package/extension/libherb/include/json.h +0 -28
- package/extension/libherb/include/memory.h +0 -12
- package/extension/libherb/json.c +0 -205
- package/extension/libherb/json.h +0 -28
- package/extension/libherb/memory.c +0 -53
- package/extension/libherb/memory.h +0 -12
- package/extension/libherb/position.c +0 -33
|
@@ -4,10 +4,8 @@
|
|
|
4
4
|
#include "lexer_struct.h"
|
|
5
5
|
#include "token_struct.h"
|
|
6
6
|
|
|
7
|
-
lexer_T*
|
|
7
|
+
void lexer_init(lexer_T* lexer, const char* source);
|
|
8
8
|
token_T* lexer_next_token(lexer_T* lexer);
|
|
9
9
|
token_T* lexer_error(lexer_T* lexer, const char* message);
|
|
10
10
|
|
|
11
|
-
void lexer_free(lexer_T* lexer);
|
|
12
|
-
|
|
13
11
|
#endif
|
|
@@ -3,80 +3,83 @@
|
|
|
3
3
|
#include "include/lexer_struct.h"
|
|
4
4
|
#include "include/macros.h"
|
|
5
5
|
#include "include/token.h"
|
|
6
|
+
#include "include/util/hb_string.h"
|
|
6
7
|
|
|
7
8
|
#include <ctype.h>
|
|
8
9
|
#include <stdbool.h>
|
|
9
10
|
|
|
10
|
-
char lexer_backtrack(const lexer_T* lexer,
|
|
11
|
-
return lexer->source[MAX(lexer->current_position - offset, 0)];
|
|
11
|
+
char lexer_backtrack(const lexer_T* lexer, uint32_t offset) {
|
|
12
|
+
return lexer->source.data[MAX(lexer->current_position - offset, 0)];
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
char lexer_peek(const lexer_T* lexer,
|
|
15
|
-
return lexer->source[MIN(lexer->current_position + offset, lexer->
|
|
15
|
+
char lexer_peek(const lexer_T* lexer, uint32_t offset) {
|
|
16
|
+
return lexer->source.data[MIN(lexer->current_position + offset, lexer->source.length)];
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
bool lexer_peek_for(const lexer_T* lexer,
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
bool lexer_peek_for(const lexer_T* lexer, uint32_t offset, hb_string_T pattern, const bool case_insensitive) {
|
|
20
|
+
hb_string_T remaining_source = hb_string_slice(lexer->source, lexer->current_position + offset);
|
|
21
|
+
remaining_source.length = MIN(pattern.length, remaining_source.length);
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
23
|
+
if (case_insensitive) {
|
|
24
|
+
return hb_string_equals_case_insensitive(remaining_source, pattern);
|
|
25
|
+
} else {
|
|
26
|
+
return hb_string_equals(remaining_source, pattern);
|
|
27
27
|
}
|
|
28
|
+
}
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
bool lexer_peek_for_doctype(const lexer_T* lexer, uint32_t offset) {
|
|
31
|
+
return lexer_peek_for(lexer, offset, hb_string("<!DOCTYPE"), true);
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
bool
|
|
33
|
-
return lexer_peek_for(lexer, offset, "
|
|
34
|
+
bool lexer_peek_for_xml_declaration(const lexer_T* lexer, uint32_t offset) {
|
|
35
|
+
return lexer_peek_for(lexer, offset, hb_string("<?xml"), true);
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
bool
|
|
37
|
-
return lexer_peek_for(lexer, offset, "
|
|
38
|
+
bool lexer_peek_for_cdata_start(const lexer_T* lexer, uint32_t offset) {
|
|
39
|
+
return lexer_peek_for(lexer, offset, hb_string("<![CDATA["), false);
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
bool
|
|
41
|
-
return lexer_peek_for(lexer, offset, "
|
|
42
|
+
bool lexer_peek_for_cdata_end(const lexer_T* lexer, uint32_t offset) {
|
|
43
|
+
return lexer_peek_for(lexer, offset, hb_string("]]>"), false);
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
bool
|
|
45
|
-
return lexer_peek_for(lexer, offset, "
|
|
46
|
+
bool lexer_peek_for_html_comment_start(const lexer_T* lexer, uint32_t offset) {
|
|
47
|
+
return lexer_peek_for(lexer, offset, hb_string("<!--"), false);
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
bool
|
|
49
|
-
return lexer_peek_for(lexer, offset, "
|
|
50
|
+
bool lexer_peek_for_html_comment_end(const lexer_T* lexer, uint32_t offset) {
|
|
51
|
+
return lexer_peek_for(lexer, offset, hb_string("-->"), false);
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
bool
|
|
53
|
-
return lexer_peek_for(lexer, offset, "
|
|
54
|
+
bool lexer_peek_erb_close_tag(const lexer_T* lexer, uint32_t offset) {
|
|
55
|
+
return lexer_peek_for(lexer, offset, hb_string("%>"), false);
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
bool
|
|
57
|
-
return lexer_peek_for(lexer, offset, "
|
|
58
|
+
bool lexer_peek_erb_dash_close_tag(const lexer_T* lexer, uint32_t offset) {
|
|
59
|
+
return lexer_peek_for(lexer, offset, hb_string("-%>"), false);
|
|
58
60
|
}
|
|
59
61
|
|
|
60
|
-
bool
|
|
61
|
-
return lexer_peek_for(lexer, offset, "
|
|
62
|
+
bool lexer_peek_erb_percent_close_tag(const lexer_T* lexer, uint32_t offset) {
|
|
63
|
+
return lexer_peek_for(lexer, offset, hb_string("%%>"), false);
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
bool
|
|
65
|
-
return lexer_peek_for(lexer, offset, "
|
|
66
|
+
bool lexer_peek_erb_equals_close_tag(const lexer_T* lexer, uint32_t offset) {
|
|
67
|
+
return lexer_peek_for(lexer, offset, hb_string("=%>"), false);
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
bool lexer_peek_erb_end(const lexer_T* lexer,
|
|
70
|
+
bool lexer_peek_erb_end(const lexer_T* lexer, uint32_t offset) {
|
|
69
71
|
return (
|
|
70
72
|
lexer_peek_erb_close_tag(lexer, offset) || lexer_peek_erb_dash_close_tag(lexer, offset)
|
|
71
|
-
|| lexer_peek_erb_percent_close_tag(lexer, offset)
|
|
73
|
+
|| lexer_peek_erb_percent_close_tag(lexer, offset) || lexer_peek_erb_equals_close_tag(lexer, offset)
|
|
72
74
|
);
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
bool lexer_peek_for_token_type_after_whitespace(lexer_T* lexer, token_type_T token_type) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
uint32_t saved_position = lexer->current_position;
|
|
79
|
+
uint32_t saved_line = lexer->current_line;
|
|
80
|
+
uint32_t saved_column = lexer->current_column;
|
|
79
81
|
char saved_character = lexer->current_character;
|
|
82
|
+
lexer_state_T saved_state = lexer->state;
|
|
80
83
|
|
|
81
84
|
token_T* token = lexer_next_token(lexer);
|
|
82
85
|
|
|
@@ -93,14 +96,15 @@ bool lexer_peek_for_token_type_after_whitespace(lexer_T* lexer, token_type_T tok
|
|
|
93
96
|
lexer->current_line = saved_line;
|
|
94
97
|
lexer->current_column = saved_column;
|
|
95
98
|
lexer->current_character = saved_character;
|
|
99
|
+
lexer->state = saved_state;
|
|
96
100
|
|
|
97
101
|
return result;
|
|
98
102
|
}
|
|
99
103
|
|
|
100
|
-
bool lexer_peek_for_close_tag_start(const lexer_T* lexer,
|
|
104
|
+
bool lexer_peek_for_close_tag_start(const lexer_T* lexer, uint32_t offset) {
|
|
101
105
|
if (lexer_peek(lexer, offset) != '<' || lexer_peek(lexer, offset + 1) != '/') { return false; }
|
|
102
106
|
|
|
103
|
-
|
|
107
|
+
uint32_t pos = offset + 2;
|
|
104
108
|
|
|
105
109
|
while (lexer_peek(lexer, pos) == ' ' || lexer_peek(lexer, pos) == '\t' || lexer_peek(lexer, pos) == '\n'
|
|
106
110
|
|| lexer_peek(lexer, pos) == '\r') {
|
|
@@ -5,38 +5,40 @@
|
|
|
5
5
|
#include "token_struct.h"
|
|
6
6
|
|
|
7
7
|
#include <stdbool.h>
|
|
8
|
+
#include <stdint.h>
|
|
8
9
|
#include <stdio.h>
|
|
9
10
|
#include <stdlib.h>
|
|
10
11
|
|
|
11
12
|
typedef struct {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
uint32_t position;
|
|
14
|
+
uint32_t line;
|
|
15
|
+
uint32_t column;
|
|
16
|
+
uint32_t previous_position;
|
|
17
|
+
uint32_t previous_line;
|
|
18
|
+
uint32_t previous_column;
|
|
18
19
|
char current_character;
|
|
19
20
|
lexer_state_T state;
|
|
20
21
|
} lexer_state_snapshot_T;
|
|
21
22
|
|
|
22
|
-
char lexer_peek(const lexer_T* lexer,
|
|
23
|
-
bool lexer_peek_for_doctype(const lexer_T* lexer,
|
|
24
|
-
bool lexer_peek_for_xml_declaration(const lexer_T* lexer,
|
|
25
|
-
bool lexer_peek_for_cdata_start(const lexer_T* lexer,
|
|
26
|
-
bool lexer_peek_for_cdata_end(const lexer_T* lexer,
|
|
23
|
+
char lexer_peek(const lexer_T* lexer, uint32_t offset);
|
|
24
|
+
bool lexer_peek_for_doctype(const lexer_T* lexer, uint32_t offset);
|
|
25
|
+
bool lexer_peek_for_xml_declaration(const lexer_T* lexer, uint32_t offset);
|
|
26
|
+
bool lexer_peek_for_cdata_start(const lexer_T* lexer, uint32_t offset);
|
|
27
|
+
bool lexer_peek_for_cdata_end(const lexer_T* lexer, uint32_t offset);
|
|
27
28
|
|
|
28
|
-
bool lexer_peek_for_html_comment_start(const lexer_T* lexer,
|
|
29
|
-
bool lexer_peek_for_html_comment_end(const lexer_T* lexer,
|
|
29
|
+
bool lexer_peek_for_html_comment_start(const lexer_T* lexer, uint32_t offset);
|
|
30
|
+
bool lexer_peek_for_html_comment_end(const lexer_T* lexer, uint32_t offset);
|
|
30
31
|
|
|
31
|
-
bool lexer_peek_erb_close_tag(const lexer_T* lexer,
|
|
32
|
-
bool lexer_peek_erb_dash_close_tag(const lexer_T* lexer,
|
|
33
|
-
bool lexer_peek_erb_percent_close_tag(const lexer_T* lexer,
|
|
34
|
-
bool
|
|
32
|
+
bool lexer_peek_erb_close_tag(const lexer_T* lexer, uint32_t offset);
|
|
33
|
+
bool lexer_peek_erb_dash_close_tag(const lexer_T* lexer, uint32_t offset);
|
|
34
|
+
bool lexer_peek_erb_percent_close_tag(const lexer_T* lexer, uint32_t offset);
|
|
35
|
+
bool lexer_peek_erb_equals_close_tag(const lexer_T* lexer, uint32_t offset);
|
|
36
|
+
bool lexer_peek_erb_end(const lexer_T* lexer, uint32_t offset);
|
|
35
37
|
|
|
36
|
-
char lexer_backtrack(const lexer_T* lexer,
|
|
38
|
+
char lexer_backtrack(const lexer_T* lexer, uint32_t offset);
|
|
37
39
|
|
|
38
40
|
bool lexer_peek_for_token_type_after_whitespace(lexer_T* lexer, token_type_T token_type);
|
|
39
|
-
bool lexer_peek_for_close_tag_start(const lexer_T* lexer,
|
|
41
|
+
bool lexer_peek_for_close_tag_start(const lexer_T* lexer, uint32_t offset);
|
|
40
42
|
|
|
41
43
|
lexer_state_snapshot_T lexer_save_state(lexer_T* lexer);
|
|
42
44
|
void lexer_restore_state(lexer_T* lexer, lexer_state_snapshot_T snapshot);
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
#ifndef HERB_LEXER_STRUCT_H
|
|
2
2
|
#define HERB_LEXER_STRUCT_H
|
|
3
3
|
|
|
4
|
+
#include "util/hb_string.h"
|
|
5
|
+
|
|
4
6
|
#include <stdbool.h>
|
|
7
|
+
#include <stdint.h>
|
|
5
8
|
#include <stdlib.h>
|
|
6
9
|
|
|
7
10
|
typedef enum {
|
|
@@ -11,21 +14,20 @@ typedef enum {
|
|
|
11
14
|
} lexer_state_T;
|
|
12
15
|
|
|
13
16
|
typedef struct LEXER_STRUCT {
|
|
14
|
-
|
|
15
|
-
size_t source_length;
|
|
17
|
+
hb_string_T source;
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
uint32_t current_line;
|
|
20
|
+
uint32_t current_column;
|
|
21
|
+
uint32_t current_position;
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
uint32_t previous_line;
|
|
24
|
+
uint32_t previous_column;
|
|
25
|
+
uint32_t previous_position;
|
|
24
26
|
|
|
25
27
|
char current_character;
|
|
26
28
|
lexer_state_T state;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
uint32_t stall_counter;
|
|
30
|
+
uint32_t last_position;
|
|
29
31
|
bool stalled;
|
|
30
32
|
} lexer_T;
|
|
31
33
|
|
|
@@ -1,41 +1,13 @@
|
|
|
1
1
|
#include "include/location.h"
|
|
2
|
-
#include "include/memory.h"
|
|
3
2
|
#include "include/position.h"
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
location->start =
|
|
13
|
-
location->end =
|
|
14
|
-
|
|
15
|
-
return location;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
location_T* location_from(size_t start_line, size_t start_column, size_t end_line, size_t end_column) {
|
|
19
|
-
return location_init(position_init(start_line, start_column), position_init(end_line, end_column));
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
position_T* location_start(location_T* location) {
|
|
23
|
-
return location->start;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
position_T* location_end(location_T* location) {
|
|
27
|
-
return location->end;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
location_T* location_copy(location_T* location) {
|
|
31
|
-
if (location == NULL) { return NULL; }
|
|
32
|
-
|
|
33
|
-
return location_init(position_copy(location->start), position_copy(location->end));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
void location_free(location_T* location) {
|
|
37
|
-
if (location->start != NULL) { position_free(location->start); }
|
|
38
|
-
if (location->end != NULL) { position_free(location->end); }
|
|
39
|
-
|
|
40
|
-
free(location);
|
|
4
|
+
void location_from(
|
|
5
|
+
location_T* location,
|
|
6
|
+
uint32_t start_line,
|
|
7
|
+
uint32_t start_column,
|
|
8
|
+
uint32_t end_line,
|
|
9
|
+
uint32_t end_column
|
|
10
|
+
) {
|
|
11
|
+
location->start = (position_T) { .line = start_line, .column = start_column };
|
|
12
|
+
location->end = (position_T) { .line = end_line, .column = end_column };
|
|
41
13
|
}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
#ifndef HERB_LOCATION_H
|
|
2
2
|
#define HERB_LOCATION_H
|
|
3
3
|
|
|
4
|
+
#include <stdint.h>
|
|
4
5
|
#include <stdlib.h>
|
|
5
6
|
|
|
6
7
|
#include "position.h"
|
|
7
8
|
|
|
8
9
|
typedef struct LOCATION_STRUCT {
|
|
9
|
-
position_T
|
|
10
|
-
position_T
|
|
10
|
+
position_T start;
|
|
11
|
+
position_T end;
|
|
11
12
|
} location_T;
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
location_T*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
location_T* location_copy(location_T* location);
|
|
22
|
-
|
|
23
|
-
void location_free(location_T* location);
|
|
14
|
+
void location_from(
|
|
15
|
+
location_T* location,
|
|
16
|
+
uint32_t start_line,
|
|
17
|
+
uint32_t start_column,
|
|
18
|
+
uint32_t end_line,
|
|
19
|
+
uint32_t end_column
|
|
20
|
+
);
|
|
24
21
|
|
|
25
22
|
#endif
|
package/extension/libherb/main.c
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
#include "include/ast_node.h"
|
|
5
5
|
#include "include/ast_nodes.h"
|
|
6
6
|
#include "include/ast_pretty_print.h"
|
|
7
|
-
#include "include/buffer.h"
|
|
8
7
|
#include "include/extract.h"
|
|
9
8
|
#include "include/herb.h"
|
|
10
9
|
#include "include/io.h"
|
|
11
10
|
#include "include/ruby_parser.h"
|
|
11
|
+
#include "include/util/hb_buffer.h"
|
|
12
12
|
|
|
13
13
|
#include <stdio.h>
|
|
14
14
|
#include <string.h>
|
|
@@ -39,7 +39,6 @@ int main(const int argc, char* argv[]) {
|
|
|
39
39
|
printf("Herb 🌿 Powerful and seamless HTML-aware ERB parsing and tooling.\n\n");
|
|
40
40
|
|
|
41
41
|
printf("./herb lex [file] - Lex a file\n");
|
|
42
|
-
printf("./herb lex_json [file] - Lex a file and return the result as json.\n");
|
|
43
42
|
printf("./herb parse [file] - Parse a file\n");
|
|
44
43
|
printf("./herb ruby [file] - Extract Ruby from a file\n");
|
|
45
44
|
printf("./herb html [file] - Extract HTML from a file\n");
|
|
@@ -53,9 +52,9 @@ int main(const int argc, char* argv[]) {
|
|
|
53
52
|
return 1;
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
hb_buffer_T output;
|
|
57
56
|
|
|
58
|
-
if (!
|
|
57
|
+
if (!hb_buffer_init(&output, 4096)) { return 1; }
|
|
59
58
|
|
|
60
59
|
char* source = herb_read_file(argv[2]);
|
|
61
60
|
|
|
@@ -74,7 +73,7 @@ int main(const int argc, char* argv[]) {
|
|
|
74
73
|
print_time_diff(start, end, "visiting");
|
|
75
74
|
|
|
76
75
|
ast_node_free((AST_NODE_T*) root);
|
|
77
|
-
|
|
76
|
+
free(output.value);
|
|
78
77
|
free(source);
|
|
79
78
|
|
|
80
79
|
return 0;
|
|
@@ -87,18 +86,7 @@ int main(const int argc, char* argv[]) {
|
|
|
87
86
|
printf("%s\n", output.value);
|
|
88
87
|
print_time_diff(start, end, "lexing");
|
|
89
88
|
|
|
90
|
-
|
|
91
|
-
free(source);
|
|
92
|
-
|
|
93
|
-
return 0;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (strcmp(argv[1], "lex_json") == 0) {
|
|
97
|
-
herb_lex_json_to_buffer(source, &output);
|
|
98
|
-
|
|
99
|
-
printf("%s\n", output.value);
|
|
100
|
-
|
|
101
|
-
buffer_free(&output);
|
|
89
|
+
free(output.value);
|
|
102
90
|
free(source);
|
|
103
91
|
|
|
104
92
|
return 0;
|
|
@@ -106,15 +94,23 @@ int main(const int argc, char* argv[]) {
|
|
|
106
94
|
|
|
107
95
|
if (strcmp(argv[1], "parse") == 0) {
|
|
108
96
|
AST_DOCUMENT_NODE_T* root = herb_parse(source, NULL);
|
|
97
|
+
|
|
98
|
+
herb_analyze_parse_tree(root, source);
|
|
99
|
+
|
|
109
100
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
|
110
101
|
|
|
111
|
-
|
|
112
|
-
|
|
102
|
+
int silent = 0;
|
|
103
|
+
if (argc > 3 && strcmp(argv[3], "--silent") == 0) { silent = 1; }
|
|
104
|
+
|
|
105
|
+
if (!silent) {
|
|
106
|
+
ast_pretty_print_node((AST_NODE_T*) root, 0, 0, &output);
|
|
107
|
+
printf("%s\n", output.value);
|
|
113
108
|
|
|
114
|
-
|
|
109
|
+
print_time_diff(start, end, "parsing");
|
|
110
|
+
}
|
|
115
111
|
|
|
116
112
|
ast_node_free((AST_NODE_T*) root);
|
|
117
|
-
|
|
113
|
+
free(output.value);
|
|
118
114
|
free(source);
|
|
119
115
|
|
|
120
116
|
return 0;
|
|
@@ -127,7 +123,7 @@ int main(const int argc, char* argv[]) {
|
|
|
127
123
|
printf("%s\n", output.value);
|
|
128
124
|
print_time_diff(start, end, "extracting Ruby");
|
|
129
125
|
|
|
130
|
-
|
|
126
|
+
free(output.value);
|
|
131
127
|
free(source);
|
|
132
128
|
|
|
133
129
|
return 0;
|
|
@@ -140,7 +136,7 @@ int main(const int argc, char* argv[]) {
|
|
|
140
136
|
printf("%s\n", output.value);
|
|
141
137
|
print_time_diff(start, end, "extracting HTML");
|
|
142
138
|
|
|
143
|
-
|
|
139
|
+
free(output.value);
|
|
144
140
|
free(source);
|
|
145
141
|
|
|
146
142
|
return 0;
|