erudit 3.0.0-dev.2 → 3.0.0-dev.21

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 (321) hide show
  1. package/app/app.vue +195 -172
  2. package/app/assets/icons/cameo-add.svg +3 -0
  3. package/app/assets/icons/diamond.svg +3 -0
  4. package/app/assets/icons/graduation.svg +3 -0
  5. package/app/components/Avatar.vue +118 -0
  6. package/app/components/EruditLink.vue +17 -0
  7. package/app/components/Loading.vue +23 -23
  8. package/app/components/SiteAside.vue +393 -382
  9. package/app/components/SiteMain.vue +32 -35
  10. package/app/components/ads/Ads.vue +33 -0
  11. package/app/components/ads/AdsBannerAside.vue +61 -0
  12. package/app/components/ads/AdsBannerBottom.vue +22 -0
  13. package/app/components/ads/AdsProviderCustom.vue +35 -0
  14. package/app/components/ads/AdsProviderYandex.vue +91 -0
  15. package/app/components/ads/AdsReplacer.vue +73 -0
  16. package/app/components/aside/AsideListItem.vue +91 -74
  17. package/app/components/aside/AsideMajor.vue +56 -56
  18. package/app/components/aside/AsideMinor.vue +97 -71
  19. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  20. package/app/components/aside/major/PaneSwitch.vue +54 -54
  21. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  22. package/app/components/aside/major/SiteInfo.vue +85 -85
  23. package/app/components/aside/major/panes/Language.vue +79 -79
  24. package/app/components/aside/major/panes/Pages.vue +50 -34
  25. package/app/components/aside/major/panes/Search.vue +11 -11
  26. package/app/components/aside/major/panes/nav/Nav.vue +92 -91
  27. package/app/components/aside/major/panes/nav/NavBook.vue +95 -86
  28. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  29. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  30. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  31. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  32. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  33. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  34. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  35. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  36. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  37. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  38. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -15
  39. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  40. package/app/components/aside/major/panes/other/Other.vue +16 -16
  41. package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
  42. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  43. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  44. package/app/components/aside/minor/AsideMinorTopLink.vue +66 -67
  45. package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
  46. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
  47. package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
  48. package/app/components/aside/minor/topic/AsideMinorTopic.vue +31 -32
  49. package/app/components/aside/minor/topic/TopicContributors.vue +183 -177
  50. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  51. package/app/components/aside/minor/topic/TopicToc.vue +212 -203
  52. package/app/components/aside/minor/topic/TopicTocItem.vue +19 -31
  53. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  54. package/app/components/bitran/BitranContent.vue +90 -63
  55. package/app/components/bitran/RenderWrapper.vue +10 -10
  56. package/app/components/contributor/ContributorListItem.vue +43 -35
  57. package/app/components/main/MainActionButton.vue +51 -0
  58. package/app/components/main/MainBitranContent.vue +55 -0
  59. package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +63 -75
  60. package/app/components/main/MainDescription.vue +24 -0
  61. package/app/components/main/MainSection.vue +58 -0
  62. package/app/components/main/MainTitle.vue +76 -0
  63. package/app/components/main/cameo/MainCameo.vue +135 -0
  64. package/app/components/main/cameo/MainCameoData.vue +232 -0
  65. package/app/components/main/content/ContentBreadcrumb.vue +28 -0
  66. package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
  67. package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
  68. package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
  69. package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
  70. package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
  71. package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
  72. package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
  73. package/app/components/main/topic/MainTopic.vue +76 -79
  74. package/app/components/main/topic/TopicPartSwitch.vue +119 -118
  75. package/app/components/preview/Preview.vue +186 -177
  76. package/app/components/preview/PreviewDisplay.vue +139 -139
  77. package/app/components/preview/PreviewFooterAction.vue +73 -73
  78. package/app/components/preview/PreviewLoading.vue +14 -14
  79. package/app/components/preview/PreviewScreen.vue +141 -99
  80. package/app/components/preview/display/Alert.vue +50 -50
  81. package/app/components/preview/display/Custom.vue +18 -18
  82. package/app/components/preview/display/GenericLink.vue +48 -48
  83. package/app/components/preview/display/PageLink.vue +22 -20
  84. package/app/components/preview/display/Unique.vue +46 -49
  85. package/app/components/sponsor/SponsorTier1.vue +89 -0
  86. package/app/components/sponsor/SponsorTier2.vue +109 -0
  87. package/app/components/transition/Fade.vue +19 -19
  88. package/app/components/tree/TreeContainer.vue +11 -11
  89. package/app/components/tree/TreeItem.vue +93 -89
  90. package/app/composables/adsAllowed.ts +11 -0
  91. package/app/composables/asset.ts +12 -0
  92. package/app/composables/bitran.ts +108 -127
  93. package/app/composables/bitranLocation.ts +7 -7
  94. package/app/composables/contentData.ts +38 -36
  95. package/app/composables/contentPage.ts +168 -156
  96. package/app/composables/contentRoute.ts +45 -45
  97. package/app/composables/darkMagic.ts +24 -24
  98. package/app/composables/externalApi.ts +69 -63
  99. package/app/composables/favicon.ts +8 -8
  100. package/app/composables/formatText.ts +99 -86
  101. package/app/composables/head.ts +24 -0
  102. package/app/composables/majorPane.ts +62 -60
  103. package/app/composables/phrases.ts +77 -80
  104. package/app/composables/theme.ts +29 -29
  105. package/app/composables/url.ts +43 -33
  106. package/app/pages/_test/preview.vue +110 -110
  107. package/app/pages/article/[...articleId].vue +3 -3
  108. package/app/pages/book/[...bookId].vue +42 -47
  109. package/app/pages/contributor/[contributorId].vue +227 -0
  110. package/app/pages/contributors.vue +184 -0
  111. package/app/pages/group/[...groupId].vue +53 -65
  112. package/app/pages/index.vue +32 -32
  113. package/app/pages/practice/[...practice].vue +3 -3
  114. package/app/pages/sponsors.vue +95 -0
  115. package/app/pages/summary/[...summaryId].vue +3 -3
  116. package/app/plugins/analytics.ts +95 -0
  117. package/app/plugins/prerender.server.ts +34 -0
  118. package/app/public/favicon/article.svg +5 -5
  119. package/app/public/favicon/default.svg +3 -3
  120. package/app/public/favicon/practice.svg +3 -3
  121. package/app/public/favicon/summary.svg +4 -4
  122. package/app/public/logotype.svg +2 -2
  123. package/app/scripts/_immediate.js +9 -9
  124. package/app/scripts/aside/index.ts +59 -59
  125. package/app/scripts/aside/major/nav.ts +26 -26
  126. package/app/scripts/aside/minor/state.ts +37 -37
  127. package/app/scripts/flag.ts +28 -28
  128. package/app/scripts/og.ts +28 -27
  129. package/app/scripts/preview/build.ts +76 -73
  130. package/app/scripts/preview/data/alert.ts +19 -19
  131. package/app/scripts/preview/data/custom.ts +8 -8
  132. package/app/scripts/preview/data/genericLink.ts +24 -24
  133. package/app/scripts/preview/data/pageLink.ts +23 -20
  134. package/app/scripts/preview/data/unique.ts +69 -70
  135. package/app/scripts/preview/data.ts +24 -24
  136. package/app/scripts/preview/display.ts +37 -37
  137. package/app/scripts/preview/footer.ts +9 -9
  138. package/app/scripts/preview/request.ts +51 -51
  139. package/app/scripts/preview/state.ts +63 -63
  140. package/app/styles/_immediate.css +7 -7
  141. package/app/styles/_util.scss +43 -43
  142. package/app/styles/_utils.scss +44 -44
  143. package/app/styles/app.scss +91 -91
  144. package/app/styles/def/_bp.scss +27 -27
  145. package/app/styles/def/_size.scss +7 -7
  146. package/app/styles/def/_z.scss +5 -5
  147. package/app/styles/normalize.scss +49 -63
  148. package/app/styles/partials/_darkMagic.scss +5 -5
  149. package/app/styles/partials/_fnav.scss +15 -15
  150. package/app/styles/partials/_preview.scss +5 -5
  151. package/bin/erudit.mjs +2 -0
  152. package/const.ts +3 -0
  153. package/globalPath.ts +21 -21
  154. package/globals/bitran.ts +1 -47
  155. package/globals/cameo.ts +5 -0
  156. package/globals/content.ts +27 -22
  157. package/globals/contributor.ts +5 -5
  158. package/globals/erudit.ts +5 -5
  159. package/globals/register.ts +23 -18
  160. package/globals/sponsor.ts +17 -0
  161. package/languages/en.ts +108 -95
  162. package/languages/ru.ts +112 -99
  163. package/module/bitran.ts +66 -34
  164. package/module/config.ts +35 -34
  165. package/module/imports.ts +74 -46
  166. package/module/index.ts +47 -47
  167. package/module/logger.ts +10 -10
  168. package/module/paths.ts +22 -22
  169. package/module/restart.ts +61 -61
  170. package/nuxt.config.ts +126 -112
  171. package/package.json +22 -15
  172. package/server/api/aside/major/nav/bookIds.ts +5 -5
  173. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  174. package/server/api/aside/major/nav/global.ts +7 -7
  175. package/server/api/aside/minor/book/[...bookId].ts +18 -0
  176. package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
  177. package/server/api/aside/minor/group/[...groupId].ts +18 -0
  178. package/server/api/aside/minor/news.ts +7 -7
  179. package/server/api/aside/minor/topic.ts +36 -0
  180. package/server/api/bitran/content/[...location].ts +13 -0
  181. package/server/api/bitran/toc/[...location].ts +9 -0
  182. package/server/api/cameo/data/[cameoId].ts +42 -0
  183. package/server/api/cameo/ids.ts +5 -0
  184. package/server/api/content/data.ts +75 -72
  185. package/server/api/contributor/count.ts +6 -6
  186. package/server/api/contributor/list.ts +44 -0
  187. package/server/api/contributor/page/[contributorId].ts +14 -0
  188. package/server/api/fake/content.ts +11 -11
  189. package/server/api/fake/shared/languages.ts +12 -12
  190. package/server/api/language/functions.ts +12 -12
  191. package/server/api/language/phrase/[phraseId].ts +19 -19
  192. package/server/api/language/phraseIds.ts +8 -8
  193. package/server/api/prerender/assets/cameo.ts +14 -0
  194. package/server/api/prerender/assets/contributor.ts +12 -0
  195. package/server/api/prerender/assets/sponsor.ts +13 -0
  196. package/server/api/prerender/cameos.ts +12 -0
  197. package/server/api/prerender/language.ts +9 -0
  198. package/server/api/preview/page/[...parts].ts +78 -51
  199. package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
  200. package/server/api/problem/generator/[...path].ts +26 -0
  201. package/server/api/sponsor/cameo/data/[sponsorId].ts +51 -0
  202. package/server/api/sponsor/cameo/ids.ts +5 -0
  203. package/server/api/sponsor/count.ts +5 -0
  204. package/server/api/sponsor/list.ts +36 -0
  205. package/server/plugin/bitran/content.ts +252 -187
  206. package/server/plugin/bitran/{products → elements}/include.ts +229 -230
  207. package/server/plugin/bitran/location.ts +43 -25
  208. package/server/plugin/bitran/toc.ts +94 -83
  209. package/server/plugin/bitran/transpiler.ts +18 -46
  210. package/server/plugin/build/close.ts +12 -10
  211. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  212. package/server/plugin/build/jobs/content/generic.ts +191 -176
  213. package/server/plugin/build/jobs/content/parse.ts +113 -100
  214. package/server/plugin/build/jobs/content/path.ts +6 -6
  215. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  216. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  217. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  218. package/server/plugin/build/jobs/contributors.ts +69 -66
  219. package/server/plugin/build/jobs/language.ts +36 -36
  220. package/server/plugin/build/jobs/nav.ts +345 -210
  221. package/server/plugin/build/process.ts +34 -25
  222. package/server/plugin/build/rebuild.ts +68 -55
  223. package/server/plugin/build/setup.ts +19 -21
  224. package/server/plugin/content/context.ts +119 -112
  225. package/server/plugin/db/entities/Book.ts +7 -7
  226. package/server/plugin/db/entities/Content.ts +45 -49
  227. package/server/plugin/db/entities/Contribution.ts +10 -10
  228. package/server/plugin/db/entities/Contributor.ts +25 -16
  229. package/server/plugin/db/entities/File.ts +10 -0
  230. package/server/plugin/db/entities/Group.ts +14 -14
  231. package/server/plugin/db/entities/Hash.ts +15 -15
  232. package/server/plugin/db/entities/Topic.ts +20 -20
  233. package/server/plugin/db/entities/Unique.ts +21 -21
  234. package/server/plugin/db/reset.ts +12 -0
  235. package/server/plugin/db/setup.ts +49 -34
  236. package/server/plugin/global.ts +18 -18
  237. package/server/plugin/importer.ts +16 -12
  238. package/server/plugin/index.ts +9 -9
  239. package/server/plugin/logger.ts +23 -23
  240. package/server/plugin/nav/node.ts +27 -26
  241. package/server/plugin/nav/utils.ts +179 -129
  242. package/server/plugin/repository/asideMinor.ts +51 -0
  243. package/server/plugin/repository/book.ts +39 -21
  244. package/server/plugin/repository/cameo.ts +16 -0
  245. package/server/plugin/repository/content.ts +240 -238
  246. package/server/plugin/repository/contentId.ts +40 -0
  247. package/server/plugin/repository/contributor.ts +129 -8
  248. package/server/plugin/repository/file.ts +10 -0
  249. package/server/plugin/repository/frontNav.ts +145 -148
  250. package/server/plugin/repository/topic.ts +35 -32
  251. package/server/plugin/sponsor/build.ts +82 -0
  252. package/server/plugin/sponsor/index.ts +5 -0
  253. package/server/plugin/sponsor/repository.ts +56 -0
  254. package/server/routes/asset/[...assetPath].ts +34 -0
  255. package/server/routes/robots.txt.ts +9 -0
  256. package/server/routes/sitemap.xml.ts +103 -0
  257. package/server/tsconfig.json +9 -9
  258. package/shared/aside/minor.ts +55 -50
  259. package/shared/asset.ts +17 -15
  260. package/shared/bitran/content.ts +9 -0
  261. package/shared/bitran/contentId.ts +56 -0
  262. package/shared/bitran/toc.ts +8 -8
  263. package/shared/breadcrumb.ts +7 -0
  264. package/shared/content/bookId.ts +12 -0
  265. package/shared/content/context.ts +9 -9
  266. package/shared/content/data/base.ts +32 -32
  267. package/shared/content/data/index.ts +5 -5
  268. package/shared/content/data/type/book.ts +5 -5
  269. package/shared/content/data/type/group.ts +6 -6
  270. package/shared/content/data/type/topic.ts +11 -11
  271. package/shared/content/previousNext.ts +9 -9
  272. package/shared/contributor.ts +34 -5
  273. package/shared/frontNav.ts +41 -41
  274. package/shared/icons.ts +38 -38
  275. package/shared/image.ts +5 -5
  276. package/shared/link.ts +28 -25
  277. package/shared/popover.ts +8 -0
  278. package/shared/types/language.ts +84 -75
  279. package/shared/utils/objectsEqual.ts +4 -4
  280. package/shared/utils/stringColor.ts +9 -9
  281. package/test/contentId.test.ts +91 -0
  282. package/test/utils/url.test.ts +99 -0
  283. package/tsconfig.json +8 -8
  284. package/utils/contentPath.ts +67 -0
  285. package/utils/ext.ts +41 -0
  286. package/utils/stress.ts +9 -9
  287. package/utils/url.ts +23 -0
  288. package/app/components/ads/BannerTemplate.vue +0 -51
  289. package/app/components/ads/BottomBanner.vue +0 -45
  290. package/app/components/ads/LeftBanner.vue +0 -50
  291. package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
  292. package/app/components/contributor/ContributorAvatar.vue +0 -43
  293. package/app/components/main/utils/ContentDescription.vue +0 -19
  294. package/app/components/main/utils/ContentFlag.vue +0 -15
  295. package/app/components/main/utils/ContentSection.vue +0 -45
  296. package/app/components/main/utils/ContentTitle.vue +0 -39
  297. package/app/composables/bitranContent.ts +0 -37
  298. package/app/pages/members.vue +0 -6
  299. package/app/public/user.svg +0 -10
  300. package/app/scripts/aside/minor/topic.ts +0 -3
  301. package/app/styles/default.scss +0 -83
  302. package/server/api/aside/minor/path.ts +0 -78
  303. package/server/api/bitran/content/[location].ts +0 -7
  304. package/server/api/bitran/toc/[location].ts +0 -7
  305. package/server/plugin/bitran/products/link.ts +0 -116
  306. package/server/plugin/bitran/setup.ts +0 -9
  307. package/server/plugin/content/absoluteId.ts +0 -94
  308. package/shared/bitran/context.ts +0 -8
  309. package/shared/bitran/default.ts +0 -46
  310. package/shared/bitran/link/Link.vue +0 -167
  311. package/shared/bitran/link/factory.ts +0 -24
  312. package/shared/bitran/link/icon.svg +0 -3
  313. package/shared/bitran/link/languages/en.ts +0 -7
  314. package/shared/bitran/link/languages/ru.ts +0 -7
  315. package/shared/bitran/link/renderer.ts +0 -21
  316. package/shared/bitran/link/shared.ts +0 -17
  317. package/shared/bitran/link/target.ts +0 -134
  318. package/shared/bitran/link/transpiler.ts +0 -10
  319. package/shared/bitran/location.ts +0 -166
  320. package/test/bitran/link/target.test.ts +0 -141
  321. package/test/bitran/location.test.ts +0 -143
