@erudit-js/prose 3.0.0-dev.25

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 (355) hide show
  1. package/dist/app/appElement.d.ts +19 -0
  2. package/dist/app/appElement.js +12 -0
  3. package/dist/app/component.d.ts +6 -0
  4. package/dist/app/component.js +6 -0
  5. package/dist/app/composables/anchor.d.ts +16 -0
  6. package/dist/app/composables/anchor.js +89 -0
  7. package/dist/app/composables/appElement.d.ts +4 -0
  8. package/dist/app/composables/appElement.js +16 -0
  9. package/dist/app/composables/context.d.ts +22 -0
  10. package/dist/app/composables/context.js +5 -0
  11. package/dist/app/composables/elementIcon.d.ts +3 -0
  12. package/dist/app/composables/elementIcon.js +5 -0
  13. package/dist/app/composables/formatText.d.ts +1 -0
  14. package/dist/app/composables/formatText.js +5 -0
  15. package/dist/app/composables/language.d.ts +8 -0
  16. package/dist/app/composables/language.js +13 -0
  17. package/dist/app/composables/storage.d.ts +5 -0
  18. package/dist/app/composables/storage.js +23 -0
  19. package/dist/app/default/Inliners.vue +11 -0
  20. package/dist/app/default/Mix.vue +11 -0
  21. package/dist/app/default/Text.vue +21 -0
  22. package/dist/app/icon.d.ts +5 -0
  23. package/dist/app/icon.js +7 -0
  24. package/dist/app/index.d.ts +18 -0
  25. package/dist/app/index.js +18 -0
  26. package/dist/app/language/element.d.ts +10 -0
  27. package/dist/app/language/element.js +12 -0
  28. package/dist/app/language/list/en.d.ts +3 -0
  29. package/dist/app/language/list/en.js +5 -0
  30. package/dist/app/language/list/ru.d.ts +3 -0
  31. package/dist/app/language/list/ru.js +5 -0
  32. package/dist/app/language/prose.d.ts +9 -0
  33. package/dist/app/language/prose.js +4 -0
  34. package/dist/app/shared/Prose.vue +36 -0
  35. package/dist/app/shared/Render.vue +51 -0
  36. package/dist/app/shared/assets/block.svg +3 -0
  37. package/dist/app/shared/assets/check.svg +3 -0
  38. package/dist/app/shared/assets/inliner.svg +3 -0
  39. package/dist/app/shared/assets/plus.svg +3 -0
  40. package/dist/app/shared/assets/share.svg +3 -0
  41. package/dist/app/shared/block/AsideMenu.vue +44 -0
  42. package/dist/app/shared/block/AsideMenuButton.vue +53 -0
  43. package/dist/app/shared/block/AsideMenuCopyLink.vue +40 -0
  44. package/dist/app/shared/block/AsideMenuSeparator.vue +3 -0
  45. package/dist/app/shared/block/Block.vue +270 -0
  46. package/dist/app/shared/inliner/Inliner.vue +11 -0
  47. package/dist/app/shared/invert.d.ts +2 -0
  48. package/dist/app/shared/invert.js +2 -0
  49. package/dist/app/shared/photoswipe/composable.d.ts +9 -0
  50. package/dist/app/shared/photoswipe/composable.js +68 -0
  51. package/dist/app/shared/photoswipe/style.css +26 -0
  52. package/dist/context.d.ts +4 -0
  53. package/dist/context.js +1 -0
  54. package/dist/coreElement.d.ts +10 -0
  55. package/dist/coreElement.js +6 -0
  56. package/dist/elements/accent/Accent.vue +92 -0
  57. package/dist/elements/accent/AccentColumnSection.vue +61 -0
  58. package/dist/elements/accent/AccentRowSections.vue +65 -0
  59. package/dist/elements/accent/app.d.ts +21 -0
  60. package/dist/elements/accent/app.js +16 -0
  61. package/dist/elements/accent/core.d.ts +340 -0
  62. package/dist/elements/accent/core.js +175 -0
  63. package/dist/elements/callout/Callout.vue +88 -0
  64. package/dist/elements/callout/_global.d.ts +15 -0
  65. package/dist/elements/callout/app.d.ts +9 -0
  66. package/dist/elements/callout/app.js +11 -0
  67. package/dist/elements/callout/core.d.ts +80 -0
  68. package/dist/elements/callout/core.js +37 -0
  69. package/dist/elements/callout/icon.svg +3 -0
  70. package/dist/elements/callout/languages/en.d.ts +4 -0
  71. package/dist/elements/callout/languages/en.js +2 -0
  72. package/dist/elements/callout/languages/ru.d.ts +4 -0
  73. package/dist/elements/callout/languages/ru.js +2 -0
  74. package/dist/elements/callout/storage.d.ts +2 -0
  75. package/dist/elements/callout/storage.js +5 -0
  76. package/dist/elements/caption/Caption.vue +47 -0
  77. package/dist/elements/caption/_global.d.ts +26 -0
  78. package/dist/elements/caption/app.d.ts +9 -0
  79. package/dist/elements/caption/app.js +6 -0
  80. package/dist/elements/caption/core.d.ts +114 -0
  81. package/dist/elements/caption/core.js +61 -0
  82. package/dist/elements/details/Details.vue +51 -0
  83. package/dist/elements/details/_global.d.ts +27 -0
  84. package/dist/elements/details/app.d.ts +9 -0
  85. package/dist/elements/details/app.js +11 -0
  86. package/dist/elements/details/core.d.ts +68 -0
  87. package/dist/elements/details/core.js +30 -0
  88. package/dist/elements/details/icon.svg +3 -0
  89. package/dist/elements/details/languages/en.d.ts +4 -0
  90. package/dist/elements/details/languages/en.js +2 -0
  91. package/dist/elements/details/languages/ru.d.ts +4 -0
  92. package/dist/elements/details/languages/ru.js +2 -0
  93. package/dist/elements/diagram/Diagram.vue +364 -0
  94. package/dist/elements/diagram/_global.d.ts +19 -0
  95. package/dist/elements/diagram/app.d.ts +30 -0
  96. package/dist/elements/diagram/app.js +11 -0
  97. package/dist/elements/diagram/core.d.ts +194 -0
  98. package/dist/elements/diagram/core.js +36 -0
  99. package/dist/elements/diagram/icon.svg +3 -0
  100. package/dist/elements/diagram/languages/en.d.ts +4 -0
  101. package/dist/elements/diagram/languages/en.js +2 -0
  102. package/dist/elements/diagram/languages/ru.d.ts +4 -0
  103. package/dist/elements/diagram/languages/ru.js +2 -0
  104. package/dist/elements/emphasis/Emphasis.vue +25 -0
  105. package/dist/elements/emphasis/_global.d.ts +18 -0
  106. package/dist/elements/emphasis/app.d.ts +9 -0
  107. package/dist/elements/emphasis/app.js +6 -0
  108. package/dist/elements/emphasis/core.d.ts +90 -0
  109. package/dist/elements/emphasis/core.js +32 -0
  110. package/dist/elements/flex/Flex.vue +32 -0
  111. package/dist/elements/flex/_global.d.ts +23 -0
  112. package/dist/elements/flex/app.d.ts +9 -0
  113. package/dist/elements/flex/app.js +11 -0
  114. package/dist/elements/flex/core.d.ts +67 -0
  115. package/dist/elements/flex/core.js +28 -0
  116. package/dist/elements/flex/icon.svg +3 -0
  117. package/dist/elements/flex/languages/en.d.ts +4 -0
  118. package/dist/elements/flex/languages/en.js +2 -0
  119. package/dist/elements/flex/languages/ru.d.ts +4 -0
  120. package/dist/elements/flex/languages/ru.js +2 -0
  121. package/dist/elements/gallery/Gallery.vue +56 -0
  122. package/dist/elements/gallery/_global.d.ts +18 -0
  123. package/dist/elements/gallery/app.d.ts +23 -0
  124. package/dist/elements/gallery/app.js +11 -0
  125. package/dist/elements/gallery/core.d.ts +138 -0
  126. package/dist/elements/gallery/core.js +21 -0
  127. package/dist/elements/gallery/icon.svg +3 -0
  128. package/dist/elements/gallery/languages/en.d.ts +4 -0
  129. package/dist/elements/gallery/languages/en.js +2 -0
  130. package/dist/elements/gallery/languages/ru.d.ts +4 -0
  131. package/dist/elements/gallery/languages/ru.js +2 -0
  132. package/dist/elements/heading/Heading.vue +44 -0
  133. package/dist/elements/heading/_global.d.ts +45 -0
  134. package/dist/elements/heading/app.d.ts +9 -0
  135. package/dist/elements/heading/app.js +11 -0
  136. package/dist/elements/heading/core.d.ts +108 -0
  137. package/dist/elements/heading/core.js +52 -0
  138. package/dist/elements/heading/icon.svg +3 -0
  139. package/dist/elements/heading/languages/en.d.ts +4 -0
  140. package/dist/elements/heading/languages/en.js +2 -0
  141. package/dist/elements/heading/languages/ru.d.ts +4 -0
  142. package/dist/elements/heading/languages/ru.js +2 -0
  143. package/dist/elements/horizontalLine/HorizontalLine.vue +6 -0
  144. package/dist/elements/horizontalLine/_global.d.ts +17 -0
  145. package/dist/elements/horizontalLine/app.d.ts +9 -0
  146. package/dist/elements/horizontalLine/app.js +6 -0
  147. package/dist/elements/horizontalLine/core.d.ts +54 -0
  148. package/dist/elements/horizontalLine/core.js +19 -0
  149. package/dist/elements/image/Image.vue +15 -0
  150. package/dist/elements/image/ImageElement.vue +80 -0
  151. package/dist/elements/image/_global.d.ts +18 -0
  152. package/dist/elements/image/app.d.ts +16 -0
  153. package/dist/elements/image/app.js +11 -0
  154. package/dist/elements/image/core.d.ts +136 -0
  155. package/dist/elements/image/core.js +44 -0
  156. package/dist/elements/image/icon.svg +3 -0
  157. package/dist/elements/image/languages/en.d.ts +4 -0
  158. package/dist/elements/image/languages/en.js +2 -0
  159. package/dist/elements/image/languages/ru.d.ts +4 -0
  160. package/dist/elements/image/languages/ru.js +2 -0
  161. package/dist/elements/image/storage.d.ts +6 -0
  162. package/dist/elements/image/storage.js +23 -0
  163. package/dist/elements/lineBreak/LineBreak.vue +3 -0
  164. package/dist/elements/lineBreak/_global.d.ts +18 -0
  165. package/dist/elements/lineBreak/app.d.ts +9 -0
  166. package/dist/elements/lineBreak/app.js +6 -0
  167. package/dist/elements/lineBreak/core.d.ts +54 -0
  168. package/dist/elements/lineBreak/core.js +19 -0
  169. package/dist/elements/link/BlockLink.vue +111 -0
  170. package/dist/elements/link/Link.vue +93 -0
  171. package/dist/elements/link/core.d.ts +13 -0
  172. package/dist/elements/link/core.js +12 -0
  173. package/dist/elements/link/dependency/_global.d.ts +47 -0
  174. package/dist/elements/link/dependency/app.d.ts +16 -0
  175. package/dist/elements/link/dependency/app.js +14 -0
  176. package/dist/elements/link/dependency/core.d.ts +125 -0
  177. package/dist/elements/link/dependency/core.js +51 -0
  178. package/dist/elements/link/dependency/languages/en.d.ts +4 -0
  179. package/dist/elements/link/dependency/languages/en.js +2 -0
  180. package/dist/elements/link/dependency/languages/ru.d.ts +4 -0
  181. package/dist/elements/link/dependency/languages/ru.js +2 -0
  182. package/dist/elements/link/icon.svg +3 -0
  183. package/dist/elements/link/reference/_global.d.ts +49 -0
  184. package/dist/elements/link/reference/app.d.ts +16 -0
  185. package/dist/elements/link/reference/app.js +14 -0
  186. package/dist/elements/link/reference/core.d.ts +120 -0
  187. package/dist/elements/link/reference/core.js +35 -0
  188. package/dist/elements/link/reference/languages/en.d.ts +4 -0
  189. package/dist/elements/link/reference/languages/en.js +2 -0
  190. package/dist/elements/link/reference/languages/ru.d.ts +4 -0
  191. package/dist/elements/link/reference/languages/ru.js +2 -0
  192. package/dist/elements/link/storage.d.ts +34 -0
  193. package/dist/elements/link/storage.js +20 -0
  194. package/dist/elements/list/List.vue +63 -0
  195. package/dist/elements/list/_global.d.ts +50 -0
  196. package/dist/elements/list/app.d.ts +16 -0
  197. package/dist/elements/list/app.js +11 -0
  198. package/dist/elements/list/core.d.ts +169 -0
  199. package/dist/elements/list/core.js +49 -0
  200. package/dist/elements/list/icon.svg +3 -0
  201. package/dist/elements/list/languages/en.d.ts +4 -0
  202. package/dist/elements/list/languages/en.js +2 -0
  203. package/dist/elements/list/languages/ru.d.ts +4 -0
  204. package/dist/elements/list/languages/ru.js +2 -0
  205. package/dist/elements/math/_global.d.ts +72 -0
  206. package/dist/elements/math/_global.ts +3 -0
  207. package/dist/elements/math/app.d.ts +16 -0
  208. package/dist/elements/math/app.js +20 -0
  209. package/dist/elements/math/block.d.ts +75 -0
  210. package/dist/elements/math/block.js +115 -0
  211. package/dist/elements/math/components/BlockMath.vue +30 -0
  212. package/dist/elements/math/components/InlinerMath.vue +65 -0
  213. package/dist/elements/math/components/Katex.vue +89 -0
  214. package/dist/elements/math/components/MathGroup.vue +39 -0
  215. package/dist/elements/math/core.d.ts +66 -0
  216. package/dist/elements/math/core.js +11 -0
  217. package/dist/elements/math/icon.svg +3 -0
  218. package/dist/elements/math/inliner.d.ts +64 -0
  219. package/dist/elements/math/inliner.js +85 -0
  220. package/dist/elements/math/katex.d.ts +8 -0
  221. package/dist/elements/math/katex.js +18 -0
  222. package/dist/elements/math/languages/en.d.ts +4 -0
  223. package/dist/elements/math/languages/en.js +2 -0
  224. package/dist/elements/math/languages/ru.d.ts +4 -0
  225. package/dist/elements/math/languages/ru.js +2 -0
  226. package/dist/elements/math/macros.d.ts +13 -0
  227. package/dist/elements/math/macros.js +12 -0
  228. package/dist/elements/paragraph/Paragraph.vue +27 -0
  229. package/dist/elements/paragraph/_global.d.ts +27 -0
  230. package/dist/elements/paragraph/app.d.ts +9 -0
  231. package/dist/elements/paragraph/app.js +11 -0
  232. package/dist/elements/paragraph/core.d.ts +67 -0
  233. package/dist/elements/paragraph/core.js +29 -0
  234. package/dist/elements/paragraph/icon.svg +4 -0
  235. package/dist/elements/paragraph/languages/en.d.ts +4 -0
  236. package/dist/elements/paragraph/languages/en.js +2 -0
  237. package/dist/elements/paragraph/languages/ru.d.ts +4 -0
  238. package/dist/elements/paragraph/languages/ru.js +2 -0
  239. package/dist/elements/problem/_global.d.ts +112 -0
  240. package/dist/elements/problem/app.d.ts +30 -0
  241. package/dist/elements/problem/app.js +27 -0
  242. package/dist/elements/problem/assets/actions/answer.svg +3 -0
  243. package/dist/elements/problem/assets/actions/check.svg +3 -0
  244. package/dist/elements/problem/assets/actions/generate.svg +3 -0
  245. package/dist/elements/problem/assets/actions/hint.svg +3 -0
  246. package/dist/elements/problem/assets/actions/note.svg +3 -0
  247. package/dist/elements/problem/assets/actions/solution.svg +3 -0
  248. package/dist/elements/problem/assets/attributes/applied.svg +3 -0
  249. package/dist/elements/problem/assets/attributes/inter.svg +3 -0
  250. package/dist/elements/problem/assets/attributes/method.svg +3 -0
  251. package/dist/elements/problem/assets/attributes/pretty.svg +1 -0
  252. package/dist/elements/problem/assets/icon.svg +3 -0
  253. package/dist/elements/problem/components/Problem.vue +22 -0
  254. package/dist/elements/problem/components/ProblemButton.vue +21 -0
  255. package/dist/elements/problem/components/ProblemContainer.vue +9 -0
  256. package/dist/elements/problem/components/ProblemContent.vue +371 -0
  257. package/dist/elements/problem/components/ProblemExpander.vue +7 -0
  258. package/dist/elements/problem/components/ProblemExpanderSection.vue +58 -0
  259. package/dist/elements/problem/components/ProblemHeader.vue +106 -0
  260. package/dist/elements/problem/components/Problems.vue +87 -0
  261. package/dist/elements/problem/components/SubProblem.vue +14 -0
  262. package/dist/elements/problem/components/expanders/Check.vue +151 -0
  263. package/dist/elements/problem/components/expanders/Checks.vue +83 -0
  264. package/dist/elements/problem/components/expanders/DefaultPlusSections.vue +38 -0
  265. package/dist/elements/problem/components/expanders/Hint.vue +26 -0
  266. package/dist/elements/problem/composables/phrase.d.ts +2 -0
  267. package/dist/elements/problem/composables/phrase.js +7 -0
  268. package/dist/elements/problem/composables/problemScript.d.ts +3 -0
  269. package/dist/elements/problem/composables/problemScript.js +11 -0
  270. package/dist/elements/problem/core.d.ts +248 -0
  271. package/dist/elements/problem/core.js +17 -0
  272. package/dist/elements/problem/languages/en.d.ts +3 -0
  273. package/dist/elements/problem/languages/en.js +24 -0
  274. package/dist/elements/problem/languages/ru.d.ts +3 -0
  275. package/dist/elements/problem/languages/ru.js +24 -0
  276. package/dist/elements/problem/phrases.d.ts +16 -0
  277. package/dist/elements/problem/phrases.js +1 -0
  278. package/dist/elements/problem/problem.d.ts +106 -0
  279. package/dist/elements/problem/problem.js +37 -0
  280. package/dist/elements/problem/problemContent.d.ts +439 -0
  281. package/dist/elements/problem/problemContent.js +236 -0
  282. package/dist/elements/problem/problemScript.d.ts +26 -0
  283. package/dist/elements/problem/problemScript.js +79 -0
  284. package/dist/elements/problem/problems.d.ts +212 -0
  285. package/dist/elements/problem/problems.js +74 -0
  286. package/dist/elements/problem/rng.d.ts +18 -0
  287. package/dist/elements/problem/rng.js +76 -0
  288. package/dist/elements/problem/shared.d.ts +28 -0
  289. package/dist/elements/problem/shared.js +42 -0
  290. package/dist/elements/problem/step.d.ts +5 -0
  291. package/dist/elements/problem/step.js +13 -0
  292. package/dist/elements/problem/storage.d.ts +5 -0
  293. package/dist/elements/problem/storage.js +8 -0
  294. package/dist/elements/table/Table.vue +104 -0
  295. package/dist/elements/table/_global.d.ts +36 -0
  296. package/dist/elements/table/app.d.ts +30 -0
  297. package/dist/elements/table/app.js +11 -0
  298. package/dist/elements/table/core.d.ts +324 -0
  299. package/dist/elements/table/core.js +65 -0
  300. package/dist/elements/table/icon.svg +3 -0
  301. package/dist/elements/table/languages/en.d.ts +4 -0
  302. package/dist/elements/table/languages/en.js +2 -0
  303. package/dist/elements/table/languages/ru.d.ts +4 -0
  304. package/dist/elements/table/languages/ru.js +2 -0
  305. package/dist/elements/video/Video.vue +109 -0
  306. package/dist/elements/video/_global.d.ts +18 -0
  307. package/dist/elements/video/app.d.ts +16 -0
  308. package/dist/elements/video/app.js +11 -0
  309. package/dist/elements/video/core.d.ts +128 -0
  310. package/dist/elements/video/core.js +43 -0
  311. package/dist/elements/video/icon.svg +3 -0
  312. package/dist/elements/video/languages/en.d.ts +4 -0
  313. package/dist/elements/video/languages/en.js +2 -0
  314. package/dist/elements/video/languages/ru.d.ts +4 -0
  315. package/dist/elements/video/languages/ru.js +2 -0
  316. package/dist/elements/video/storage.d.ts +2 -0
  317. package/dist/elements/video/storage.js +5 -0
  318. package/dist/include.d.ts +6 -0
  319. package/dist/include.js +42 -0
  320. package/dist/index.d.ts +15 -0
  321. package/dist/index.js +15 -0
  322. package/dist/rawElement.d.ts +6 -0
  323. package/dist/rawElement.js +3 -0
  324. package/dist/resolve.d.ts +20 -0
  325. package/dist/resolve.js +99 -0
  326. package/dist/resolveStep.d.ts +9 -0
  327. package/dist/resolveStep.js +3 -0
  328. package/dist/shared/filePath.d.ts +5 -0
  329. package/dist/shared/filePath.js +11 -0
  330. package/dist/shared/invert.d.ts +1 -0
  331. package/dist/shared/invert.js +1 -0
  332. package/dist/shared/paragraphWrap.d.ts +3 -0
  333. package/dist/shared/paragraphWrap.js +15 -0
  334. package/dist/shared/photoswipe.d.ts +10 -0
  335. package/dist/shared/photoswipe.js +10 -0
  336. package/dist/slugify/index.d.ts +1 -0
  337. package/dist/slugify/index.js +12 -0
  338. package/dist/slugify/languages/en.d.ts +2 -0
  339. package/dist/slugify/languages/en.js +3 -0
  340. package/dist/slugify/languages/ru.d.ts +2 -0
  341. package/dist/slugify/languages/ru.js +38 -0
  342. package/dist/snippet.d.ts +66 -0
  343. package/dist/snippet.js +57 -0
  344. package/dist/tag.d.ts +22 -0
  345. package/dist/tag.js +20 -0
  346. package/dist/title.d.ts +8 -0
  347. package/dist/title.js +6 -0
  348. package/dist/toc.d.ts +34 -0
  349. package/dist/toc.js +52 -0
  350. package/dist/utils/case.d.ts +4 -0
  351. package/dist/utils/case.js +8 -0
  352. package/dist/utils/docs.d.ts +1 -0
  353. package/dist/utils/docs.js +22 -0
  354. package/package.json +48 -0
  355. package/types.d.ts +4 -0
