@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,236 @@
1
+ //
2
+ // <>
3
+ // <ProblemDescription>
4
+ // <ProblemHint>
5
+ // <...>
6
+ // <ProblemNote>
7
+ // <ProblemSection>
8
+ // <...>
9
+ // <ProblemSolution>
10
+ // <ProblemSection>
11
+ // <...>
12
+ // <ProblemAnswer>
13
+ // <ProblemSection>
14
+ // <...>
15
+ // <ProblemCheck>
16
+ // <...>
17
+ // </>
18
+ //
19
+ import { defineRegistryItem, defineSchema, ensureTagChildren, ensureTagNoChildren, isRawElement, ProseError } from "@jsprose/core";
20
+ import { defineEruditTag } from "../../tag.js";
21
+ import { defineEruditProseCoreElement } from "../../coreElement.js";
22
+ import { uppercaseFirst } from "../../utils/case.js";
23
+ import { tryParagraphWrap } from "../../shared/paragraphWrap.js";
24
+ //
25
+ // Description
26
+ //
27
+ export const problemDescriptionSchema = defineSchema({
28
+ name: "problemDescription",
29
+ type: "block",
30
+ linkable: false
31
+ })();
32
+ export const ProblemDescription = defineEruditTag({
33
+ tagName: "ProblemDescription",
34
+ schema: problemDescriptionSchema
35
+ })(({ element, tagName, children }) => {
36
+ ensureTagChildren(tagName, children);
37
+ element.children = children;
38
+ const paragraphWrap = tryParagraphWrap(children);
39
+ if (paragraphWrap) {
40
+ element.children = paragraphWrap;
41
+ }
42
+ });
43
+ export const problemDescriptionRegistryItem = defineRegistryItem({
44
+ schema: problemDescriptionSchema,
45
+ tags: [ProblemDescription]
46
+ });
47
+ export const problemDescriptionCoreElement = defineEruditProseCoreElement({ registryItem: problemDescriptionRegistryItem });
48
+ //
49
+ // Hint
50
+ //
51
+ export const problemHintSchema = defineSchema({
52
+ name: "problemHint",
53
+ type: "block",
54
+ linkable: false
55
+ })();
56
+ export const ProblemHint = defineEruditTag({
57
+ tagName: "ProblemHint",
58
+ schema: problemHintSchema
59
+ })(({ element, tagName, children }) => {
60
+ ensureTagChildren(tagName, children);
61
+ element.children = children;
62
+ const paragraphWrap = tryParagraphWrap(children);
63
+ if (paragraphWrap) {
64
+ element.children = paragraphWrap;
65
+ }
66
+ });
67
+ export const problemHintRegistryItem = defineRegistryItem({
68
+ schema: problemHintSchema,
69
+ tags: [ProblemHint]
70
+ });
71
+ export const problemHintCoreElement = defineEruditProseCoreElement({ registryItem: problemHintRegistryItem });
72
+ //
73
+ // Section
74
+ //
75
+ export const problemSectionSchema = defineSchema({
76
+ name: "problemSection",
77
+ type: "block",
78
+ linkable: false
79
+ })();
80
+ export const ProblemSection = defineEruditTag({
81
+ tagName: "ProblemSection",
82
+ schema: problemSectionSchema
83
+ })(({ element, tagName, props, children }) => {
84
+ ensureTagChildren(tagName, children);
85
+ element.children = children;
86
+ const paragraphWrap = tryParagraphWrap(children);
87
+ if (paragraphWrap) {
88
+ element.children = paragraphWrap;
89
+ }
90
+ const title = props.title.trim();
91
+ if (!title) {
92
+ throw new ProseError(`${tagName} title prop must be a non-empty string.`);
93
+ }
94
+ element.data = title;
95
+ });
96
+ export const problemSectionRegistryItem = defineRegistryItem({
97
+ schema: problemSectionSchema,
98
+ tags: [ProblemSection]
99
+ });
100
+ export const problemSectionCoreElement = defineEruditProseCoreElement({ registryItem: problemSectionRegistryItem });
101
+ function defineProblemSectionContainer(name) {
102
+ const schema = defineSchema({
103
+ name: `problem${uppercaseFirst(name)}`,
104
+ type: "block",
105
+ linkable: false
106
+ })();
107
+ const tag = defineEruditTag({
108
+ tagName: `Problem${uppercaseFirst(name)}`,
109
+ schema
110
+ })(({ element, tagName, children }) => {
111
+ ensureTagChildren(tagName, children);
112
+ const sectionChildren = [];
113
+ const nonSectionChildren = [];
114
+ let seenSection = false;
115
+ for (const child of children) {
116
+ if (isRawElement(child, problemSectionSchema)) {
117
+ sectionChildren.push(child);
118
+ seenSection = true;
119
+ } else {
120
+ if (seenSection) {
121
+ throw new ProseError(`${tagName} non-section children must appear before any <ProblemSection> child.`);
122
+ }
123
+ nonSectionChildren.push(child);
124
+ }
125
+ }
126
+ const paragraphWrap = tryParagraphWrap(nonSectionChildren);
127
+ const wrappedNonSectionChildren = paragraphWrap ?? nonSectionChildren;
128
+ element.children = [...wrappedNonSectionChildren, ...sectionChildren];
129
+ });
130
+ const registryItem = defineRegistryItem({
131
+ schema,
132
+ tags: [tag]
133
+ });
134
+ const coreElement = defineEruditProseCoreElement({ registryItem });
135
+ return {
136
+ schema,
137
+ tag,
138
+ registryItem,
139
+ coreElement
140
+ };
141
+ }
142
+ //
143
+ // Section Containers
144
+ //
145
+ export const problemNote = defineProblemSectionContainer("note");
146
+ export const problemSolution = defineProblemSectionContainer("solution");
147
+ export const problemAnswer = defineProblemSectionContainer("answer");
148
+ export const problemCheckSchema = defineSchema({
149
+ name: "problemCheck",
150
+ type: "block",
151
+ linkable: false
152
+ })();
153
+ export const ProblemCheck = defineEruditTag({
154
+ tagName: "ProblemCheck",
155
+ schema: problemCheckSchema
156
+ })(({ element, tagName, props, children }) => {
157
+ ensureTagNoChildren(tagName, children);
158
+ if (props.answer !== undefined) {
159
+ element.data = {
160
+ ...element.data,
161
+ answers: [String(props.answer)]
162
+ };
163
+ } else if (props.answers !== undefined) {
164
+ element.data = {
165
+ ...element.data,
166
+ answers: props.answers.map(String)
167
+ };
168
+ } else if (props.script !== undefined) {
169
+ element.data = {
170
+ ...element.data,
171
+ script: props.script
172
+ };
173
+ }
174
+ if (props.label !== undefined) {
175
+ element.data = {
176
+ ...element.data,
177
+ label: props.label
178
+ };
179
+ }
180
+ if (props.hint !== undefined) {
181
+ element.data = {
182
+ ...element.data,
183
+ hint: props.hint
184
+ };
185
+ }
186
+ if (props.placeholder !== undefined) {
187
+ element.data = {
188
+ ...element.data,
189
+ placeholder: props.placeholder
190
+ };
191
+ }
192
+ });
193
+ export const problemCheckRegistryItem = defineRegistryItem({
194
+ schema: problemCheckSchema,
195
+ tags: [ProblemCheck]
196
+ });
197
+ export const problemCheckCoreElement = defineEruditProseCoreElement({ registryItem: problemCheckRegistryItem });
198
+ export function validateProblemContent(source, children) {
199
+ ensureTagChildren(source, children, [
200
+ problemDescriptionSchema,
201
+ problemHintSchema,
202
+ problemNote.schema,
203
+ problemSolution.schema,
204
+ problemAnswer.schema,
205
+ problemCheckSchema
206
+ ]);
207
+ const uniques = [
208
+ {
209
+ schema: problemDescriptionSchema,
210
+ label: "ProblemDescription"
211
+ },
212
+ {
213
+ schema: problemSolution.schema,
214
+ label: "ProblemSolution"
215
+ },
216
+ {
217
+ schema: problemAnswer.schema,
218
+ label: "ProblemAnswer"
219
+ }
220
+ ];
221
+ const found = new Set();
222
+ for (const child of children) {
223
+ for (const { schema, label } of uniques) {
224
+ if (isRawElement(child, schema)) {
225
+ if (found.has(label)) {
226
+ throw new ProseError(`
227
+ Invalid problem content at ${source}:
228
+ It can contain only one <${label}>!
229
+ `.trim());
230
+ }
231
+ found.add(label);
232
+ break;
233
+ }
234
+ }
235
+ }
236
+ }
@@ -0,0 +1,26 @@
1
+ import { type AnySchema, type AnyUnique, type AutoUnique, type LinkableTag, type RawElement, type Unique, type WrapSchemas } from '@jsprose/core';
2
+ import { type ProblemSeed, Random } from './rng.js';
3
+ import { type CheckFunction, type ProblemContentChild } from './problemContent.js';
4
+ export declare function insertProblemScriptId(scriptSrc: string, code: string): string;
5
+ export interface ProblemScriptDefinition {
6
+ uniques?: Record<string, LinkableTag>;
7
+ isGenerator?: boolean;
8
+ }
9
+ export declare function defineProblemScript<const TDefinition extends ProblemScriptDefinition>(scriptSrcOrDefinition?: string | TDefinition, maybeDefinition?: TDefinition): (problemContentFn: (args: (TDefinition["uniques"] extends Record<string, LinkableTag> ? {
10
+ uniques: { [K in keyof NonNullable<TDefinition["uniques"]>]: Unique<NonNullable<TDefinition["uniques"]>[K]>; };
11
+ } : {}) & (TDefinition["isGenerator"] extends true ? {
12
+ initial: boolean;
13
+ random: Random;
14
+ } : {})) => RawElement<AnySchema> | {
15
+ problemContent: RawElement<AnySchema>;
16
+ check?: CheckFunction;
17
+ }) => (...args: TDefinition["uniques"] extends Record<string, LinkableTag> ? [uniquesMapping: (() => AutoUnique) | { [K in keyof NonNullable<TDefinition["uniques"]>]: Unique<NonNullable<TDefinition["uniques"]>[K]> | (() => AutoUnique); }] : []) => ProblemScriptInstance;
18
+ export interface ProblemScriptInstance {
19
+ scriptSrc: string;
20
+ uniques: Record<string, AnyUnique>;
21
+ isGenerator: boolean;
22
+ generate: (seed?: ProblemSeed) => {
23
+ problemContent: WrapSchemas<'raw-prose', ProblemContentChild>[];
24
+ check?: CheckFunction;
25
+ };
26
+ }
@@ -0,0 +1,79 @@
1
+ import { isRawElement, ProseError } from "@jsprose/core";
2
+ import { DEFAULT_SEED, Random } from "./rng.js";
3
+ import { validateProblemContent } from "./problemContent.js";
4
+ //
5
+ // Problem Script Src
6
+ //
7
+ export function insertProblemScriptId(scriptSrc, code) {
8
+ // Match: export default defineProblemScript(...)
9
+ return code.replace(/\bdefineProblemScript\(([\s\S]*?)\)/g, (fullMatch, argsContent) => {
10
+ const trimmed = argsContent.trim();
11
+ // If the first argument already looks like a string literal, skip.
12
+ if (/^['"`]/.test(trimmed)) {
13
+ return fullMatch;
14
+ }
15
+ const needsNoSpace = /^\s*\n/.test(argsContent);
16
+ const comma = needsNoSpace ? "," : ", ";
17
+ const newArgs = `'${scriptSrc}'${comma}${argsContent}`;
18
+ return `defineProblemScript(${newArgs})`;
19
+ });
20
+ }
21
+ export function defineProblemScript(scriptSrcOrDefinition, maybeDefinition) {
22
+ let scriptSrc;
23
+ let definition;
24
+ if (typeof scriptSrcOrDefinition === "string") {
25
+ scriptSrc = scriptSrcOrDefinition;
26
+ definition = maybeDefinition;
27
+ } else {
28
+ throw new ProseError(`Problem script requires script ID to be manually specified or inserted at transform time!`);
29
+ }
30
+ function defineProblemContent(problemContentFn) {
31
+ function createProblemScriptInstance(...args) {
32
+ const finalizedUniques = {};
33
+ if (definition.uniques) {
34
+ const uniquesMapping = args[0];
35
+ if (typeof uniquesMapping === "function") {
36
+ for (const key in definition.uniques) {
37
+ finalizedUniques[key] = uniquesMapping();
38
+ }
39
+ } else {
40
+ for (const key in uniquesMapping) {
41
+ const mapping = uniquesMapping[key];
42
+ if (typeof mapping === "function") {
43
+ finalizedUniques[key] = mapping();
44
+ } else {
45
+ finalizedUniques[key] = mapping;
46
+ // @ts-expect-error
47
+ delete finalizedUniques[key].rawElement;
48
+ // @ts-expect-error
49
+ delete finalizedUniques[key].tag;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ return {
55
+ scriptSrc,
56
+ uniques: finalizedUniques,
57
+ isGenerator: definition.isGenerator ?? false,
58
+ generate: (seed) => {
59
+ const finalizedSeed = seed ?? DEFAULT_SEED;
60
+ const problemContentResult = problemContentFn({
61
+ uniques: finalizedUniques,
62
+ ...definition.isGenerator ? {
63
+ initial: finalizedSeed === DEFAULT_SEED,
64
+ random: new Random(finalizedSeed)
65
+ } : {}
66
+ });
67
+ const problemContent = isRawElement(problemContentResult) ? problemContentResult : problemContentResult.problemContent;
68
+ validateProblemContent("[Problem Script]", problemContent.children);
69
+ return {
70
+ problemContent: problemContent.children,
71
+ check: !isRawElement(problemContentResult) ? problemContentResult.check : undefined
72
+ };
73
+ }
74
+ };
75
+ }
76
+ return createProblemScriptInstance;
77
+ }
78
+ return defineProblemContent;
79
+ }
@@ -0,0 +1,212 @@
1
+ import { type AnyUnique, type BlockSchema, type TagChildren } from '@jsprose/core';
2
+ import { type ProblemContentChild } from './problemContent.js';
3
+ import { type ProblemInfo } from './shared.js';
4
+ import { type ProblemScriptStorage } from './storage.js';
5
+ import { type ProblemScriptInstance } from './problemScript.js';
6
+ export interface SubProblemData {
7
+ label?: string;
8
+ scriptUniques?: Record<string, AnyUnique>;
9
+ }
10
+ export declare const subProblemSchema: {
11
+ name: "subProblem";
12
+ type: "block";
13
+ linkable: false;
14
+ Data: SubProblemData;
15
+ Storage: ProblemScriptStorage;
16
+ Children: ProblemContentChild[];
17
+ };
18
+ export declare const SubProblem: import("@jsprose/core").Tag<"SubProblem", {
19
+ name: "subProblem";
20
+ type: "block";
21
+ linkable: false;
22
+ Data: SubProblemData;
23
+ Storage: ProblemScriptStorage;
24
+ Children: ProblemContentChild[];
25
+ }, ({
26
+ label?: string;
27
+ } & {
28
+ children: {};
29
+ script?: undefined;
30
+ }) | ({
31
+ label?: string;
32
+ } & {
33
+ script: ProblemScriptInstance;
34
+ children?: undefined;
35
+ })>;
36
+ export declare const subProblemRegistryItem: import("@jsprose/core").RegistryItem<{
37
+ name: "subProblem";
38
+ type: "block";
39
+ linkable: false;
40
+ Data: SubProblemData;
41
+ Storage: ProblemScriptStorage;
42
+ Children: ProblemContentChild[];
43
+ }, {
44
+ SubProblem: import("@jsprose/core").Tag<"SubProblem", {
45
+ name: "subProblem";
46
+ type: "block";
47
+ linkable: false;
48
+ Data: SubProblemData;
49
+ Storage: ProblemScriptStorage;
50
+ Children: ProblemContentChild[];
51
+ }, ({
52
+ label?: string;
53
+ } & {
54
+ children: {};
55
+ script?: undefined;
56
+ }) | ({
57
+ label?: string;
58
+ } & {
59
+ script: ProblemScriptInstance;
60
+ children?: undefined;
61
+ })>;
62
+ }, undefined>;
63
+ export declare const subProblemCoreElement: {
64
+ registryItem: import("@jsprose/core").RegistryItem<{
65
+ name: "subProblem";
66
+ type: "block";
67
+ linkable: false;
68
+ Data: SubProblemData;
69
+ Storage: ProblemScriptStorage;
70
+ Children: ProblemContentChild[];
71
+ }, {
72
+ SubProblem: import("@jsprose/core").Tag<"SubProblem", {
73
+ name: "subProblem";
74
+ type: "block";
75
+ linkable: false;
76
+ Data: SubProblemData;
77
+ Storage: ProblemScriptStorage;
78
+ Children: ProblemContentChild[];
79
+ }, ({
80
+ label?: string;
81
+ } & {
82
+ children: {};
83
+ script?: undefined;
84
+ }) | ({
85
+ label?: string;
86
+ } & {
87
+ script: ProblemScriptInstance;
88
+ children?: undefined;
89
+ })>;
90
+ }, undefined>;
91
+ };
92
+ export declare const problemsSchema: {
93
+ name: "problems";
94
+ type: "block";
95
+ linkable: true;
96
+ Data: ProblemInfo;
97
+ Storage: undefined;
98
+ Children: (BlockSchema | {
99
+ name: "subProblem";
100
+ type: "block";
101
+ linkable: false;
102
+ Data: SubProblemData;
103
+ Storage: ProblemScriptStorage;
104
+ Children: ProblemContentChild[];
105
+ })[];
106
+ };
107
+ export declare const Problems: import("@jsprose/core").Tag<"Problems", {
108
+ name: "problems";
109
+ type: "block";
110
+ linkable: true;
111
+ Data: ProblemInfo;
112
+ Storage: undefined;
113
+ Children: (BlockSchema | {
114
+ name: "subProblem";
115
+ type: "block";
116
+ linkable: false;
117
+ Data: SubProblemData;
118
+ Storage: ProblemScriptStorage;
119
+ Children: ProblemContentChild[];
120
+ })[];
121
+ }, {
122
+ title: string;
123
+ level: import("./shared.js").ProblemLevel;
124
+ attributes?: (import("./shared.js").ProblemAttribute | import("./shared.js").ProblemCustomAttribute)[];
125
+ } & {
126
+ pretty?: true | undefined;
127
+ applied?: true | undefined;
128
+ method?: true | undefined;
129
+ inter?: true | undefined;
130
+ } & TagChildren & import("../../toc.js").ObjPropToc & import("../../snippet.js").ObjPropSnippet & import("../../snippet.js").ObjPropSearch & import("../../snippet.js").ObjPropQuick & import("../../snippet.js").ObjPropSeo>;
131
+ export declare const problemsRegistryItem: import("@jsprose/core").RegistryItem<{
132
+ name: "problems";
133
+ type: "block";
134
+ linkable: true;
135
+ Data: ProblemInfo;
136
+ Storage: undefined;
137
+ Children: (BlockSchema | {
138
+ name: "subProblem";
139
+ type: "block";
140
+ linkable: false;
141
+ Data: SubProblemData;
142
+ Storage: ProblemScriptStorage;
143
+ Children: ProblemContentChild[];
144
+ })[];
145
+ }, {
146
+ Problems: import("@jsprose/core").Tag<"Problems", {
147
+ name: "problems";
148
+ type: "block";
149
+ linkable: true;
150
+ Data: ProblemInfo;
151
+ Storage: undefined;
152
+ Children: (BlockSchema | {
153
+ name: "subProblem";
154
+ type: "block";
155
+ linkable: false;
156
+ Data: SubProblemData;
157
+ Storage: ProblemScriptStorage;
158
+ Children: ProblemContentChild[];
159
+ })[];
160
+ }, {
161
+ title: string;
162
+ level: import("./shared.js").ProblemLevel;
163
+ attributes?: (import("./shared.js").ProblemAttribute | import("./shared.js").ProblemCustomAttribute)[];
164
+ } & {
165
+ pretty?: true | undefined;
166
+ applied?: true | undefined;
167
+ method?: true | undefined;
168
+ inter?: true | undefined;
169
+ } & TagChildren & import("../../toc.js").ObjPropToc & import("../../snippet.js").ObjPropSnippet & import("../../snippet.js").ObjPropSearch & import("../../snippet.js").ObjPropQuick & import("../../snippet.js").ObjPropSeo>;
170
+ }, undefined>;
171
+ export declare const problemsCoreElement: {
172
+ registryItem: import("@jsprose/core").RegistryItem<{
173
+ name: "problems";
174
+ type: "block";
175
+ linkable: true;
176
+ Data: ProblemInfo;
177
+ Storage: undefined;
178
+ Children: (BlockSchema | {
179
+ name: "subProblem";
180
+ type: "block";
181
+ linkable: false;
182
+ Data: SubProblemData;
183
+ Storage: ProblemScriptStorage;
184
+ Children: ProblemContentChild[];
185
+ })[];
186
+ }, {
187
+ Problems: import("@jsprose/core").Tag<"Problems", {
188
+ name: "problems";
189
+ type: "block";
190
+ linkable: true;
191
+ Data: ProblemInfo;
192
+ Storage: undefined;
193
+ Children: (BlockSchema | {
194
+ name: "subProblem";
195
+ type: "block";
196
+ linkable: false;
197
+ Data: SubProblemData;
198
+ Storage: ProblemScriptStorage;
199
+ Children: ProblemContentChild[];
200
+ })[];
201
+ }, {
202
+ title: string;
203
+ level: import("./shared.js").ProblemLevel;
204
+ attributes?: (import("./shared.js").ProblemAttribute | import("./shared.js").ProblemCustomAttribute)[];
205
+ } & {
206
+ pretty?: true | undefined;
207
+ applied?: true | undefined;
208
+ method?: true | undefined;
209
+ inter?: true | undefined;
210
+ } & TagChildren & import("../../toc.js").ObjPropToc & import("../../snippet.js").ObjPropSnippet & import("../../snippet.js").ObjPropSearch & import("../../snippet.js").ObjPropQuick & import("../../snippet.js").ObjPropSeo>;
211
+ }, undefined>;
212
+ };
@@ -0,0 +1,74 @@
1
+ import { defineRegistryItem, defineSchema, ensureTagBlockChildren, isRawElement, ProseError } from "@jsprose/core";
2
+ import { validateProblemContent } from "./problemContent.js";
3
+ import { defineEruditTag } from "../../tag.js";
4
+ import { problemProps2Info } from "./shared.js";
5
+ import { defineEruditProseCoreElement } from "../../coreElement.js";
6
+ import { problemScriptStorageKey } from "./storage.js";
7
+ import "./problemScript.js";
8
+ export const subProblemSchema = defineSchema({
9
+ name: "subProblem",
10
+ type: "block",
11
+ linkable: false
12
+ })();
13
+ export const SubProblem = defineEruditTag({
14
+ tagName: "SubProblem",
15
+ schema: subProblemSchema
16
+ })(({ element, tagName, props, children }) => {
17
+ element.data = {};
18
+ const label = props.label?.trim();
19
+ if (label) {
20
+ element.data.label = label;
21
+ }
22
+ if (props.script && children) {
23
+ throw new ProseError(`<${tagName}> cannot have both script and children!`);
24
+ }
25
+ if (props.script) {
26
+ element.data.scriptUniques = props.script.uniques;
27
+ element.storageKey = problemScriptStorageKey(props.script.scriptSrc);
28
+ element.children = props.script.generate().problemContent;
29
+ } else {
30
+ validateProblemContent(tagName, children);
31
+ element.children = children;
32
+ }
33
+ });
34
+ export const subProblemRegistryItem = defineRegistryItem({
35
+ schema: subProblemSchema,
36
+ tags: [SubProblem]
37
+ });
38
+ export const subProblemCoreElement = defineEruditProseCoreElement({ registryItem: subProblemRegistryItem });
39
+ //
40
+ // Problems
41
+ //
42
+ export const problemsSchema = defineSchema({
43
+ name: "problems",
44
+ type: "block",
45
+ linkable: true
46
+ })();
47
+ export const Problems = defineEruditTag({
48
+ tagName: "Problems",
49
+ schema: problemsSchema
50
+ })(({ element, tagName, props, children, registry }) => {
51
+ ensureTagBlockChildren(tagName, children, registry);
52
+ const subProblemChildren = [];
53
+ const otherChildren = [];
54
+ for (const child of children) {
55
+ if (isRawElement(child, subProblemSchema)) {
56
+ subProblemChildren.push(child);
57
+ } else {
58
+ otherChildren.push(child);
59
+ }
60
+ }
61
+ if (subProblemChildren.length === 0) {
62
+ throw new ProseError(`<${tagName}> must have at least one <SubProblem> child!`);
63
+ }
64
+ element.children = [...otherChildren, ...subProblemChildren];
65
+ element.data = problemProps2Info(props);
66
+ element.title = element.data.title;
67
+ element.snippet = {};
68
+ element.toc = { add: true };
69
+ });
70
+ export const problemsRegistryItem = defineRegistryItem({
71
+ schema: problemsSchema,
72
+ tags: [Problems]
73
+ });
74
+ export const problemsCoreElement = defineEruditProseCoreElement({ registryItem: problemsRegistryItem });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Static seed not random for SEO reasons.
3
+ * It ensures that initial problem content is always the same on each build, helping search engines to index initial problem content consistently.
4
+ */
5
+ export declare const DEFAULT_SEED = "3141592653";
6
+ export type ProblemSeed = string | number;
7
+ export declare function normalizeSeed(seed: ProblemSeed): number;
8
+ export declare class Random {
9
+ private _rng;
10
+ constructor(seed: ProblemSeed);
11
+ rng(): number;
12
+ boolean(): boolean;
13
+ integer(min: number, max: number): number;
14
+ float(min: number, max: number, decimals: number): number;
15
+ shuffle<T>(arr: T[]): T[];
16
+ arrayElement<T>(arr: T[]): T | undefined;
17
+ arrayElements<T>(arr: T[], count: number, unique?: boolean): T[];
18
+ }