@@ -1,100 +1,113 @@
1
- import { ElementNode, walkForward } from '@bitran-js/core';
2
- import { type BitranTranspiler } from '@bitran-js/transpiler';
3
- import {
4
- AliasesNode,
5
- mergeAliases,
6
- NO_ALIASES,
7
- } from '@erudit-js/bitran-elements/aliases/shared';
8
- import { HeadingNode } from '@erudit-js/bitran-elements/heading/shared';
9
-
10
- import { createBitranTranspiler } from '@server/bitran/transpiler';
11
- import { ERUDIT_SERVER } from '@server/global';
12
- import { DbUnique } from '@server/db/entities/Unique';
13
-
14
- import type { BitranContext } from '@shared/bitran/context';
15
- import {
16
- stringifyBitranLocation,
17
- type BitranLocation,
18
- } from '@shared/bitran/location';
19
-
20
- let context: BitranContext = {} as any;
21
- let bitranTranspiler: BitranTranspiler;
22
-
23
- const blocksAfterHeading = 2;
24
-
25
- export async function parseBitranContent(
26
- location: BitranLocation,
27
- biCode: string,
28
- ) {
29
- // Reset Bitran context in order not to create core each time
30
- context.location = location;
31
- context.aliases = NO_ALIASES();
32
-
33
- bitranTranspiler ||= await createBitranTranspiler();
34
-
35
- // Tracking heading nodes to deal with them later
36
- const headings: HeadingNode[] = [];
37
-
38
- await bitranTranspiler.parser.parse(biCode, {
39
- async step(node) {
40
- const meta = node.meta;
41
- const uniqueId = meta?.id;
42
-
43
- if (node instanceof AliasesNode) {
44
- mergeAliases(context.aliases, node.parseData);
45
- }
46
-
47
- if (uniqueId) {
48
- if (node instanceof HeadingNode) {
49
- headings.push(node);
50
- return;
51
- }
52
-
53
- await addUnique(node);
54
- }
55
- },
56
- });
57
-
58
- for (const heading of headings) {
59
- let blocksAfter = 0;
60
- let content = await bitranTranspiler.stringifier.stringify(heading);
61
-
62
- await walkForward(heading, async (node) => {
63
- if (blocksAfter >= blocksAfterHeading) return false;
64
-
65
- if (node instanceof AliasesNode) return;
66
- // Spoiler
67
- // Todo
68
-
69
- content +=
70
- '\n\n' + (await bitranTranspiler.stringifier.stringify(node));
71
-
72
- blocksAfter++;
73
- });
74
-
75
- await addUnique(heading, content);
76
- }
77
-
78
- //
79
- //
80
- //
81
-
82
- function createUniqueLocation(node: ElementNode) {
83
- return stringifyBitranLocation({
84
- ...location,
85
- ...{ unique: node.meta.id! },
86
- });
87
- }
88
-
89
- async function addUnique(node: ElementNode, content?: string) {
90
- const dbUnique = new DbUnique();
91
- dbUnique.location = createUniqueLocation(node);
92
- dbUnique.content =
93
- content || (await bitranTranspiler.stringifier.stringify(node));
94
- dbUnique.title = node.parseData?.title || node.meta?.title;
95
- dbUnique.productName = node.name;
96
- dbUnique.context = context;
97
-
98
- await ERUDIT_SERVER.DB.manager.save(dbUnique);
99
- }
100
- }
1
+ import { ElementNode, walkForward } from '@bitran-js/core';
2
+ import { type BitranTranspiler } from '@bitran-js/transpiler';
3
+
4
+ import {
5
+ mergeAliases,
6
+ NO_ALIASES,
7
+ stringifyBitranLocation,
8
+ type BitranContext,
9
+ type BitranLocation,
10
+ } from '@erudit-js/cog/schema';
11
+ import { AliasesNode } from '@erudit-js/bitran-elements/aliases/shared';
12
+ import { DetailsNode } from '@erudit-js/bitran-elements/details/shared';
13
+ import { HeadingNode } from '@erudit-js/bitran-elements/heading/shared';
14
+
15
+ import { createBitranTranspiler } from '@server/bitran/transpiler';
16
+ import { ERUDIT_SERVER } from '@server/global';
17
+ import { DbUnique } from '@server/db/entities/Unique';
18
+
19
+ let context: BitranContext = {} as any;
20
+ let bitranTranspiler: BitranTranspiler;
21
+
22
+ const blocksAfterHeading = 2;
23
+
24
+ export async function parseBitranContent(
25
+ location: BitranLocation,
26
+ biCode: string,
27
+ ) {
28
+ // Reset Bitran context in order not to create core each time
29
+ context.location = location;
30
+ context.aliases = NO_ALIASES();
31
+
32
+ bitranTranspiler ||= await createBitranTranspiler({
33
+ context,
34
+ eruditConfig: ERUDIT_SERVER.CONFIG,
35
+ insideInclude: false,
36
+ });
37
+
38
+ // Tracking heading nodes to deal with them later
39
+ const headings: HeadingNode[] = [];
40
+
41
+ await bitranTranspiler.parser.parse(biCode, {
42
+ async step(node) {
43
+ const meta = node.meta;
44
+ const uniqueId = meta?.id;
45
+
46
+ if (node instanceof AliasesNode) {
47
+ mergeAliases(context.aliases, node.parseData);
48
+ }
49
+
50
+ if (uniqueId) {
51
+ if (node instanceof HeadingNode) {
52
+ headings.push(node);
53
+ return;
54
+ }
55
+
56
+ if (node instanceof DetailsNode) {
57
+ await addUnique(
58
+ node,
59
+ await bitranTranspiler.stringifier.stringify(
60
+ node.parseData,
61
+ ),
62
+ );
63
+ return;
64
+ }
65
+
66
+ await addUnique(node);
67
+ }
68
+ },
69
+ });
70
+
71
+ for (const heading of headings) {
72
+ let blocksAfter = 0;
73
+ let content = await bitranTranspiler.stringifier.stringify(heading);
74
+
75
+ await walkForward(heading, async (node) => {
76
+ if (blocksAfter >= blocksAfterHeading) return false;
77
+
78
+ if (node instanceof AliasesNode) return;
79
+ if (node instanceof DetailsNode) return;
80
+ // Todo
81
+
82
+ content +=
83
+ '\n\n' + (await bitranTranspiler.stringifier.stringify(node));
84
+
85
+ blocksAfter++;
86
+ });
87
+
88
+ await addUnique(heading, content);
89
+ }
90
+
91
+ //
92
+ //
93
+ //
94
+
95
+ function createUniqueLocation(node: ElementNode) {
96
+ return stringifyBitranLocation({
97
+ ...location,
98
+ ...{ unique: node.meta.id! },
99
+ });
100
+ }
101
+
102
+ async function addUnique(node: ElementNode, content?: string) {
103
+ const dbUnique = new DbUnique();
104
+ dbUnique.location = createUniqueLocation(node);
105
+ dbUnique.content =
106
+ content || (await bitranTranspiler.stringifier.stringify(node));
107
+ dbUnique.title = node.parseData?.title || node.meta?.title || null;
108
+ dbUnique.productName = node.name;
109
+ dbUnique.context = context;
110
+
111
+ await ERUDIT_SERVER.DB.manager.save(dbUnique);
112
+ }
113
+ }
@@ -1,6 +1,6 @@
1
- import { PROJECT_DIR } from '#erudit/globalPaths';
2
- import type { NavNode } from '@server/nav/node';
3
-
4
- export function contentItemPath(navNode: NavNode, path?: string) {
5
- return PROJECT_DIR + `/content/${navNode.path}${path ? '/' + path : ''}`;
6
- }
1
+ import { PROJECT_DIR } from '#erudit/globalPaths';
2
+ import type { NavNode } from '@server/nav/node';
3
+
4
+ export function contentItemPath(navNode: NavNode, path?: string) {
5
+ return PROJECT_DIR + `/content/${navNode.fsPath}${path ? '/' + path : ''}`;
6
+ }
@@ -1,9 +1,9 @@
1
- import { DbBook } from '@server/db/entities/Book';
2
- import { ERUDIT_SERVER } from '@server/global';
3
- import type { BuilderFunctionArgs } from '../builderArgs';
4
-
5
- export async function buildBook({ dbContent }: BuilderFunctionArgs) {
6
- const dbBook = new DbBook();
7
- dbBook.contentId = dbContent.contentId;
8
- await ERUDIT_SERVER.DB.manager.save(dbBook);
9
- }
1
+ import { DbBook } from '@server/db/entities/Book';
2
+ import { ERUDIT_SERVER } from '@server/global';
3
+ import type { BuilderFunctionArgs } from '../builderArgs';
4
+
5
+ export async function buildBook({ dbContent }: BuilderFunctionArgs) {
6
+ const dbBook = new DbBook();
7
+ dbBook.contentId = dbContent.contentId;
8
+ await ERUDIT_SERVER.DB.manager.save(dbBook);
9
+ }
@@ -1,37 +1,37 @@
1
- import { readFileSync } from 'node:fs';
2
- import type { GroupConfig } from 'erudit-cog/schema';
3
-
4
- import { DbGroup } from '@server/db/entities/Group';
5
- import { ERUDIT_SERVER } from '@erudit/server/plugin/global';
6
- import type { BuilderFunctionArgs } from '../builderArgs';
7
- import { contentItemPath } from '../path';
8
- import { parseBitranContent } from '../parse';
9
-
10
- export async function buildGroup({
11
- navNode,
12
- config,
13
- }: BuilderFunctionArgs<GroupConfig>) {
14
- const dbGroup = new DbGroup();
15
- dbGroup.contentId = navNode.id;
16
- dbGroup.type = config?.type || 'folder';
17
-
18
- try {
19
- const strContent = readFileSync(
20
- contentItemPath(navNode, 'content.bi'),
21
- 'utf-8',
22
- );
23
-
24
- if (strContent) {
25
- dbGroup.content = strContent;
26
- await parseBitranContent(
27
- {
28
- type: 'group',
29
- path: navNode.id,
30
- },
31
- strContent,
32
- );
33
- }
34
- } catch {}
35
-
36
- await ERUDIT_SERVER.DB.manager.save(dbGroup);
37
- }
1
+ import { readFileSync } from 'node:fs';
2
+ import type { GroupConfig } from '@erudit-js/cog/schema';
3
+
4
+ import { DbGroup } from '@server/db/entities/Group';
5
+ import { ERUDIT_SERVER } from '@erudit/server/plugin/global';
6
+ import type { BuilderFunctionArgs } from '../builderArgs';
7
+ import { contentItemPath } from '../path';
8
+ import { parseBitranContent } from '../parse';
9
+
10
+ export async function buildGroup({
11
+ navNode,
12
+ config,
13
+ }: BuilderFunctionArgs<GroupConfig>) {
14
+ const dbGroup = new DbGroup();
15
+ dbGroup.contentId = navNode.fullId;
16
+ dbGroup.type = config?.type || 'folder';
17
+
18
+ try {
19
+ const strContent = readFileSync(
20
+ contentItemPath(navNode, 'content.bi'),
21
+ 'utf-8',
22
+ );
23
+
24
+ if (strContent) {
25
+ dbGroup.content = strContent;
26
+ await parseBitranContent(
27
+ {
28
+ type: 'group',
29
+ path: dbGroup.contentId,
30
+ },
31
+ strContent,
32
+ );
33
+ }
34
+ } catch {}
35
+
36
+ await ERUDIT_SERVER.DB.manager.save(dbGroup);
37
+ }
@@ -1,36 +1,36 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { topicParts, type TopicPart } from 'erudit-cog/schema';
3
-
4
- import { ERUDIT_SERVER } from '@server/global';
5
- import { DbTopic } from '@server/db/entities/Topic';
6
- import type { BuilderFunctionArgs } from '../builderArgs';
7
- import { contentItemPath } from '../path';
8
- import { parseBitranContent } from '../parse';
9
-
10
- export async function buildTopic({ navNode }: BuilderFunctionArgs) {
11
- const dbTopic = new DbTopic();
12
- dbTopic.contentId = navNode.id;
13
- const existingTopicParts: TopicPart[] = [];
14
-
15
- for (const topicPart of topicParts) {
16
- const partPath = contentItemPath(navNode, `${topicPart}.bi`);
17
- const strContent =
18
- existsSync(partPath) && readFileSync(partPath, 'utf-8');
19
-
20
- if (strContent === false) continue;
21
-
22
- existingTopicParts.push(topicPart);
23
- dbTopic[topicPart] = strContent;
24
-
25
- await parseBitranContent(
26
- {
27
- type: topicPart,
28
- path: navNode.id,
29
- },
30
- strContent,
31
- );
32
- }
33
-
34
- dbTopic.parts = existingTopicParts;
35
- await ERUDIT_SERVER.DB.manager.save(dbTopic);
36
- }
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { topicParts, type TopicPart } from '@erudit-js/cog/schema';
3
+
4
+ import { ERUDIT_SERVER } from '@server/global';
5
+ import { DbTopic } from '@server/db/entities/Topic';
6
+ import type { BuilderFunctionArgs } from '../builderArgs';
7
+ import { contentItemPath } from '../path';
8
+ import { parseBitranContent } from '../parse';
9
+
10
+ export async function buildTopic({ navNode }: BuilderFunctionArgs) {
11
+ const dbTopic = new DbTopic();
12
+ dbTopic.contentId = navNode.fullId;
13
+ const existingTopicParts: TopicPart[] = [];
14
+
15
+ for (const topicPart of topicParts) {
16
+ const partPath = contentItemPath(navNode, `${topicPart}.bi`);
17
+ const strContent =
18
+ existsSync(partPath) && readFileSync(partPath, 'utf-8');
19
+
20
+ if (strContent === false) continue;
21
+
22
+ existingTopicParts.push(topicPart);
23
+ dbTopic[topicPart] = strContent;
24
+
25
+ await parseBitranContent(
26
+ {
27
+ type: topicPart,
28
+ path: dbTopic.contentId,
29
+ },
30
+ strContent,
31
+ );
32
+ }
33
+
34
+ dbTopic.parts = existingTopicParts;
35
+ await ERUDIT_SERVER.DB.manager.save(dbTopic);
36
+ }
@@ -1,66 +1,69 @@
1
- import { readFileSync } from 'node:fs';
2
- import { globSync } from 'glob';
3
- import path from 'node:path';
4
- import chalk from 'chalk';
5
- import { resolvePaths } from 'erudit-cog/kit';
6
- import type { ContributorConfig } from 'erudit-cog/schema';
7
-
8
- import { PROJECT_DIR } from '#erudit/globalPaths';
9
- import { stress } from '@erudit/utils/stress';
10
- import { debug, logger } from '@server/logger';
11
- import { ERUDIT_SERVER } from '@server/global';
12
- import { IMPORT } from '@server/importer';
13
- import { DbContributor } from '@server/db/entities/Contributor';
14
-
15
- export async function buildContributors() {
16
- debug.start('Building contributors...');
17
-
18
- const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
19
- for (const contributorPath of contributorPaths)
20
- await addContributor(resolvePaths(contributorPath));
21
-
22
- logger.success(
23
- `Contributors built successfully!`,
24
- chalk.dim(`(${contributorPaths.length})`),
25
- );
26
- }
27
-
28
- async function addContributor(contributorPath: string) {
29
- const contributorId = contributorPath.split('/').pop() as string;
30
-
31
- debug.start(`Adding contributor ${stress(contributorId)}...`);
32
-
33
- const avatarFilename = (() => {
34
- const avatarPaths = globSync(`${contributorPath}/avatar.*`);
35
- if (avatarPaths[0])
36
- return avatarPaths[0].split(path.sep).slice(-2).join('/');
37
-
38
- return undefined;
39
- })();
40
-
41
- const config: Partial<ContributorConfig> = await (async () => {
42
- try {
43
- return await IMPORT(`${contributorPath}/contributor`, {
44
- default: true,
45
- });
46
- } catch {
47
- return {};
48
- }
49
- })();
50
-
51
- const description = (() => {
52
- try {
53
- return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
54
- } catch {
55
- return undefined;
56
- }
57
- })();
58
-
59
- const dbContributor = new DbContributor();
60
- dbContributor.contributorId = contributorId;
61
- dbContributor.avatar = avatarFilename;
62
- dbContributor.displayName = config.displayName;
63
- dbContributor.description = description;
64
-
65
- await ERUDIT_SERVER.DB.manager.save(dbContributor);
66
- }
1
+ import { readFileSync } from 'node:fs';
2
+ import { globSync } from 'glob';
3
+ import path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { resolvePaths } from '@erudit-js/cog/kit';
6
+ import type { ContributorConfig } from '@erudit-js/cog/schema';
7
+
8
+ import { PROJECT_DIR } from '#erudit/globalPaths';
9
+ import { stress } from '@erudit/utils/stress';
10
+ import { debug, logger } from '@server/logger';
11
+ import { ERUDIT_SERVER } from '@server/global';
12
+ import { IMPORT } from '@server/importer';
13
+ import { DbContributor } from '@server/db/entities/Contributor';
14
+
15
+ export async function buildContributors() {
16
+ debug.start('Building contributors...');
17
+
18
+ const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
19
+ for (const contributorPath of contributorPaths)
20
+ await addContributor(resolvePaths(contributorPath));
21
+
22
+ logger.success(
23
+ `Contributors built successfully!`,
24
+ chalk.dim(`(${contributorPaths.length})`),
25
+ );
26
+ }
27
+
28
+ async function addContributor(contributorPath: string) {
29
+ const contributorId = contributorPath.split('/').pop() as string;
30
+
31
+ debug.start(`Adding contributor ${stress(contributorId)}...`);
32
+
33
+ const avatarFilename = (() => {
34
+ const avatarPaths = globSync(`${contributorPath}/avatar.*`);
35
+ if (avatarPaths[0])
36
+ return avatarPaths[0].split(path.sep).slice(-2).join('/');
37
+
38
+ return undefined;
39
+ })();
40
+
41
+ const config: Partial<ContributorConfig> = await (async () => {
42
+ try {
43
+ return await IMPORT(`${contributorPath}/contributor`, {
44
+ default: true,
45
+ });
46
+ } catch {
47
+ return {};
48
+ }
49
+ })();
50
+
51
+ const description = (() => {
52
+ try {
53
+ return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
54
+ } catch {
55
+ return undefined;
56
+ }
57
+ })();
58
+
59
+ const dbContributor = new DbContributor();
60
+ dbContributor.contributorId = contributorId;
61
+ dbContributor.avatar = avatarFilename;
62
+ dbContributor.displayName = config.displayName;
63
+ dbContributor.isEditor = Boolean(config.editor);
64
+ dbContributor.slogan = config.slogan;
65
+ dbContributor.links = config.links;
66
+ dbContributor.description = description;
67
+
68
+ await ERUDIT_SERVER.DB.manager.save(dbContributor);
69
+ }
@@ -1,36 +1,36 @@
1
- import { existsSync } from 'node:fs';
2
-
3
- import { ERUDIT_DIR } from '#erudit/globalPaths';
4
- import { stress } from '@erudit/utils/stress';
5
- import { ERUDIT_SERVER } from '@server/global';
6
- import { IMPORT } from '@server/importer';
7
-
8
- export async function setupLanguage() {
9
- const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
10
- const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
11
-
12
- if (!existsSync(languageFilePath))
13
- throw new Error(`Language file for ${stress(languageCode)} not found!`);
14
-
15
- try {
16
- const languageModule = await IMPORT(languageFilePath);
17
-
18
- if (!languageModule.default)
19
- throw new Error(
20
- `Language file for ${stress(languageCode)} is missing default export with phrases!`,
21
- );
22
-
23
- const { default: phrases, ...context } = { ...languageModule };
24
-
25
- ERUDIT_SERVER.LANGUAGE = {
26
- phrases,
27
- functions: Object.entries(context)
28
- .filter(([, value]) => typeof value === 'function')
29
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
30
- };
31
- } catch (error) {
32
- throw new Error(
33
- `Error while loading language ${stress(languageCode)}!\n\n${error}`,
34
- );
35
- }
36
- }
1
+ import { existsSync } from 'node:fs';
2
+
3
+ import { ERUDIT_DIR } from '#erudit/globalPaths';
4
+ import { stress } from '@erudit/utils/stress';
5
+ import { ERUDIT_SERVER } from '@server/global';
6
+ import { IMPORT } from '@server/importer';
7
+
8
+ export async function setupLanguage() {
9
+ const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
10
+ const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
11
+
12
+ if (!existsSync(languageFilePath))
13
+ throw new Error(`Language file for ${stress(languageCode)} not found!`);
14
+
15
+ try {
16
+ const languageModule = await IMPORT(languageFilePath);
17
+
18
+ if (!languageModule.default)
19
+ throw new Error(
20
+ `Language file for ${stress(languageCode)} is missing default export with phrases!`,
21
+ );
22
+
23
+ const { default: phrases, ...context } = { ...languageModule };
24
+
25
+ ERUDIT_SERVER.LANGUAGE = {
26
+ phrases,
27
+ functions: Object.entries(context)
28
+ .filter(([, value]) => typeof value === 'function')
29
+ .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
30
+ };
31
+ } catch (error) {
32
+ throw new Error(
33
+ `Error while loading language ${stress(languageCode)}!\n\n${error}`,
34
+ );
35
+ }
36
+ }