erudit 4.0.0-dev.3 → 4.0.0-dev.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 (336) hide show
  1. package/.nuxtrc +1 -1
  2. package/app/app.vue +34 -34
  3. package/app/components/EruditLink.ts +7 -7
  4. package/app/components/FancyBold.vue +16 -16
  5. package/app/components/FancyCard.vue +52 -58
  6. package/app/components/FancyCardTag.vue +16 -16
  7. package/app/components/Loading.vue +7 -0
  8. package/app/components/Prose.vue +55 -51
  9. package/app/components/ScrollHolder.vue +13 -13
  10. package/app/components/SmartMedia.vue +107 -112
  11. package/app/components/ads/Ads.vue +17 -17
  12. package/app/components/ads/AdsBannerAside.vue +29 -29
  13. package/app/components/ads/AdsBannerBottom.vue +6 -6
  14. package/app/components/ads/AdsReplacer.vue +19 -21
  15. package/app/components/ads/provider/Custom.vue +9 -9
  16. package/app/components/ads/provider/Yandex.vue +56 -56
  17. package/app/components/aside/AsideListItem.vue +47 -52
  18. package/app/components/aside/AsideMajor.vue +6 -6
  19. package/app/components/aside/AsideMinor.vue +47 -55
  20. package/app/components/aside/AsidePlainMessage.vue +9 -9
  21. package/app/components/aside/AsideSwitch.vue +53 -54
  22. package/app/components/aside/major/PaneHolder.vue +61 -61
  23. package/app/components/aside/major/PaneSwitcher.vue +50 -55
  24. package/app/components/aside/major/PaneSwitcherButton.vue +24 -24
  25. package/app/components/aside/major/PaneTemplate.vue +3 -3
  26. package/app/components/aside/major/SiteInfo.vue +40 -42
  27. package/app/components/aside/major/contentNav/PaneBookNav.vue +107 -116
  28. package/app/components/aside/major/contentNav/PaneGlobalNav.vue +19 -19
  29. package/app/components/aside/major/contentNav/items/ContentNavBook.vue +8 -8
  30. package/app/components/aside/major/contentNav/items/ContentNavFolder.vue +55 -56
  31. package/app/components/aside/major/contentNav/items/ContentNavItem.vue +16 -16
  32. package/app/components/aside/major/contentNav/items/ContentNavPage.vue +2 -6
  33. package/app/components/aside/major/contentNav/items/ContentNavSeparator.vue +34 -35
  34. package/app/components/aside/major/contentNav/items/ContentNavTopic.vue +6 -6
  35. package/app/components/aside/major/contentNav/items/Flags.vue +31 -33
  36. package/app/components/aside/major/contentNav/items/ItemTemplate.vue +13 -13
  37. package/app/components/aside/major/languages/PaneLanguages.vue +40 -40
  38. package/app/components/aside/major/pages/PanePages.vue +45 -45
  39. package/app/components/aside/major/search/PaneSearch.vue +111 -100
  40. package/app/components/aside/major/search/SearchInput.vue +52 -53
  41. package/app/components/aside/major/search/SearchResult.vue +125 -74
  42. package/app/components/aside/major/search/SearchStatus.vue +28 -28
  43. package/app/components/aside/major/search/search.worker.ts +129 -129
  44. package/app/components/aside/major/settings/BuildTime.vue +15 -15
  45. package/app/components/aside/major/settings/EngineVersion.vue +8 -7
  46. package/app/components/aside/major/settings/PaneSettings.vue +8 -8
  47. package/app/components/aside/major/settings/ThemeSwitcher.vue +38 -36
  48. package/app/components/aside/major/settings/repository/Repository.vue +18 -18
  49. package/app/components/aside/major/settings/repository/SecondaryGitHub.vue +47 -47
  50. package/app/components/aside/minor/AsideMinorPane.vue +5 -5
  51. package/app/components/aside/minor/AsideMinorPlainHeader.vue +20 -20
  52. package/app/components/aside/minor/content/AsideMinorContentContributions.vue +47 -51
  53. package/app/components/aside/minor/content/AsideMinorContentPage.vue +37 -37
  54. package/app/components/aside/minor/content/AsideMinorContentTopic.vue +61 -66
  55. package/app/components/aside/minor/content/ButtonPaneContributions.vue +101 -114
  56. package/app/components/aside/minor/content/ButtonPaneImprove.vue +112 -120
  57. package/app/components/aside/minor/content/Contribution.vue +36 -36
  58. package/app/components/aside/minor/content/Toc.vue +163 -163
  59. package/app/components/aside/minor/content/TocItem.vue +91 -91
  60. package/app/components/aside/minor/content/TopicPartButton.vue +35 -35
  61. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +36 -39
  62. package/app/components/aside/minor/contributor/ItemBook.vue +33 -39
  63. package/app/components/aside/minor/contributor/ItemContent.vue +17 -17
  64. package/app/components/aside/minor/news/AsideMinorNews.vue +132 -132
  65. package/app/components/aside/minor/news/NewsItem.vue +69 -69
  66. package/app/components/aside/minor/news/RenderNewsElement.vue +42 -42
  67. package/app/components/aside/minor/news/elements/Mix.vue +11 -11
  68. package/app/components/aside/minor/news/elements/P.vue +14 -14
  69. package/app/components/aside/minor/news/elements/Ref.vue +59 -58
  70. package/app/components/aside/minor/news/elements/Text.vue +18 -18
  71. package/app/components/indexPage/IndexPagePersons.vue +116 -117
  72. package/app/components/main/MainAction.vue +26 -20
  73. package/app/components/main/MainBreadcrumbs.vue +28 -28
  74. package/app/components/main/MainContentChild.vue +44 -47
  75. package/app/components/main/MainContentChildren.vue +13 -14
  76. package/app/components/main/MainDecoration.vue +15 -15
  77. package/app/components/main/MainDescription.vue +13 -13
  78. package/app/components/main/MainFlag.vue +129 -133
  79. package/app/components/main/MainFlags.vue +17 -17
  80. package/app/components/main/MainGlow.vue +12 -12
  81. package/app/components/main/MainQuickLink.vue +90 -91
  82. package/app/components/main/MainQuickLinks.vue +40 -40
  83. package/app/components/main/MainQuote.vue +149 -159
  84. package/app/components/main/MainQuoteLoader.vue +86 -86
  85. package/app/components/main/MainSection.vue +44 -44
  86. package/app/components/main/MainSectionPreamble.vue +5 -5
  87. package/app/components/main/MainSubTitle.vue +11 -12
  88. package/app/components/main/MainTitle.vue +32 -32
  89. package/app/components/main/MainTopicPartPage.vue +88 -88
  90. package/app/components/main/MainTopicPartSwitch.vue +67 -71
  91. package/app/components/main/connections/Deps.vue +30 -34
  92. package/app/components/main/connections/Externals.vue +80 -104
  93. package/app/components/main/connections/MainConnections.vue +90 -94
  94. package/app/components/main/connections/MainConnectionsButton.vue +81 -81
  95. package/app/components/main/connections/ScrollPane.vue +10 -10
  96. package/app/components/main/contentStats/Item.vue +28 -34
  97. package/app/components/main/contentStats/ItemElement.vue +19 -19
  98. package/app/components/main/contentStats/ItemMaterials.vue +11 -11
  99. package/app/components/main/contentStats/MainContentStats.vue +50 -53
  100. package/app/components/preview/Preview.vue +110 -121
  101. package/app/components/preview/PreviewError.vue +4 -4
  102. package/app/components/preview/PreviewLoading.vue +3 -3
  103. package/app/components/preview/PreviewScreen.vue +48 -48
  104. package/app/components/preview/PreviewScreenButton.vue +27 -27
  105. package/app/components/preview/screen/ContentPage.vue +27 -30
  106. package/app/components/preview/screen/DirectLink.vue +13 -13
  107. package/app/components/preview/screen/Unique.vue +31 -32
  108. package/app/components/site/SiteAside.vue +50 -51
  109. package/app/components/site/SiteAsideOverlay.vue +8 -8
  110. package/app/components/site/SiteMain.vue +11 -11
  111. package/app/components/transition/Fade.vue +16 -16
  112. package/app/components/transition/Slide.vue +27 -27
  113. package/app/components/tree/TreeContainer.vue +3 -3
  114. package/app/components/tree/TreeItem.vue +27 -31
  115. package/app/composables/ads.ts +11 -11
  116. package/app/composables/analytics.ts +102 -102
  117. package/app/composables/appElements.ts +21 -21
  118. package/app/composables/aside.ts +15 -15
  119. package/app/composables/asideMajorPane.ts +82 -82
  120. package/app/composables/asideMinor.ts +109 -109
  121. package/app/composables/contentNav.ts +7 -7
  122. package/app/composables/favicon.ts +103 -108
  123. package/app/composables/file.ts +4 -3
  124. package/app/composables/formatText.ts +100 -100
  125. package/app/composables/loading.ts +26 -2
  126. package/app/composables/mainContent.ts +22 -22
  127. package/app/composables/og.ts +184 -182
  128. package/app/composables/phrases.ts +98 -98
  129. package/app/composables/preview.ts +44 -44
  130. package/app/composables/route.ts +4 -2
  131. package/app/composables/theme.ts +47 -51
  132. package/app/composables/url.ts +19 -11
  133. package/app/formatters/ru.ts +14 -14
  134. package/app/pages/article/[...articleId].vue +12 -12
  135. package/app/pages/book/[...bookId].vue +56 -56
  136. package/app/pages/contributor/[contributorId].vue +144 -150
  137. package/app/pages/contributors.vue +95 -99
  138. package/app/pages/group/[...groupId].vue +58 -58
  139. package/app/pages/index.vue +113 -117
  140. package/app/pages/page/[...pageId].vue +60 -60
  141. package/app/pages/practice/[...practiceId].vue +12 -12
  142. package/app/pages/sponsors.vue +88 -91
  143. package/app/pages/summary/[...summaryId].vue +12 -12
  144. package/app/plugins/appSetup/client/htmlBranding.ts +6 -6
  145. package/app/plugins/appSetup/client/welcome.ts +37 -35
  146. package/app/plugins/appSetup/config.ts +6 -6
  147. package/app/plugins/appSetup/global.ts +3 -3
  148. package/app/plugins/appSetup/index.ts +27 -28
  149. package/app/plugins/prerender.server.ts +40 -40
  150. package/app/router.options.ts +5 -5
  151. package/app/scripts/theme.js +21 -24
  152. package/app/styles/main.css +128 -124
  153. package/bin/erudit.js +12 -0
  154. package/modules/erudit/env.ts +8 -0
  155. package/modules/erudit/globals/content.ts +4 -4
  156. package/modules/erudit/globals/contributor.ts +1 -1
  157. package/modules/erudit/globals/eruditConfig.ts +5 -10
  158. package/modules/erudit/globals/problem.ts +1 -1
  159. package/modules/erudit/globals/prose.ts +1 -1
  160. package/modules/erudit/globals/public.ts +18 -18
  161. package/modules/erudit/index.ts +50 -60
  162. package/modules/erudit/logger.ts +10 -10
  163. package/modules/erudit/setup/elements/appTemplate.ts +44 -45
  164. package/modules/erudit/setup/elements/globalTemplate.ts +82 -82
  165. package/modules/erudit/setup/elements/globalTypes.ts +259 -273
  166. package/modules/erudit/setup/elements/setup.ts +163 -167
  167. package/modules/erudit/setup/elements/shared.ts +10 -10
  168. package/modules/erudit/setup/elements/tagsTable.ts +28 -28
  169. package/modules/erudit/setup/fullRestart.ts +61 -71
  170. package/modules/erudit/setup/globals.ts +206 -196
  171. package/modules/erudit/setup/publicAssets.ts +43 -52
  172. package/modules/erudit/setup/runtimeConfig.ts +106 -58
  173. package/modules/erudit/watcher.ts +20 -27
  174. package/nuxt.config.ts +102 -84
  175. package/package.json +51 -55
  176. package/server/api/aside/major/frontNav/book/[...shortId].ts +10 -10
  177. package/server/api/aside/major/frontNav/global.ts +5 -5
  178. package/server/api/aside/major/pages.ts +6 -6
  179. package/server/api/contributor/list.ts +60 -61
  180. package/server/api/contributor/page/[contributorId].ts +68 -68
  181. package/server/api/indexPage.ts +81 -81
  182. package/server/api/language/functions.ts +11 -11
  183. package/server/api/language/phrase/[phraseKey].ts +35 -35
  184. package/server/api/main/content/[...contentTypePath].ts +149 -153
  185. package/server/api/news/batch/[batchIndex].ts +5 -5
  186. package/server/api/pageSponsors.ts +56 -58
  187. package/server/api/prerender/content.ts +79 -82
  188. package/server/api/prerender/default.ts +35 -35
  189. package/server/api/prerender/files.ts +10 -10
  190. package/server/api/prerender/frontNav.ts +13 -13
  191. package/server/api/prerender/language.ts +7 -7
  192. package/server/api/prerender/news.ts +8 -8
  193. package/server/api/prerender/quotes.ts +15 -15
  194. package/server/api/preview/contentPage/[...contentTypePath].ts +63 -63
  195. package/server/api/preview/contentUnique/[...contentTypePathUnique].ts +73 -81
  196. package/server/api/problemScript/[...problemScriptPath].ts +88 -92
  197. package/server/api/quote/data/[quoteId].ts +84 -87
  198. package/server/api/quote/ids.ts +3 -3
  199. package/server/erudit/build.ts +132 -137
  200. package/server/erudit/cameos/build.ts +161 -161
  201. package/server/erudit/config.ts +13 -13
  202. package/server/erudit/content/global/build.ts +300 -297
  203. package/server/erudit/content/global/singleton.ts +5 -5
  204. package/server/erudit/content/nav/build.ts +459 -463
  205. package/server/erudit/content/nav/front.ts +125 -127
  206. package/server/erudit/content/nav/repository/books.ts +37 -40
  207. package/server/erudit/content/nav/repository/get.ts +33 -33
  208. package/server/erudit/content/nav/repository/hasChildren.ts +5 -5
  209. package/server/erudit/content/nav/repository/hasNav.ts +3 -3
  210. package/server/erudit/content/nav/repository/hasParent.ts +5 -5
  211. package/server/erudit/content/nav/repository/id.ts +9 -9
  212. package/server/erudit/content/nav/repository/index.ts +9 -9
  213. package/server/erudit/content/nav/repository/order.ts +14 -14
  214. package/server/erudit/content/nav/repository/previousNext.ts +35 -35
  215. package/server/erudit/content/nav/repository/walk.ts +127 -127
  216. package/server/erudit/content/nav/setup.ts +13 -13
  217. package/server/erudit/content/nav/types.ts +24 -24
  218. package/server/erudit/content/repository/breadcrumbs.ts +24 -24
  219. package/server/erudit/content/repository/children.ts +47 -47
  220. package/server/erudit/content/repository/connections.ts +35 -35
  221. package/server/erudit/content/repository/contentLink.ts +16 -16
  222. package/server/erudit/content/repository/decoration.ts +23 -23
  223. package/server/erudit/content/repository/deps.ts +121 -84
  224. package/server/erudit/content/repository/description.ts +11 -11
  225. package/server/erudit/content/repository/elementSnippets.ts +105 -105
  226. package/server/erudit/content/repository/externals.ts +50 -50
  227. package/server/erudit/content/repository/flags.ts +33 -33
  228. package/server/erudit/content/repository/seo.ts +12 -12
  229. package/server/erudit/content/repository/stats.ts +97 -97
  230. package/server/erudit/content/repository/title.ts +27 -27
  231. package/server/erudit/content/repository/topicParts.ts +39 -39
  232. package/server/erudit/content/repository/unique.ts +76 -76
  233. package/server/erudit/content/resolve/book.ts +29 -32
  234. package/server/erudit/content/resolve/group.ts +34 -39
  235. package/server/erudit/content/resolve/index.ts +272 -290
  236. package/server/erudit/content/resolve/page.ts +80 -87
  237. package/server/erudit/content/resolve/topic.ts +220 -246
  238. package/server/erudit/content/resolve/utils/contentError.ts +10 -10
  239. package/server/erudit/content/resolve/utils/insertContentItem.ts +113 -122
  240. package/server/erudit/content/resolve/utils/insertContentResolved.ts +126 -132
  241. package/server/erudit/content/search.ts +146 -163
  242. package/server/erudit/contributors/build.ts +158 -166
  243. package/server/erudit/contributors/global.ts +3 -3
  244. package/server/erudit/contributors/repository/avatarUrl.ts +10 -10
  245. package/server/erudit/contributors/repository/contributions.ts +171 -178
  246. package/server/erudit/contributors/repository/count.ts +3 -3
  247. package/server/erudit/contributors/search.ts +34 -34
  248. package/server/erudit/db/repository/pushFile.ts +23 -26
  249. package/server/erudit/db/repository/pushProblemScript.ts +19 -19
  250. package/server/erudit/db/repository/pushProseLink.ts +40 -40
  251. package/server/erudit/db/schema/cameos.ts +7 -7
  252. package/server/erudit/db/schema/content.ts +18 -18
  253. package/server/erudit/db/schema/contentContributions.ts +15 -15
  254. package/server/erudit/db/schema/contentDeps.ts +21 -21
  255. package/server/erudit/db/schema/contentElementStats.ts +20 -20
  256. package/server/erudit/db/schema/contentProseLinks.ts +23 -23
  257. package/server/erudit/db/schema/contentSnippets.ts +15 -15
  258. package/server/erudit/db/schema/contentToc.ts +16 -16
  259. package/server/erudit/db/schema/contentUniques.ts +19 -25
  260. package/server/erudit/db/schema/contributors.ts +12 -12
  261. package/server/erudit/db/schema/files.ts +11 -11
  262. package/server/erudit/db/schema/groups.ts +6 -6
  263. package/server/erudit/db/schema/index.ts +17 -17
  264. package/server/erudit/db/schema/news.ts +7 -7
  265. package/server/erudit/db/schema/pages.ts +7 -7
  266. package/server/erudit/db/schema/problemScripts.ts +14 -14
  267. package/server/erudit/db/schema/sponsors.ts +9 -9
  268. package/server/erudit/db/schema/topics.ts +9 -9
  269. package/server/erudit/db/setup.ts +62 -62
  270. package/server/erudit/db/types.ts +10 -10
  271. package/server/erudit/global.ts +38 -33
  272. package/server/erudit/importer.ts +94 -97
  273. package/server/erudit/index.ts +96 -90
  274. package/server/erudit/language/list/en.ts +116 -116
  275. package/server/erudit/language/list/ru.ts +120 -120
  276. package/server/erudit/language/list.ts +6 -6
  277. package/server/erudit/language/setup.ts +36 -36
  278. package/server/erudit/language/types.ts +16 -16
  279. package/server/erudit/logger.ts +73 -77
  280. package/server/erudit/news/build.ts +112 -114
  281. package/server/erudit/news/repository/batch.ts +61 -61
  282. package/server/erudit/path.ts +19 -0
  283. package/server/erudit/prose/repository/finalize.ts +68 -68
  284. package/server/erudit/prose/repository/get.ts +54 -54
  285. package/server/erudit/prose/repository/resolve.ts +17 -17
  286. package/server/erudit/prose/storage/callout.ts +16 -14
  287. package/server/erudit/prose/storage/image.ts +22 -20
  288. package/server/erudit/prose/storage/link.ts +222 -226
  289. package/server/erudit/prose/storage/problemScript.ts +23 -21
  290. package/server/erudit/prose/storage/video.ts +16 -14
  291. package/server/erudit/prose/transform/bundleProblemScript.ts +6 -6
  292. package/server/erudit/prose/transform/extensions.ts +15 -15
  293. package/server/erudit/quote/repository/ids.ts +31 -31
  294. package/server/erudit/repository.ts +96 -96
  295. package/server/erudit/sponsors/build.ts +161 -165
  296. package/server/erudit/sponsors/repository/avatarUrl.ts +10 -10
  297. package/server/erudit/sponsors/repository/count.ts +4 -4
  298. package/server/erudit/staticFile.ts +28 -28
  299. package/server/plugins/augmentCss.ts +17 -17
  300. package/server/plugins/lang.ts +5 -7
  301. package/server/plugins/metaViewport.ts +15 -15
  302. package/server/plugins/theme.ts +13 -13
  303. package/server/routes/file/[...path].ts +18 -18
  304. package/server/routes/robots.txt.ts +9 -9
  305. package/server/routes/search.json.gz.ts +76 -73
  306. package/server/routes/sitemap.xml.ts +83 -81
  307. package/shared/search/encoders.ts +10 -10
  308. package/shared/types/asideMajorPages.ts +2 -2
  309. package/shared/types/breadcrumbs.ts +3 -3
  310. package/shared/types/contentChildren.ts +10 -10
  311. package/shared/types/contentConnections.ts +27 -27
  312. package/shared/types/contentStats.ts +6 -6
  313. package/shared/types/elementSnippet.ts +14 -14
  314. package/shared/types/frontContentNav.ts +17 -17
  315. package/shared/types/indexPage.ts +20 -20
  316. package/shared/types/language.ts +174 -174
  317. package/shared/types/mainContent.ts +40 -40
  318. package/shared/types/news.ts +13 -13
  319. package/shared/types/preview.ts +28 -28
  320. package/shared/types/runtimeConfig.ts +29 -47
  321. package/shared/types/search.ts +32 -32
  322. package/shared/utils/contentTypePath.ts +44 -44
  323. package/shared/utils/icons.ts +7 -7
  324. package/shared/utils/pages.ts +19 -20
  325. package/shared/utils/stringColor.ts +8 -8
  326. package/shared/utils/toStringEqual.ts +13 -13
  327. package/shared/utils/zip.ts +64 -64
  328. package/test/shared/utils/zip.test.ts +8 -8
  329. package/tsconfig.json +15 -15
  330. package/bin/erudit.mjs +0 -2
  331. package/modules/erudit/setup/aliases.ts +0 -17
  332. package/modules/erudit/setup/baseUrl.ts +0 -19
  333. package/modules/erudit/setup/nuxtConfig.ts +0 -62
  334. package/modules/erudit/setup/projectConfig.ts +0 -114
  335. package/shared/utils/slasher.ts +0 -64
  336. package/test/shared/utils/slasher.test.ts +0 -75
