@fiduswriter/document 0.1.0-alpha.3 → 0.1.0-alpha.5

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 (582) hide show
  1. package/README.md +22 -1
  2. package/dist/bibliography/common.d.ts +10 -0
  3. package/dist/bibliography/common.d.ts.map +1 -0
  4. package/dist/bibliography/common.js +86 -0
  5. package/dist/bibliography/common.js.map +1 -0
  6. package/dist/bibliography/csl_bib.d.ts +3 -0
  7. package/dist/bibliography/csl_bib.d.ts.map +1 -0
  8. package/dist/bibliography/csl_bib.js +131 -0
  9. package/dist/bibliography/csl_bib.js.map +1 -0
  10. package/dist/citations/citeproc_sys.d.ts +12 -0
  11. package/dist/citations/citeproc_sys.d.ts.map +1 -0
  12. package/dist/citations/citeproc_sys.js +48 -0
  13. package/dist/citations/citeproc_sys.js.map +1 -0
  14. package/dist/citations/format.d.ts +40 -0
  15. package/dist/citations/format.d.ts.map +1 -0
  16. package/dist/citations/format.js +186 -0
  17. package/dist/citations/format.js.map +1 -0
  18. package/dist/editor/e2ee/encryptor.d.ts +123 -0
  19. package/dist/editor/e2ee/encryptor.d.ts.map +1 -0
  20. package/dist/editor/e2ee/encryptor.js +201 -0
  21. package/dist/editor/e2ee/encryptor.js.map +1 -0
  22. package/dist/exporter/docx/citations.d.ts +31 -0
  23. package/dist/exporter/docx/citations.d.ts.map +1 -0
  24. package/dist/exporter/docx/citations.js +171 -0
  25. package/dist/exporter/docx/citations.js.map +1 -0
  26. package/dist/exporter/docx/comments.d.ts +22 -0
  27. package/dist/exporter/docx/comments.d.ts.map +1 -0
  28. package/dist/exporter/docx/comments.js +170 -0
  29. package/dist/exporter/docx/comments.js.map +1 -0
  30. package/dist/exporter/docx/footnotes.d.ts +47 -0
  31. package/dist/exporter/docx/footnotes.d.ts.map +1 -0
  32. package/dist/exporter/docx/footnotes.js +216 -0
  33. package/dist/exporter/docx/footnotes.js.map +1 -0
  34. package/dist/exporter/docx/images.d.ts +25 -0
  35. package/dist/exporter/docx/images.d.ts.map +1 -0
  36. package/dist/exporter/docx/images.js +101 -0
  37. package/dist/exporter/docx/images.js.map +1 -0
  38. package/dist/exporter/docx/index.d.ts +16 -0
  39. package/dist/exporter/docx/index.d.ts.map +1 -0
  40. package/dist/exporter/docx/index.js +115 -0
  41. package/dist/exporter/docx/index.js.map +1 -0
  42. package/dist/exporter/docx/lists.d.ts +38 -0
  43. package/dist/exporter/docx/lists.d.ts.map +1 -0
  44. package/dist/exporter/docx/lists.js +276 -0
  45. package/dist/exporter/docx/lists.js.map +1 -0
  46. package/dist/exporter/docx/math.d.ts +13 -0
  47. package/dist/exporter/docx/math.d.ts.map +1 -0
  48. package/dist/exporter/docx/math.js +59 -0
  49. package/dist/exporter/docx/math.js.map +1 -0
  50. package/dist/exporter/docx/metadata.d.ts +17 -0
  51. package/dist/exporter/docx/metadata.d.ts.map +1 -0
  52. package/dist/exporter/docx/metadata.js +272 -0
  53. package/dist/exporter/docx/metadata.js.map +1 -0
  54. package/dist/exporter/docx/rels.d.ts +27 -0
  55. package/dist/exporter/docx/rels.d.ts.map +1 -0
  56. package/dist/exporter/docx/rels.js +183 -0
  57. package/dist/exporter/docx/rels.js.map +1 -0
  58. package/dist/exporter/docx/render.d.ts +22 -0
  59. package/dist/exporter/docx/render.d.ts.map +1 -0
  60. package/dist/exporter/docx/render.js +780 -0
  61. package/dist/exporter/docx/render.js.map +1 -0
  62. package/dist/exporter/docx/richtext.d.ts +25 -0
  63. package/dist/exporter/docx/richtext.d.ts.map +1 -0
  64. package/dist/exporter/docx/richtext.js +1070 -0
  65. package/dist/exporter/docx/richtext.js.map +1 -0
  66. package/dist/exporter/docx/tables.d.ts +16 -0
  67. package/dist/exporter/docx/tables.d.ts.map +1 -0
  68. package/dist/exporter/docx/tables.js +115 -0
  69. package/dist/exporter/docx/tables.js.map +1 -0
  70. package/dist/exporter/docx/tools.d.ts +4 -0
  71. package/dist/exporter/docx/tools.d.ts.map +1 -0
  72. package/dist/exporter/docx/tools.js +48 -0
  73. package/dist/exporter/docx/tools.js.map +1 -0
  74. package/dist/exporter/epub/index.d.ts +19 -0
  75. package/dist/exporter/epub/index.d.ts.map +1 -0
  76. package/dist/exporter/epub/index.js +109 -0
  77. package/dist/exporter/epub/index.js.map +1 -0
  78. package/dist/exporter/epub/templates.d.ts +63 -0
  79. package/dist/exporter/epub/templates.d.ts.map +1 -0
  80. package/dist/exporter/epub/templates.js +95 -0
  81. package/dist/exporter/epub/templates.js.map +1 -0
  82. package/dist/exporter/epub/tools.d.ts +13 -0
  83. package/dist/exporter/epub/tools.d.ts.map +1 -0
  84. package/{src → dist}/exporter/epub/tools.js +32 -46
  85. package/dist/exporter/epub/tools.js.map +1 -0
  86. package/dist/exporter/html/citations.d.ts +29 -0
  87. package/dist/exporter/html/citations.d.ts.map +1 -0
  88. package/dist/exporter/html/citations.js +110 -0
  89. package/dist/exporter/html/citations.js.map +1 -0
  90. package/dist/exporter/html/convert.d.ts +50 -0
  91. package/dist/exporter/html/convert.d.ts.map +1 -0
  92. package/dist/exporter/html/convert.js +750 -0
  93. package/dist/exporter/html/convert.js.map +1 -0
  94. package/dist/exporter/html/index.d.ts +64 -0
  95. package/dist/exporter/html/index.d.ts.map +1 -0
  96. package/dist/exporter/html/index.js +154 -0
  97. package/dist/exporter/html/index.js.map +1 -0
  98. package/dist/exporter/html/templates.d.ts +24 -0
  99. package/dist/exporter/html/templates.d.ts.map +1 -0
  100. package/dist/exporter/html/templates.js +21 -0
  101. package/dist/exporter/html/templates.js.map +1 -0
  102. package/dist/exporter/html/tools.d.ts +2 -0
  103. package/dist/exporter/html/tools.d.ts.map +1 -0
  104. package/dist/exporter/html/tools.js +49 -0
  105. package/dist/exporter/html/tools.js.map +1 -0
  106. package/dist/exporter/jats/bibliography.d.ts +3 -0
  107. package/dist/exporter/jats/bibliography.d.ts.map +1 -0
  108. package/dist/exporter/jats/bibliography.js +158 -0
  109. package/dist/exporter/jats/bibliography.js.map +1 -0
  110. package/dist/exporter/jats/citations.d.ts +16 -0
  111. package/dist/exporter/jats/citations.d.ts.map +1 -0
  112. package/dist/exporter/jats/citations.js +105 -0
  113. package/dist/exporter/jats/citations.js.map +1 -0
  114. package/dist/exporter/jats/convert.d.ts +41 -0
  115. package/dist/exporter/jats/convert.d.ts.map +1 -0
  116. package/dist/exporter/jats/convert.js +816 -0
  117. package/dist/exporter/jats/convert.js.map +1 -0
  118. package/dist/exporter/jats/index.d.ts +25 -0
  119. package/dist/exporter/jats/index.d.ts.map +1 -0
  120. package/dist/exporter/jats/index.js +82 -0
  121. package/dist/exporter/jats/index.js.map +1 -0
  122. package/dist/exporter/jats/templates.d.ts +18 -0
  123. package/dist/exporter/jats/templates.d.ts.map +1 -0
  124. package/dist/exporter/jats/templates.js +25 -0
  125. package/dist/exporter/jats/templates.js.map +1 -0
  126. package/dist/exporter/jats/text.d.ts +4 -0
  127. package/dist/exporter/jats/text.d.ts.map +1 -0
  128. package/dist/exporter/jats/text.js +72 -0
  129. package/dist/exporter/jats/text.js.map +1 -0
  130. package/dist/exporter/latex/convert.d.ts +24 -0
  131. package/dist/exporter/latex/convert.d.ts.map +1 -0
  132. package/dist/exporter/latex/convert.js +881 -0
  133. package/dist/exporter/latex/convert.js.map +1 -0
  134. package/dist/exporter/latex/escape_latex.d.ts +2 -0
  135. package/dist/exporter/latex/escape_latex.d.ts.map +1 -0
  136. package/dist/exporter/latex/escape_latex.js +20 -0
  137. package/dist/exporter/latex/escape_latex.js.map +1 -0
  138. package/dist/exporter/latex/index.d.ts +24 -0
  139. package/dist/exporter/latex/index.d.ts.map +1 -0
  140. package/dist/exporter/latex/index.js +67 -0
  141. package/dist/exporter/latex/index.js.map +1 -0
  142. package/dist/exporter/latex/readme.d.ts +2 -0
  143. package/dist/exporter/latex/readme.d.ts.map +1 -0
  144. package/dist/exporter/latex/readme.js +23 -0
  145. package/dist/exporter/latex/readme.js.map +1 -0
  146. package/dist/exporter/native/copy.d.ts +30 -0
  147. package/dist/exporter/native/copy.d.ts.map +1 -0
  148. package/dist/exporter/native/copy.js +151 -0
  149. package/dist/exporter/native/copy.js.map +1 -0
  150. package/dist/exporter/native/file.d.ts +12 -0
  151. package/dist/exporter/native/file.d.ts.map +1 -0
  152. package/dist/exporter/native/file.js +38 -0
  153. package/dist/exporter/native/file.js.map +1 -0
  154. package/dist/exporter/native/index.d.ts +5 -0
  155. package/dist/exporter/native/index.d.ts.map +1 -0
  156. package/dist/exporter/native/index.js +5 -0
  157. package/dist/exporter/native/index.js.map +1 -0
  158. package/dist/exporter/native/revision.d.ts +18 -0
  159. package/dist/exporter/native/revision.d.ts.map +1 -0
  160. package/dist/exporter/native/revision.js +39 -0
  161. package/dist/exporter/native/revision.js.map +1 -0
  162. package/dist/exporter/native/shrink.d.ts +36 -0
  163. package/dist/exporter/native/shrink.d.ts.map +1 -0
  164. package/dist/exporter/native/shrink.js +124 -0
  165. package/dist/exporter/native/shrink.js.map +1 -0
  166. package/dist/exporter/native/zip.d.ts +25 -0
  167. package/dist/exporter/native/zip.d.ts.map +1 -0
  168. package/dist/exporter/native/zip.js +56 -0
  169. package/dist/exporter/native/zip.js.map +1 -0
  170. package/dist/exporter/odt/citations.d.ts +21 -0
  171. package/dist/exporter/odt/citations.d.ts.map +1 -0
  172. package/dist/exporter/odt/citations.js +104 -0
  173. package/dist/exporter/odt/citations.js.map +1 -0
  174. package/dist/exporter/odt/footnotes.d.ts +31 -0
  175. package/dist/exporter/odt/footnotes.d.ts.map +1 -0
  176. package/dist/exporter/odt/footnotes.js +129 -0
  177. package/dist/exporter/odt/footnotes.js.map +1 -0
  178. package/dist/exporter/odt/images.d.ts +25 -0
  179. package/dist/exporter/odt/images.d.ts.map +1 -0
  180. package/dist/exporter/odt/images.js +106 -0
  181. package/dist/exporter/odt/images.js.map +1 -0
  182. package/dist/exporter/odt/index.d.ts +17 -0
  183. package/dist/exporter/odt/index.d.ts.map +1 -0
  184. package/dist/exporter/odt/index.js +108 -0
  185. package/dist/exporter/odt/index.js.map +1 -0
  186. package/dist/exporter/odt/math.d.ts +15 -0
  187. package/dist/exporter/odt/math.d.ts.map +1 -0
  188. package/dist/exporter/odt/math.js +71 -0
  189. package/dist/exporter/odt/math.js.map +1 -0
  190. package/dist/exporter/odt/metadata.d.ts +18 -0
  191. package/dist/exporter/odt/metadata.d.ts.map +1 -0
  192. package/dist/exporter/odt/metadata.js +224 -0
  193. package/dist/exporter/odt/metadata.js.map +1 -0
  194. package/dist/exporter/odt/render.d.ts +26 -0
  195. package/dist/exporter/odt/render.d.ts.map +1 -0
  196. package/dist/exporter/odt/render.js +651 -0
  197. package/dist/exporter/odt/render.js.map +1 -0
  198. package/dist/exporter/odt/richtext.d.ts +22 -0
  199. package/dist/exporter/odt/richtext.d.ts.map +1 -0
  200. package/dist/exporter/odt/richtext.js +743 -0
  201. package/dist/exporter/odt/richtext.js.map +1 -0
  202. package/dist/exporter/odt/styles.d.ts +41 -0
  203. package/dist/exporter/odt/styles.d.ts.map +1 -0
  204. package/dist/exporter/odt/styles.js +370 -0
  205. package/dist/exporter/odt/styles.js.map +1 -0
  206. package/dist/exporter/odt/track.d.ts +18 -0
  207. package/dist/exporter/odt/track.d.ts.map +1 -0
  208. package/dist/exporter/odt/track.js +66 -0
  209. package/dist/exporter/odt/track.js.map +1 -0
  210. package/dist/exporter/pandoc/citations.d.ts +23 -0
  211. package/dist/exporter/pandoc/citations.d.ts.map +1 -0
  212. package/dist/exporter/pandoc/citations.js +99 -0
  213. package/dist/exporter/pandoc/citations.js.map +1 -0
  214. package/dist/exporter/pandoc/convert.d.ts +19 -0
  215. package/dist/exporter/pandoc/convert.d.ts.map +1 -0
  216. package/dist/exporter/pandoc/convert.js +886 -0
  217. package/dist/exporter/pandoc/convert.js.map +1 -0
  218. package/dist/exporter/pandoc/index.d.ts +25 -0
  219. package/dist/exporter/pandoc/index.d.ts.map +1 -0
  220. package/dist/exporter/pandoc/index.js +79 -0
  221. package/dist/exporter/pandoc/index.js.map +1 -0
  222. package/dist/exporter/pandoc/readme.d.ts +2 -0
  223. package/dist/exporter/pandoc/readme.d.ts.map +1 -0
  224. package/dist/exporter/pandoc/readme.js +8 -0
  225. package/dist/exporter/pandoc/readme.js.map +1 -0
  226. package/dist/exporter/pandoc/tools.d.ts +22 -0
  227. package/dist/exporter/pandoc/tools.d.ts.map +1 -0
  228. package/dist/exporter/pandoc/tools.js +52 -0
  229. package/dist/exporter/pandoc/tools.js.map +1 -0
  230. package/dist/exporter/print/index.d.ts +20 -0
  231. package/dist/exporter/print/index.d.ts.map +1 -0
  232. package/dist/exporter/print/index.js +142 -0
  233. package/dist/exporter/print/index.js.map +1 -0
  234. package/dist/exporter/tools/doc_content.d.ts +6 -0
  235. package/dist/exporter/tools/doc_content.d.ts.map +1 -0
  236. package/dist/exporter/tools/doc_content.js +130 -0
  237. package/dist/exporter/tools/doc_content.js.map +1 -0
  238. package/dist/exporter/tools/file.d.ts +2 -0
  239. package/dist/exporter/tools/file.d.ts.map +1 -0
  240. package/dist/exporter/tools/file.js +10 -0
  241. package/dist/exporter/tools/file.js.map +1 -0
  242. package/dist/exporter/tools/json.d.ts +7 -0
  243. package/dist/exporter/tools/json.d.ts.map +1 -0
  244. package/dist/exporter/tools/json.js +82 -0
  245. package/dist/exporter/tools/json.js.map +1 -0
  246. package/dist/exporter/tools/svg.d.ts +8 -0
  247. package/dist/exporter/tools/svg.d.ts.map +1 -0
  248. package/dist/exporter/tools/svg.js +26 -0
  249. package/dist/exporter/tools/svg.js.map +1 -0
  250. package/dist/exporter/tools/xml.d.ts +42 -0
  251. package/dist/exporter/tools/xml.d.ts.map +1 -0
  252. package/dist/exporter/tools/xml.js +467 -0
  253. package/dist/exporter/tools/xml.js.map +1 -0
  254. package/dist/exporter/tools/xml_zip.d.ts +21 -0
  255. package/dist/exporter/tools/xml_zip.d.ts.map +1 -0
  256. package/dist/exporter/tools/xml_zip.js +92 -0
  257. package/dist/exporter/tools/xml_zip.js.map +1 -0
  258. package/dist/exporter/tools/zip.d.ts +35 -0
  259. package/dist/exporter/tools/zip.d.ts.map +1 -0
  260. package/dist/exporter/tools/zip.js +78 -0
  261. package/dist/exporter/tools/zip.js.map +1 -0
  262. package/dist/exporter/tools/zotero_csl.d.ts +23 -0
  263. package/dist/exporter/tools/zotero_csl.d.ts.map +1 -0
  264. package/dist/exporter/tools/zotero_csl.js +78 -0
  265. package/dist/exporter/tools/zotero_csl.js.map +1 -0
  266. package/dist/importer/citations.d.ts +28 -0
  267. package/dist/importer/citations.d.ts.map +1 -0
  268. package/dist/importer/citations.js +68 -0
  269. package/dist/importer/citations.js.map +1 -0
  270. package/dist/importer/docx/citations.d.ts +43 -0
  271. package/dist/importer/docx/citations.d.ts.map +1 -0
  272. package/dist/importer/docx/citations.js +81 -0
  273. package/dist/importer/docx/citations.js.map +1 -0
  274. package/dist/importer/docx/convert.d.ts +150 -0
  275. package/dist/importer/docx/convert.d.ts.map +1 -0
  276. package/dist/importer/docx/convert.js +1243 -0
  277. package/dist/importer/docx/convert.js.map +1 -0
  278. package/dist/importer/docx/helpers.d.ts +2 -0
  279. package/dist/importer/docx/helpers.d.ts.map +1 -0
  280. package/dist/importer/docx/helpers.js +10 -0
  281. package/dist/importer/docx/helpers.js.map +1 -0
  282. package/dist/importer/docx/index.d.ts +27 -0
  283. package/dist/importer/docx/index.d.ts.map +1 -0
  284. package/dist/importer/docx/index.js +77 -0
  285. package/dist/importer/docx/index.js.map +1 -0
  286. package/dist/importer/docx/omml2mathml.d.ts +6 -0
  287. package/dist/importer/docx/omml2mathml.d.ts.map +1 -0
  288. package/dist/importer/docx/omml2mathml.js +1146 -0
  289. package/dist/importer/docx/omml2mathml.js.map +1 -0
  290. package/dist/importer/docx/parse.d.ts +96 -0
  291. package/dist/importer/docx/parse.d.ts.map +1 -0
  292. package/dist/importer/docx/parse.js +681 -0
  293. package/dist/importer/docx/parse.js.map +1 -0
  294. package/dist/importer/native/extract_template.d.ts +6 -0
  295. package/dist/importer/native/extract_template.d.ts.map +1 -0
  296. package/dist/importer/native/extract_template.js +80 -0
  297. package/dist/importer/native/extract_template.js.map +1 -0
  298. package/dist/importer/native/file.d.ts +37 -0
  299. package/dist/importer/native/file.d.ts.map +1 -0
  300. package/dist/importer/native/file.js +162 -0
  301. package/dist/importer/native/file.js.map +1 -0
  302. package/dist/importer/native/get_images.d.ts +21 -0
  303. package/dist/importer/native/get_images.d.ts.map +1 -0
  304. package/dist/importer/native/get_images.js +58 -0
  305. package/dist/importer/native/get_images.js.map +1 -0
  306. package/dist/importer/native/importer.d.ts +41 -0
  307. package/dist/importer/native/importer.d.ts.map +1 -0
  308. package/dist/importer/native/importer.js +170 -0
  309. package/dist/importer/native/importer.js.map +1 -0
  310. package/dist/importer/native/index.d.ts +7 -0
  311. package/dist/importer/native/index.d.ts.map +1 -0
  312. package/dist/importer/native/index.js +7 -0
  313. package/dist/importer/native/index.js.map +1 -0
  314. package/dist/importer/native/update.d.ts +7 -0
  315. package/dist/importer/native/update.d.ts.map +1 -0
  316. package/dist/importer/native/update.js +27 -0
  317. package/dist/importer/native/update.js.map +1 -0
  318. package/dist/importer/native/update_template.d.ts +12 -0
  319. package/dist/importer/native/update_template.d.ts.map +1 -0
  320. package/dist/importer/native/update_template.js +19 -0
  321. package/dist/importer/native/update_template.js.map +1 -0
  322. package/dist/importer/odt/citations.d.ts +27 -0
  323. package/dist/importer/odt/citations.d.ts.map +1 -0
  324. package/dist/importer/odt/citations.js +57 -0
  325. package/dist/importer/odt/citations.js.map +1 -0
  326. package/dist/importer/odt/convert.d.ts +146 -0
  327. package/dist/importer/odt/convert.d.ts.map +1 -0
  328. package/dist/importer/odt/convert.js +1530 -0
  329. package/dist/importer/odt/convert.js.map +1 -0
  330. package/dist/importer/odt/index.d.ts +30 -0
  331. package/dist/importer/odt/index.d.ts.map +1 -0
  332. package/dist/importer/odt/index.js +124 -0
  333. package/dist/importer/odt/index.js.map +1 -0
  334. package/dist/importer/pandoc/convert.d.ts +32 -0
  335. package/dist/importer/pandoc/convert.d.ts.map +1 -0
  336. package/dist/importer/pandoc/convert.js +790 -0
  337. package/dist/importer/pandoc/convert.js.map +1 -0
  338. package/dist/importer/pandoc/helpers.d.ts +5 -0
  339. package/dist/importer/pandoc/helpers.d.ts.map +1 -0
  340. package/dist/importer/pandoc/helpers.js +73 -0
  341. package/dist/importer/pandoc/helpers.js.map +1 -0
  342. package/dist/importer/pandoc/index.d.ts +31 -0
  343. package/dist/importer/pandoc/index.d.ts.map +1 -0
  344. package/dist/importer/pandoc/index.js +114 -0
  345. package/dist/importer/pandoc/index.js.map +1 -0
  346. package/dist/importer/registry.d.ts +21 -0
  347. package/dist/importer/registry.d.ts.map +1 -0
  348. package/dist/importer/registry.js +41 -0
  349. package/dist/importer/registry.js.map +1 -0
  350. package/dist/importer/zip_analyzer.d.ts +31 -0
  351. package/dist/importer/zip_analyzer.d.ts.map +1 -0
  352. package/dist/importer/zip_analyzer.js +89 -0
  353. package/dist/importer/zip_analyzer.js.map +1 -0
  354. package/dist/index.d.ts +2 -0
  355. package/dist/index.d.ts.map +1 -0
  356. package/dist/index.js +2 -0
  357. package/dist/index.js.map +1 -0
  358. package/dist/mathlive/opf_includes.d.ts +2 -0
  359. package/dist/mathlive/opf_includes.d.ts.map +1 -0
  360. package/dist/mathlive/opf_includes.js +25 -0
  361. package/dist/mathlive/opf_includes.js.map +1 -0
  362. package/dist/schema/common/annotate.d.ts +47 -0
  363. package/dist/schema/common/annotate.d.ts.map +1 -0
  364. package/dist/schema/common/annotate.js +75 -0
  365. package/dist/schema/common/annotate.js.map +1 -0
  366. package/dist/schema/common/base.d.ts +91 -0
  367. package/dist/schema/common/base.d.ts.map +1 -0
  368. package/dist/schema/common/base.js +109 -0
  369. package/dist/schema/common/base.js.map +1 -0
  370. package/dist/schema/common/citation.d.ts +30 -0
  371. package/dist/schema/common/citation.d.ts.map +1 -0
  372. package/dist/schema/common/citation.js +61 -0
  373. package/dist/schema/common/citation.js.map +1 -0
  374. package/dist/schema/common/equation.d.ts +17 -0
  375. package/dist/schema/common/equation.d.ts.map +1 -0
  376. package/dist/schema/common/equation.js +32 -0
  377. package/dist/schema/common/equation.js.map +1 -0
  378. package/dist/schema/common/figure.d.ts +87 -0
  379. package/dist/schema/common/figure.d.ts.map +1 -0
  380. package/dist/schema/common/figure.js +178 -0
  381. package/dist/schema/common/figure.js.map +1 -0
  382. package/dist/schema/common/heading.d.ts +9 -0
  383. package/dist/schema/common/heading.d.ts.map +1 -0
  384. package/dist/schema/common/heading.js +41 -0
  385. package/dist/schema/common/heading.js.map +1 -0
  386. package/dist/schema/common/index.d.ts +11 -0
  387. package/dist/schema/common/index.d.ts.map +1 -0
  388. package/dist/schema/common/index.js +11 -0
  389. package/dist/schema/common/index.js.map +1 -0
  390. package/dist/schema/common/list.d.ts +63 -0
  391. package/dist/schema/common/list.d.ts.map +1 -0
  392. package/dist/schema/common/list.js +92 -0
  393. package/dist/schema/common/list.js.map +1 -0
  394. package/dist/schema/common/reference.d.ts +70 -0
  395. package/dist/schema/common/reference.d.ts.map +1 -0
  396. package/dist/schema/common/reference.js +97 -0
  397. package/dist/schema/common/reference.js.map +1 -0
  398. package/dist/schema/common/table.d.ts +76 -0
  399. package/dist/schema/common/table.d.ts.map +1 -0
  400. package/dist/schema/common/table.js +86 -0
  401. package/dist/schema/common/table.js.map +1 -0
  402. package/dist/schema/common/track.d.ts +117 -0
  403. package/dist/schema/common/track.d.ts.map +1 -0
  404. package/{src → dist}/schema/common/track.js +44 -49
  405. package/dist/schema/common/track.js.map +1 -0
  406. package/dist/schema/const.d.ts +3 -0
  407. package/dist/schema/const.d.ts.map +1 -0
  408. package/{src → dist}/schema/const.js +3 -3
  409. package/dist/schema/const.js.map +1 -0
  410. package/dist/schema/convert.d.ts +3 -0
  411. package/dist/schema/convert.d.ts.map +1 -0
  412. package/dist/schema/convert.js +1215 -0
  413. package/dist/schema/convert.js.map +1 -0
  414. package/dist/schema/document/content.d.ts +110 -0
  415. package/dist/schema/document/content.d.ts.map +1 -0
  416. package/dist/schema/document/content.js +177 -0
  417. package/dist/schema/document/content.js.map +1 -0
  418. package/dist/schema/document/index.d.ts +795 -0
  419. package/dist/schema/document/index.d.ts.map +1 -0
  420. package/dist/schema/document/index.js +68 -0
  421. package/dist/schema/document/index.js.map +1 -0
  422. package/dist/schema/document/structure.d.ts +164 -0
  423. package/dist/schema/document/structure.d.ts.map +1 -0
  424. package/dist/schema/document/structure.js +445 -0
  425. package/dist/schema/document/structure.js.map +1 -0
  426. package/dist/schema/export.d.ts +7 -0
  427. package/dist/schema/export.d.ts.map +1 -0
  428. package/dist/schema/export.js +17 -0
  429. package/dist/schema/export.js.map +1 -0
  430. package/dist/schema/footnotes.d.ts +454 -0
  431. package/dist/schema/footnotes.d.ts.map +1 -0
  432. package/dist/schema/footnotes.js +90 -0
  433. package/dist/schema/footnotes.js.map +1 -0
  434. package/dist/schema/footnotes_convert.d.ts +5 -0
  435. package/dist/schema/footnotes_convert.d.ts.map +1 -0
  436. package/dist/schema/footnotes_convert.js +30 -0
  437. package/dist/schema/footnotes_convert.js.map +1 -0
  438. package/dist/schema/i18n.d.ts +55 -0
  439. package/dist/schema/i18n.d.ts.map +1 -0
  440. package/{src → dist}/schema/i18n.js +14 -23
  441. package/dist/schema/i18n.js.map +1 -0
  442. package/dist/schema/index.d.ts +6 -0
  443. package/dist/schema/index.d.ts.map +1 -0
  444. package/dist/schema/index.js +6 -0
  445. package/dist/schema/index.js.map +1 -0
  446. package/dist/schema/mini_json.d.ts +4 -0
  447. package/dist/schema/mini_json.d.ts.map +1 -0
  448. package/{src → dist}/schema/mini_json.js +19 -28
  449. package/dist/schema/mini_json.js.map +1 -0
  450. package/dist/schema/text.d.ts +3 -0
  451. package/dist/schema/text.d.ts.map +1 -0
  452. package/dist/schema/text.js +23 -0
  453. package/dist/schema/text.js.map +1 -0
  454. package/dist/types.d.ts +281 -0
  455. package/dist/types.d.ts.map +1 -0
  456. package/dist/types.js +9 -0
  457. package/dist/types.js.map +1 -0
  458. package/package.json +51 -16
  459. package/scripts/export-schema.js +1 -1
  460. package/src/bibliography/{common.js → common.ts} +15 -12
  461. package/src/bibliography/{csl_bib.js → csl_bib.ts} +16 -15
  462. package/src/citations/{citeproc_sys.js → citeproc_sys.ts} +26 -6
  463. package/src/citations/{format.js → format.ts} +80 -24
  464. package/src/editor/e2ee/{encryptor.js → encryptor.ts} +76 -44
  465. package/src/exporter/docx/{citations.js → citations.ts} +51 -23
  466. package/src/exporter/docx/{comments.js → comments.ts} +69 -26
  467. package/src/exporter/docx/{footnotes.js → footnotes.ts} +81 -42
  468. package/src/exporter/docx/images.ts +128 -0
  469. package/src/exporter/docx/{index.js → index.ts} +48 -25
  470. package/src/exporter/docx/{lists.js → lists.ts} +89 -46
  471. package/src/exporter/docx/{math.js → math.ts} +29 -9
  472. package/src/exporter/docx/{metadata.js → metadata.ts} +78 -42
  473. package/src/exporter/docx/{rels.js → rels.ts} +71 -50
  474. package/src/exporter/docx/{render.js → render.ts} +124 -87
  475. package/src/exporter/docx/{richtext.js → richtext.ts} +107 -84
  476. package/src/exporter/docx/{tables.js → tables.ts} +33 -23
  477. package/src/exporter/docx/{tools.js → tools.ts} +4 -3
  478. package/src/exporter/epub/{index.js → index.ts} +44 -15
  479. package/src/exporter/epub/{templates.js → templates.ts} +71 -7
  480. package/src/exporter/epub/tools.ts +102 -0
  481. package/src/exporter/html/{citations.js → citations.ts} +79 -31
  482. package/src/exporter/html/{convert.js → convert.ts} +118 -71
  483. package/src/exporter/html/{index.js → index.ts} +63 -29
  484. package/src/exporter/html/{templates.js → templates.ts} +22 -2
  485. package/src/exporter/html/{tools.js → tools.ts} +9 -6
  486. package/src/exporter/jats/bibliography.ts +199 -0
  487. package/src/exporter/jats/{citations.js → citations.ts} +56 -20
  488. package/src/exporter/jats/{convert.js → convert.ts} +72 -53
  489. package/src/exporter/jats/index.ts +132 -0
  490. package/src/exporter/jats/{templates.js → templates.ts} +19 -3
  491. package/src/exporter/jats/{text.js → text.ts} +8 -6
  492. package/src/exporter/latex/{convert.js → convert.ts} +160 -125
  493. package/src/exporter/latex/{escape_latex.js → escape_latex.ts} +1 -1
  494. package/src/exporter/latex/{index.js → index.ts} +27 -12
  495. package/src/exporter/latex/{readme.js → readme.ts} +2 -2
  496. package/src/exporter/native/copy.ts +231 -0
  497. package/src/exporter/native/file.ts +65 -0
  498. package/src/exporter/native/index.ts +4 -0
  499. package/src/exporter/native/revision.ts +76 -0
  500. package/src/exporter/native/{shrink.js → shrink.ts} +64 -29
  501. package/src/exporter/native/zip.ts +85 -0
  502. package/src/exporter/odt/{citations.js → citations.ts} +35 -15
  503. package/src/exporter/odt/{footnotes.js → footnotes.ts} +53 -30
  504. package/src/exporter/odt/images.ts +135 -0
  505. package/src/exporter/odt/{index.js → index.ts} +49 -27
  506. package/src/exporter/odt/{math.js → math.ts} +38 -9
  507. package/src/exporter/odt/{metadata.js → metadata.ts} +54 -29
  508. package/src/exporter/odt/{render.js → render.ts} +89 -60
  509. package/src/exporter/odt/{richtext.js → richtext.ts} +102 -72
  510. package/src/exporter/odt/{styles.js → styles.ts} +98 -66
  511. package/src/exporter/odt/{track.js → track.ts} +22 -6
  512. package/src/exporter/pandoc/{citations.js → citations.ts} +31 -15
  513. package/src/exporter/pandoc/{convert.js → convert.ts} +98 -79
  514. package/src/exporter/pandoc/{index.js → index.ts} +36 -13
  515. package/src/exporter/pandoc/{readme.js → readme.ts} +0 -1
  516. package/src/exporter/pandoc/{tools.js → tools.ts} +28 -5
  517. package/src/exporter/print/{index.js → index.ts} +38 -19
  518. package/src/exporter/tools/{doc_content.js → doc_content.ts} +34 -24
  519. package/src/exporter/tools/{file.js → file.ts} +1 -1
  520. package/src/exporter/tools/{json.js → json.ts} +30 -19
  521. package/src/exporter/tools/{svg.js → svg.ts} +9 -3
  522. package/src/exporter/tools/{xml.js → xml.ts} +187 -138
  523. package/src/exporter/tools/{xml_zip.js → xml_zip.ts} +19 -11
  524. package/src/exporter/tools/{zip.js → zip.ts} +35 -11
  525. package/src/exporter/tools/{zotero_csl.js → zotero_csl.ts} +35 -18
  526. package/src/global.d.ts +13 -0
  527. package/src/importer/citations.ts +116 -0
  528. package/src/importer/docx/{citations.js → citations.ts} +22 -37
  529. package/src/importer/docx/{convert.js → convert.ts} +176 -141
  530. package/src/importer/docx/{helpers.js → helpers.ts} +1 -1
  531. package/src/importer/docx/index.ts +124 -0
  532. package/src/importer/docx/{omml2mathml.js → omml2mathml.ts} +154 -176
  533. package/src/importer/docx/{parse.js → parse.ts} +103 -81
  534. package/src/importer/native/extract_template.ts +83 -0
  535. package/src/importer/native/file.ts +282 -0
  536. package/src/importer/native/get_images.ts +82 -0
  537. package/src/importer/native/importer.ts +244 -0
  538. package/src/importer/native/index.ts +6 -0
  539. package/src/importer/native/{update.js → update.ts} +13 -5
  540. package/src/importer/native/update_template.ts +32 -0
  541. package/src/importer/odt/{citations.js → citations.ts} +17 -29
  542. package/src/importer/odt/{convert.js → convert.ts} +261 -237
  543. package/src/importer/odt/index.ts +202 -0
  544. package/src/importer/pandoc/{convert.js → convert.ts} +116 -94
  545. package/src/importer/pandoc/{helpers.js → helpers.ts} +24 -12
  546. package/src/importer/pandoc/index.ts +171 -0
  547. package/src/importer/registry.ts +69 -0
  548. package/src/importer/{zip_analyzer.js → zip_analyzer.ts} +44 -18
  549. package/src/mathlive/{opf_includes.js → opf_includes.ts} +1 -1
  550. package/src/modules.d.ts +40 -0
  551. package/src/schema/common/{annotate.js → annotate.ts} +10 -8
  552. package/src/schema/common/{base.js → base.ts} +12 -10
  553. package/src/schema/common/{citation.js → citation.ts} +17 -8
  554. package/src/schema/common/{equation.js → equation.ts} +6 -4
  555. package/src/schema/common/{figure.js → figure.ts} +43 -23
  556. package/src/schema/common/{heading.js → heading.ts} +7 -5
  557. package/src/schema/common/{list.js → list.ts} +15 -13
  558. package/src/schema/common/{reference.js → reference.ts} +14 -12
  559. package/src/schema/common/{table.js → table.ts} +16 -14
  560. package/src/schema/common/track.ts +201 -0
  561. package/src/schema/const.ts +58 -0
  562. package/src/schema/{convert.js → convert.ts} +6 -2
  563. package/src/schema/document/{content.js → content.ts} +22 -20
  564. package/src/schema/document/{structure.js → structure.ts} +15 -9
  565. package/src/schema/{export.js → export.ts} +4 -2
  566. package/src/schema/{footnotes.js → footnotes.ts} +11 -8
  567. package/src/schema/{footnotes_convert.js → footnotes_convert.ts} +11 -8
  568. package/src/schema/i18n.ts +601 -0
  569. package/src/schema/mini_json.ts +60 -0
  570. package/src/schema/{text.js → text.ts} +6 -2
  571. package/src/types.ts +314 -0
  572. package/jest.config.js +0 -24
  573. package/src/exporter/docx/images.js +0 -101
  574. package/src/exporter/jats/bibliography.js +0 -183
  575. package/src/exporter/jats/index.js +0 -92
  576. package/src/exporter/odt/images.js +0 -115
  577. package/src/importer/citations.js +0 -129
  578. package/src/importer/native/get_images.js +0 -76
  579. /package/src/{index.js → index.ts} +0 -0
  580. /package/src/schema/common/{index.js → index.ts} +0 -0
  581. /package/src/schema/document/{index.js → index.ts} +0 -0
  582. /package/src/schema/{index.js → index.ts} +0 -0
