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.
Files changed (43) hide show
  1. package/CMakeLists.txt +9 -2
  2. package/LICENSE.md +198 -0
  3. package/NOTICE.md +13 -0
  4. package/README.md +86 -29
  5. package/binding.c +240 -48
  6. package/cmake/rust.cmake +2 -2
  7. package/core/Cargo.lock +19 -234
  8. package/core/Cargo.toml +2 -2
  9. package/core/include/simple_converter.h +0 -1
  10. package/core/src/doc/mod.rs +31 -16
  11. package/core/src/docx/mod.rs +15 -6
  12. package/core/src/docx/numbering.rs +8 -4
  13. package/core/src/lib.rs +42 -16
  14. package/core/src/limits.rs +42 -0
  15. package/core/src/markdown/mod.rs +461 -0
  16. package/core/src/markdown/style.rs +191 -0
  17. package/core/src/model.rs +26 -40
  18. package/core/src/odf_chart.rs +240 -0
  19. package/core/src/odt/geometry.rs +504 -0
  20. package/core/src/odt/mod.rs +62 -20
  21. package/core/src/odt/odp.rs +438 -0
  22. package/core/src/odt/styles.rs +151 -30
  23. package/core/src/pptx/mod.rs +25 -10
  24. package/core/src/pptx/text.rs +2 -2
  25. package/core/src/typst_backend/emit.rs +132 -33
  26. package/core/src/typst_backend/fonts.rs +1 -1
  27. package/core/src/typst_backend/images.rs +76 -0
  28. package/core/src/typst_backend/mod.rs +57 -7
  29. package/core/src/typst_backend/notes.rs +156 -0
  30. package/core/src/xlsx/biff.rs +1010 -0
  31. package/core/src/xlsx/biff_art.rs +201 -0
  32. package/core/src/xlsx/biff_cf.rs +339 -0
  33. package/core/src/xlsx/biff_chart.rs +317 -0
  34. package/core/src/xlsx/formula.rs +30 -3
  35. package/core/src/xlsx/mod.rs +318 -124
  36. package/core/src/xlsx/ods.rs +780 -0
  37. package/core/src/xml.rs +6 -1
  38. package/index.d.ts +27 -5
  39. package/index.js +153 -38
  40. package/package.json +36 -32
  41. package/cmake/pdfium.cmake +0 -75
  42. package/core/src/docx/writer.rs +0 -222
  43. 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 js_value_t *
35
- simple_converter_convert(js_env_t *env, js_callback_info_t *info) {
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
- size_t argc = 5;
39
- js_value_t *argv[5];
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 < 5) {
45
- err = js_throw_error(env, NULL, "convert expects (bytes, from, to, fontsDir, pdfiumPath)");
88
+ if (argc < 4) {
89
+ err = js_throw_error(env, NULL, "convert expects (bytes, from, to, fontsDir)");
46
90
  assert(err == 0);
47
- return NULL;
91
+ return false;
48
92
  }
49
93
 
50
- uint8_t *input;
51
- size_t input_len;
52
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &input, &input_len, NULL, NULL);
53
- if (err != 0) {
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 NULL;
107
+ return false;
57
108
  }
58
109
 
59
- char *from = NULL;
60
- char *to = NULL;
61
- char *fonts_dir = NULL;
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
- free(from);
71
- free(to);
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 NULL;
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
- sc_buffer_t out = {NULL, 0};
80
- sc_buffer_t error = {NULL, 0};
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
- int status = sc_convert(input, input_len, from, to, fonts_dir, pdfium_path, &out, &error);
151
+ static js_value_t *
152
+ simple_converter__output(js_env_t *env, simple_converter_job_t *job) {
153
+ int err;
83
154
 
84
- free(from);
85
- free(to);
86
- free(fonts_dir);
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 (status != 0) {
90
- char *message = malloc(error.len + 1);
91
- if (message != NULL) {
92
- memcpy(message, error.data, error.len);
93
- message[error.len] = '\0';
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
- sc_free(&error);
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
- if (out.len > 0) memcpy(data, out.data, out.len);
108
- sc_free(&out);
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(CORROSION_VERSION "v0.6.1" CACHE STRING "Corrosion release tag")
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#${CORROSION_VERSION}")
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"