erudit 3.0.0-dev.15 → 3.0.0-dev.17

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 (243) hide show
  1. package/app/app.vue +191 -195
  2. package/app/components/Loading.vue +23 -23
  3. package/app/components/SiteAside.vue +393 -393
  4. package/app/components/SiteMain.vue +32 -32
  5. package/app/components/ads/Ads.vue +35 -0
  6. package/app/components/ads/AdsBannerAside.vue +61 -0
  7. package/app/components/ads/AdsBannerBottom.vue +22 -0
  8. package/app/components/ads/AdsProviderCustom.vue +35 -0
  9. package/app/components/ads/AdsProviderYandex.vue +54 -0
  10. package/app/components/ads/AdsReplacer.vue +73 -0
  11. package/app/components/aside/AsideListItem.vue +74 -74
  12. package/app/components/aside/AsideMajor.vue +56 -56
  13. package/app/components/aside/AsideMinor.vue +73 -71
  14. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  15. package/app/components/aside/major/PaneSwitch.vue +54 -54
  16. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  17. package/app/components/aside/major/SiteInfo.vue +85 -85
  18. package/app/components/aside/major/panes/Language.vue +79 -79
  19. package/app/components/aside/major/panes/Pages.vue +34 -34
  20. package/app/components/aside/major/panes/Search.vue +11 -11
  21. package/app/components/aside/major/panes/nav/Nav.vue +92 -92
  22. package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
  23. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  24. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  25. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  26. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  27. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  28. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  29. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  30. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  31. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  32. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  33. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
  34. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  35. package/app/components/aside/major/panes/other/Other.vue +16 -16
  36. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  37. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  38. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  39. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  40. package/app/components/aside/minor/Contribute.vue +145 -145
  41. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  42. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  43. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  44. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  45. package/app/components/aside/minor/topic/TopicToc.vue +214 -214
  46. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
  47. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  48. package/app/components/bitran/BitranContent.vue +91 -91
  49. package/app/components/bitran/RenderWrapper.vue +10 -10
  50. package/app/components/contributor/ContributorAvatar.vue +45 -45
  51. package/app/components/contributor/ContributorListItem.vue +35 -35
  52. package/app/components/main/topic/MainTopic.vue +88 -78
  53. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  54. package/app/components/main/utils/Breadcrumb.vue +74 -70
  55. package/app/components/main/utils/ContentDecoration.vue +29 -29
  56. package/app/components/main/utils/ContentDescription.vue +19 -19
  57. package/app/components/main/utils/ContentPopover.vue +188 -188
  58. package/app/components/main/utils/ContentPopovers.vue +111 -111
  59. package/app/components/main/utils/ContentReferences.vue +70 -70
  60. package/app/components/main/utils/ContentSection.vue +45 -45
  61. package/app/components/main/utils/ContentTitle.vue +63 -63
  62. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  63. package/app/components/main/utils/reference/ReferenceItem.vue +70 -70
  64. package/app/components/main/utils/reference/ReferenceSource.vue +120 -118
  65. package/app/components/preview/Preview.vue +186 -186
  66. package/app/components/preview/PreviewDisplay.vue +139 -139
  67. package/app/components/preview/PreviewFooterAction.vue +73 -73
  68. package/app/components/preview/PreviewLoading.vue +14 -14
  69. package/app/components/preview/PreviewScreen.vue +141 -141
  70. package/app/components/preview/display/Alert.vue +50 -50
  71. package/app/components/preview/display/Custom.vue +18 -18
  72. package/app/components/preview/display/GenericLink.vue +48 -48
  73. package/app/components/preview/display/PageLink.vue +22 -20
  74. package/app/components/preview/display/Unique.vue +55 -55
  75. package/app/components/transition/Fade.vue +19 -19
  76. package/app/components/tree/TreeContainer.vue +11 -11
  77. package/app/components/tree/TreeItem.vue +89 -89
  78. package/app/composables/bitran.ts +108 -108
  79. package/app/composables/bitranContent.ts +92 -92
  80. package/app/composables/bitranLocation.ts +7 -7
  81. package/app/composables/contentData.ts +38 -38
  82. package/app/composables/contentPage.ts +158 -158
  83. package/app/composables/contentRoute.ts +45 -45
  84. package/app/composables/darkMagic.ts +24 -24
  85. package/app/composables/externalApi.ts +69 -63
  86. package/app/composables/favicon.ts +8 -8
  87. package/app/composables/formatText.ts +99 -99
  88. package/app/composables/majorPane.ts +60 -60
  89. package/app/composables/phrases.ts +65 -65
  90. package/app/composables/theme.ts +29 -29
  91. package/app/composables/url.ts +33 -33
  92. package/app/pages/_test/preview.vue +110 -110
  93. package/app/pages/article/[...articleId].vue +3 -3
  94. package/app/pages/book/[...bookId].vue +47 -47
  95. package/app/pages/group/[...groupId].vue +66 -64
  96. package/app/pages/index.vue +32 -32
  97. package/app/pages/members.vue +6 -6
  98. package/app/pages/practice/[...practice].vue +3 -3
  99. package/app/pages/summary/[...summaryId].vue +3 -3
  100. package/app/plugins/analytics.ts +87 -0
  101. package/app/plugins/prerender.server.ts +22 -22
  102. package/app/scripts/_immediate.js +9 -9
  103. package/app/scripts/aside/index.ts +59 -59
  104. package/app/scripts/aside/major/nav.ts +26 -26
  105. package/app/scripts/aside/minor/state.ts +37 -37
  106. package/app/scripts/aside/minor/topic.ts +3 -3
  107. package/app/scripts/flag.ts +28 -28
  108. package/app/scripts/og.ts +27 -27
  109. package/app/scripts/preview/build.ts +76 -76
  110. package/app/scripts/preview/data/alert.ts +19 -19
  111. package/app/scripts/preview/data/custom.ts +8 -8
  112. package/app/scripts/preview/data/genericLink.ts +24 -24
  113. package/app/scripts/preview/data/pageLink.ts +23 -23
  114. package/app/scripts/preview/data/unique.ts +72 -72
  115. package/app/scripts/preview/data.ts +24 -24
  116. package/app/scripts/preview/display.ts +37 -37
  117. package/app/scripts/preview/footer.ts +9 -9
  118. package/app/scripts/preview/request.ts +51 -51
  119. package/app/scripts/preview/state.ts +63 -63
  120. package/app/styles/_immediate.css +7 -7
  121. package/app/styles/_util.scss +43 -43
  122. package/app/styles/_utils.scss +44 -44
  123. package/app/styles/app.scss +91 -91
  124. package/app/styles/def/_bp.scss +27 -27
  125. package/app/styles/def/_size.scss +7 -7
  126. package/app/styles/def/_z.scss +5 -5
  127. package/app/styles/normalize.scss +49 -49
  128. package/app/styles/partials/_darkMagic.scss +5 -5
  129. package/app/styles/partials/_fnav.scss +15 -15
  130. package/app/styles/partials/_preview.scss +5 -5
  131. package/bin/erudit.mjs +2 -2
  132. package/const.ts +4 -4
  133. package/globalPath.ts +21 -21
  134. package/globals/bitran.ts +1 -1
  135. package/globals/content.ts +27 -27
  136. package/globals/contributor.ts +5 -5
  137. package/globals/erudit.ts +5 -5
  138. package/globals/register.ts +18 -18
  139. package/languages/en.ts +94 -94
  140. package/languages/ru.ts +98 -98
  141. package/module/bitran.ts +66 -66
  142. package/module/config.ts +35 -35
  143. package/module/imports.ts +67 -67
  144. package/module/index.ts +47 -49
  145. package/module/logger.ts +10 -10
  146. package/module/paths.ts +22 -22
  147. package/module/restart.ts +61 -61
  148. package/nuxt.config.ts +131 -134
  149. package/package.json +8 -7
  150. package/server/api/aside/major/nav/bookIds.ts +5 -5
  151. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  152. package/server/api/aside/major/nav/global.ts +7 -7
  153. package/server/api/aside/minor/news.ts +7 -7
  154. package/server/api/aside/minor/path.ts +82 -82
  155. package/server/api/bitran/content/[...location].ts +10 -10
  156. package/server/api/bitran/toc/[...location].ts +9 -9
  157. package/server/api/content/data.ts +75 -75
  158. package/server/api/contributor/count.ts +6 -6
  159. package/server/api/fake/content.ts +11 -11
  160. package/server/api/fake/shared/languages.ts +12 -12
  161. package/server/api/language/functions.ts +12 -12
  162. package/server/api/language/phrase/[phraseId].ts +19 -19
  163. package/server/api/language/phraseIds.ts +8 -8
  164. package/server/api/prerender.ts +120 -120
  165. package/server/api/preview/page/[...parts].ts +78 -78
  166. package/server/api/preview/unique/[...location].ts +61 -61
  167. package/server/api/problem/generator/[...path].ts +26 -0
  168. package/server/plugin/bitran/content.ts +190 -190
  169. package/server/plugin/bitran/elements/include.ts +229 -229
  170. package/server/plugin/bitran/location.ts +39 -39
  171. package/server/plugin/bitran/toc.ts +94 -94
  172. package/server/plugin/bitran/transpiler.ts +18 -18
  173. package/server/plugin/build/close.ts +12 -12
  174. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  175. package/server/plugin/build/jobs/content/generic.ts +191 -191
  176. package/server/plugin/build/jobs/content/parse.ts +113 -113
  177. package/server/plugin/build/jobs/content/path.ts +6 -6
  178. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  179. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  180. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  181. package/server/plugin/build/jobs/contributors.ts +66 -66
  182. package/server/plugin/build/jobs/language.ts +36 -36
  183. package/server/plugin/build/jobs/nav.ts +345 -265
  184. package/server/plugin/build/process.ts +32 -32
  185. package/server/plugin/build/rebuild.ts +66 -66
  186. package/server/plugin/build/setup.ts +19 -19
  187. package/server/plugin/content/context.ts +119 -119
  188. package/server/plugin/db/entities/Book.ts +7 -7
  189. package/server/plugin/db/entities/Content.ts +45 -45
  190. package/server/plugin/db/entities/Contribution.ts +10 -10
  191. package/server/plugin/db/entities/Contributor.ts +16 -16
  192. package/server/plugin/db/entities/File.ts +10 -10
  193. package/server/plugin/db/entities/Group.ts +14 -14
  194. package/server/plugin/db/entities/Hash.ts +15 -15
  195. package/server/plugin/db/entities/Topic.ts +20 -20
  196. package/server/plugin/db/entities/Unique.ts +21 -21
  197. package/server/plugin/db/reset.ts +12 -12
  198. package/server/plugin/db/setup.ts +49 -49
  199. package/server/plugin/global.ts +16 -16
  200. package/server/plugin/importer.ts +16 -16
  201. package/server/plugin/index.ts +9 -9
  202. package/server/plugin/logger.ts +23 -23
  203. package/server/plugin/nav/node.ts +27 -27
  204. package/server/plugin/nav/utils.ts +175 -175
  205. package/server/plugin/repository/book.ts +21 -21
  206. package/server/plugin/repository/content.ts +240 -240
  207. package/server/plugin/repository/contentId.ts +40 -40
  208. package/server/plugin/repository/contributor.ts +8 -8
  209. package/server/plugin/repository/file.ts +10 -10
  210. package/server/plugin/repository/frontNav.ts +145 -145
  211. package/server/plugin/repository/topic.ts +35 -35
  212. package/server/tsconfig.json +9 -9
  213. package/shared/aside/minor.ts +51 -51
  214. package/shared/asset.ts +22 -22
  215. package/shared/bitran/contentId.ts +56 -56
  216. package/shared/bitran/stringContent.ts +6 -6
  217. package/shared/bitran/toc.ts +8 -8
  218. package/shared/content/bookId.ts +12 -12
  219. package/shared/content/context.ts +9 -9
  220. package/shared/content/data/base.ts +32 -32
  221. package/shared/content/data/index.ts +5 -5
  222. package/shared/content/data/type/book.ts +5 -5
  223. package/shared/content/data/type/group.ts +6 -6
  224. package/shared/content/data/type/topic.ts +11 -11
  225. package/shared/content/previousNext.ts +9 -9
  226. package/shared/contributor.ts +5 -5
  227. package/shared/frontNav.ts +41 -41
  228. package/shared/icons.ts +38 -38
  229. package/shared/image.ts +5 -5
  230. package/shared/link.ts +28 -28
  231. package/shared/popover.ts +8 -8
  232. package/shared/types/language.ts +74 -74
  233. package/shared/utils/objectsEqual.ts +4 -4
  234. package/shared/utils/stringColor.ts +9 -9
  235. package/test/contentId.test.ts +91 -91
  236. package/tsconfig.json +8 -8
  237. package/utils/contentPath.ts +67 -67
  238. package/utils/slash.ts +11 -11
  239. package/utils/stress.ts +9 -9
  240. package/app/components/ads/BannerTemplate.vue +0 -51
  241. package/app/components/ads/BottomBanner.vue +0 -45
  242. package/app/components/ads/LeftBanner.vue +0 -50
  243. package/module/problemGenerators.ts +0 -46