@@ -1,87 +1,80 @@
1
- import { isDocument, type AnyDocument } from '@jsprose/core';
2
- import { isContentItem } from '@erudit-js/core/content/item';
3
- import type { PageContentItem } from '@erudit-js/core/content/page';
4
- import { isIncludedRawElement } from '@erudit-js/prose';
5
-
6
- import type { ContentNavNode } from '../nav/types';
7
- import { logContentError } from './utils/contentError';
8
- import { insertContentItem } from './utils/insertContentItem';
9
- import { resolveEruditProse } from '../../prose/repository/resolve';
10
- import { insertContentResolved } from './utils/insertContentResolved';
11
-
12
- export async function resolvePage(pageNode: ContentNavNode) {
13
- ERUDIT.log.debug.start(
14
- `Resolving page ${ERUDIT.log.stress(pageNode.fullId)}...`,
15
- );
16
-
17
- try {
18
- const pageModule = await ERUDIT.import<{
19
- content: AnyDocument;
20
- page: PageContentItem;
21
- }>(
22
- ERUDIT.config.paths.project +
23
- '/content/' +
24
- pageNode.contentRelPath +
25
- '/page',
26
- );
27
-
28
- if (!isContentItem<PageContentItem>(pageModule?.page, 'page')) {
29
- throw new Error('Page `page` export must be a page content item!');
30
- }
31
-
32
- if (!isDocument(pageModule?.content)) {
33
- throw new Error('Page `content` export must be a Document!');
34
- }
35
-
36
- await insertContentItem(pageNode, pageModule.page);
37
-
38
- const elementsCount: Record<string, number> = {};
39
-
40
- const proseDocument = pageModule.content;
41
- const resolveResult = await resolveEruditProse(
42
- proseDocument.content,
43
- true,
44
- async ({ rawElement }) => {
45
- // Counting elements for statistics
46
-
47
- if (isIncludedRawElement(rawElement)) {
48
- return;
49
- }
50
-
51
- if (
52
- ERUDIT.config.project.countElements
53
- .flat()
54
- .includes(rawElement.schemaName)
55
- ) {
56
- elementsCount[rawElement.schemaName] =
57
- (elementsCount[rawElement.schemaName] || 0) + 1;
58
- }
59
- },
60
- );
61
-
62
- if (resolveResult.tocItems?.length) {
63
- await ERUDIT.db.insert(ERUDIT.db.schema.contentToc).values({
64
- fullId: pageNode.fullId,
65
- toc: resolveResult.tocItems,
66
- });
67
- }
68
-
69
- for (const [schemaName, count] of Object.entries(elementsCount)) {
70
- await ERUDIT.repository.content.addElementCount(
71
- pageNode.fullId,
72
- schemaName,
73
- count,
74
- );
75
- }
76
-
77
- await ERUDIT.db.insert(ERUDIT.db.schema.pages).values({
78
- fullId: pageNode.fullId,
79
- prose: resolveResult.proseElement,
80
- });
81
-
82
- await insertContentResolved(pageNode.fullId, 'page', resolveResult);
83
- } catch (error) {
84
- logContentError(pageNode);
85
- throw error;
86
- }
87
- }
1
+ import { isDocument, type AnyDocument } from '@jsprose/core';
2
+ import { isContentItem } from '@erudit-js/core/content/item';
3
+ import type { PageContentItem } from '@erudit-js/core/content/page';
4
+ import { isIncludedRawElement } from '@erudit-js/prose';
5
+
6
+ import type { ContentNavNode } from '../nav/types';
7
+ import { logContentError } from './utils/contentError';
8
+ import { insertContentItem } from './utils/insertContentItem';
9
+ import { resolveEruditProse } from '../../prose/repository/resolve';
10
+ import { insertContentResolved } from './utils/insertContentResolved';
11
+
12
+ export async function resolvePage(pageNode: ContentNavNode) {
13
+ ERUDIT.log.debug.start(
14
+ `Resolving page ${ERUDIT.log.stress(pageNode.fullId)}...`,
15
+ );
16
+
17
+ try {
18
+ const pageModule = await ERUDIT.import<{
19
+ content: AnyDocument;
20
+ page: PageContentItem;
21
+ }>(ERUDIT.paths.project(`content/${pageNode.contentRelPath}/page`));
22
+
23
+ if (!isContentItem<PageContentItem>(pageModule?.page, 'page')) {
24
+ throw new Error('Page `page` export must be a page content item!');
25
+ }
26
+
27
+ if (!isDocument(pageModule?.content)) {
28
+ throw new Error('Page `content` export must be a Document!');
29
+ }
30
+
31
+ await insertContentItem(pageNode, pageModule.page);
32
+
33
+ const elementsCount: Record<string, number> = {};
34
+
35
+ const proseDocument = pageModule.content;
36
+ const resolveResult = await resolveEruditProse(
37
+ proseDocument.content,
38
+ true,
39
+ async ({ rawElement }) => {
40
+ // Counting elements for statistics
41
+
42
+ if (isIncludedRawElement(rawElement)) {
43
+ return;
44
+ }
45
+
46
+ if (
47
+ ERUDIT.config.countElements.flat().includes(rawElement.schemaName)
48
+ ) {
49
+ elementsCount[rawElement.schemaName] =
50
+ (elementsCount[rawElement.schemaName] || 0) + 1;
51
+ }
52
+ },
53
+ );
54
+
55
+ if (resolveResult.tocItems?.length) {
56
+ await ERUDIT.db.insert(ERUDIT.db.schema.contentToc).values({
57
+ fullId: pageNode.fullId,
58
+ toc: resolveResult.tocItems,
59
+ });
60
+ }
61
+
62
+ for (const [schemaName, count] of Object.entries(elementsCount)) {
63
+ await ERUDIT.repository.content.addElementCount(
64
+ pageNode.fullId,
65
+ schemaName,
66
+ count,
67
+ );
68
+ }
69
+
70
+ await ERUDIT.db.insert(ERUDIT.db.schema.pages).values({
71
+ fullId: pageNode.fullId,
72
+ prose: resolveResult.proseElement,
73
+ });
74
+
75
+ await insertContentResolved(pageNode.fullId, 'page', resolveResult);
76
+ } catch (error) {
77
+ logContentError(pageNode);
78
+ throw error;
79
+ }
80
+ }
@@ -1,246 +1,220 @@
1
- import { eq } from 'drizzle-orm';
2
- import {
3
- isDocument,
4
- isRawElement,
5
- walkElements,
6
- type AnyDocument,
7
- type AnySchema,
8
- } from '@jsprose/core';
9
- import {
10
- topicParts,
11
- type TopicContentItem,
12
- } from '@erudit-js/core/content/topic';
13
- import { isContentItem } from '@erudit-js/core/content/item';
14
- import {
15
- isIncludedRawElement,
16
- type EruditRawElement,
17
- type ResolvedTocItem,
18
- } from '@erudit-js/prose';
19
- import { problemSchema } from '@erudit-js/prose/elements/problem/problem';
20
- import { problemsSchema } from '@erudit-js/prose/elements/problem/problems';
21
-
22
- import type { ContentNavNode } from '../nav/types';
23
- import { logContentError } from './utils/contentError';
24
- import { insertContentItem } from './utils/insertContentItem';
25
- import { resolveEruditProse } from '../../prose/repository/resolve';
26
- import { insertContentResolved } from './utils/insertContentResolved';
27
-
28
- export async function resolveTopic(topicNode: ContentNavNode) {
29
- ERUDIT.log.debug.start(
30
- `Resolving topic ${ERUDIT.log.stress(topicNode.fullId)}...`,
31
- );
32
-
33
- try {
34
- const topicModule = await ERUDIT.import<{ default: TopicContentItem }>(
35
- ERUDIT.config.paths.project +
36
- '/content/' +
37
- topicNode.contentRelPath +
38
- '/topic',
39
- );
40
-
41
- if (!isContentItem<TopicContentItem>(topicModule?.default, 'topic')) {
42
- throw new Error(
43
- 'Topic default export must be a topic content item!',
44
- );
45
- }
46
-
47
- await insertContentItem(topicNode, topicModule.default);
48
- await ERUDIT.db.insert(ERUDIT.db.schema.topics).values({
49
- fullId: topicNode.fullId,
50
- });
51
-
52
- const elementsCount: Record<string, number> = {};
53
-
54
- for (const topicPart of topicParts) {
55
- const topicPartDocument = await ERUDIT.import<{
56
- default: AnyDocument;
57
- }>(
58
- ERUDIT.config.paths.project +
59
- '/content/' +
60
- topicNode.contentRelPath +
61
- '/' +
62
- topicPart,
63
- { try: true },
64
- );
65
-
66
- if (isDocument(topicPartDocument?.default)) {
67
- const practiceProblemsTocItems: ResolvedTocItem[] = [];
68
-
69
- const resolvedTopicPart = await resolveEruditProse(
70
- topicPartDocument.default.content,
71
- true,
72
- async ({ rawElement, proseElement }) => {
73
- //
74
- // Auto-adding problems to TOC if in practice topic part
75
- //
76
-
77
- if (topicPart === 'practice') {
78
- if (
79
- (rawElement as EruditRawElement<AnySchema>)
80
- .title &&
81
- proseElement.id
82
- ) {
83
- if (
84
- isRawElement(rawElement, problemSchema) ||
85
- isRawElement(rawElement, problemsSchema)
86
- ) {
87
- practiceProblemsTocItems.push({
88
- type: 'element',
89
- elementId: proseElement.id,
90
- schemaName: rawElement.schemaName,
91
- title: (
92
- rawElement as EruditRawElement<AnySchema>
93
- ).title!,
94
- });
95
- }
96
- }
97
- }
98
-
99
- //
100
- // Counting elements for statistics
101
- //
102
-
103
- if (isIncludedRawElement(rawElement)) {
104
- return;
105
- }
106
-
107
- if (
108
- ERUDIT.config.project.countElements
109
- .flat()
110
- .includes(rawElement.schemaName)
111
- ) {
112
- elementsCount[rawElement.schemaName] =
113
- (elementsCount[rawElement.schemaName] || 0) + 1;
114
- }
115
- },
116
- );
117
-
118
- let finalTocItems = resolvedTopicPart.tocItems;
119
-
120
- if (
121
- topicPart === 'practice' &&
122
- practiceProblemsTocItems.length
123
- ) {
124
- // Map elementId -> TocItem for both headings and problems
125
- const itemMap = new Map<string, ResolvedTocItem>();
126
-
127
- // Collect all existing TOC items (headings) recursively
128
- const collectItems = (items: ResolvedTocItem[]) => {
129
- for (const item of items) {
130
- if (item.elementId) {
131
- itemMap.set(item.elementId, item);
132
- }
133
- if (
134
- item.type === 'heading' &&
135
- item.children?.length
136
- ) {
137
- collectItems(item.children);
138
- }
139
- }
140
- };
141
- collectItems(resolvedTopicPart.tocItems || []);
142
-
143
- // Add practice problems to the map
144
- practiceProblemsTocItems.forEach((p) => {
145
- if (p.elementId) {
146
- itemMap.set(p.elementId, p);
147
- }
148
- });
149
-
150
- // Rebuild TOC in document order using walkElements
151
- const result: ResolvedTocItem[] = [];
152
- const stack: ResolvedTocItem[] = [];
153
-
154
- await walkElements(
155
- resolvedTopicPart.proseElement,
156
- (element) => {
157
- if (element.id && itemMap.has(element.id)) {
158
- const item = itemMap.get(element.id)!;
159
-
160
- if (item.type === 'heading') {
161
- // Pop headings at same or deeper level
162
- while (stack.length > 0) {
163
- const last = stack[stack.length - 1];
164
- if (
165
- last.type === 'heading' &&
166
- last.level >= item.level
167
- ) {
168
- stack.pop();
169
- } else {
170
- break;
171
- }
172
- }
173
-
174
- // Create new heading with empty children array
175
- const newItem: ResolvedTocItem = {
176
- ...item,
177
- children: [],
178
- };
179
-
180
- // Add to parent heading or root
181
- if (stack.length > 0) {
182
- const parent = stack[stack.length - 1];
183
- if (parent.type === 'heading') {
184
- parent.children.push(newItem);
185
- }
186
- } else {
187
- result.push(newItem);
188
- }
189
-
190
- stack.push(newItem);
191
- } else {
192
- // Non-heading item (problems, etc.)
193
- if (stack.length > 0) {
194
- const parent = stack[stack.length - 1];
195
- if (parent.type === 'heading') {
196
- parent.children.push(item);
197
- } else {
198
- result.push(item);
199
- }
200
- } else {
201
- result.push(item);
202
- }
203
- }
204
- }
205
- },
206
- );
207
-
208
- finalTocItems = result;
209
- }
210
-
211
- await ERUDIT.db.insert(ERUDIT.db.schema.contentToc).values({
212
- fullId: topicNode.fullId,
213
- topicPart,
214
- toc: finalTocItems,
215
- });
216
-
217
- await ERUDIT.db
218
- .update(ERUDIT.db.schema.topics)
219
- .set({
220
- [topicPart]: resolvedTopicPart.proseElement,
221
- })
222
- .where(
223
- eq(ERUDIT.db.schema.topics.fullId, topicNode.fullId),
224
- );
225
-
226
- await insertContentResolved(
227
- topicNode.fullId,
228
- topicPart,
229
- resolvedTopicPart,
230
- );
231
- }
232
- }
233
-
234
- for (const [schemaName, count] of Object.entries(elementsCount)) {
235
- await ERUDIT.repository.content.addElementCount(
236
- topicNode.fullId,
237
- schemaName,
238
- count,
239
- );
240
- }
241
- } catch (error) {
242
- logContentError(topicNode);
243
- //console.log(error);
244
- throw error;
245
- }
246
- }
1
+ import { eq } from 'drizzle-orm';
2
+ import {
3
+ isDocument,
4
+ isRawElement,
5
+ walkElements,
6
+ type AnyDocument,
7
+ type AnySchema,
8
+ } from '@jsprose/core';
9
+ import {
10
+ topicParts,
11
+ type TopicContentItem,
12
+ } from '@erudit-js/core/content/topic';
13
+ import { isContentItem } from '@erudit-js/core/content/item';
14
+ import {
15
+ isIncludedRawElement,
16
+ type EruditRawElement,
17
+ type ResolvedTocItem,
18
+ } from '@erudit-js/prose';
19
+ import { problemSchema } from '@erudit-js/prose/elements/problem/problem';
20
+ import { problemsSchema } from '@erudit-js/prose/elements/problem/problems';
21
+
22
+ import type { ContentNavNode } from '../nav/types';
23
+ import { logContentError } from './utils/contentError';
24
+ import { insertContentItem } from './utils/insertContentItem';
25
+ import { resolveEruditProse } from '../../prose/repository/resolve';
26
+ import { insertContentResolved } from './utils/insertContentResolved';
27
+
28
+ export async function resolveTopic(topicNode: ContentNavNode) {
29
+ ERUDIT.log.debug.start(
30
+ `Resolving topic ${ERUDIT.log.stress(topicNode.fullId)}...`,
31
+ );
32
+
33
+ try {
34
+ const topicModule = await ERUDIT.import<{ default: TopicContentItem }>(
35
+ ERUDIT.paths.project(`content/${topicNode.contentRelPath}/topic`),
36
+ );
37
+
38
+ if (!isContentItem<TopicContentItem>(topicModule?.default, 'topic')) {
39
+ throw new Error('Topic default export must be a topic content item!');
40
+ }
41
+
42
+ await insertContentItem(topicNode, topicModule.default);
43
+ await ERUDIT.db.insert(ERUDIT.db.schema.topics).values({
44
+ fullId: topicNode.fullId,
45
+ });
46
+
47
+ const elementsCount: Record<string, number> = {};
48
+
49
+ for (const topicPart of topicParts) {
50
+ const topicPartDocument = await ERUDIT.import<{
51
+ default: AnyDocument;
52
+ }>(
53
+ ERUDIT.paths.project(
54
+ `content/${topicNode.contentRelPath}/${topicPart}`,
55
+ ),
56
+ { try: true },
57
+ );
58
+
59
+ if (isDocument(topicPartDocument?.default)) {
60
+ const practiceProblemsTocItems: ResolvedTocItem[] = [];
61
+
62
+ const resolvedTopicPart = await resolveEruditProse(
63
+ topicPartDocument.default.content,
64
+ true,
65
+ async ({ rawElement, proseElement }) => {
66
+ //
67
+ // Auto-adding problems to TOC if in practice topic part
68
+ //
69
+
70
+ if (topicPart === 'practice') {
71
+ if (
72
+ (rawElement as EruditRawElement<AnySchema>).title &&
73
+ proseElement.id
74
+ ) {
75
+ if (
76
+ isRawElement(rawElement, problemSchema) ||
77
+ isRawElement(rawElement, problemsSchema)
78
+ ) {
79
+ practiceProblemsTocItems.push({
80
+ type: 'element',
81
+ elementId: proseElement.id,
82
+ schemaName: rawElement.schemaName,
83
+ title: (rawElement as EruditRawElement<AnySchema>).title!,
84
+ });
85
+ }
86
+ }
87
+ }
88
+
89
+ //
90
+ // Counting elements for statistics
91
+ //
92
+
93
+ if (isIncludedRawElement(rawElement)) {
94
+ return;
95
+ }
96
+
97
+ if (
98
+ ERUDIT.config.countElements.flat().includes(rawElement.schemaName)
99
+ ) {
100
+ elementsCount[rawElement.schemaName] =
101
+ (elementsCount[rawElement.schemaName] || 0) + 1;
102
+ }
103
+ },
104
+ );
105
+
106
+ let finalTocItems = resolvedTopicPart.tocItems;
107
+
108
+ if (topicPart === 'practice' && practiceProblemsTocItems.length) {
109
+ // Map elementId -> TocItem for both headings and problems
110
+ const itemMap = new Map<string, ResolvedTocItem>();
111
+
112
+ // Collect all existing TOC items (headings) recursively
113
+ const collectItems = (items: ResolvedTocItem[]) => {
114
+ for (const item of items) {
115
+ if (item.elementId) {
116
+ itemMap.set(item.elementId, item);
117
+ }
118
+ if (item.type === 'heading' && item.children?.length) {
119
+ collectItems(item.children);
120
+ }
121
+ }
122
+ };
123
+ collectItems(resolvedTopicPart.tocItems || []);
124
+
125
+ // Add practice problems to the map
126
+ practiceProblemsTocItems.forEach((p) => {
127
+ if (p.elementId) {
128
+ itemMap.set(p.elementId, p);
129
+ }
130
+ });
131
+
132
+ // Rebuild TOC in document order using walkElements
133
+ const result: ResolvedTocItem[] = [];
134
+ const stack: ResolvedTocItem[] = [];
135
+
136
+ await walkElements(resolvedTopicPart.proseElement, (element) => {
137
+ if (element.id && itemMap.has(element.id)) {
138
+ const item = itemMap.get(element.id)!;
139
+
140
+ if (item.type === 'heading') {
141
+ // Pop headings at same or deeper level
142
+ while (stack.length > 0) {
143
+ const last = stack[stack.length - 1];
144
+ if (last.type === 'heading' && last.level >= item.level) {
145
+ stack.pop();
146
+ } else {
147
+ break;
148
+ }
149
+ }
150
+
151
+ // Create new heading with empty children array
152
+ const newItem: ResolvedTocItem = {
153
+ ...item,
154
+ children: [],
155
+ };
156
+
157
+ // Add to parent heading or root
158
+ if (stack.length > 0) {
159
+ const parent = stack[stack.length - 1];
160
+ if (parent.type === 'heading') {
161
+ parent.children.push(newItem);
162
+ }
163
+ } else {
164
+ result.push(newItem);
165
+ }
166
+
167
+ stack.push(newItem);
168
+ } else {
169
+ // Non-heading item (problems, etc.)
170
+ if (stack.length > 0) {
171
+ const parent = stack[stack.length - 1];
172
+ if (parent.type === 'heading') {
173
+ parent.children.push(item);
174
+ } else {
175
+ result.push(item);
176
+ }
177
+ } else {
178
+ result.push(item);
179
+ }
180
+ }
181
+ }
182
+ });
183
+
184
+ finalTocItems = result;
185
+ }
186
+
187
+ await ERUDIT.db.insert(ERUDIT.db.schema.contentToc).values({
188
+ fullId: topicNode.fullId,
189
+ topicPart,
190
+ toc: finalTocItems,
191
+ });
192
+
193
+ await ERUDIT.db
194
+ .update(ERUDIT.db.schema.topics)
195
+ .set({
196
+ [topicPart]: resolvedTopicPart.proseElement,
197
+ })
198
+ .where(eq(ERUDIT.db.schema.topics.fullId, topicNode.fullId));
199
+
200
+ await insertContentResolved(
201
+ topicNode.fullId,
202
+ topicPart,
203
+ resolvedTopicPart,
204
+ );
205
+ }
206
+ }
207
+
208
+ for (const [schemaName, count] of Object.entries(elementsCount)) {
209
+ await ERUDIT.repository.content.addElementCount(
210
+ topicNode.fullId,
211
+ schemaName,
212
+ count,
213
+ );
214
+ }
215
+ } catch (error) {
216
+ logContentError(topicNode);
217
+ //console.log(error);
218
+ throw error;
219
+ }
220
+ }