bare-x-to-pdf 0.2.0 → 0.4.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/CMakeLists.txt +9 -2
- package/LICENSE.md +198 -0
- package/NOTICE.md +13 -0
- package/README.md +86 -29
- package/binding.c +240 -48
- package/cmake/rust.cmake +2 -2
- package/core/Cargo.lock +19 -234
- package/core/Cargo.toml +2 -2
- package/core/include/simple_converter.h +0 -1
- package/core/src/doc/mod.rs +31 -16
- package/core/src/docx/mod.rs +15 -6
- package/core/src/docx/numbering.rs +8 -4
- package/core/src/lib.rs +42 -16
- package/core/src/limits.rs +42 -0
- package/core/src/markdown/mod.rs +461 -0
- package/core/src/markdown/style.rs +191 -0
- package/core/src/model.rs +26 -40
- package/core/src/odf_chart.rs +240 -0
- package/core/src/odt/geometry.rs +504 -0
- package/core/src/odt/mod.rs +62 -20
- package/core/src/odt/odp.rs +438 -0
- package/core/src/odt/styles.rs +151 -30
- package/core/src/pptx/mod.rs +25 -10
- package/core/src/pptx/text.rs +2 -2
- package/core/src/typst_backend/emit.rs +132 -33
- package/core/src/typst_backend/fonts.rs +1 -1
- package/core/src/typst_backend/images.rs +76 -0
- package/core/src/typst_backend/mod.rs +57 -7
- package/core/src/typst_backend/notes.rs +156 -0
- package/core/src/xlsx/biff.rs +1010 -0
- package/core/src/xlsx/biff_art.rs +201 -0
- package/core/src/xlsx/biff_cf.rs +339 -0
- package/core/src/xlsx/biff_chart.rs +317 -0
- package/core/src/xlsx/formula.rs +30 -3
- package/core/src/xlsx/mod.rs +318 -124
- package/core/src/xlsx/ods.rs +780 -0
- package/core/src/xml.rs +6 -1
- package/index.d.ts +27 -5
- package/index.js +153 -38
- package/package.json +36 -32
- package/cmake/pdfium.cmake +0 -75
- package/core/src/docx/writer.rs +0 -222
- package/core/src/pdf/mod.rs +0 -354
package/binding.c
CHANGED
|
@@ -6,13 +6,39 @@
|
|
|
6
6
|
#include <stdlib.h>
|
|
7
7
|
#include <string.h>
|
|
8
8
|
#include <utf.h>
|
|
9
|
+
#include <uv.h>
|
|
9
10
|
|
|
10
11
|
#include "simple_converter.h"
|
|
11
12
|
|
|
13
|
+
typedef struct {
|
|
14
|
+
const uint8_t *input;
|
|
15
|
+
size_t input_len;
|
|
16
|
+
uint8_t *owned_input;
|
|
17
|
+
char *from;
|
|
18
|
+
char *to;
|
|
19
|
+
char *fonts_dir;
|
|
20
|
+
sc_buffer_t out;
|
|
21
|
+
sc_buffer_t error;
|
|
22
|
+
int status;
|
|
23
|
+
} simple_converter_job_t;
|
|
24
|
+
|
|
25
|
+
typedef struct {
|
|
26
|
+
uv_work_t work;
|
|
27
|
+
js_env_t *env;
|
|
28
|
+
js_deferred_t *deferred;
|
|
29
|
+
js_deferred_teardown_t *teardown;
|
|
30
|
+
bool exiting;
|
|
31
|
+
simple_converter_job_t job;
|
|
32
|
+
} simple_converter_req_t;
|
|
33
|
+
|
|
12
34
|
static bool
|
|
13
35
|
simple_converter__string(js_env_t *env, js_value_t *value, char **result) {
|
|
14
36
|
int err;
|
|
15
37
|
|
|
38
|
+
bool is_string;
|
|
39
|
+
err = js_is_string(env, value, &is_string);
|
|
40
|
+
if (err != 0 || !is_string) return false;
|
|
41
|
+
|
|
16
42
|
size_t len = 0;
|
|
17
43
|
err = js_get_value_string_utf8(env, value, NULL, 0, &len);
|
|
18
44
|
if (err != 0) return false;
|
|
@@ -27,89 +53,254 @@ simple_converter__string(js_env_t *env, js_value_t *value, char **result) {
|
|
|
27
53
|
}
|
|
28
54
|
|
|
29
55
|
str[len] = '\0';
|
|
56
|
+
|
|
57
|
+
if (strlen(str) != len) {
|
|
58
|
+
free(str);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
30
62
|
*result = str;
|
|
31
63
|
return true;
|
|
32
64
|
}
|
|
33
65
|
|
|
34
|
-
static
|
|
35
|
-
|
|
66
|
+
static void
|
|
67
|
+
simple_converter__job_release(simple_converter_job_t *job) {
|
|
68
|
+
free(job->owned_input);
|
|
69
|
+
free(job->from);
|
|
70
|
+
free(job->to);
|
|
71
|
+
free(job->fonts_dir);
|
|
72
|
+
sc_free(&job->out);
|
|
73
|
+
sc_free(&job->error);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static bool
|
|
77
|
+
simple_converter__job_init(js_env_t *env, js_callback_info_t *info, bool copy_input, simple_converter_job_t *job) {
|
|
36
78
|
int err;
|
|
37
79
|
|
|
38
|
-
|
|
39
|
-
|
|
80
|
+
memset(job, 0, sizeof(*job));
|
|
81
|
+
|
|
82
|
+
size_t argc = 4;
|
|
83
|
+
js_value_t *argv[4];
|
|
40
84
|
|
|
41
85
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
42
86
|
assert(err == 0);
|
|
43
87
|
|
|
44
|
-
if (argc <
|
|
45
|
-
err = js_throw_error(env, NULL, "convert expects (bytes, from, to, fontsDir
|
|
88
|
+
if (argc < 4) {
|
|
89
|
+
err = js_throw_error(env, NULL, "convert expects (bytes, from, to, fontsDir)");
|
|
46
90
|
assert(err == 0);
|
|
47
|
-
return
|
|
91
|
+
return false;
|
|
48
92
|
}
|
|
49
93
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
err
|
|
53
|
-
|
|
94
|
+
bool is_typedarray;
|
|
95
|
+
err = js_is_typedarray(env, argv[0], &is_typedarray);
|
|
96
|
+
assert(err == 0);
|
|
97
|
+
|
|
98
|
+
js_typedarray_type_t type = js_int8array;
|
|
99
|
+
uint8_t *input = NULL;
|
|
100
|
+
size_t input_len = 0;
|
|
101
|
+
if (is_typedarray) {
|
|
102
|
+
err = js_get_typedarray_info(env, argv[0], &type, (void **) &input, &input_len, NULL, NULL);
|
|
103
|
+
}
|
|
104
|
+
if (!is_typedarray || err != 0 || type != js_uint8array) {
|
|
54
105
|
err = js_throw_error(env, NULL, "input must be a Uint8Array");
|
|
55
106
|
assert(err == 0);
|
|
56
|
-
return
|
|
107
|
+
return false;
|
|
57
108
|
}
|
|
58
109
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
char *pdfium_path = NULL;
|
|
63
|
-
|
|
64
|
-
bool ok = simple_converter__string(env, argv[1], &from) &&
|
|
65
|
-
simple_converter__string(env, argv[2], &to) &&
|
|
66
|
-
simple_converter__string(env, argv[3], &fonts_dir) &&
|
|
67
|
-
simple_converter__string(env, argv[4], &pdfium_path);
|
|
110
|
+
bool ok = simple_converter__string(env, argv[1], &job->from) &&
|
|
111
|
+
simple_converter__string(env, argv[2], &job->to) &&
|
|
112
|
+
simple_converter__string(env, argv[3], &job->fonts_dir);
|
|
68
113
|
|
|
69
114
|
if (!ok) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
free(fonts_dir);
|
|
73
|
-
free(pdfium_path);
|
|
74
|
-
err = js_throw_error(env, NULL, "from, to, fontsDir and pdfiumPath must be strings");
|
|
115
|
+
simple_converter__job_release(job);
|
|
116
|
+
err = js_throw_error(env, NULL, "from, to and fontsDir must be strings without NUL characters");
|
|
75
117
|
assert(err == 0);
|
|
76
|
-
return
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
job->input = input;
|
|
122
|
+
job->input_len = input_len;
|
|
123
|
+
|
|
124
|
+
if (copy_input && input_len > 0) {
|
|
125
|
+
job->owned_input = malloc(input_len);
|
|
126
|
+
if (job->owned_input == NULL) {
|
|
127
|
+
simple_converter__job_release(job);
|
|
128
|
+
err = js_throw_error(env, NULL, "out of memory");
|
|
129
|
+
assert(err == 0);
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
memcpy(job->owned_input, input, input_len);
|
|
133
|
+
job->input = job->owned_input;
|
|
77
134
|
}
|
|
78
135
|
|
|
79
|
-
|
|
80
|
-
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static void
|
|
140
|
+
simple_converter__run(simple_converter_job_t *job) {
|
|
141
|
+
job->status = sc_convert(job->input, job->input_len, job->from, job->to, job->fonts_dir, &job->out, &job->error);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static void
|
|
145
|
+
simple_converter__finalize_output(js_env_t *env, void *data, void *finalize_hint) {
|
|
146
|
+
sc_buffer_t *buffer = finalize_hint;
|
|
147
|
+
sc_free(buffer);
|
|
148
|
+
free(buffer);
|
|
149
|
+
}
|
|
81
150
|
|
|
82
|
-
|
|
151
|
+
static js_value_t *
|
|
152
|
+
simple_converter__output(js_env_t *env, simple_converter_job_t *job) {
|
|
153
|
+
int err;
|
|
83
154
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
free(pdfium_path);
|
|
155
|
+
js_value_t *result;
|
|
156
|
+
|
|
157
|
+
sc_buffer_t *owned = job->out.len > 0 ? malloc(sizeof(sc_buffer_t)) : NULL;
|
|
88
158
|
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
159
|
+
if (owned != NULL) {
|
|
160
|
+
*owned = job->out;
|
|
161
|
+
err = js_create_external_arraybuffer(env, owned->data, owned->len, simple_converter__finalize_output, owned, &result);
|
|
162
|
+
if (err == 0) {
|
|
163
|
+
job->out.data = NULL;
|
|
164
|
+
job->out.len = 0;
|
|
165
|
+
return result;
|
|
94
166
|
}
|
|
95
|
-
|
|
96
|
-
err = js_throw_error(env, NULL, message ? message : "conversion failed");
|
|
97
|
-
assert(err == 0);
|
|
98
|
-
free(message);
|
|
99
|
-
return NULL;
|
|
167
|
+
free(owned);
|
|
100
168
|
}
|
|
101
169
|
|
|
102
|
-
js_value_t *result;
|
|
103
170
|
void *data;
|
|
104
|
-
err = js_create_arraybuffer(env, out.len, &data, &result);
|
|
171
|
+
err = js_create_arraybuffer(env, job->out.len, &data, &result);
|
|
172
|
+
assert(err == 0);
|
|
173
|
+
|
|
174
|
+
if (job->out.len > 0) memcpy(data, job->out.data, job->out.len);
|
|
175
|
+
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static js_value_t *
|
|
180
|
+
simple_converter__error(js_env_t *env, simple_converter_job_t *job) {
|
|
181
|
+
int err;
|
|
182
|
+
|
|
183
|
+
js_value_t *message;
|
|
184
|
+
if (job->error.len > 0) {
|
|
185
|
+
err = js_create_string_utf8(env, (utf8_t *) job->error.data, job->error.len, &message);
|
|
186
|
+
} else {
|
|
187
|
+
err = js_create_string_utf8(env, (utf8_t *) "conversion failed", (size_t) -1, &message);
|
|
188
|
+
}
|
|
189
|
+
assert(err == 0);
|
|
190
|
+
|
|
191
|
+
js_value_t *error;
|
|
192
|
+
err = js_create_error(env, NULL, message, &error);
|
|
105
193
|
assert(err == 0);
|
|
106
194
|
|
|
107
|
-
|
|
108
|
-
|
|
195
|
+
return error;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static js_value_t *
|
|
199
|
+
simple_converter_convert_sync(js_env_t *env, js_callback_info_t *info) {
|
|
200
|
+
int err;
|
|
201
|
+
|
|
202
|
+
simple_converter_job_t job;
|
|
203
|
+
if (!simple_converter__job_init(env, info, false, &job)) return NULL;
|
|
204
|
+
|
|
205
|
+
simple_converter__run(&job);
|
|
206
|
+
|
|
207
|
+
js_value_t *result = NULL;
|
|
208
|
+
|
|
209
|
+
if (job.status == 0) {
|
|
210
|
+
result = simple_converter__output(env, &job);
|
|
211
|
+
} else {
|
|
212
|
+
err = js_throw(env, simple_converter__error(env, &job));
|
|
213
|
+
assert(err == 0);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
simple_converter__job_release(&job);
|
|
109
217
|
|
|
110
218
|
return result;
|
|
111
219
|
}
|
|
112
220
|
|
|
221
|
+
static void
|
|
222
|
+
simple_converter__on_work(uv_work_t *work) {
|
|
223
|
+
simple_converter_req_t *req = (simple_converter_req_t *) work;
|
|
224
|
+
|
|
225
|
+
simple_converter__run(&req->job);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
static void
|
|
229
|
+
simple_converter__on_after_work(uv_work_t *work, int status) {
|
|
230
|
+
int err;
|
|
231
|
+
|
|
232
|
+
simple_converter_req_t *req = (simple_converter_req_t *) work;
|
|
233
|
+
|
|
234
|
+
js_env_t *env = req->env;
|
|
235
|
+
|
|
236
|
+
if (!req->exiting) {
|
|
237
|
+
js_handle_scope_t *scope;
|
|
238
|
+
err = js_open_handle_scope(env, &scope);
|
|
239
|
+
assert(err == 0);
|
|
240
|
+
|
|
241
|
+
if (status == 0 && req->job.status == 0) {
|
|
242
|
+
err = js_resolve_deferred(env, req->deferred, simple_converter__output(env, &req->job));
|
|
243
|
+
} else {
|
|
244
|
+
err = js_reject_deferred(env, req->deferred, simple_converter__error(env, &req->job));
|
|
245
|
+
}
|
|
246
|
+
assert(err == 0);
|
|
247
|
+
|
|
248
|
+
err = js_close_handle_scope(env, scope);
|
|
249
|
+
assert(err == 0);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
err = js_finish_deferred_teardown_callback(req->teardown);
|
|
253
|
+
assert(err == 0);
|
|
254
|
+
|
|
255
|
+
simple_converter__job_release(&req->job);
|
|
256
|
+
free(req);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
static void
|
|
260
|
+
simple_converter__on_teardown(js_deferred_teardown_t *teardown, void *data) {
|
|
261
|
+
simple_converter_req_t *req = data;
|
|
262
|
+
|
|
263
|
+
req->exiting = true;
|
|
264
|
+
|
|
265
|
+
uv_cancel((uv_req_t *) &req->work);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
static js_value_t *
|
|
269
|
+
simple_converter_convert(js_env_t *env, js_callback_info_t *info) {
|
|
270
|
+
int err;
|
|
271
|
+
|
|
272
|
+
simple_converter_req_t *req = malloc(sizeof(simple_converter_req_t));
|
|
273
|
+
if (req == NULL) {
|
|
274
|
+
err = js_throw_error(env, NULL, "out of memory");
|
|
275
|
+
assert(err == 0);
|
|
276
|
+
return NULL;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (!simple_converter__job_init(env, info, true, &req->job)) {
|
|
280
|
+
free(req);
|
|
281
|
+
return NULL;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
req->env = env;
|
|
285
|
+
req->exiting = false;
|
|
286
|
+
|
|
287
|
+
js_value_t *promise;
|
|
288
|
+
err = js_create_promise(env, &req->deferred, &promise);
|
|
289
|
+
assert(err == 0);
|
|
290
|
+
|
|
291
|
+
uv_loop_t *loop;
|
|
292
|
+
err = js_get_env_loop(env, &loop);
|
|
293
|
+
assert(err == 0);
|
|
294
|
+
|
|
295
|
+
err = uv_queue_work(loop, &req->work, simple_converter__on_work, simple_converter__on_after_work);
|
|
296
|
+
assert(err == 0);
|
|
297
|
+
|
|
298
|
+
err = js_add_deferred_teardown_callback(env, simple_converter__on_teardown, req, &req->teardown);
|
|
299
|
+
assert(err == 0);
|
|
300
|
+
|
|
301
|
+
return promise;
|
|
302
|
+
}
|
|
303
|
+
|
|
113
304
|
static js_value_t *
|
|
114
305
|
simple_converter_exports(js_env_t *env, js_value_t *exports) {
|
|
115
306
|
int err;
|
|
@@ -124,6 +315,7 @@ simple_converter_exports(js_env_t *env, js_value_t *exports) {
|
|
|
124
315
|
}
|
|
125
316
|
|
|
126
317
|
V("convert", simple_converter_convert)
|
|
318
|
+
V("convertSync", simple_converter_convert_sync)
|
|
127
319
|
#undef V
|
|
128
320
|
|
|
129
321
|
return exports;
|
package/cmake/rust.cmake
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
include_guard(GLOBAL)
|
|
2
2
|
|
|
3
|
-
set(
|
|
3
|
+
set(CORROSION_COMMIT "1499b14e4906a2890f5cee1547c8848db261753d" CACHE STRING "Corrosion commit (v0.6.1)")
|
|
4
4
|
|
|
5
5
|
bare_platform(_sys)
|
|
6
6
|
bare_arch(_arch)
|
|
@@ -49,7 +49,7 @@ endif()
|
|
|
49
49
|
|
|
50
50
|
set(Rust_CARGO_TARGET "${_triple}" CACHE STRING "Rust target triple")
|
|
51
51
|
|
|
52
|
-
fetch_package("github:corrosion-rs/corrosion#${
|
|
52
|
+
fetch_package("github:corrosion-rs/corrosion#${CORROSION_COMMIT}")
|
|
53
53
|
|
|
54
54
|
corrosion_import_crate(
|
|
55
55
|
MANIFEST_PATH "${CMAKE_CURRENT_SOURCE_DIR}/core/Cargo.toml"
|