@@ -1,145 +1,145 @@
1
- import type {
2
- FrontNav,
3
- FrontNavBase,
4
- FrontNavBook,
5
- FrontNavFolder,
6
- FrontNavItem,
7
- FrontNavSeparator,
8
- FrontNavTopic,
9
- } from '@erudit/shared/frontNav';
10
-
11
- import type { NavNode, RootNavNode } from '@server/nav/node';
12
- import { ERUDIT_SERVER } from '@server/global';
13
- import { DbContent } from '@server/db/entities/Content';
14
- import { DbGroup } from '@server/db/entities/Group';
15
-
16
- import { getTopicPart } from './topic';
17
-
18
- export async function createGlobalFrontNav(
19
- from: RootNavNode | NavNode | undefined,
20
- ): Promise<FrontNav | []> {
21
- if (!from || !from.children) return [];
22
-
23
- return await Promise.all(
24
- from.children.map((node) =>
25
- toFrontNavItem({ node, level: 0, includeBookNav: true }),
26
- ),
27
- );
28
- }
29
-
30
- export async function createBookFrontNav(from: NavNode): Promise<FrontNavBook> {
31
- return await toFrontNavBook({ node: from, level: 0, includeBookNav: true });
32
- }
33
-
34
- type ToFuncArg = {
35
- node: NavNode;
36
- level: number;
37
- includeBookNav?: boolean;
38
- };
39
-
40
- async function toFrontNavItem(arg: ToFuncArg): Promise<FrontNavItem> {
41
- switch (arg.node.type) {
42
- case 'book':
43
- return await toFrontNavBook(arg);
44
- case 'topic':
45
- return await toFrontNavTopic(arg);
46
- case 'group':
47
- const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
48
- select: ['type'],
49
- where: { contentId: arg.node.fullId },
50
- });
51
-
52
- if (!dbGroup)
53
- throw new Error(
54
- `Missing group content item "${arg.node.fullId}" when creating front nav!`,
55
- );
56
-
57
- if (dbGroup.type === 'folder') return await toFrontNavFolder(arg);
58
- else return await toFrontNavSeparator(arg);
59
- }
60
- }
61
-
62
- async function toFrontNavBook({
63
- node,
64
- level,
65
- includeBookNav,
66
- }: ToFuncArg): Promise<FrontNavBook> {
67
- return {
68
- type: 'book',
69
- children: await toFrontNavChildren({
70
- node,
71
- level: 0,
72
- includeBookNav,
73
- }),
74
- ...(await toFrontNavBase({ node, level })),
75
- };
76
- }
77
-
78
- async function toFrontNavSeparator({
79
- node,
80
- level,
81
- includeBookNav,
82
- }: ToFuncArg): Promise<FrontNavSeparator> {
83
- return {
84
- type: 'separator',
85
- children: await toFrontNavChildren({ node, level, includeBookNav }),
86
- ...(await toFrontNavBase({ node, level })),
87
- };
88
- }
89
-
90
- async function toFrontNavFolder({
91
- node,
92
- level,
93
- includeBookNav,
94
- }: ToFuncArg): Promise<FrontNavFolder> {
95
- return {
96
- type: 'folder',
97
- children: await toFrontNavChildren({
98
- node,
99
- level: level + 1,
100
- includeBookNav,
101
- }),
102
- ...(await toFrontNavBase({ node, level })),
103
- };
104
- }
105
-
106
- async function toFrontNavTopic({
107
- node,
108
- level,
109
- }: ToFuncArg): Promise<FrontNavTopic> {
110
- const topicPart = await getTopicPart(node.fullId);
111
- return {
112
- type: 'topic',
113
- part: topicPart,
114
- ...(await toFrontNavBase({ node, level })),
115
- };
116
- }
117
-
118
- async function toFrontNavBase({
119
- node,
120
- level,
121
- }: ToFuncArg): Promise<Omit<FrontNavBase, 'type'>> {
122
- const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
123
- select: ['title', 'navTitle', 'flags'],
124
- where: { contentId: node.fullId },
125
- });
126
-
127
- return {
128
- id: node.shortId,
129
- fullId: node.fullId,
130
- level,
131
- flags: dbContent?.flags,
132
- label: dbContent?.navTitle || dbContent?.title || node.idPart,
133
- };
134
- }
135
-
136
- async function toFrontNavChildren({ node, includeBookNav, level }: ToFuncArg) {
137
- if (node.type === 'book' && !includeBookNav) return undefined;
138
- if (!node.children) return undefined;
139
-
140
- return Promise.all(
141
- node.children!.map((child) =>
142
- toFrontNavItem({ node: child, level, includeBookNav }),
143
- ),
144
- );
145
- }
1
+ import type {
2
+ FrontNav,
3
+ FrontNavBase,
4
+ FrontNavBook,
5
+ FrontNavFolder,
6
+ FrontNavItem,
7
+ FrontNavSeparator,
8
+ FrontNavTopic,
9
+ } from '@erudit/shared/frontNav';
10
+
11
+ import type { NavNode, RootNavNode } from '@server/nav/node';
12
+ import { ERUDIT_SERVER } from '@server/global';
13
+ import { DbContent } from '@server/db/entities/Content';
14
+ import { DbGroup } from '@server/db/entities/Group';
15
+
16
+ import { getTopicPart } from './topic';
17
+
18
+ export async function createGlobalFrontNav(
19
+ from: RootNavNode | NavNode | undefined,
20
+ ): Promise<FrontNav | []> {
21
+ if (!from || !from.children) return [];
22
+
23
+ return await Promise.all(
24
+ from.children.map((node) =>
25
+ toFrontNavItem({ node, level: 0, includeBookNav: true }),
26
+ ),
27
+ );
28
+ }
29
+
30
+ export async function createBookFrontNav(from: NavNode): Promise<FrontNavBook> {
31
+ return await toFrontNavBook({ node: from, level: 0, includeBookNav: true });
32
+ }
33
+
34
+ type ToFuncArg = {
35
+ node: NavNode;
36
+ level: number;
37
+ includeBookNav?: boolean;
38
+ };
39
+
40
+ async function toFrontNavItem(arg: ToFuncArg): Promise<FrontNavItem> {
41
+ switch (arg.node.type) {
42
+ case 'book':
43
+ return await toFrontNavBook(arg);
44
+ case 'topic':
45
+ return await toFrontNavTopic(arg);
46
+ case 'group':
47
+ const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
48
+ select: ['type'],
49
+ where: { contentId: arg.node.fullId },
50
+ });
51
+
52
+ if (!dbGroup)
53
+ throw new Error(
54
+ `Missing group content item "${arg.node.fullId}" when creating front nav!`,
55
+ );
56
+
57
+ if (dbGroup.type === 'folder') return await toFrontNavFolder(arg);
58
+ else return await toFrontNavSeparator(arg);
59
+ }
60
+ }
61
+
62
+ async function toFrontNavBook({
63
+ node,
64
+ level,
65
+ includeBookNav,
66
+ }: ToFuncArg): Promise<FrontNavBook> {
67
+ return {
68
+ type: 'book',
69
+ children: await toFrontNavChildren({
70
+ node,
71
+ level: 0,
72
+ includeBookNav,
73
+ }),
74
+ ...(await toFrontNavBase({ node, level })),
75
+ };
76
+ }
77
+
78
+ async function toFrontNavSeparator({
79
+ node,
80
+ level,
81
+ includeBookNav,
82
+ }: ToFuncArg): Promise<FrontNavSeparator> {
83
+ return {
84
+ type: 'separator',
85
+ children: await toFrontNavChildren({ node, level, includeBookNav }),
86
+ ...(await toFrontNavBase({ node, level })),
87
+ };
88
+ }
89
+
90
+ async function toFrontNavFolder({
91
+ node,
92
+ level,
93
+ includeBookNav,
94
+ }: ToFuncArg): Promise<FrontNavFolder> {
95
+ return {
96
+ type: 'folder',
97
+ children: await toFrontNavChildren({
98
+ node,
99
+ level: level + 1,
100
+ includeBookNav,
101
+ }),
102
+ ...(await toFrontNavBase({ node, level })),
103
+ };
104
+ }
105
+
106
+ async function toFrontNavTopic({
107
+ node,
108
+ level,
109
+ }: ToFuncArg): Promise<FrontNavTopic> {
110
+ const topicPart = await getTopicPart(node.fullId);
111
+ return {
112
+ type: 'topic',
113
+ part: topicPart,
114
+ ...(await toFrontNavBase({ node, level })),
115
+ };
116
+ }
117
+
118
+ async function toFrontNavBase({
119
+ node,
120
+ level,
121
+ }: ToFuncArg): Promise<Omit<FrontNavBase, 'type'>> {
122
+ const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
123
+ select: ['title', 'navTitle', 'flags'],
124
+ where: { contentId: node.fullId },
125
+ });
126
+
127
+ return {
128
+ id: node.shortId,
129
+ fullId: node.fullId,
130
+ level,
131
+ flags: dbContent?.flags,
132
+ label: dbContent?.navTitle || dbContent?.title || node.idPart,
133
+ };
134
+ }
135
+
136
+ async function toFrontNavChildren({ node, includeBookNav, level }: ToFuncArg) {
137
+ if (node.type === 'book' && !includeBookNav) return undefined;
138
+ if (!node.children) return undefined;
139
+
140
+ return Promise.all(
141
+ node.children!.map((child) =>
142
+ toFrontNavItem({ node: child, level, includeBookNav }),
143
+ ),
144
+ );
145
+ }
@@ -1,35 +1,35 @@
1
- import type { TopicPart } from '@erudit-js/cog/schema';
2
-
3
- import { ERUDIT_SERVER } from '@server/global';
4
- import { DbTopic } from '@server/db/entities/Topic';
5
- import { getShortContentId } from '@server/repository/contentId';
6
-
7
- import type { TopicPartLinks } from '@shared/content/data/type/topic';
8
- import { createTopicPartLink } from '@shared/link';
9
-
10
- export async function getTopicParts(contentId: string) {
11
- const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
12
- select: ['parts'],
13
- where: { contentId },
14
- });
15
-
16
- if (!dbTopic) throw new Error(`Missing topic "${contentId}".`);
17
-
18
- return dbTopic.parts;
19
- }
20
-
21
- export async function getTopicPart(contentId: string): Promise<TopicPart> {
22
- const topicParts = await getTopicParts(contentId);
23
- return topicParts.shift()!;
24
- }
25
-
26
- export async function getTopicPartsLinks(topicId: string) {
27
- const existingTopicParts = await getTopicParts(topicId);
28
- const shortTopicId = await getShortContentId(topicId);
29
- const links: TopicPartLinks = {};
30
-
31
- for (const topicPart of existingTopicParts)
32
- links[topicPart] = createTopicPartLink(topicPart, shortTopicId);
33
-
34
- return links;
35
- }
1
+ import type { TopicPart } from '@erudit-js/cog/schema';
2
+
3
+ import { ERUDIT_SERVER } from '@server/global';
4
+ import { DbTopic } from '@server/db/entities/Topic';
5
+ import { getShortContentId } from '@server/repository/contentId';
6
+
7
+ import type { TopicPartLinks } from '@shared/content/data/type/topic';
8
+ import { createTopicPartLink } from '@shared/link';
9
+
10
+ export async function getTopicParts(contentId: string) {
11
+ const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
12
+ select: ['parts'],
13
+ where: { contentId },
14
+ });
15
+
16
+ if (!dbTopic) throw new Error(`Missing topic "${contentId}".`);
17
+
18
+ return dbTopic.parts;
19
+ }
20
+
21
+ export async function getTopicPart(contentId: string): Promise<TopicPart> {
22
+ const topicParts = await getTopicParts(contentId);
23
+ return topicParts.shift()!;
24
+ }
25
+
26
+ export async function getTopicPartsLinks(topicId: string) {
27
+ const existingTopicParts = await getTopicParts(topicId);
28
+ const shortTopicId = await getShortContentId(topicId);
29
+ const links: TopicPartLinks = {};
30
+
31
+ for (const topicPart of existingTopicParts)
32
+ links[topicPart] = createTopicPartLink(topicPart, shortTopicId);
33
+
34
+ return links;
35
+ }
@@ -1,9 +1,9 @@
1
- {
2
- "extends": "../../../playground/.erudit/nuxt/.nuxt/tsconfig.server.json",
3
- "compilerOptions": {
4
- "verbatimModuleSyntax": true,
5
- "experimentalDecorators": true,
6
- "emitDecoratorMetadata": true
7
- },
8
- "exclude": ["../module/**/*", "../globalPath.ts"]
9
- }
1
+ {
2
+ "extends": "../../../playground/.erudit/nuxt/.nuxt/tsconfig.server.json",
3
+ "compilerOptions": {
4
+ "verbatimModuleSyntax": true,
5
+ "experimentalDecorators": true,
6
+ "emitDecoratorMetadata": true
7
+ },
8
+ "exclude": ["../module/**/*", "../globalPath.ts"]
9
+ }
@@ -1,51 +1,51 @@
1
- import type { BitranLocation } from '@erudit-js/cog/schema';
2
-
3
- import type { Toc } from '../bitran/toc';
4
- import type { PreviousNextItem } from '../content/previousNext';
5
- import type { ContentContributor } from '../contributor';
6
-
7
- interface AsideMinorBase {
8
- type: AsideMinorType;
9
- }
10
-
11
- export type AsideMinorType =
12
- | 'topic'
13
- | 'group'
14
- | 'book'
15
- | 'contributor'
16
- | 'news';
17
-
18
- export interface AsideMinorTopic extends AsideMinorBase {
19
- type: 'topic';
20
- topicId: string;
21
- location: BitranLocation;
22
- nav: Partial<{
23
- previous: PreviousNextItem;
24
- next: PreviousNextItem;
25
- article: string;
26
- summary: string;
27
- practice: string;
28
- }>;
29
- toc: Toc;
30
- contributors?: ContentContributor[];
31
- // todos: TodoItem[];
32
- }
33
-
34
- export interface AsideMinorContent extends AsideMinorBase {
35
- type: 'group' | 'book';
36
- contentId: string;
37
- nav: Partial<{
38
- previous: PreviousNextItem;
39
- next: PreviousNextItem;
40
- }>;
41
- contributors?: ContentContributor[];
42
- }
43
-
44
- export interface AsideMinorNews extends AsideMinorBase {
45
- type: 'news';
46
- }
47
-
48
- export type AsideMinorData =
49
- | AsideMinorTopic
50
- | AsideMinorContent
51
- | AsideMinorNews;
1
+ import type { BitranLocation } from '@erudit-js/cog/schema';
2
+
3
+ import type { Toc } from '../bitran/toc';
4
+ import type { PreviousNextItem } from '../content/previousNext';
5
+ import type { ContentContributor } from '../contributor';
6
+
7
+ interface AsideMinorBase {
8
+ type: AsideMinorType;
9
+ }
10
+
11
+ export type AsideMinorType =
12
+ | 'topic'
13
+ | 'group'
14
+ | 'book'
15
+ | 'contributor'
16
+ | 'news';
17
+
18
+ export interface AsideMinorTopic extends AsideMinorBase {
19
+ type: 'topic';
20
+ topicId: string;
21
+ location: BitranLocation;
22
+ nav: Partial<{
23
+ previous: PreviousNextItem;
24
+ next: PreviousNextItem;
25
+ article: string;
26
+ summary: string;
27
+ practice: string;
28
+ }>;
29
+ toc: Toc;
30
+ contributors?: ContentContributor[];
31
+ // todos: TodoItem[];
32
+ }
33
+
34
+ export interface AsideMinorContent extends AsideMinorBase {
35
+ type: 'group' | 'book';
36
+ contentId: string;
37
+ nav: Partial<{
38
+ previous: PreviousNextItem;
39
+ next: PreviousNextItem;
40
+ }>;
41
+ contributors?: ContentContributor[];
42
+ }
43
+
44
+ export interface AsideMinorNews extends AsideMinorBase {
45
+ type: 'news';
46
+ }
47
+
48
+ export type AsideMinorData =
49
+ | AsideMinorTopic
50
+ | AsideMinorContent
51
+ | AsideMinorNews;
package/shared/asset.ts CHANGED
@@ -1,22 +1,22 @@
1
- import {
2
- PUBLIC_CONTENT_ASSET,
3
- PUBLIC_CONTRIBUTOR_ASSET,
4
- PUBLIC_ERUDIT_ASSET,
5
- PUBLIC_USER_ASSET,
6
- } from '@erudit/const';
7
-
8
- export function eruditAsset(path: string) {
9
- return PUBLIC_ERUDIT_ASSET + path;
10
- }
11
-
12
- export function contributorAsset(path: string) {
13
- return PUBLIC_CONTRIBUTOR_ASSET + path;
14
- }
15
-
16
- export function contentAsset(path: string) {
17
- return PUBLIC_CONTENT_ASSET + path;
18
- }
19
-
20
- export function publicAsset(path: string) {
21
- return PUBLIC_USER_ASSET + path;
22
- }
1
+ import {
2
+ PUBLIC_CONTENT_ASSET,
3
+ PUBLIC_CONTRIBUTOR_ASSET,
4
+ PUBLIC_ERUDIT_ASSET,
5
+ PUBLIC_USER_ASSET,
6
+ } from '@erudit/const';
7
+
8
+ export function eruditAsset(path: string) {
9
+ return PUBLIC_ERUDIT_ASSET + path;
10
+ }
11
+
12
+ export function contributorAsset(path: string) {
13
+ return PUBLIC_CONTRIBUTOR_ASSET + path;
14
+ }
15
+
16
+ export function contentAsset(path: string) {
17
+ return PUBLIC_CONTENT_ASSET + path;
18
+ }
19
+
20
+ export function publicAsset(path: string) {
21
+ return PUBLIC_USER_ASSET + path;
22
+ }
@@ -1,56 +1,56 @@
1
- import { detectContentBookId } from '../content/bookId';
2
-
3
- export function toAbsoluteContentPath(
4
- contentPath: string,
5
- contextPath: string,
6
- bookIds?: string[],
7
- ) {
8
- const unresolvedPath = (() => {
9
- if (contentPath.startsWith('/')) {
10
- return contentPath;
11
- }
12
-
13
- if (contentPath.startsWith('~/')) {
14
- const restPath = contentPath.substring(2);
15
- const bookId = detectContentBookId(contextPath, bookIds ?? []);
16
-
17
- if (bookId) {
18
- return bookId + '/' + restPath;
19
- }
20
-
21
- // Not in any book, convert to absolute path
22
- return '/' + restPath;
23
- }
24
-
25
- return contextPath + '/' + contentPath;
26
- })();
27
-
28
- return resolveContentPath(unresolvedPath);
29
- }
30
-
31
- export function resolveContentPath(toResolvePath: string) {
32
- const reverseParts = toResolvePath.split('/').reverse();
33
- const resolvedParts: string[] = [];
34
-
35
- let skipCounter = 0;
36
-
37
- for (let i = 0; i < reverseParts.length; i++) {
38
- const part = reverseParts[i];
39
-
40
- if (part === '..') {
41
- skipCounter++;
42
- continue;
43
- }
44
-
45
- if (skipCounter) {
46
- skipCounter--;
47
- continue;
48
- }
49
-
50
- if (part && part !== '.') {
51
- resolvedParts.unshift(part);
52
- }
53
- }
54
-
55
- return resolvedParts.join('/');
56
- }
1
+ import { detectContentBookId } from '../content/bookId';
2
+
3
+ export function toAbsoluteContentPath(
4
+ contentPath: string,
5
+ contextPath: string,
6
+ bookIds?: string[],
7
+ ) {
8
+ const unresolvedPath = (() => {
9
+ if (contentPath.startsWith('/')) {
10
+ return contentPath;
11
+ }
12
+
13
+ if (contentPath.startsWith('~/')) {
14
+ const restPath = contentPath.substring(2);
15
+ const bookId = detectContentBookId(contextPath, bookIds ?? []);
16
+
17
+ if (bookId) {
18
+ return bookId + '/' + restPath;
19
+ }
20
+
21
+ // Not in any book, convert to absolute path
22
+ return '/' + restPath;
23
+ }
24
+
25
+ return contextPath + '/' + contentPath;
26
+ })();
27
+
28
+ return resolveContentPath(unresolvedPath);
29
+ }
30
+
31
+ export function resolveContentPath(toResolvePath: string) {
32
+ const reverseParts = toResolvePath.split('/').reverse();
33
+ const resolvedParts: string[] = [];
34
+
35
+ let skipCounter = 0;
36
+
37
+ for (let i = 0; i < reverseParts.length; i++) {
38
+ const part = reverseParts[i];
39
+
40
+ if (part === '..') {
41
+ skipCounter++;
42
+ continue;
43
+ }
44
+
45
+ if (skipCounter) {
46
+ skipCounter--;
47
+ continue;
48
+ }
49
+
50
+ if (part && part !== '.') {
51
+ resolvedParts.unshift(part);
52
+ }
53
+ }
54
+
55
+ return resolvedParts.join('/');
56
+ }
@@ -1,6 +1,6 @@
1
- import type { RenderDataStorage } from '@bitran-js/core';
2
-
3
- export interface StringBitranContent {
4
- biCode: string;
5
- renderDataStorage: RenderDataStorage;
6
- }
1
+ import type { RenderDataStorage } from '@bitran-js/core';
2
+
3
+ export interface StringBitranContent {
4
+ biCode: string;
5
+ renderDataStorage: RenderDataStorage;
6
+ }
@@ -1,8 +1,8 @@
1
- export interface TocItem {
2
- id: string;
3
- level: number;
4
- productName: string;
5
- title?: string;
6
- }
7
-
8
- export type Toc = TocItem[];
1
+ export interface TocItem {
2
+ id: string;
3
+ level: number;
4
+ productName: string;
5
+ title?: string;
6
+ }
7
+
8
+ export type Toc = TocItem[];