@@ -0,0 +1,99 @@
1
+ import { resolveRawElement } from "@jsprose/core";
2
+ import { snippetStep } from "./snippet.js";
3
+ import { tocItemStep } from "./toc.js";
4
+ import { slugify } from "./slugify/index.js";
5
+ import { imageSrcStep } from "./elements/image/core.js";
6
+ import { videoSrcStep } from "./elements/video/core.js";
7
+ import { calloutIconSrcStep } from "./elements/callout/core.js";
8
+ import { problemScriptStep } from "./elements/problem/step.js";
9
+ import { dependencyStep } from "./elements/link/dependency/core.js";
10
+ export async function resolveEruditRawElement(args) {
11
+ const { context, rawElement, step } = args;
12
+ const snippets = [];
13
+ const tocItems = [];
14
+ const headingStack = [];
15
+ const dependencies = new Set();
16
+ const files = new Set();
17
+ const problemScripts = new Set();
18
+ const uniqueTitles = {};
19
+ const _step = async (args) => {
20
+ const snippet = snippetStep(args);
21
+ if (snippet) snippets.push(snippet);
22
+ const tocItem = tocItemStep(args);
23
+ if (tocItem) {
24
+ if (tocItem.type === "heading") {
25
+ // Pop headings from stack that are same level or deeper
26
+ while (headingStack.length > 0) {
27
+ const lastItem = headingStack[headingStack.length - 1];
28
+ if (lastItem.type === "heading" && lastItem.level >= tocItem.level) {
29
+ headingStack.pop();
30
+ } else {
31
+ break;
32
+ }
33
+ }
34
+ // Add to parent or root
35
+ if (headingStack.length > 0) {
36
+ const parent = headingStack[headingStack.length - 1];
37
+ if (parent.type === "heading") {
38
+ parent.children.push(tocItem);
39
+ }
40
+ } else {
41
+ tocItems.push(tocItem);
42
+ }
43
+ // Push this heading to stack
44
+ headingStack.push(tocItem);
45
+ } else {
46
+ // Non-heading item: add to most recent heading or root
47
+ if (headingStack.length > 0) {
48
+ const parent = headingStack[headingStack.length - 1];
49
+ if (parent.type === "heading") {
50
+ parent.children.push(tocItem);
51
+ }
52
+ } else {
53
+ tocItems.push(tocItem);
54
+ }
55
+ }
56
+ }
57
+ const resolvedDependency = dependencyStep(args);
58
+ if (resolvedDependency) dependencies.add(resolvedDependency);
59
+ const imageSrc = imageSrcStep(args);
60
+ if (imageSrc && !files.has(imageSrc)) files.add(imageSrc);
61
+ const videoSrc = videoSrcStep(args);
62
+ if (videoSrc && !files.has(videoSrc)) files.add(videoSrc);
63
+ const calloutIconSrc = calloutIconSrcStep(args);
64
+ if (calloutIconSrc && !files.has(calloutIconSrc)) files.add(calloutIconSrc);
65
+ const problemScript = problemScriptStep(args);
66
+ if (problemScript && !problemScripts.has(problemScript)) problemScripts.add(problemScript);
67
+ if (args.rawElement.title && args.rawElement.uniqueName) {
68
+ uniqueTitles[args.rawElement.uniqueName] = args.rawElement.title;
69
+ }
70
+ if (step) {
71
+ await step(args);
72
+ }
73
+ };
74
+ const baseResolveResult = await resolveRawElement({
75
+ rawElement,
76
+ linkable: context.linkable,
77
+ pre: async (rawElement) => {
78
+ if (rawElement.slug) {
79
+ rawElement.slug = await slugify(rawElement.slug, context.language);
80
+ }
81
+ },
82
+ step: ({ rawElement, proseElement }) => {
83
+ _step({
84
+ context,
85
+ rawElement,
86
+ proseElement
87
+ });
88
+ }
89
+ });
90
+ return {
91
+ ...baseResolveResult,
92
+ snippets,
93
+ tocItems,
94
+ dependencies,
95
+ files,
96
+ problemScripts,
97
+ uniqueTitles
98
+ };
99
+ }
@@ -0,0 +1,9 @@
1
+ import type { AnySchema, ProseElement } from '@jsprose/core';
2
+ import type { EruditProseContext } from './context.js';
3
+ import type { EruditRawElement } from './rawElement.js';
4
+ export type ResolveStep<TReturn = undefined> = (args: {
5
+ context: EruditProseContext;
6
+ rawElement: EruditRawElement<AnySchema>;
7
+ proseElement: ProseElement<AnySchema>;
8
+ }) => TReturn | Promise<TReturn>;
9
+ export declare function defineResolveStep<TReturn, TStep extends ResolveStep<TReturn>>(step: TStep): TStep;
@@ -0,0 +1,3 @@
1
+ export function defineResolveStep(step) {
2
+ return step;
3
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Checks that the given absolute file path is within the given absolute project path.
3
+ * Returns the file path relative to the project path.
4
+ */
5
+ export declare function projectRelFilePath(projectAbsPath: string, fileAbsPath: string): string;
@@ -0,0 +1,11 @@
1
+ import { ProseError } from "@jsprose/core";
2
+ /**
3
+ * Checks that the given absolute file path is within the given absolute project path.
4
+ * Returns the file path relative to the project path.
5
+ */
6
+ export function projectRelFilePath(projectAbsPath, fileAbsPath) {
7
+ if (!fileAbsPath.startsWith(projectAbsPath)) {
8
+ throw new ProseError(`File "${fileAbsPath}" is outside of project "${projectAbsPath}"`);
9
+ }
10
+ return fileAbsPath.slice(projectAbsPath.length + 1);
11
+ }
@@ -0,0 +1 @@
1
+ export type Invert = 'light' | 'dark';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import { type NormalizedChildren, type RawElement } from '@jsprose/core';
2
+ import type { paragraphSchema } from '../elements/paragraph/core.js';
3
+ export declare function tryParagraphWrap(children: NormalizedChildren): undefined | [RawElement<typeof paragraphSchema>];
@@ -0,0 +1,15 @@
1
+ import { PROSE_REGISTRY } from "@jsprose/core";
2
+ export function tryParagraphWrap(children) {
3
+ const P = PROSE_REGISTRY.getTag("P");
4
+ let hasInliners = children?.some((child) => {
5
+ const schema = PROSE_REGISTRY.getSchema(child.schemaName);
6
+ return schema.type === "inliner";
7
+ });
8
+ if (hasInliners) {
9
+ return [P({
10
+ children,
11
+ __JSPROSE_registryProp: PROSE_REGISTRY
12
+ })];
13
+ }
14
+ return undefined;
15
+ }
@@ -0,0 +1,10 @@
1
+ export declare const photoswipeDependency: {
2
+ photoswipe: {
3
+ optimize: boolean;
4
+ transpile: boolean;
5
+ };
6
+ 'photoswipe/lightbox': {
7
+ optimize: boolean;
8
+ transpile: boolean;
9
+ };
10
+ };
@@ -0,0 +1,10 @@
1
+ export const photoswipeDependency = {
2
+ photoswipe: {
3
+ optimize: true,
4
+ transpile: true
5
+ },
6
+ "photoswipe/lightbox": {
7
+ optimize: true,
8
+ transpile: true
9
+ }
10
+ };
@@ -0,0 +1 @@
1
+ export declare function slugify(text: string, language: string): Promise<string | undefined>;
@@ -0,0 +1,12 @@
1
+ export async function slugify(text, language) {
2
+ const slugifiers = {
3
+ en: async () => await import("./languages/en.js"),
4
+ ru: async () => await import("./languages/ru.js")
5
+ };
6
+ const slugifyModule = language in slugifiers ? await slugifiers[language]() : undefined;
7
+ if (slugifyModule) {
8
+ const slug = slugifyModule.default(text);
9
+ return slug || undefined;
10
+ }
11
+ return undefined;
12
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: (text: string) => string;
2
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default (text) => {
2
+ return text.toLowerCase().replace(/[^a-z0-9]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
3
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: (text: string) => string;
2
+ export default _default;
@@ -0,0 +1,38 @@
1
+ export default (text) => {
2
+ const cyrillicToLatin = {
3
+ а: "a",
4
+ б: "b",
5
+ в: "v",
6
+ г: "g",
7
+ д: "d",
8
+ е: "e",
9
+ ё: "e",
10
+ ж: "zh",
11
+ з: "z",
12
+ и: "i",
13
+ й: "y",
14
+ к: "k",
15
+ л: "l",
16
+ м: "m",
17
+ н: "n",
18
+ о: "o",
19
+ п: "p",
20
+ р: "r",
21
+ с: "s",
22
+ т: "t",
23
+ у: "u",
24
+ ф: "f",
25
+ х: "kh",
26
+ ц: "ts",
27
+ ч: "ch",
28
+ ш: "sh",
29
+ щ: "sch",
30
+ ъ: "",
31
+ ы: "y",
32
+ ь: "",
33
+ э: "e",
34
+ ю: "yu",
35
+ я: "ya"
36
+ };
37
+ return text.toLowerCase().split("").map((char) => cyrillicToLatin[char] !== undefined ? cyrillicToLatin[char] : /[a-z0-9]/.test(char) ? char : "-").join("").replace(/-+/g, "-").replace(/^-|-$/g, "");
38
+ };
@@ -0,0 +1,66 @@
1
+ import { type AnySchema, type ProseElement } from '@jsprose/core';
2
+ import type { EruditProcessTagArgs } from './tag.js';
3
+ import type { EruditRawElement } from './rawElement.js';
4
+ /**
5
+ * Snippet attribute - only contains title and description
6
+ */
7
+ export interface SnippetProp {
8
+ title?: string;
9
+ description?: string;
10
+ }
11
+ export type ObjPropSnippet = {
12
+ /**
13
+ * Compact summary of the element with title and description.
14
+ */
15
+ snippet?: SnippetProp;
16
+ };
17
+ export type ObjPropSearch = {
18
+ /**
19
+ * Show element in search results.
20
+ * Can be a boolean to enable/disable, or an object with synonyms.
21
+ */
22
+ search?: boolean | {
23
+ synonyms: string[];
24
+ };
25
+ };
26
+ export type ObjPropQuick = {
27
+ /**
28
+ * Show element in "Quick Links" sections at start of the page and also in TOC.
29
+ */
30
+ quick?: boolean;
31
+ };
32
+ export type ObjPropSeo = {
33
+ /**
34
+ * When targeting this element with '#' anchor, adjust SEO metadata (like title and description).
35
+ * Search engines should treat it as a different "page" and therefore show it as a standalone search result.
36
+ */
37
+ seo?: boolean;
38
+ };
39
+ export type ObjRawElementSnippet = {
40
+ snippet?: SnippetProp;
41
+ snippetFlags?: {
42
+ quick?: boolean;
43
+ search?: boolean | {
44
+ synonyms: string[];
45
+ };
46
+ seo?: boolean;
47
+ };
48
+ };
49
+ export declare function finalizeSnippet(processTagArgs: EruditProcessTagArgs): SnippetProp | undefined;
50
+ export interface ResolvedSnippet {
51
+ title: string;
52
+ description?: string;
53
+ quick?: boolean;
54
+ search?: boolean | {
55
+ synonyms: string[];
56
+ };
57
+ seo?: boolean;
58
+ schemaName: string;
59
+ isUnique: boolean;
60
+ elementId: string;
61
+ }
62
+ export declare const snippetStep: ({ rawElement, proseElement }: {
63
+ context: import("./context.js").EruditProseContext;
64
+ rawElement: EruditRawElement<AnySchema>;
65
+ proseElement: ProseElement<AnySchema>;
66
+ }) => ResolvedSnippet | undefined;
@@ -0,0 +1,57 @@
1
+ import { ProseError } from "@jsprose/core";
2
+ import { defineResolveStep } from "./resolveStep.js";
3
+ export function finalizeSnippet(processTagArgs) {
4
+ const quick = processTagArgs.props.quick ?? processTagArgs.element.snippetFlags?.quick;
5
+ const search = processTagArgs.props.search ?? processTagArgs.element.snippetFlags?.search;
6
+ let seo = processTagArgs.props.seo ?? processTagArgs.element.snippetFlags?.seo;
7
+ // If none of the flags are set to true, no snippet is created
8
+ if (!quick && !search && !seo) {
9
+ return undefined;
10
+ }
11
+ // Enable SEO if either quick or search is enabled unless SEO is explicitly disabled
12
+ // Check both element defaults and props - if either explicitly disables seo, don't auto-enable
13
+ const seoExplicitlyDisabled = processTagArgs.element.snippetFlags?.seo === false || processTagArgs.props.seo === false;
14
+ if (!seoExplicitlyDisabled) {
15
+ if (quick || search) {
16
+ seo = true;
17
+ }
18
+ }
19
+ const title = finalizeTitle(processTagArgs);
20
+ const description = finalizeDescription(processTagArgs);
21
+ const snippet = { title };
22
+ if (description) {
23
+ snippet.description = description;
24
+ }
25
+ // Store flags on element for later resolution
26
+ processTagArgs.element.snippetFlags = {
27
+ quick,
28
+ search,
29
+ seo
30
+ };
31
+ return snippet;
32
+ }
33
+ function finalizeTitle(processTagArgs) {
34
+ const title = processTagArgs.props.snippet?.title?.trim() || processTagArgs.element.snippet?.title?.trim() || processTagArgs.element.title?.trim();
35
+ if (!title) {
36
+ throw new ProseError(`Unable to finalize snippet title!`);
37
+ }
38
+ return title;
39
+ }
40
+ function finalizeDescription(processTagArgs) {
41
+ return processTagArgs.props.snippet?.description?.trim() || processTagArgs.element.snippet?.description?.trim();
42
+ }
43
+ export const snippetStep = defineResolveStep(({ rawElement, proseElement }) => {
44
+ if (rawElement.snippet && proseElement.id && rawElement.snippet.title) {
45
+ const resolvedSnippet = {
46
+ title: rawElement.snippet.title,
47
+ description: rawElement.snippet.description,
48
+ quick: rawElement.snippetFlags?.quick,
49
+ search: rawElement.snippetFlags?.search,
50
+ seo: rawElement.snippetFlags?.seo,
51
+ schemaName: rawElement.schemaName,
52
+ isUnique: Boolean(rawElement.uniqueName),
53
+ elementId: proseElement.id
54
+ };
55
+ return resolvedSnippet;
56
+ }
57
+ });
package/dist/tag.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { Registry, type AnySchema, type ConfigurableTagProps, type NormalizedChildren, type ProcessTagFunction, type TagDefinition } from '@jsprose/core';
2
+ import type { EruditRawElement } from './rawElement.js';
3
+ import { type ObjPropSnippet, type ObjPropSearch, type ObjPropQuick, type ObjPropSeo } from './snippet.js';
4
+ import { type ObjPropToc } from './toc.js';
5
+ declare const NoTocSymbol: unique symbol;
6
+ declare const NoSnippetSymbol: unique symbol;
7
+ export type NoToc = {
8
+ readonly [NoTocSymbol]?: never;
9
+ };
10
+ export type NoSnippet = {
11
+ readonly [NoSnippetSymbol]?: never;
12
+ };
13
+ export type EruditTagProps<TProps extends Record<string, unknown>> = (TProps extends NoToc ? {} : ObjPropToc) & (TProps extends NoSnippet ? {} : ObjPropSnippet & ObjPropSearch & ObjPropQuick & ObjPropSeo);
14
+ export type EruditProcessTagArgs = {
15
+ tagName: string;
16
+ element: EruditRawElement<AnySchema>;
17
+ props: ConfigurableTagProps & ObjPropSnippet & ObjPropToc & ObjPropSearch & ObjPropQuick & ObjPropSeo;
18
+ children: NormalizedChildren;
19
+ registry: Registry;
20
+ };
21
+ export declare function defineEruditTag<const TSchema extends AnySchema, const TTagDefinition extends TagDefinition<TSchema>>(definition: TTagDefinition): <const TConfigurableTagProps extends ConfigurableTagProps>(processTag: ProcessTagFunction<TTagDefinition["schema"], TTagDefinition, TConfigurableTagProps & (TTagDefinition["schema"]["linkable"] extends true ? EruditTagProps<TConfigurableTagProps> : {}), EruditRawElement<TTagDefinition["schema"], TTagDefinition["tagName"]>>) => import("@jsprose/core").Tag<TTagDefinition["tagName"], TTagDefinition["schema"], TConfigurableTagProps & (TTagDefinition["schema"]["linkable"] extends true ? EruditTagProps<TConfigurableTagProps> : {})>;
22
+ export {};
package/dist/tag.js ADDED
@@ -0,0 +1,20 @@
1
+ import { defineTag, Registry } from "@jsprose/core";
2
+ import { finalizeSnippet } from "./snippet.js";
3
+ import { finalizeToc } from "./toc.js";
4
+ import { finalizeTitle } from "./title.js";
5
+ export function defineEruditTag(definition) {
6
+ const baseFinalizeTag = defineTag(definition);
7
+ function eruditFinalizeTag(processTag) {
8
+ const eruditTag = baseFinalizeTag((args) => {
9
+ processTag(args);
10
+ // Use every possibility to get shared title property
11
+ args.element.title = finalizeTitle(args);
12
+ args.element.snippet = finalizeSnippet(args);
13
+ args.element.toc = finalizeToc(args);
14
+ // Use every possibility to get human-readable slug whether it is set manually or taken from snippet or toc
15
+ args.element.slug ||= args.element.snippet?.title || args.element.toc?.title;
16
+ });
17
+ return eruditTag;
18
+ }
19
+ return eruditFinalizeTag;
20
+ }
@@ -0,0 +1,8 @@
1
+ import type { EruditProcessTagArgs } from './tag.js';
2
+ export type ObjRawElementTitle = {
3
+ /**
4
+ * Shared element title to be used as fallback value (for example, in snippet or TOC).
5
+ */
6
+ title?: string;
7
+ };
8
+ export declare function finalizeTitle(processTagArgs: EruditProcessTagArgs): string | undefined;
package/dist/title.js ADDED
@@ -0,0 +1,6 @@
1
+ export function finalizeTitle(processTagArgs) {
2
+ const elementTitle = processTagArgs.element.title?.trim();
3
+ const propSnippetTitle = processTagArgs.props.snippet?.title?.trim();
4
+ const propTocTitle = typeof processTagArgs.props.toc === "string" ? processTagArgs.props.toc.trim() : undefined;
5
+ return elementTitle || propSnippetTitle || propTocTitle || undefined;
6
+ }
package/dist/toc.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { type AnySchema, type ProseElement } from '@jsprose/core';
2
+ import type { EruditProcessTagArgs } from './tag.js';
3
+ import type { EruditRawElement } from './rawElement.js';
4
+ export type Toc = {
5
+ title?: string;
6
+ add?: boolean;
7
+ };
8
+ export type ObjPropToc = {
9
+ /** Show element in the table of contents */
10
+ toc?: boolean | string;
11
+ };
12
+ export type ObjRawElementToc = {
13
+ toc?: Toc;
14
+ };
15
+ export declare function finalizeToc(processTagArgs: EruditProcessTagArgs): Toc | undefined;
16
+ export type ResolvedTocHeading = {
17
+ type: 'heading';
18
+ level: 1 | 2 | 3;
19
+ title: string;
20
+ elementId: string;
21
+ children: ResolvedTocItem[];
22
+ };
23
+ export type ResolvedTocElement = {
24
+ type: 'element';
25
+ schemaName: string;
26
+ title: string;
27
+ elementId: string;
28
+ };
29
+ export type ResolvedTocItem = ResolvedTocHeading | ResolvedTocElement;
30
+ export declare const tocItemStep: ({ rawElement, proseElement }: {
31
+ context: import("./context.js").EruditProseContext;
32
+ rawElement: EruditRawElement<AnySchema>;
33
+ proseElement: ProseElement<AnySchema>;
34
+ }) => ResolvedTocHeading | ResolvedTocElement | undefined;
package/dist/toc.js ADDED
@@ -0,0 +1,52 @@
1
+ import { ProseError } from "@jsprose/core";
2
+ import { headingSchema } from "./elements/heading/core.js";
3
+ import { defineResolveStep } from "./resolveStep.js";
4
+ export function finalizeToc(processTagArgs) {
5
+ const propToc = processTagArgs.props.toc;
6
+ if (propToc === false) {
7
+ return undefined;
8
+ }
9
+ if (propToc === true) {
10
+ const title = finalizeTocTitle(processTagArgs);
11
+ return { title };
12
+ }
13
+ if (typeof propToc === "string") {
14
+ const manualTocTitle = finalizeTocTitle(processTagArgs);
15
+ return { title: manualTocTitle };
16
+ }
17
+ if (processTagArgs.element.toc) {
18
+ if (processTagArgs.element.toc.add) {
19
+ const tocTitle = finalizeTocTitle(processTagArgs);
20
+ return { title: tocTitle };
21
+ }
22
+ }
23
+ }
24
+ function finalizeTocTitle(processTagArgs) {
25
+ const title = (typeof processTagArgs.props.toc === "string" ? processTagArgs.props.toc.trim() : "") || processTagArgs.element.toc?.title?.trim() || processTagArgs.element.title?.trim();
26
+ if (title) {
27
+ return title;
28
+ }
29
+ throw new ProseError("Unable to finalize TOC title!");
30
+ }
31
+ export const tocItemStep = defineResolveStep(({ rawElement, proseElement }) => {
32
+ if (rawElement.toc?.title && proseElement.id) {
33
+ if (rawElement.schemaName === headingSchema.name) {
34
+ const tocItem = {
35
+ type: "heading",
36
+ level: rawElement.data.level,
37
+ title: rawElement.toc.title,
38
+ elementId: proseElement.id,
39
+ children: []
40
+ };
41
+ return tocItem;
42
+ } else {
43
+ const tocItem = {
44
+ type: "element",
45
+ schemaName: rawElement.schemaName,
46
+ title: rawElement.toc.title,
47
+ elementId: proseElement.id
48
+ };
49
+ return tocItem;
50
+ }
51
+ }
52
+ });
@@ -0,0 +1,4 @@
1
+ export type UppercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Uppercase<First>}${Rest}` : S;
2
+ export declare function uppercaseFirst(str: string): string;
3
+ export type LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;
4
+ export declare function lowercaseFirst(str: string): string;
@@ -0,0 +1,8 @@
1
+ export function uppercaseFirst(str) {
2
+ if (str.length === 0) return str;
3
+ return str[0].toUpperCase() + str.slice(1);
4
+ }
5
+ export function lowercaseFirst(str) {
6
+ if (str.length === 0) return str;
7
+ return str[0].toLowerCase() + str.slice(1);
8
+ }
@@ -0,0 +1 @@
1
+ export declare function extractTagDocs(tag: string, docsContent: string): string | undefined;
@@ -0,0 +1,22 @@
1
+ export function extractTagDocs(tag, docsContent) {
2
+ const blocks = docsContent.match(/\/\*\*[\s\S]*?\*\//g);
3
+ if (!blocks) {
4
+ return;
5
+ }
6
+ for (const block of blocks) {
7
+ // After the JSDoc block, match the following JS statement (e.g., let M, Problem...)
8
+ const after = docsContent.slice(docsContent.indexOf(block) + block.length);
9
+ // Match trailing variable declarations after this block
10
+ // e.g.: let A; OR let A, B, C; OR on multiple lines
11
+ const declMatch = after.match(/^\s*let\s+([^;]+);/);
12
+ if (!declMatch) {
13
+ continue;
14
+ }
15
+ // Extract all declared names
16
+ const names = declMatch[1].split(",").map((n) => n.trim()).filter(Boolean);
17
+ // Found?
18
+ if (names.includes(tag)) {
19
+ return block;
20
+ }
21
+ }
22
+ }
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "type": "module",
3
+ "name": "@erudit-js/prose",
4
+ "version": "3.0.0-dev.25",
5
+ "description": "📝 JSX prose subsystem for Erudit sites",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./app": {
14
+ "import": "./dist/app/index.js",
15
+ "types": "./dist/app/index.d.ts"
16
+ },
17
+ "./elements/*": {
18
+ "import": "./dist/elements/*.js",
19
+ "types": "./dist/elements/*.d.ts"
20
+ },
21
+ "./types": "./types.d.ts"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "types.d.ts"
26
+ ],
27
+ "license": "MIT",
28
+ "scripts": {
29
+ "build": "bun run script/build.ts",
30
+ "dev": "bun run script/dev.ts",
31
+ "test": "bun vitest run",
32
+ "prepack": "bun run build"
33
+ },
34
+ "dependencies": {
35
+ "@erudit-js/core": "workspace:3.0.0-dev.25",
36
+ "@jsprose/core": "link:@jsprose/core",
37
+ "vue": "latest",
38
+ "@floating-ui/vue": "^1.1.9",
39
+ "image-size": "^2.0.2",
40
+ "katex": "^0.16.25",
41
+ "mermaid": "^11.12.1",
42
+ "photoswipe": "^5.4.4"
43
+ },
44
+ "devDependencies": {
45
+ "glob": "11.0.3",
46
+ "oxc-transform": "0.94.0"
47
+ }
48
+ }
package/types.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ declare module '*?raw' {
2
+ const content: string;
3
+ export default content;
4
+ }