@herb-tools/node 0.1.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/CHANGELOG.md +3 -0
- package/README.md +9 -0
- package/binding.gyp +98 -0
- package/dist/herb-node.cjs +20 -0
- package/dist/herb-node.cjs.map +1 -0
- package/dist/herb-node.esm.js +33 -0
- package/dist/herb-node.esm.js.map +1 -0
- package/dist/types/index-cjs.d.cts +1 -0
- package/dist/types/index-esm.d.mts +8 -0
- package/dist/types/node-backend.d.ts +4 -0
- package/dist/types/util.d.ts +2 -0
- package/extension/error_helpers.cpp +340 -0
- package/extension/error_helpers.h +26 -0
- package/extension/extension_helpers.cpp +206 -0
- package/extension/extension_helpers.h +22 -0
- package/extension/herb.cpp +232 -0
- package/extension/libherb/analyze.c +989 -0
- package/extension/libherb/analyze_helpers.c +241 -0
- package/extension/libherb/analyzed_ruby.c +35 -0
- package/extension/libherb/array.c +137 -0
- package/extension/libherb/ast_node.c +81 -0
- package/extension/libherb/ast_nodes.c +866 -0
- package/extension/libherb/ast_pretty_print.c +588 -0
- package/extension/libherb/buffer.c +199 -0
- package/extension/libherb/errors.c +740 -0
- package/extension/libherb/extract.c +110 -0
- package/extension/libherb/herb.c +103 -0
- package/extension/libherb/html_util.c +143 -0
- package/extension/libherb/include/analyze.h +36 -0
- package/extension/libherb/include/analyze_helpers.h +43 -0
- package/extension/libherb/include/analyzed_ruby.h +33 -0
- package/extension/libherb/include/array.h +33 -0
- package/extension/libherb/include/ast_node.h +35 -0
- package/extension/libherb/include/ast_nodes.h +303 -0
- package/extension/libherb/include/ast_pretty_print.h +17 -0
- package/extension/libherb/include/buffer.h +36 -0
- package/extension/libherb/include/errors.h +125 -0
- package/extension/libherb/include/extract.h +20 -0
- package/extension/libherb/include/herb.h +32 -0
- package/extension/libherb/include/html_util.h +13 -0
- package/extension/libherb/include/io.h +9 -0
- package/extension/libherb/include/json.h +28 -0
- package/extension/libherb/include/lexer.h +13 -0
- package/extension/libherb/include/lexer_peek_helpers.h +23 -0
- package/extension/libherb/include/lexer_struct.h +32 -0
- package/extension/libherb/include/location.h +25 -0
- package/extension/libherb/include/macros.h +10 -0
- package/extension/libherb/include/memory.h +12 -0
- package/extension/libherb/include/parser.h +22 -0
- package/extension/libherb/include/parser_helpers.h +33 -0
- package/extension/libherb/include/position.h +22 -0
- package/extension/libherb/include/pretty_print.h +53 -0
- package/extension/libherb/include/prism_helpers.h +18 -0
- package/extension/libherb/include/range.h +23 -0
- package/extension/libherb/include/ruby_parser.h +6 -0
- package/extension/libherb/include/token.h +25 -0
- package/extension/libherb/include/token_matchers.h +21 -0
- package/extension/libherb/include/token_struct.h +51 -0
- package/extension/libherb/include/util.h +25 -0
- package/extension/libherb/include/version.h +6 -0
- package/extension/libherb/include/visitor.h +11 -0
- package/extension/libherb/io.c +30 -0
- package/extension/libherb/json.c +205 -0
- package/extension/libherb/lexer.c +284 -0
- package/extension/libherb/lexer_peek_helpers.c +59 -0
- package/extension/libherb/location.c +41 -0
- package/extension/libherb/main.c +162 -0
- package/extension/libherb/memory.c +53 -0
- package/extension/libherb/parser.c +704 -0
- package/extension/libherb/parser_helpers.c +161 -0
- package/extension/libherb/position.c +33 -0
- package/extension/libherb/pretty_print.c +242 -0
- package/extension/libherb/prism_helpers.c +50 -0
- package/extension/libherb/range.c +38 -0
- package/extension/libherb/ruby_parser.c +47 -0
- package/extension/libherb/token.c +194 -0
- package/extension/libherb/token_matchers.c +32 -0
- package/extension/libherb/util.c +128 -0
- package/extension/libherb/visitor.c +321 -0
- package/extension/nodes.cpp +1060 -0
- package/extension/nodes.h +44 -0
- package/extension/prism/include/prism/ast.h +7964 -0
- package/extension/prism/include/prism/defines.h +260 -0
- package/extension/prism/include/prism/diagnostic.h +451 -0
- package/extension/prism/include/prism/encoding.h +283 -0
- package/extension/prism/include/prism/node.h +129 -0
- package/extension/prism/include/prism/options.h +442 -0
- package/extension/prism/include/prism/pack.h +163 -0
- package/extension/prism/include/prism/parser.h +933 -0
- package/extension/prism/include/prism/prettyprint.h +34 -0
- package/extension/prism/include/prism/regexp.h +43 -0
- package/extension/prism/include/prism/static_literals.h +121 -0
- package/extension/prism/include/prism/util/pm_buffer.h +228 -0
- package/extension/prism/include/prism/util/pm_char.h +204 -0
- package/extension/prism/include/prism/util/pm_constant_pool.h +218 -0
- package/extension/prism/include/prism/util/pm_integer.h +126 -0
- package/extension/prism/include/prism/util/pm_list.h +97 -0
- package/extension/prism/include/prism/util/pm_memchr.h +29 -0
- package/extension/prism/include/prism/util/pm_newline_list.h +113 -0
- package/extension/prism/include/prism/util/pm_string.h +190 -0
- package/extension/prism/include/prism/util/pm_strncasecmp.h +32 -0
- package/extension/prism/include/prism/util/pm_strpbrk.h +46 -0
- package/extension/prism/include/prism/version.h +29 -0
- package/extension/prism/include/prism.h +383 -0
- package/extension/prism/src/diagnostic.c +842 -0
- package/extension/prism/src/encoding.c +5235 -0
- package/extension/prism/src/node.c +8674 -0
- package/extension/prism/src/options.c +328 -0
- package/extension/prism/src/pack.c +509 -0
- package/extension/prism/src/prettyprint.c +8939 -0
- package/extension/prism/src/prism.c +23184 -0
- package/extension/prism/src/regexp.c +790 -0
- package/extension/prism/src/serialize.c +2266 -0
- package/extension/prism/src/static_literals.c +617 -0
- package/extension/prism/src/token_type.c +701 -0
- package/extension/prism/src/util/pm_buffer.c +357 -0
- package/extension/prism/src/util/pm_char.c +318 -0
- package/extension/prism/src/util/pm_constant_pool.c +342 -0
- package/extension/prism/src/util/pm_integer.c +670 -0
- package/extension/prism/src/util/pm_list.c +49 -0
- package/extension/prism/src/util/pm_memchr.c +35 -0
- package/extension/prism/src/util/pm_newline_list.c +125 -0
- package/extension/prism/src/util/pm_string.c +383 -0
- package/extension/prism/src/util/pm_strncasecmp.c +36 -0
- package/extension/prism/src/util/pm_strpbrk.c +206 -0
- package/package.json +74 -0
- package/src/index-cjs.cts +22 -0
- package/src/index-esm.mts +28 -0
- package/src/node-backend.ts +9 -0
- package/src/types/global.d.ts +18 -0
- package/src/util.ts +35 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#include <node_api.h>
|
|
2
|
+
#include <stdio.h>
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
#include "../extension/libherb/include/array.h"
|
|
8
|
+
#include "../extension/libherb/include/ast_nodes.h"
|
|
9
|
+
#include "../extension/libherb/include/buffer.h"
|
|
10
|
+
#include "../extension/libherb/include/herb.h"
|
|
11
|
+
#include "../extension/libherb/include/io.h"
|
|
12
|
+
#include "../extension/libherb/include/location.h"
|
|
13
|
+
#include "../extension/libherb/include/position.h"
|
|
14
|
+
#include "../extension/libherb/include/range.h"
|
|
15
|
+
#include "../extension/libherb/include/token.h"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#include "error_helpers.h"
|
|
19
|
+
#include "nodes.h"
|
|
20
|
+
|
|
21
|
+
char* CheckString(napi_env env, napi_value value) {
|
|
22
|
+
size_t length;
|
|
23
|
+
size_t copied;
|
|
24
|
+
napi_valuetype type;
|
|
25
|
+
|
|
26
|
+
napi_typeof(env, value, &type);
|
|
27
|
+
if (type != napi_string) {
|
|
28
|
+
napi_throw_type_error(env, nullptr, "String expected");
|
|
29
|
+
return nullptr;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
napi_get_value_string_utf8(env, value, nullptr, 0, &length);
|
|
33
|
+
char* result = (char*) malloc(length + 1);
|
|
34
|
+
if (!result) {
|
|
35
|
+
napi_throw_error(env, nullptr, "Memory allocation failed");
|
|
36
|
+
return nullptr;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
napi_get_value_string_utf8(env, value, result, length + 1, &copied);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
napi_value CreateString(napi_env env, const char* str) {
|
|
44
|
+
napi_value result;
|
|
45
|
+
napi_create_string_utf8(env, str, NAPI_AUTO_LENGTH, &result);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
napi_value CreatePosition(napi_env env, position_T* position) {
|
|
50
|
+
if (!position) {
|
|
51
|
+
napi_value null_value;
|
|
52
|
+
napi_get_null(env, &null_value);
|
|
53
|
+
return null_value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
napi_value result;
|
|
57
|
+
napi_create_object(env, &result);
|
|
58
|
+
|
|
59
|
+
napi_value line, column;
|
|
60
|
+
napi_create_uint32(env, (uint32_t)position->line, &line);
|
|
61
|
+
napi_create_uint32(env, (uint32_t)position->column, &column);
|
|
62
|
+
|
|
63
|
+
napi_set_named_property(env, result, "line", line);
|
|
64
|
+
napi_set_named_property(env, result, "column", column);
|
|
65
|
+
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
napi_value CreateLocation(napi_env env, location_T* location) {
|
|
70
|
+
if (!location) {
|
|
71
|
+
napi_value null_value;
|
|
72
|
+
napi_get_null(env, &null_value);
|
|
73
|
+
return null_value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
napi_value result;
|
|
77
|
+
napi_create_object(env, &result);
|
|
78
|
+
|
|
79
|
+
napi_value start = CreatePosition(env, location->start);
|
|
80
|
+
napi_value end = CreatePosition(env, location->end);
|
|
81
|
+
|
|
82
|
+
napi_set_named_property(env, result, "start", start);
|
|
83
|
+
napi_set_named_property(env, result, "end", end);
|
|
84
|
+
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
napi_value CreateRange(napi_env env, range_T* range) {
|
|
89
|
+
if (!range) {
|
|
90
|
+
napi_value null_value;
|
|
91
|
+
napi_get_null(env, &null_value);
|
|
92
|
+
return null_value;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
napi_value result;
|
|
96
|
+
napi_create_array(env, &result);
|
|
97
|
+
|
|
98
|
+
napi_value from, to;
|
|
99
|
+
napi_create_uint32(env, (uint32_t)range->from, &from);
|
|
100
|
+
napi_create_uint32(env, (uint32_t)range->to, &to);
|
|
101
|
+
|
|
102
|
+
napi_set_element(env, result, 0, from);
|
|
103
|
+
napi_set_element(env, result, 1, to);
|
|
104
|
+
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
napi_value CreateToken(napi_env env, token_T* token) {
|
|
109
|
+
if (!token) {
|
|
110
|
+
napi_value null_value;
|
|
111
|
+
napi_get_null(env, &null_value);
|
|
112
|
+
return null_value;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
napi_value result;
|
|
116
|
+
napi_create_object(env, &result);
|
|
117
|
+
|
|
118
|
+
// Value
|
|
119
|
+
napi_value value = token->value ? CreateString(env, token->value) : nullptr;
|
|
120
|
+
if (value) {
|
|
121
|
+
napi_set_named_property(env, result, "value", value);
|
|
122
|
+
} else {
|
|
123
|
+
napi_value null_value;
|
|
124
|
+
napi_get_null(env, &null_value);
|
|
125
|
+
napi_set_named_property(env, result, "value", null_value);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Range
|
|
129
|
+
napi_value range = CreateRange(env, token->range);
|
|
130
|
+
napi_set_named_property(env, result, "range", range);
|
|
131
|
+
|
|
132
|
+
// Location
|
|
133
|
+
napi_value location = CreateLocation(env, token->location);
|
|
134
|
+
napi_set_named_property(env, result, "location", location);
|
|
135
|
+
|
|
136
|
+
// Type
|
|
137
|
+
napi_value type = CreateString(env, token_type_to_string(token->type));
|
|
138
|
+
napi_set_named_property(env, result, "type", type);
|
|
139
|
+
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
napi_value ReadFileToString(napi_env env, const char* file_path) {
|
|
144
|
+
char* content = herb_read_file(file_path);
|
|
145
|
+
if (!content) {
|
|
146
|
+
napi_throw_error(env, nullptr, "Failed to read file");
|
|
147
|
+
return nullptr;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
napi_value result = CreateString(env, content);
|
|
151
|
+
free(content);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
napi_value CreateLexResult(napi_env env, array_T* tokens, napi_value source) {
|
|
156
|
+
napi_value result, tokens_array, errors_array, warnings_array;
|
|
157
|
+
|
|
158
|
+
napi_create_object(env, &result);
|
|
159
|
+
napi_create_array(env, &tokens_array);
|
|
160
|
+
napi_create_array(env, &errors_array);
|
|
161
|
+
napi_create_array(env, &warnings_array);
|
|
162
|
+
|
|
163
|
+
// Add tokens to array
|
|
164
|
+
if (tokens) {
|
|
165
|
+
for (size_t i = 0; i < array_size(tokens); i++) {
|
|
166
|
+
token_T* token = (token_T*)array_get(tokens, i);
|
|
167
|
+
if (token) {
|
|
168
|
+
napi_value token_obj = CreateToken(env, token);
|
|
169
|
+
napi_set_element(env, tokens_array, i, token_obj);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
napi_set_named_property(env, result, "tokens", tokens_array);
|
|
175
|
+
napi_set_named_property(env, result, "source", source);
|
|
176
|
+
napi_set_named_property(env, result, "warnings", warnings_array);
|
|
177
|
+
napi_set_named_property(env, result, "errors", errors_array);
|
|
178
|
+
|
|
179
|
+
// Free tokens after creating JS objects
|
|
180
|
+
herb_free_tokens(&tokens);
|
|
181
|
+
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
napi_value CreateParseResult(napi_env env, AST_DOCUMENT_NODE_T* root, napi_value source) {
|
|
186
|
+
napi_value result, errors_array, warnings_array;
|
|
187
|
+
|
|
188
|
+
napi_create_object(env, &result);
|
|
189
|
+
napi_create_array(env, &errors_array);
|
|
190
|
+
napi_create_array(env, &warnings_array);
|
|
191
|
+
|
|
192
|
+
// Convert the AST to a JavaScript object
|
|
193
|
+
napi_value ast_value;
|
|
194
|
+
if (root) {
|
|
195
|
+
ast_value = NodeFromCStruct(env, (AST_NODE_T*)root);
|
|
196
|
+
} else {
|
|
197
|
+
napi_get_null(env, &ast_value);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
napi_set_named_property(env, result, "value", ast_value);
|
|
201
|
+
napi_set_named_property(env, result, "source", source);
|
|
202
|
+
napi_set_named_property(env, result, "warnings", warnings_array);
|
|
203
|
+
napi_set_named_property(env, result, "errors", errors_array);
|
|
204
|
+
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#ifndef HERB_NODE_EXTENSION_HELPERS_H
|
|
2
|
+
#define HERB_NODE_EXTENSION_HELPERS_H
|
|
3
|
+
|
|
4
|
+
#include <node_api.h>
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
#include "../extension/libherb/include/array.h"
|
|
8
|
+
#include "../extension/libherb/include/ast_nodes.h"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
char* CheckString(napi_env env, napi_value value);
|
|
12
|
+
napi_value CreateString(napi_env env, const char* str);
|
|
13
|
+
napi_value ReadFileToString(napi_env env, const char* file_path);
|
|
14
|
+
napi_value CreateLexResult(napi_env env, array_T* tokens, napi_value source);
|
|
15
|
+
napi_value CreateParseResult(napi_env env, AST_DOCUMENT_NODE_T* root, napi_value source);
|
|
16
|
+
|
|
17
|
+
napi_value CreateLocation(napi_env env, location_T* location);
|
|
18
|
+
napi_value CreateToken(napi_env env, token_T* token);
|
|
19
|
+
napi_value CreatePosition(napi_env env, position_T* position);
|
|
20
|
+
napi_value CreateRange(napi_env env, range_T* range);
|
|
21
|
+
|
|
22
|
+
#endif
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
extern "C" {
|
|
2
|
+
#include "../extension/libherb/include/analyze.h"
|
|
3
|
+
#include "../extension/libherb/include/array.h"
|
|
4
|
+
#include "../extension/libherb/include/ast_nodes.h"
|
|
5
|
+
#include "../extension/libherb/include/buffer.h"
|
|
6
|
+
#include "../extension/libherb/include/herb.h"
|
|
7
|
+
#include "../extension/libherb/include/location.h"
|
|
8
|
+
#include "../extension/libherb/include/range.h"
|
|
9
|
+
#include "../extension/libherb/include/token.h"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#include "error_helpers.h"
|
|
13
|
+
#include "extension_helpers.h"
|
|
14
|
+
#include "nodes.h"
|
|
15
|
+
|
|
16
|
+
#include <node_api.h>
|
|
17
|
+
#include <stdio.h>
|
|
18
|
+
#include <stdlib.h>
|
|
19
|
+
#include <string.h>
|
|
20
|
+
|
|
21
|
+
napi_value Herb_lex(napi_env env, napi_callback_info info) {
|
|
22
|
+
size_t argc = 1;
|
|
23
|
+
napi_value args[1];
|
|
24
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
25
|
+
|
|
26
|
+
if (argc < 1) {
|
|
27
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
28
|
+
return nullptr;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
char* string = CheckString(env, args[0]);
|
|
32
|
+
if (!string) { return nullptr; }
|
|
33
|
+
|
|
34
|
+
array_T* tokens = herb_lex(string);
|
|
35
|
+
napi_value result = CreateLexResult(env, tokens, args[0]);
|
|
36
|
+
|
|
37
|
+
free(string);
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
napi_value Herb_lex_file(napi_env env, napi_callback_info info) {
|
|
42
|
+
size_t argc = 1;
|
|
43
|
+
napi_value args[1];
|
|
44
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
45
|
+
|
|
46
|
+
if (argc < 1) {
|
|
47
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
48
|
+
return nullptr;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
char* file_path = CheckString(env, args[0]);
|
|
52
|
+
if (!file_path) { return nullptr; }
|
|
53
|
+
|
|
54
|
+
array_T* tokens = herb_lex_file(file_path);
|
|
55
|
+
napi_value source_value = ReadFileToString(env, file_path);
|
|
56
|
+
napi_value result = CreateLexResult(env, tokens, source_value);
|
|
57
|
+
|
|
58
|
+
free(file_path);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
napi_value Herb_parse(napi_env env, napi_callback_info info) {
|
|
63
|
+
size_t argc = 1;
|
|
64
|
+
napi_value args[1];
|
|
65
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
66
|
+
|
|
67
|
+
if (argc < 1) {
|
|
68
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
69
|
+
return nullptr;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
char* string = CheckString(env, args[0]);
|
|
73
|
+
if (!string) { return nullptr; }
|
|
74
|
+
|
|
75
|
+
AST_DOCUMENT_NODE_T* root = herb_parse(string);
|
|
76
|
+
herb_analyze_parse_tree(root, string);
|
|
77
|
+
napi_value result = CreateParseResult(env, root, args[0]);
|
|
78
|
+
|
|
79
|
+
free(string);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
napi_value Herb_parse_file(napi_env env, napi_callback_info info) {
|
|
84
|
+
size_t argc = 1;
|
|
85
|
+
napi_value args[1];
|
|
86
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
87
|
+
|
|
88
|
+
if (argc < 1) {
|
|
89
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
90
|
+
return nullptr;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
char* file_path = CheckString(env, args[0]);
|
|
94
|
+
if (!file_path) { return nullptr; }
|
|
95
|
+
|
|
96
|
+
napi_value source_value = ReadFileToString(env, file_path);
|
|
97
|
+
|
|
98
|
+
char* string = CheckString(env, source_value);
|
|
99
|
+
if (!string) {
|
|
100
|
+
free(file_path);
|
|
101
|
+
return nullptr;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
AST_DOCUMENT_NODE_T* root = herb_parse(string);
|
|
105
|
+
napi_value result = CreateParseResult(env, root, source_value);
|
|
106
|
+
|
|
107
|
+
free(file_path);
|
|
108
|
+
free(string);
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
napi_value Herb_lex_to_json(napi_env env, napi_callback_info info) {
|
|
113
|
+
size_t argc = 1;
|
|
114
|
+
napi_value args[1];
|
|
115
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
116
|
+
|
|
117
|
+
if (argc < 1) {
|
|
118
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
119
|
+
return nullptr;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
char* string = CheckString(env, args[0]);
|
|
123
|
+
if (!string) { return nullptr; }
|
|
124
|
+
|
|
125
|
+
buffer_T output;
|
|
126
|
+
if (!buffer_init(&output)) {
|
|
127
|
+
free(string);
|
|
128
|
+
napi_throw_error(env, nullptr, "Failed to initialize buffer");
|
|
129
|
+
return nullptr;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
herb_lex_json_to_buffer(string, &output);
|
|
133
|
+
|
|
134
|
+
napi_value result;
|
|
135
|
+
napi_create_string_utf8(env, output.value, output.length, &result);
|
|
136
|
+
|
|
137
|
+
buffer_free(&output);
|
|
138
|
+
free(string);
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
napi_value Herb_extract_ruby(napi_env env, napi_callback_info info) {
|
|
143
|
+
size_t argc = 1;
|
|
144
|
+
napi_value args[1];
|
|
145
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
146
|
+
|
|
147
|
+
if (argc < 1) {
|
|
148
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
149
|
+
return nullptr;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
char* string = CheckString(env, args[0]);
|
|
153
|
+
if (!string) { return nullptr; }
|
|
154
|
+
|
|
155
|
+
buffer_T output;
|
|
156
|
+
if (!buffer_init(&output)) {
|
|
157
|
+
free(string);
|
|
158
|
+
napi_throw_error(env, nullptr, "Failed to initialize buffer");
|
|
159
|
+
return nullptr;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
herb_extract_ruby_to_buffer(string, &output);
|
|
163
|
+
|
|
164
|
+
napi_value result;
|
|
165
|
+
napi_create_string_utf8(env, output.value, NAPI_AUTO_LENGTH, &result);
|
|
166
|
+
|
|
167
|
+
buffer_free(&output);
|
|
168
|
+
free(string);
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
napi_value Herb_extract_html(napi_env env, napi_callback_info info) {
|
|
173
|
+
size_t argc = 1;
|
|
174
|
+
napi_value args[1];
|
|
175
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
176
|
+
|
|
177
|
+
if (argc < 1) {
|
|
178
|
+
napi_throw_error(env, nullptr, "Wrong number of arguments");
|
|
179
|
+
return nullptr;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
char* string = CheckString(env, args[0]);
|
|
183
|
+
if (!string) { return nullptr; }
|
|
184
|
+
|
|
185
|
+
buffer_T output;
|
|
186
|
+
if (!buffer_init(&output)) {
|
|
187
|
+
free(string);
|
|
188
|
+
napi_throw_error(env, nullptr, "Failed to initialize buffer");
|
|
189
|
+
return nullptr;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
herb_extract_html_to_buffer(string, &output);
|
|
193
|
+
|
|
194
|
+
napi_value result;
|
|
195
|
+
napi_create_string_utf8(env, output.value, NAPI_AUTO_LENGTH, &result);
|
|
196
|
+
|
|
197
|
+
buffer_free(&output);
|
|
198
|
+
free(string);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
napi_value Herb_version(napi_env env, napi_callback_info info) {
|
|
203
|
+
const char* libherb_version = herb_version();
|
|
204
|
+
const char* libprism_version = herb_prism_version();
|
|
205
|
+
|
|
206
|
+
char version_buf[256];
|
|
207
|
+
snprintf(version_buf, sizeof(version_buf), "libprism@%s, libherb@%s (Node.js C++ native extension)", libprism_version, libherb_version);
|
|
208
|
+
|
|
209
|
+
napi_value result;
|
|
210
|
+
napi_create_string_utf8(env, version_buf, NAPI_AUTO_LENGTH, &result);
|
|
211
|
+
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
napi_value Init(napi_env env, napi_value exports) {
|
|
216
|
+
napi_property_descriptor descriptors[] = {
|
|
217
|
+
{ "parse", nullptr, Herb_parse, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
218
|
+
{ "lex", nullptr, Herb_lex, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
219
|
+
{ "parseFile", nullptr, Herb_parse_file, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
220
|
+
{ "lexFile", nullptr, Herb_lex_file, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
221
|
+
{ "lexToJson", nullptr, Herb_lex_to_json, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
222
|
+
{ "extractRuby", nullptr, Herb_extract_ruby, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
223
|
+
{ "extractHTML", nullptr, Herb_extract_html, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
224
|
+
{ "version", nullptr, Herb_version, nullptr, nullptr, nullptr, napi_default, nullptr },
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
napi_define_properties(env, exports, sizeof(descriptors) / sizeof(descriptors[0]), descriptors);
|
|
228
|
+
|
|
229
|
+
return exports;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
|