@@ -0,0 +1,1243 @@
1
+ import { MathMLToLaTeX } from "mathml-to-latex";
2
+ import { randomFigureId, randomHeadingId } from "../../schema/common/index.js";
3
+ import { isDocxBibliographyField, isDocxCitationField, isDocxSdtBibliography, isDocxSdtCitation, parseDocxFieldCitation, parseDocxSdtCitation } from "./citations.js";
4
+ import { normalizeText } from "./helpers.js";
5
+ import { omml2mathml } from "./omml2mathml.js";
6
+ import { DocxParser } from "./parse.js";
7
+ import { gettext } from "fwtoolkit";
8
+ function attr(node, name) {
9
+ if (node && typeof node === "object" && "getAttribute" in node) {
10
+ return String(node.getAttribute(name) || "");
11
+ }
12
+ return "";
13
+ }
14
+ export class DocxConvert {
15
+ zip;
16
+ importId;
17
+ template;
18
+ bibliography;
19
+ images;
20
+ parser;
21
+ tracks;
22
+ currentTracks;
23
+ currentFields;
24
+ currentCommentIds;
25
+ sourcesXml;
26
+ referenceTargets;
27
+ constructor(zip, importId, template, bibliography) {
28
+ this.zip = zip;
29
+ this.importId = importId;
30
+ this.template = template;
31
+ this.bibliography = bibliography;
32
+ this.images = {};
33
+ this.parser = new DocxParser(zip);
34
+ this.tracks = {};
35
+ this.currentTracks = [];
36
+ this.currentFields = [];
37
+ this.currentCommentIds = [];
38
+ this.sourcesXml = null;
39
+ this.referenceTargets = {};
40
+ }
41
+ async init() {
42
+ await this.parser.init();
43
+ // Load Word-native bibliography sources if present.
44
+ // This file is required by DocxCitationsParser for CITATION field codes.
45
+ this.sourcesXml =
46
+ (await this.zip.file("customXml/item1.xml")?.async("string")) ??
47
+ null;
48
+ const body = this.parser.document.query("w:body");
49
+ if (!body) {
50
+ return {
51
+ content: {
52
+ type: "doc",
53
+ content: []
54
+ },
55
+ settings: {
56
+ import_id: this.importId,
57
+ tracked: false,
58
+ language: "en-US"
59
+ },
60
+ comments: {}
61
+ };
62
+ }
63
+ // Find all reference targets in the document for cross-references
64
+ this.referenceTargets = this.findReferenceTargets(this.parser.document);
65
+ const convertedContent = this.convertDocument(body);
66
+ // Convert document
67
+ return {
68
+ content: convertedContent,
69
+ settings: {
70
+ import_id: this.importId,
71
+ tracked: this.hasTrackedChanges(this.parser.document),
72
+ language: this.detectLanguage(this.parser.document)
73
+ },
74
+ comments: this.parser.comments
75
+ };
76
+ }
77
+ convertDocument(body) {
78
+ const templateParts = this.template.content.content.slice();
79
+ templateParts.shift(); // Remove first element
80
+ const document = {
81
+ type: "doc",
82
+ attrs: {
83
+ import_id: this.importId
84
+ },
85
+ content: []
86
+ };
87
+ // Add title (required first element)
88
+ const title = this.extractTitle(body);
89
+ document.content.push({
90
+ type: "title",
91
+ content: title.content || [
92
+ { type: "text", text: gettext("Untitled") }
93
+ ]
94
+ });
95
+ title.containerNodes.forEach((node) => {
96
+ node.parentElement.removeChild(node);
97
+ });
98
+ document.attrs.title =
99
+ title.content.map((node) => node.textContent).join("") ||
100
+ gettext("Untitled");
101
+ // Extract metadata sections
102
+ const metadata = this.extractMetadata(body);
103
+ metadata.forEach(({ type, content }) => {
104
+ const templatePart = templateParts.find((part) => part.attrs.metadata === type);
105
+ const attrs = {};
106
+ if (templatePart) {
107
+ if (templatePart.attrs?.hidden) {
108
+ attrs.hidden = false;
109
+ }
110
+ document.content.push({
111
+ type: templatePart.type,
112
+ attrs: {
113
+ ...templatePart.attrs,
114
+ ...attrs
115
+ },
116
+ content: content.content
117
+ });
118
+ // Remove paragraphs from content so they are not added to body
119
+ content.containerNodes.forEach((node) => {
120
+ node.parentElement?.removeChild(node);
121
+ });
122
+ }
123
+ });
124
+ // Extract main content sections
125
+ const sections = this.groupContentIntoSections(body);
126
+ // Map sections to template parts
127
+ sections.forEach((section) => {
128
+ const templatePart = this.findMatchingTemplatePart(section.title, templateParts);
129
+ if (templatePart) {
130
+ document.content.push({
131
+ type: "richtext_part",
132
+ attrs: {
133
+ title: templatePart.attrs.title,
134
+ id: templatePart.attrs.id,
135
+ metadata: templatePart.attrs.metadata || undefined,
136
+ marks: templatePart.attrs.marks || [
137
+ "strong",
138
+ "em",
139
+ "link"
140
+ ]
141
+ },
142
+ content: section.content
143
+ });
144
+ }
145
+ });
146
+ // Add remaining content to body section
147
+ const unassignedContent = sections
148
+ .filter((section) => !this.findMatchingTemplatePart(section.title, templateParts))
149
+ .flatMap((section) => section.content);
150
+ if (unassignedContent.length) {
151
+ const bodyTemplatePart = templateParts.find((part) => !part.attrs.metadata && part.type === "richtext_part");
152
+ document.content.push({
153
+ type: "richtext_part",
154
+ attrs: {
155
+ title: bodyTemplatePart?.attrs?.title || "Body",
156
+ id: bodyTemplatePart?.attrs?.id || "body",
157
+ marks: ["strong", "em", "link"]
158
+ },
159
+ content: unassignedContent
160
+ });
161
+ }
162
+ return document;
163
+ }
164
+ extractMetadata(body) {
165
+ const metadata = [];
166
+ // Try structured contributor data from custom properties first
167
+ const contributorsByRole = this.extractContributorsFromCustomProps();
168
+ if (Object.keys(contributorsByRole).length) {
169
+ Object.entries(contributorsByRole).forEach(([role, contributors]) => {
170
+ metadata.push({
171
+ type: role,
172
+ content: { content: contributors, containerNodes: [] }
173
+ });
174
+ });
175
+ }
176
+ else {
177
+ // Fall back to legacy author extraction
178
+ const authors = this.extractAuthors(body);
179
+ if (authors.content.length) {
180
+ metadata.push({
181
+ type: "authors",
182
+ content: authors
183
+ });
184
+ }
185
+ }
186
+ // Extract abstract if present
187
+ const abstract = this.extractAbstract(body);
188
+ if (abstract.content.length) {
189
+ metadata.push({
190
+ type: "abstract",
191
+ content: abstract
192
+ });
193
+ }
194
+ // Extract keywords if present
195
+ const keywords = this.extractKeywords(body);
196
+ if (keywords.content.length) {
197
+ metadata.push({
198
+ type: "keywords",
199
+ content: keywords
200
+ });
201
+ }
202
+ return metadata;
203
+ }
204
+ extractContributorsFromCustomProps() {
205
+ if (!this.parser.customDoc) {
206
+ return {};
207
+ }
208
+ const properties = this.parser.customDoc.queryAll("property");
209
+ const contributors = [];
210
+ properties.forEach((prop) => {
211
+ const name = attr(prop, "name");
212
+ if (!name || !name.startsWith("fidus_contributor_")) {
213
+ return;
214
+ }
215
+ const match = name.match(/^fidus_contributor_(\d+)_(\w+)$/);
216
+ if (!match) {
217
+ return;
218
+ }
219
+ const num = parseInt(match[1]);
220
+ const field = match[2];
221
+ const lpwstr = prop.query("vt:lpwstr");
222
+ const value = lpwstr ? lpwstr.textContent : "";
223
+ if (!contributors[num - 1]) {
224
+ contributors[num - 1] = {
225
+ type: "contributor",
226
+ attrs: {
227
+ firstname: "",
228
+ lastname: "",
229
+ email: "",
230
+ institution: "",
231
+ id_type: "",
232
+ id_value: "",
233
+ role: ""
234
+ }
235
+ };
236
+ }
237
+ if (field === "role") {
238
+ contributors[num - 1].attrs.role = value;
239
+ }
240
+ else if ([
241
+ "firstname",
242
+ "lastname",
243
+ "email",
244
+ "institution",
245
+ "id_type",
246
+ "id_value"
247
+ ].includes(field)) {
248
+ contributors[num - 1].attrs[field] = value;
249
+ }
250
+ });
251
+ const byRole = {};
252
+ contributors.forEach((contributor) => {
253
+ if (!contributor) {
254
+ return;
255
+ }
256
+ const role = contributor.attrs.role || "authors";
257
+ if (!byRole[role]) {
258
+ byRole[role] = [];
259
+ }
260
+ byRole[role].push(contributor);
261
+ });
262
+ return byRole;
263
+ }
264
+ extractAuthors(body) {
265
+ const authors = [];
266
+ // Try to find author information in metadata
267
+ const authorNodes = body
268
+ .queryAll("w:pStyle", { "w:val": "Author" })
269
+ .map((pStyle) => pStyle.closest("w:p"))
270
+ .filter((p) => p);
271
+ authorNodes.forEach((authorNode) => {
272
+ const authorText = this.getTextContent(authorNode);
273
+ const [firstname = "", lastname = ""] = authorText.split(" ", 2);
274
+ authors.push({
275
+ type: "contributor",
276
+ attrs: {
277
+ firstname,
278
+ lastname,
279
+ email: "",
280
+ institution: ""
281
+ }
282
+ });
283
+ });
284
+ if (authors.length) {
285
+ return {
286
+ content: authors,
287
+ containerNodes: authorNodes
288
+ };
289
+ }
290
+ // Also check Creator in document properties
291
+ const creator = this.parser.coreDoc?.query("dc:creator")?.textContent;
292
+ if (creator) {
293
+ const [firstname = "", lastname = ""] = creator.split(" ", 2);
294
+ return {
295
+ content: [
296
+ {
297
+ type: "contributor",
298
+ attrs: {
299
+ firstname,
300
+ lastname,
301
+ email: "",
302
+ institution: ""
303
+ }
304
+ }
305
+ ],
306
+ containerNodes: []
307
+ };
308
+ }
309
+ return { content: [], containerNodes: [] };
310
+ }
311
+ extractAbstract(body) {
312
+ // Look for section with Abstract style or heading
313
+ const abstractNodes = body
314
+ .queryAll("w:pStyle", { "w:val": "Abstract" })
315
+ .map((pStyle) => pStyle.closest("w:p"))
316
+ .filter((p) => p);
317
+ if (abstractNodes.length) {
318
+ return {
319
+ content: abstractNodes.map((abstractNode) => this.convertBlock(abstractNode)),
320
+ containerNodes: abstractNodes
321
+ };
322
+ }
323
+ const extractedPart = this.extractPartOnTitle(body, ["Abstract"]);
324
+ if (extractedPart.content.length) {
325
+ return {
326
+ content: extractedPart.content.map((abstractNode) => this.convertBlock(abstractNode)),
327
+ containerNodes: extractedPart.content.concat([
328
+ extractedPart.header
329
+ ])
330
+ };
331
+ }
332
+ return { content: [], containerNodes: [] };
333
+ }
334
+ extractKeywords(body) {
335
+ let extraNodes = [];
336
+ // Look for keywords section or metadata
337
+ let keywordNodes = body
338
+ .queryAll("w:pStyle", { "w:val": "Keywords" })
339
+ .map((pStyle) => pStyle.closest("w:p"))
340
+ .filter((p) => p);
341
+ if (!keywordNodes.length) {
342
+ // If no keywords section is found, look for a title called "Keywords"
343
+ const extractedPart = this.extractPartOnTitle(body, ["Keywords", "Keywords:", "Keyword"], 1);
344
+ if (extractedPart.content.length) {
345
+ keywordNodes = extractedPart.content;
346
+ extraNodes = extractedPart.header ? [extractedPart.header] : [];
347
+ }
348
+ }
349
+ if (keywordNodes) {
350
+ return {
351
+ content: keywordNodes
352
+ .map((keywordsNode) => this.getTextContent(keywordsNode))
353
+ .flatMap((str) => str.split(/[,;|:]+/)) // Split on multiple separators
354
+ .map((keyword) => keyword.trim()) // Trim whitespace
355
+ .filter((keyword) => keyword.length > 0)
356
+ .map((keyword) => ({
357
+ type: "tag",
358
+ attrs: {
359
+ tag: keyword
360
+ }
361
+ })),
362
+ containerNodes: keywordNodes.concat(extraNodes)
363
+ };
364
+ }
365
+ return { content: [], containerNodes: [] };
366
+ }
367
+ extractPartOnTitle(body, titleWords, maxPars = false) {
368
+ // Fall back to heading starting with TITLEWORD in text
369
+ if (typeof titleWords === "string") {
370
+ titleWords = [titleWords];
371
+ }
372
+ const headingPars = body
373
+ .queryAll("w:pStyle", {
374
+ "w:val": [
375
+ "Heading1",
376
+ "Heading2",
377
+ "Heading3",
378
+ "Heading4",
379
+ "Heading5",
380
+ "Heading6",
381
+ "Heading7",
382
+ "Heading8",
383
+ "Heading9"
384
+ ]
385
+ })
386
+ .map((pStyle) => pStyle.closest("w:p"))
387
+ .filter((p) => p);
388
+ const header = headingPars.find((p) => titleWords.includes(this.getTextContent(p).trim()));
389
+ const content = [];
390
+ if (header && header.nextSibling) {
391
+ //const content = []
392
+ //const containerNodes = [sectionHeader]
393
+ const headerLevel = this.getParaStyle(header).level;
394
+ let searchPar = header;
395
+ // Add everything to abstract until next heading with the same or lower level
396
+ while (searchPar.nextSibling &&
397
+ (!maxPars || content.length < maxPars)) {
398
+ searchPar = searchPar.nextSibling;
399
+ const paraStyle = this.getParaStyle(searchPar);
400
+ if (paraStyle.isHeading && paraStyle.level <= headerLevel) {
401
+ break;
402
+ }
403
+ content.push(searchPar);
404
+ }
405
+ }
406
+ return { header, content };
407
+ }
408
+ groupContentIntoSections(body) {
409
+ const sections = [];
410
+ let currentSection = {
411
+ title: null,
412
+ content: []
413
+ };
414
+ const skippedBlocks = [];
415
+ body.children.forEach((node) => {
416
+ if (skippedBlocks.includes(node)) {
417
+ return;
418
+ }
419
+ if (node.tagName !== "w:p") {
420
+ return;
421
+ }
422
+ const style = this.getParaStyle(node);
423
+ const title = this.getSectionTitle(node, style);
424
+ if (title && style.isHeading) {
425
+ if (currentSection.content.length) {
426
+ sections.push(currentSection);
427
+ }
428
+ currentSection = {
429
+ title,
430
+ content: []
431
+ };
432
+ }
433
+ const block = this.convertBlock(node, skippedBlocks);
434
+ if (block) {
435
+ currentSection.content.push(block);
436
+ }
437
+ });
438
+ if (currentSection.content.length) {
439
+ sections.push(currentSection);
440
+ }
441
+ return sections;
442
+ }
443
+ getSectionTitle(node, style) {
444
+ if (!node || !style) {
445
+ return null;
446
+ }
447
+ // For headings, use text content as section title
448
+ if (style.isHeading && style.level <= 4) {
449
+ return this.getTextContent(node);
450
+ }
451
+ // Check style name for section indicators
452
+ if (style.name) {
453
+ const name = style.name.toLowerCase();
454
+ if (name.includes("section") || name.includes("title")) {
455
+ return this.getTextContent(node);
456
+ }
457
+ }
458
+ return null;
459
+ }
460
+ findMatchingTemplatePart(sectionTitle, templateParts) {
461
+ if (!sectionTitle) {
462
+ return null;
463
+ }
464
+ // Try exact match first
465
+ let matchingPart = templateParts.find((part) => part.type === "richtext_part" &&
466
+ !part.attrs.metadata &&
467
+ part.attrs.title.toLowerCase() === sectionTitle.toLowerCase());
468
+ if (!matchingPart) {
469
+ // Try fuzzy matching
470
+ matchingPart = templateParts.find((part) => part.type === "richtext_part" &&
471
+ !part.attrs.metadata &&
472
+ this.isSimilarTitle(part.attrs.title, sectionTitle));
473
+ }
474
+ return matchingPart;
475
+ }
476
+ isSimilarTitle(title1, title2) {
477
+ const normalized1 = normalizeText(title1);
478
+ const normalized2 = normalizeText(title2);
479
+ return (normalized1.includes(normalized2) ||
480
+ normalized2.includes(normalized1));
481
+ }
482
+ getTextContent(node) {
483
+ return node
484
+ .queryAll("w:t")
485
+ .map((t) => t.textContent)
486
+ .join("");
487
+ }
488
+ extractTitle(body) {
489
+ // First try to find paragraph with Title style
490
+ const titlePars = body
491
+ .queryAll("w:pStyle", { "w:val": "Title" })
492
+ .map((pStyle) => pStyle.closest("w:p"))
493
+ .filter((p) => p);
494
+ if (titlePars.length) {
495
+ return {
496
+ content: this.convertInline(titlePars[0]),
497
+ containerNodes: [titlePars[0]]
498
+ };
499
+ }
500
+ // Fall back to first heading
501
+ const headingPars = body
502
+ .queryAll("w:pStyle", {
503
+ "w:val": [
504
+ "Heading1",
505
+ "Heading2",
506
+ "Heading3",
507
+ "Heading4",
508
+ "Heading5",
509
+ "Heading6",
510
+ "Heading7",
511
+ "Heading8",
512
+ "Heading9"
513
+ ]
514
+ })
515
+ .map((pStyle) => pStyle.closest("w:p"))
516
+ .filter((p) => p);
517
+ if (headingPars.length) {
518
+ return {
519
+ content: this.convertInline(headingPars[0]),
520
+ containerNodes: [headingPars[0]]
521
+ };
522
+ }
523
+ return {
524
+ content: [
525
+ {
526
+ type: "text",
527
+ text: gettext("Untitled")
528
+ }
529
+ ],
530
+ containerNodes: []
531
+ };
532
+ }
533
+ inBibliography(node) {
534
+ // Check if we currently are in a field.
535
+ const currentField = this.currentFields[this.currentFields.length - 1];
536
+ if (currentField &&
537
+ isDocxBibliographyField(currentField.instructions)) {
538
+ return true;
539
+ }
540
+ // Check every SDT block inside this paragraph.
541
+ for (const sdt of node.queryAll("w:sdt")) {
542
+ if (isDocxSdtBibliography(sdt)) {
543
+ return true;
544
+ }
545
+ }
546
+ return false;
547
+ }
548
+ convertBlock(node, skippedBlocks = []) {
549
+ if (node.tagName !== "w:p") {
550
+ return null;
551
+ }
552
+ const inBibliography = this.inBibliography(node);
553
+ let converted;
554
+ const style = this.getParaStyle(node);
555
+ if (style.isHeading) {
556
+ converted = this.convertHeading(node, style);
557
+ }
558
+ else if (style.numbering) {
559
+ converted = this.convertListItem(node, style);
560
+ }
561
+ else if (style.isCaption &&
562
+ (node.query("w:drawing") || node.query("w:pict"))) {
563
+ converted = this.convertFigure(node, node);
564
+ }
565
+ else if (style.isCaption &&
566
+ (node.nextSibling?.query("w:drawing") ||
567
+ node.nextSibling?.query("w:pict")) &&
568
+ !skippedBlocks.includes(node.nextSibling)) {
569
+ skippedBlocks.push(node.nextSibling);
570
+ converted = this.convertFigure(node.nextSibling, node);
571
+ }
572
+ else if (node.query("w:drawing") || node.query("w:pict")) {
573
+ if (node.nextSibling &&
574
+ this.getParaStyle(node.nextSibling).isCaption) {
575
+ skippedBlocks.push(node.nextSibling);
576
+ converted = this.convertFigure(node, node.nextSibling);
577
+ }
578
+ else {
579
+ converted = this.convertFigure(node);
580
+ }
581
+ }
582
+ else {
583
+ converted = this.convertParagraph(node);
584
+ }
585
+ if (inBibliography || this.inBibliography(node)) {
586
+ // We skip bibliography paragraphs
587
+ return null;
588
+ }
589
+ return this.wrapTrackChanges(node, converted);
590
+ }
591
+ wrapTrackChanges(node, content) {
592
+ if (!content || !node.previousSibling) {
593
+ return content;
594
+ }
595
+ const track = this.getTracksFromNode(node.previousSibling);
596
+ if (!track) {
597
+ return content;
598
+ }
599
+ return {
600
+ ...content,
601
+ attrs: Object.assign({}, content.attrs || {}, { track })
602
+ };
603
+ }
604
+ getTracksFromNode(node) {
605
+ const deletion = node.query("w:pPr")?.query("w:del");
606
+ const insertion = node.query("w:pPr")?.query("w:ins");
607
+ const tracks = [];
608
+ if (insertion) {
609
+ const date = new Date(attr(insertion, "w:date"));
610
+ const date10 = Math.floor(date.getTime() / 60000) * 10;
611
+ tracks.push({
612
+ type: "insertion",
613
+ user: 0, // Default user ID
614
+ username: attr(insertion, "w:author"),
615
+ date: date10
616
+ });
617
+ }
618
+ if (deletion) {
619
+ const date = new Date(attr(deletion, "w:date"));
620
+ const date10 = Math.floor(date.getTime() / 60000) * 10;
621
+ tracks.push({
622
+ type: "deletion",
623
+ user: 0, // Default user ID
624
+ username: attr(deletion, "w:author"),
625
+ date: date10
626
+ });
627
+ }
628
+ if (tracks.length === 0) {
629
+ return null;
630
+ }
631
+ return tracks;
632
+ }
633
+ getParaStyle(node) {
634
+ const pStyle = node.query("w:pStyle");
635
+ const styleId = attr(pStyle, "w:val");
636
+ const style = this.parser.styles[styleId] || {};
637
+ const numPr = node.query("w:numPr");
638
+ const numId = attr(numPr?.query("w:numId"), "w:val");
639
+ const ilvl = parseInt(attr(numPr?.query("w:ilvl"), "w:val") || "0");
640
+ return {
641
+ ...style,
642
+ numbering: numId
643
+ ? {
644
+ id: numId,
645
+ level: ilvl,
646
+ definition: this.parser.numbering[numId]
647
+ }
648
+ : null
649
+ };
650
+ }
651
+ convertParagraph(node) {
652
+ const pStyle = node.query("w:pStyle");
653
+ const styleId = attr(pStyle, "w:val");
654
+ // Check if this is a code block (Code style or inherited from one)
655
+ if (styleId &&
656
+ (this.parser.isCodeStyle?.(styleId) || styleId === "Code")) {
657
+ return {
658
+ type: "code_block",
659
+ attrs: {
660
+ track: [],
661
+ language: "",
662
+ category: "",
663
+ title: "",
664
+ id: ""
665
+ },
666
+ content: this.convertInline(node)
667
+ };
668
+ }
669
+ return {
670
+ type: "paragraph",
671
+ content: this.convertInline(node)
672
+ };
673
+ }
674
+ convertHeading(node, style) {
675
+ return {
676
+ type: `heading${style.level}`,
677
+ attrs: {
678
+ id: randomHeadingId(),
679
+ level: style.level
680
+ },
681
+ content: this.convertInline(node)
682
+ };
683
+ }
684
+ convertListItem(node, style) {
685
+ const numbering = style.numbering;
686
+ const level = numbering.definition?.levels[numbering.level];
687
+ return {
688
+ type: level?.format === "bullet" ? "bullet_list" : "ordered_list",
689
+ attrs: {
690
+ id: `L${Math.random().toString(36).slice(2)}`,
691
+ level: numbering.level,
692
+ start: level?.start || 1
693
+ },
694
+ content: [
695
+ {
696
+ type: "list_item",
697
+ content: [this.convertParagraph(node)]
698
+ }
699
+ ]
700
+ };
701
+ }
702
+ convertFigure(node, captionNode = null) {
703
+ let captionBlock, captionOrder;
704
+ if (captionNode) {
705
+ captionBlock = this.convertParagraph(captionNode);
706
+ captionOrder = node.nextSibling === captionNode ? "after" : "before";
707
+ }
708
+ const drawing = node.query("w:drawing");
709
+ if (!drawing) {
710
+ return null;
711
+ }
712
+ const blip = drawing.query("a:blip");
713
+ if (!blip) {
714
+ return null;
715
+ }
716
+ const rId = attr(blip, "r:embed");
717
+ const rel = this.parser.relationships[rId];
718
+ if (!rel) {
719
+ return null;
720
+ }
721
+ const imagePath = rel.target.split("/").pop();
722
+ const imageBlob = this.parser.images[imagePath];
723
+ if (!imageBlob) {
724
+ return null;
725
+ }
726
+ // <a:ext cx="5753598" cy="4463556" />
727
+ //
728
+ const size = drawing.query("a:ext");
729
+ const width = parseInt(attr(size, "cx") || "0") / 9525; // In EMUs
730
+ const height = parseInt(attr(size, "cy") || "0") / 9525; // In EMUs
731
+ const imageId = Math.floor(Math.random() * 1000000);
732
+ this.images[imageId] = {
733
+ id: imageId,
734
+ title: imagePath,
735
+ image: imagePath,
736
+ file: imageBlob,
737
+ copyright: {
738
+ holder: false,
739
+ year: false,
740
+ freeToRead: true,
741
+ licenses: []
742
+ },
743
+ checksum: 0,
744
+ width,
745
+ height
746
+ };
747
+ const image = {
748
+ type: "image",
749
+ attrs: {
750
+ image: imageId
751
+ }
752
+ };
753
+ const caption = {
754
+ type: "figure_caption",
755
+ content: captionBlock?.content || []
756
+ };
757
+ const content = captionOrder === "before" ? [caption, image] : [image, caption];
758
+ return {
759
+ type: "figure",
760
+ attrs: {
761
+ id: randomFigureId(),
762
+ aligned: "center",
763
+ width: 100,
764
+ caption: !!captionBlock
765
+ },
766
+ content
767
+ };
768
+ }
769
+ convertInline(node) {
770
+ const content = [];
771
+ // We'll process all inline nodes in document order
772
+ node.children.forEach((child) => {
773
+ let contentReceiver = content;
774
+ const currentField = this.currentFields[this.currentFields.length - 1];
775
+ if (currentField) {
776
+ if (currentField.status === "instruction") {
777
+ // We're currently inside the instruction part of a fieldChar
778
+ const instrText = child.query("w:instrText");
779
+ if (instrText) {
780
+ currentField.instructions += instrText.textContent;
781
+ }
782
+ }
783
+ if (currentField.status === "display") {
784
+ // We're currently inside the display part of a fieldChar
785
+ contentReceiver = currentField.display;
786
+ }
787
+ }
788
+ if (child.tagName === "w:r") {
789
+ // A run
790
+ const fieldChar = child.query("w:fldChar");
791
+ if (fieldChar) {
792
+ let currentField;
793
+ let rendercurrentField = false;
794
+ const type = attr(fieldChar, "w:fldCharType");
795
+ if (type === "begin") {
796
+ currentField = {
797
+ status: "instruction",
798
+ display: [],
799
+ instructions: "",
800
+ data: null
801
+ };
802
+ this.currentFields.push(currentField);
803
+ }
804
+ else if (type === "separate") {
805
+ currentField =
806
+ this.currentFields[this.currentFields.length - 1];
807
+ currentField.status = "display";
808
+ contentReceiver = currentField.display;
809
+ }
810
+ else if (type === "end") {
811
+ currentField = this.currentFields.pop();
812
+ // If a fieldChar is closed and there was no display part,
813
+ // or it is inside another fieldChar, do nothing
814
+ if (currentField &&
815
+ currentField.status === "display" &&
816
+ this.currentFields.length === 0) {
817
+ rendercurrentField = true;
818
+ contentReceiver = content;
819
+ }
820
+ }
821
+ // Capture base64-encoded field data (used by EndNote)
822
+ const fldDataNode = fieldChar.query("w:fldData");
823
+ if (fldDataNode && currentField) {
824
+ currentField.data = fldDataNode.textContent || null;
825
+ }
826
+ if (rendercurrentField && currentField) {
827
+ this.renderField(currentField).forEach((node) => contentReceiver.push(node));
828
+ }
829
+ return;
830
+ }
831
+ // Process footnote references
832
+ const footnoteRef = child.query("w:footnoteReference");
833
+ if (footnoteRef) {
834
+ const footnoteId = attr(footnoteRef, "w:id");
835
+ if (this.parser.footnotes[footnoteId]) {
836
+ contentReceiver.push(this.convertFootnote(footnoteId));
837
+ }
838
+ return;
839
+ }
840
+ // Process endnote references
841
+ const endnoteRef = child.query("w:endnoteReference");
842
+ if (endnoteRef) {
843
+ const endnoteId = attr(endnoteRef, "w:id");
844
+ if (this.parser.endnotes[endnoteId]) {
845
+ contentReceiver.push(this.convertFootnote(endnoteId, true));
846
+ }
847
+ return;
848
+ }
849
+ // Process text with formatting
850
+ const text = child.query("w:t")?.textContent ||
851
+ child.query("w:delText")?.textContent;
852
+ if (!text) {
853
+ // Process line breaks
854
+ if (child.query("w:br")) {
855
+ contentReceiver.push({ type: "hard_break" });
856
+ }
857
+ return;
858
+ }
859
+ const rPr = child.query("w:rPr");
860
+ const formatting = rPr
861
+ ? this.parser.extractRunProperties(rPr)
862
+ : {};
863
+ const insertion = child.closest("w:ins");
864
+ const deletion = child.closest("w:del");
865
+ contentReceiver.push({
866
+ type: "text",
867
+ text,
868
+ marks: this.getCurrentMarks(formatting, insertion, deletion)
869
+ });
870
+ }
871
+ else if (child.tagName === "w:commentRangeStart") {
872
+ const commentId = attr(child, "w:id");
873
+ if (commentId && this.parser.comments[commentId]) {
874
+ this.currentCommentIds.push(commentId);
875
+ }
876
+ return;
877
+ }
878
+ else if (child.tagName === "w:commentRangeEnd") {
879
+ const commentId = attr(child, "w:id");
880
+ if (commentId) {
881
+ const index = this.currentCommentIds.indexOf(commentId);
882
+ if (index !== -1) {
883
+ this.currentCommentIds.splice(index, 1);
884
+ }
885
+ }
886
+ return;
887
+ }
888
+ else if (child.tagName === "w:r" &&
889
+ child.query("w:commentReference")) {
890
+ // Comment reference - just skip it (we already handle the range)
891
+ return;
892
+ }
893
+ else if (child.tagName === "w:hyperlink") {
894
+ // Process hyperlink
895
+ const rId = attr(child, "r:id");
896
+ const anchor = attr(child, "w:anchor");
897
+ const relationship = rId ? this.parser.relationships[rId] : null;
898
+ const href = relationship?.target || (anchor ? `#${anchor}` : null);
899
+ if (href) {
900
+ const runs = child.queryAll("w:r");
901
+ const text = runs
902
+ .map((run) => run.query("w:t")?.textContent || "")
903
+ .join("");
904
+ if (text) {
905
+ // Check if this is an internal link (bookmark reference) that should be a cross-reference
906
+ if (anchor && this.referenceTargets[anchor]) {
907
+ // If the link text is similar to the target text, treat it as a cross-reference
908
+ const target = this.referenceTargets[anchor];
909
+ const targetText = target.text || anchor;
910
+ // Compare normalized versions to check if text matches target
911
+ if (normalizeText(text) ===
912
+ normalizeText(targetText) ||
913
+ // Also check for "Figure X: " or "Table X: " style references
914
+ text.match(/^(Figure|Table|Equation)\s+\d+(\.\d+)*(\:|\.)?\s*$/i)) {
915
+ contentReceiver.push(this.convertCrossReference(anchor, text));
916
+ return;
917
+ }
918
+ }
919
+ // Otherwise, treat as a normal link
920
+ const rPr = runs[0]?.query("w:rPr");
921
+ const formatting = rPr
922
+ ? this.parser.extractRunProperties(rPr)
923
+ : {};
924
+ const marks = this.getCurrentMarks(formatting);
925
+ marks.push({
926
+ type: "link",
927
+ attrs: { href, title: text }
928
+ });
929
+ contentReceiver.push({
930
+ type: "text",
931
+ text,
932
+ marks
933
+ });
934
+ }
935
+ }
936
+ }
937
+ else if (child.tagName === "m:oMath") {
938
+ const equationNode = this.convertEquation(child);
939
+ if (equationNode) {
940
+ contentReceiver.push(equationNode);
941
+ }
942
+ }
943
+ else if (child.tagName === "w:sdt") {
944
+ if (isDocxSdtCitation(child)) {
945
+ // Used by Mendeley Cite & Citavi
946
+ const citationNode = parseDocxSdtCitation(child, this.bibliography);
947
+ if (citationNode) {
948
+ contentReceiver.push(citationNode);
949
+ }
950
+ }
951
+ }
952
+ else {
953
+ console.warn("unhandled node", child);
954
+ }
955
+ });
956
+ return content;
957
+ }
958
+ // Method to help process cross-references in documents
959
+ findReferenceTargets(document) {
960
+ const targets = {};
961
+ // Find bookmarks
962
+ document.queryAll("w:bookmarkStart").forEach((bookmark) => {
963
+ const id = attr(bookmark, "w:id");
964
+ const name = attr(bookmark, "w:name");
965
+ if (id && name) {
966
+ targets[name] = {
967
+ id: name,
968
+ type: "bookmark"
969
+ };
970
+ }
971
+ });
972
+ // Find headings (with styles like Heading1, Heading2, etc.)
973
+ document.queryAll("w:pStyle").forEach((pStyle) => {
974
+ const val = attr(pStyle, "w:val");
975
+ if (val && val.match(/^Heading\d+$/)) {
976
+ const paragraph = pStyle.closest("w:p");
977
+ if (paragraph) {
978
+ const text = this.getTextContent(paragraph);
979
+ // Create an ID from the heading text
980
+ const id = text
981
+ .trim()
982
+ .toLowerCase()
983
+ .replace(/[^\w\s-]/g, "")
984
+ .replace(/\s+/g, "-");
985
+ targets[id] = {
986
+ id: id,
987
+ type: "heading",
988
+ text: text
989
+ };
990
+ }
991
+ }
992
+ });
993
+ return targets;
994
+ }
995
+ convertFootnote(id, isEndnote = false) {
996
+ const footnoteContent = isEndnote
997
+ ? this.parser.endnotes[id].content
998
+ : this.parser.footnotes[id].content;
999
+ // Convert the footnote content to our document model
1000
+ const content = [];
1001
+ footnoteContent.forEach((block) => {
1002
+ if (block.type === "paragraph") {
1003
+ content.push({
1004
+ type: "paragraph",
1005
+ content: block.content.map((node) => {
1006
+ if (node.type === "text") {
1007
+ return {
1008
+ type: "text",
1009
+ text: node.text,
1010
+ marks: node.marks || []
1011
+ };
1012
+ }
1013
+ return node;
1014
+ })
1015
+ });
1016
+ }
1017
+ });
1018
+ return {
1019
+ type: "footnote",
1020
+ attrs: {
1021
+ footnote: content
1022
+ }
1023
+ };
1024
+ }
1025
+ convertEquation(oMathNode) {
1026
+ // Extract OMML content and convert to MathML
1027
+ const mmlNode = omml2mathml(oMathNode);
1028
+ const latex = MathMLToLaTeX.convert(mmlNode.outerXML);
1029
+ return {
1030
+ type: "equation",
1031
+ attrs: {
1032
+ equation: latex
1033
+ }
1034
+ };
1035
+ }
1036
+ simplifiedOmmlToLatex(omml) {
1037
+ // This is a very basic conversion - in a real implementation you would
1038
+ // use a library like MathML-to-LaTeX or implement a more complete converter
1039
+ // Extract text content as a fallback
1040
+ const textContent = omml
1041
+ .replace(/<[^>]+>/g, " ")
1042
+ .replace(/\s+/g, " ")
1043
+ .trim();
1044
+ // If the OMML contains a fraction
1045
+ if (omml.includes("<m:f>")) {
1046
+ const numMatch = omml.match(/<m:num>(.*?)<\/m:num>/s);
1047
+ const denMatch = omml.match(/<m:den>(.*?)<\/m:den>/s);
1048
+ if (numMatch && denMatch) {
1049
+ const num = numMatch[1].replace(/<[^>]+>/g, "").trim();
1050
+ const den = denMatch[1].replace(/<[^>]+>/g, "").trim();
1051
+ return `\\frac{${num}}{${den}}`;
1052
+ }
1053
+ }
1054
+ // If it contains a superscript
1055
+ if (omml.includes("<m:sup>")) {
1056
+ const baseMatch = omml.match(/<m:e>(.*?)<\/m:e>/s);
1057
+ const supMatch = omml.match(/<m:sup>(.*?)<\/m:sup>/s);
1058
+ if (baseMatch && supMatch) {
1059
+ const base = baseMatch[1].replace(/<[^>]+>/g, "").trim();
1060
+ const sup = supMatch[1].replace(/<[^>]+>/g, "").trim();
1061
+ return `${base}^{${sup}}`;
1062
+ }
1063
+ }
1064
+ // If it contains a subscript
1065
+ if (omml.includes("<m:sub>")) {
1066
+ const baseMatch = omml.match(/<m:e>(.*?)<\/m:e>/s);
1067
+ const subMatch = omml.match(/<m:sub>(.*?)<\/m:sub>/s);
1068
+ if (baseMatch && subMatch) {
1069
+ const base = baseMatch[1].replace(/<[^>]+>/g, "").trim();
1070
+ const sub = subMatch[1].replace(/<[^>]+>/g, "").trim();
1071
+ return `${base}_{${sub}}`;
1072
+ }
1073
+ }
1074
+ // Return a simplified representation with the text content
1075
+ return textContent || "x^2"; // Default fallback
1076
+ }
1077
+ renderField(field) {
1078
+ const instr = field.instructions.trim();
1079
+ // Handle REF fields (cross-references)
1080
+ if (instr.startsWith("REF ")) {
1081
+ // Extract the target bookmark/heading ID
1082
+ const parts = instr.substring(4).trim().split(/\s+/);
1083
+ if (parts.length > 0) {
1084
+ const target = parts[0];
1085
+ const text = field.display.reduce((accumulator, currentValue) => {
1086
+ if (currentValue.type === "text") {
1087
+ return accumulator + currentValue.text;
1088
+ }
1089
+ return accumulator;
1090
+ }, "");
1091
+ return [this.convertCrossReference(target, text)];
1092
+ }
1093
+ }
1094
+ // Handle SEQ fields (figure/table/equation number cross-references)
1095
+ else if (instr.startsWith("SEQ ")) {
1096
+ // This is a sequence field that generates numbers for figures/tables/equations.
1097
+ // For cross-references, we look for the text in the display part.
1098
+ const seqMatch = instr.match(/^SEQ\s+(\S+)/);
1099
+ if (seqMatch) {
1100
+ const _seqName = seqMatch[1];
1101
+ const text = field.display.reduce((acc, curr) => {
1102
+ if (curr.type === "text") {
1103
+ return acc + curr.text;
1104
+ }
1105
+ return acc;
1106
+ }, "");
1107
+ if (text) {
1108
+ // Return as a plain text node since we can't resolve SEQ references easily
1109
+ return [
1110
+ {
1111
+ type: "text",
1112
+ text,
1113
+ marks: []
1114
+ }
1115
+ ];
1116
+ }
1117
+ return [];
1118
+ }
1119
+ }
1120
+ // Handle citation fields
1121
+ else if (isDocxCitationField(instr)) {
1122
+ return [
1123
+ parseDocxFieldCitation(instr, field.data, this.sourcesXml, this.bibliography)
1124
+ ];
1125
+ }
1126
+ else if (isDocxBibliographyField(instr)) {
1127
+ // We don't render the contents of bibliography fields
1128
+ return [];
1129
+ }
1130
+ else {
1131
+ // We do not support this field type, so instead we return the display content.
1132
+ return field.display || [];
1133
+ }
1134
+ }
1135
+ convertCrossReference(targetId, displayText) {
1136
+ // Look up the target in our reference targets
1137
+ const target = this.referenceTargets[targetId];
1138
+ // If we found the target, use its information
1139
+ if (target) {
1140
+ return {
1141
+ type: "cross_reference",
1142
+ attrs: {
1143
+ id: targetId,
1144
+ title: displayText || target.text || targetId
1145
+ }
1146
+ };
1147
+ }
1148
+ // If target not found, create a reference with the display text or target ID
1149
+ return {
1150
+ type: "cross_reference",
1151
+ attrs: {
1152
+ id: targetId,
1153
+ title: displayText || targetId
1154
+ }
1155
+ };
1156
+ }
1157
+ createMarksFromFormatting(formatting, insertion = null, deletion = null) {
1158
+ const marks = [];
1159
+ if (formatting.bold) {
1160
+ marks.push({ type: "strong" });
1161
+ }
1162
+ if (formatting.italic) {
1163
+ marks.push({ type: "em" });
1164
+ }
1165
+ if (formatting.underline) {
1166
+ marks.push({ type: "underline" });
1167
+ }
1168
+ // Handle superscript and subscript
1169
+ if (formatting.vertAlign === "superscript") {
1170
+ marks.push({ type: "sup" });
1171
+ }
1172
+ if (formatting.vertAlign === "subscript") {
1173
+ marks.push({ type: "sub" });
1174
+ }
1175
+ // Handle inline code (monospace fonts)
1176
+ if (formatting.fontFamily) {
1177
+ const monospacePatterns = [
1178
+ /^courier/i,
1179
+ /^consolas/i,
1180
+ /^monaco/i,
1181
+ /^menlo/i,
1182
+ /^lucida console/i,
1183
+ /^liberation mono/i,
1184
+ /^dejavu sans mono/i,
1185
+ /^bitstream vera sans mono/i,
1186
+ /^source code pro/i,
1187
+ /^fira code/i,
1188
+ /^ubuntu mono/i,
1189
+ /^droid sans mono/i
1190
+ ];
1191
+ const isMonospace = monospacePatterns.some((pattern) => pattern.test(formatting.fontFamily));
1192
+ if (isMonospace) {
1193
+ marks.push({ type: "code" });
1194
+ }
1195
+ }
1196
+ if (insertion) {
1197
+ const date = new Date(attr(insertion, "w:date"));
1198
+ const date10 = Math.floor(date.getTime() / 600000) * 10;
1199
+ marks.push({
1200
+ type: "insertion",
1201
+ attrs: {
1202
+ user: 0,
1203
+ username: attr(insertion, "w:author"),
1204
+ date: date10,
1205
+ approved: false
1206
+ }
1207
+ });
1208
+ }
1209
+ if (deletion) {
1210
+ const date = new Date(attr(deletion, "w:date"));
1211
+ const date10 = Math.floor(date.getTime() / 600000) * 10;
1212
+ marks.push({
1213
+ type: "deletion",
1214
+ attrs: {
1215
+ user: 0,
1216
+ username: attr(deletion, "w:author"),
1217
+ date: date10
1218
+ }
1219
+ });
1220
+ }
1221
+ return marks;
1222
+ }
1223
+ getCurrentMarks(formatting, insertion = null, deletion = null) {
1224
+ const marks = this.createMarksFromFormatting(formatting, insertion, deletion);
1225
+ // Add comment marks for any active comment IDs
1226
+ this.currentCommentIds.forEach((commentId) => {
1227
+ marks.push({
1228
+ type: "comment",
1229
+ attrs: {
1230
+ id: Number.parseInt(commentId)
1231
+ }
1232
+ });
1233
+ });
1234
+ return marks;
1235
+ }
1236
+ hasTrackedChanges(doc) {
1237
+ return Boolean(doc.query("w:ins") || doc.query("w:del"));
1238
+ }
1239
+ detectLanguage(doc) {
1240
+ return attr(doc.query("w:lang"), "w:val") || "en-US";
1241
+ }
1242
+ }
1243
+ //# sourceMappingURL=convert.js.map