erudit 3.0.0-dev.16 → 3.0.0-dev.18

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 (234) hide show
  1. package/app/app.vue +193 -191
  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/AdsProviderYandex.vue +2 -2
  6. package/app/components/aside/AsideListItem.vue +74 -74
  7. package/app/components/aside/AsideMajor.vue +56 -56
  8. package/app/components/aside/AsideMinor.vue +73 -73
  9. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  10. package/app/components/aside/major/PaneSwitch.vue +54 -54
  11. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  12. package/app/components/aside/major/SiteInfo.vue +85 -85
  13. package/app/components/aside/major/panes/Language.vue +79 -79
  14. package/app/components/aside/major/panes/Pages.vue +34 -34
  15. package/app/components/aside/major/panes/Search.vue +11 -11
  16. package/app/components/aside/major/panes/nav/Nav.vue +92 -92
  17. package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
  18. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  19. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  20. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  21. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  22. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  23. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  24. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  25. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  26. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  27. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  28. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
  29. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  30. package/app/components/aside/major/panes/other/Other.vue +16 -16
  31. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  32. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  33. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  34. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  35. package/app/components/aside/minor/Contribute.vue +145 -145
  36. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  37. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  38. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  39. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  40. package/app/components/aside/minor/topic/TopicToc.vue +214 -214
  41. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
  42. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  43. package/app/components/bitran/BitranContent.vue +91 -91
  44. package/app/components/bitran/RenderWrapper.vue +10 -10
  45. package/app/components/contributor/ContributorAvatar.vue +45 -45
  46. package/app/components/contributor/ContributorListItem.vue +35 -35
  47. package/app/components/main/topic/MainTopic.vue +88 -88
  48. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  49. package/app/components/main/utils/Breadcrumb.vue +74 -74
  50. package/app/components/main/utils/ContentDecoration.vue +29 -29
  51. package/app/components/main/utils/ContentDescription.vue +19 -19
  52. package/app/components/main/utils/ContentPopover.vue +188 -188
  53. package/app/components/main/utils/ContentPopovers.vue +111 -111
  54. package/app/components/main/utils/ContentReferences.vue +70 -70
  55. package/app/components/main/utils/ContentSection.vue +45 -45
  56. package/app/components/main/utils/ContentTitle.vue +63 -63
  57. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  58. package/app/components/main/utils/reference/ReferenceItem.vue +70 -70
  59. package/app/components/main/utils/reference/ReferenceSource.vue +120 -120
  60. package/app/components/preview/Preview.vue +186 -186
  61. package/app/components/preview/PreviewDisplay.vue +139 -139
  62. package/app/components/preview/PreviewFooterAction.vue +73 -73
  63. package/app/components/preview/PreviewLoading.vue +14 -14
  64. package/app/components/preview/PreviewScreen.vue +141 -141
  65. package/app/components/preview/display/Alert.vue +50 -50
  66. package/app/components/preview/display/Custom.vue +18 -18
  67. package/app/components/preview/display/GenericLink.vue +48 -48
  68. package/app/components/preview/display/PageLink.vue +22 -22
  69. package/app/components/preview/display/Unique.vue +55 -55
  70. package/app/components/transition/Fade.vue +19 -19
  71. package/app/components/tree/TreeContainer.vue +11 -11
  72. package/app/components/tree/TreeItem.vue +89 -89
  73. package/app/composables/adsAllowed.ts +11 -0
  74. package/app/composables/bitran.ts +108 -108
  75. package/app/composables/bitranContent.ts +96 -92
  76. package/app/composables/bitranLocation.ts +7 -7
  77. package/app/composables/contentData.ts +38 -38
  78. package/app/composables/contentPage.ts +168 -158
  79. package/app/composables/contentRoute.ts +45 -45
  80. package/app/composables/darkMagic.ts +24 -24
  81. package/app/composables/externalApi.ts +69 -69
  82. package/app/composables/favicon.ts +8 -8
  83. package/app/composables/formatText.ts +99 -99
  84. package/app/composables/majorPane.ts +60 -60
  85. package/app/composables/phrases.ts +65 -65
  86. package/app/composables/theme.ts +29 -29
  87. package/app/composables/url.ts +33 -33
  88. package/app/pages/_test/preview.vue +110 -110
  89. package/app/pages/article/[...articleId].vue +3 -3
  90. package/app/pages/book/[...bookId].vue +47 -47
  91. package/app/pages/group/[...groupId].vue +66 -66
  92. package/app/pages/index.vue +32 -32
  93. package/app/pages/members.vue +5 -6
  94. package/app/pages/practice/[...practice].vue +3 -3
  95. package/app/pages/summary/[...summaryId].vue +3 -3
  96. package/app/plugins/analytics.ts +8 -0
  97. package/app/plugins/prerender.server.ts +22 -22
  98. package/app/scripts/_immediate.js +9 -9
  99. package/app/scripts/aside/index.ts +59 -59
  100. package/app/scripts/aside/major/nav.ts +26 -26
  101. package/app/scripts/aside/minor/state.ts +37 -37
  102. package/app/scripts/aside/minor/topic.ts +3 -3
  103. package/app/scripts/flag.ts +28 -28
  104. package/app/scripts/og.ts +27 -27
  105. package/app/scripts/preview/build.ts +76 -76
  106. package/app/scripts/preview/data/alert.ts +19 -19
  107. package/app/scripts/preview/data/custom.ts +8 -8
  108. package/app/scripts/preview/data/genericLink.ts +24 -24
  109. package/app/scripts/preview/data/pageLink.ts +23 -23
  110. package/app/scripts/preview/data/unique.ts +72 -72
  111. package/app/scripts/preview/data.ts +24 -24
  112. package/app/scripts/preview/display.ts +37 -37
  113. package/app/scripts/preview/footer.ts +9 -9
  114. package/app/scripts/preview/request.ts +51 -51
  115. package/app/scripts/preview/state.ts +63 -63
  116. package/app/styles/_immediate.css +7 -7
  117. package/app/styles/_util.scss +43 -43
  118. package/app/styles/_utils.scss +44 -44
  119. package/app/styles/app.scss +91 -91
  120. package/app/styles/def/_bp.scss +27 -27
  121. package/app/styles/def/_size.scss +7 -7
  122. package/app/styles/def/_z.scss +5 -5
  123. package/app/styles/normalize.scss +49 -49
  124. package/app/styles/partials/_darkMagic.scss +5 -5
  125. package/app/styles/partials/_fnav.scss +15 -15
  126. package/app/styles/partials/_preview.scss +5 -5
  127. package/bin/erudit.mjs +2 -2
  128. package/const.ts +4 -4
  129. package/globalPath.ts +21 -21
  130. package/globals/bitran.ts +1 -1
  131. package/globals/content.ts +27 -27
  132. package/globals/contributor.ts +5 -5
  133. package/globals/erudit.ts +5 -5
  134. package/globals/register.ts +18 -18
  135. package/languages/en.ts +94 -94
  136. package/languages/ru.ts +98 -98
  137. package/module/bitran.ts +66 -66
  138. package/module/config.ts +35 -35
  139. package/module/imports.ts +67 -67
  140. package/module/index.ts +47 -47
  141. package/module/logger.ts +10 -10
  142. package/module/paths.ts +22 -22
  143. package/module/restart.ts +61 -61
  144. package/nuxt.config.ts +131 -131
  145. package/package.json +4 -4
  146. package/server/api/aside/major/nav/bookIds.ts +5 -5
  147. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  148. package/server/api/aside/major/nav/global.ts +7 -7
  149. package/server/api/aside/minor/news.ts +7 -7
  150. package/server/api/aside/minor/path.ts +82 -82
  151. package/server/api/bitran/content/[...location].ts +10 -10
  152. package/server/api/bitran/toc/[...location].ts +9 -9
  153. package/server/api/content/data.ts +75 -75
  154. package/server/api/contributor/count.ts +6 -6
  155. package/server/api/fake/content.ts +11 -11
  156. package/server/api/fake/shared/languages.ts +12 -12
  157. package/server/api/language/functions.ts +12 -12
  158. package/server/api/language/phrase/[phraseId].ts +19 -19
  159. package/server/api/language/phraseIds.ts +8 -8
  160. package/server/api/prerender.ts +19 -120
  161. package/server/api/preview/page/[...parts].ts +78 -78
  162. package/server/api/preview/unique/[...location].ts +61 -61
  163. package/server/plugin/bitran/content.ts +237 -190
  164. package/server/plugin/bitran/elements/include.ts +229 -229
  165. package/server/plugin/bitran/location.ts +39 -39
  166. package/server/plugin/bitran/toc.ts +94 -94
  167. package/server/plugin/bitran/transpiler.ts +18 -18
  168. package/server/plugin/build/close.ts +12 -12
  169. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  170. package/server/plugin/build/jobs/content/generic.ts +191 -191
  171. package/server/plugin/build/jobs/content/parse.ts +113 -113
  172. package/server/plugin/build/jobs/content/path.ts +6 -6
  173. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  174. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  175. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  176. package/server/plugin/build/jobs/contributors.ts +66 -66
  177. package/server/plugin/build/jobs/language.ts +36 -36
  178. package/server/plugin/build/jobs/nav.ts +345 -345
  179. package/server/plugin/build/process.ts +32 -32
  180. package/server/plugin/build/rebuild.ts +66 -66
  181. package/server/plugin/build/setup.ts +19 -19
  182. package/server/plugin/content/context.ts +119 -119
  183. package/server/plugin/db/entities/Book.ts +7 -7
  184. package/server/plugin/db/entities/Content.ts +45 -45
  185. package/server/plugin/db/entities/Contribution.ts +10 -10
  186. package/server/plugin/db/entities/Contributor.ts +16 -16
  187. package/server/plugin/db/entities/File.ts +10 -10
  188. package/server/plugin/db/entities/Group.ts +14 -14
  189. package/server/plugin/db/entities/Hash.ts +15 -15
  190. package/server/plugin/db/entities/Topic.ts +20 -20
  191. package/server/plugin/db/entities/Unique.ts +21 -21
  192. package/server/plugin/db/reset.ts +12 -12
  193. package/server/plugin/db/setup.ts +49 -49
  194. package/server/plugin/global.ts +16 -16
  195. package/server/plugin/importer.ts +16 -16
  196. package/server/plugin/index.ts +9 -9
  197. package/server/plugin/logger.ts +23 -23
  198. package/server/plugin/nav/node.ts +27 -27
  199. package/server/plugin/nav/utils.ts +179 -175
  200. package/server/plugin/repository/book.ts +23 -21
  201. package/server/plugin/repository/content.ts +240 -240
  202. package/server/plugin/repository/contentId.ts +40 -40
  203. package/server/plugin/repository/contributor.ts +8 -8
  204. package/server/plugin/repository/file.ts +10 -10
  205. package/server/plugin/repository/frontNav.ts +145 -145
  206. package/server/plugin/repository/topic.ts +35 -35
  207. package/server/tsconfig.json +9 -9
  208. package/shared/aside/minor.ts +51 -51
  209. package/shared/asset.ts +22 -22
  210. package/shared/bitran/contentId.ts +56 -56
  211. package/shared/bitran/stringContent.ts +6 -6
  212. package/shared/bitran/toc.ts +8 -8
  213. package/shared/content/bookId.ts +12 -12
  214. package/shared/content/context.ts +9 -9
  215. package/shared/content/data/base.ts +32 -32
  216. package/shared/content/data/index.ts +5 -5
  217. package/shared/content/data/type/book.ts +5 -5
  218. package/shared/content/data/type/group.ts +6 -6
  219. package/shared/content/data/type/topic.ts +11 -11
  220. package/shared/content/previousNext.ts +9 -9
  221. package/shared/contributor.ts +5 -5
  222. package/shared/frontNav.ts +41 -41
  223. package/shared/icons.ts +38 -38
  224. package/shared/image.ts +5 -5
  225. package/shared/link.ts +28 -28
  226. package/shared/popover.ts +8 -8
  227. package/shared/types/language.ts +74 -74
  228. package/shared/utils/objectsEqual.ts +4 -4
  229. package/shared/utils/stringColor.ts +9 -9
  230. package/test/contentId.test.ts +91 -91
  231. package/tsconfig.json +8 -8
  232. package/utils/contentPath.ts +67 -67
  233. package/utils/slash.ts +11 -11
  234. package/utils/stress.ts +9 -9
@@ -1,175 +1,179 @@
1
- import { ERUDIT_SERVER } from '@server/global';
2
- import { isRootNode, type NavNode, type RootNavNode } from '@server/nav/node';
3
-
4
- export async function walkNav(
5
- step: (node: NavNode) => Promise<void | false>,
6
- from: NavNode | typeof ERUDIT_SERVER.NAV = ERUDIT_SERVER.NAV,
7
- ) {
8
- if (!from) return;
9
-
10
- const stepResult = isRootNode(from) ? true : await step(from);
11
-
12
- if (stepResult !== false)
13
- if (from.children)
14
- for (const child of from.children) await walkNav(step, child);
15
- }
16
-
17
- //
18
- //
19
- //
20
-
21
- export function getNavBookIds(mode: 'full' | 'short'): string[] {
22
- const bookIds: string[] = [];
23
-
24
- if (!ERUDIT_SERVER.NAV_BOOKS) {
25
- return bookIds;
26
- }
27
-
28
- for (const navBook of Object.values(ERUDIT_SERVER.NAV_BOOKS)) {
29
- bookIds.push(mode === 'full' ? navBook.fullId : navBook.shortId);
30
- }
31
-
32
- return bookIds;
33
- }
34
-
35
- export function getNavBookOf(target: string | NavNode): NavNode | undefined {
36
- const id = typeof target === 'string' ? target : target.fullId;
37
-
38
- if (!id || !ERUDIT_SERVER.NAV_BOOKS) return undefined;
39
-
40
- const idParts = id.split('/');
41
-
42
- while (idParts.length > 0) {
43
- const book = ERUDIT_SERVER.NAV_BOOKS[idParts.join('/')];
44
-
45
- if (book) return book;
46
-
47
- idParts.pop();
48
- }
49
-
50
- return undefined;
51
- }
52
-
53
- export async function getPreviousNextNav(contentId: string) {
54
- let previousNav: NavNode | undefined, nextNav: NavNode | undefined;
55
- let book: NavNode | undefined;
56
- let finish = false;
57
-
58
- await walkNav(async (navNode) => {
59
- if (navNode.fullId === contentId) {
60
- book = getNavBookOf(navNode);
61
- finish = true;
62
- return;
63
- }
64
-
65
- if (finish && !nextNav) {
66
- nextNav = navNode;
67
- return false;
68
- }
69
-
70
- if (!finish) previousNav = navNode;
71
- });
72
-
73
- if (book) {
74
- //
75
- // Can't lead out of current book (if givent content item is inside the book)
76
- //
77
-
78
- if (previousNav)
79
- if (getNavBookOf(previousNav)?.fullId !== book.fullId)
80
- previousNav = undefined;
81
-
82
- if (nextNav)
83
- if (getNavBookOf(nextNav)?.fullId !== book.fullId)
84
- nextNav = undefined;
85
- } else {
86
- //
87
- // If not inside the book and tries to lead inside a book, then force lead to book's about page
88
- //
89
-
90
- if (previousNav) previousNav = getNavBookOf(previousNav) || previousNav;
91
-
92
- if (nextNav) nextNav = getNavBookOf(nextNav) || nextNav;
93
- }
94
-
95
- return {
96
- previousNav,
97
- nextNav,
98
- };
99
- }
100
-
101
- /**
102
- * Find navigation node by mixed content ID.
103
- * It can be full ID, short ID or any combination of present and missing skipped parts.
104
- */
105
- export function getNavNode(mixedContentId: string): NavNode {
106
- const parts = mixedContentId.split('/');
107
- let foundNode: NavNode | undefined;
108
-
109
- function search(node: NavNode, partIdx: number): NavNode | undefined {
110
- const targetIdPart = parts[partIdx];
111
- const nodeIdPart = node.idPart;
112
-
113
- if (nodeIdPart === targetIdPart) {
114
- if (partIdx === parts.length - 1) {
115
- return node;
116
- }
117
-
118
- for (const child of node.children || []) {
119
- const deepResult = search(child, partIdx + 1);
120
- if (deepResult) return deepResult;
121
- }
122
- }
123
-
124
- if (node.skip) {
125
- for (const child of node.children || []) {
126
- const deepResult = search(child, partIdx);
127
- if (deepResult) return deepResult;
128
- }
129
- }
130
-
131
- return undefined;
132
- }
133
-
134
- for (const child of ERUDIT_SERVER.NAV?.children || []) {
135
- foundNode = search(child, 0);
136
- if (foundNode) break;
137
- }
138
-
139
- if (!foundNode) {
140
- throw new Error(
141
- `Failed to find navigation content node for ID: ${mixedContentId}`,
142
- );
143
- }
144
-
145
- return foundNode;
146
- }
147
-
148
- export function getIdsUp(contentId: string): string[] {
149
- const ids: string[] = [];
150
- const startNavNode = getNavNode(contentId);
151
-
152
- if (!startNavNode) return ids;
153
-
154
- let currentNavNode: NavNode = startNavNode;
155
-
156
- while (currentNavNode?.idPart) {
157
- ids.push(currentNavNode.fullId);
158
- currentNavNode = currentNavNode.parent as NavNode;
159
- }
160
-
161
- return ids;
162
- }
163
-
164
- export async function isSkipId(contentId: string) {
165
- let hidden = false;
166
-
167
- await walkNav(async (navNode) => {
168
- if (navNode.fullId === contentId) {
169
- hidden = navNode.skip;
170
- return false;
171
- }
172
- });
173
-
174
- return hidden;
175
- }
1
+ import { ERUDIT_SERVER } from '@server/global';
2
+ import { isRootNode, type NavNode, type RootNavNode } from '@server/nav/node';
3
+
4
+ export async function walkNav(
5
+ step: (node: NavNode) => Promise<void | false>,
6
+ from: NavNode | typeof ERUDIT_SERVER.NAV = ERUDIT_SERVER.NAV,
7
+ ) {
8
+ if (!from) return;
9
+
10
+ const stepResult = isRootNode(from) ? true : await step(from);
11
+
12
+ if (stepResult !== false)
13
+ if (from.children)
14
+ for (const child of from.children) await walkNav(step, child);
15
+ }
16
+
17
+ //
18
+ //
19
+ //
20
+
21
+ export function getNavBookIds(mode: 'full' | 'short'): string[] {
22
+ const bookIds: string[] = [];
23
+
24
+ if (!ERUDIT_SERVER.NAV_BOOKS) {
25
+ return bookIds;
26
+ }
27
+
28
+ for (const navBook of Object.values(ERUDIT_SERVER.NAV_BOOKS)) {
29
+ bookIds.push(mode === 'full' ? navBook.fullId : navBook.shortId);
30
+ }
31
+
32
+ return bookIds;
33
+ }
34
+
35
+ export function getNavBookOf(target: string | NavNode): NavNode | undefined {
36
+ const id = typeof target === 'string' ? target : target.fullId;
37
+
38
+ if (!id || !ERUDIT_SERVER.NAV_BOOKS) {
39
+ return undefined;
40
+ }
41
+
42
+ const idParts = id.split('/');
43
+
44
+ while (idParts.length > 0) {
45
+ const book = ERUDIT_SERVER.NAV_BOOKS[idParts.join('/')];
46
+
47
+ if (book) {
48
+ return book;
49
+ }
50
+
51
+ idParts.pop();
52
+ }
53
+
54
+ return undefined;
55
+ }
56
+
57
+ export async function getPreviousNextNav(contentId: string) {
58
+ let previousNav: NavNode | undefined, nextNav: NavNode | undefined;
59
+ let book: NavNode | undefined;
60
+ let finish = false;
61
+
62
+ await walkNav(async (navNode) => {
63
+ if (navNode.fullId === contentId) {
64
+ book = getNavBookOf(navNode);
65
+ finish = true;
66
+ return;
67
+ }
68
+
69
+ if (finish && !nextNav) {
70
+ nextNav = navNode;
71
+ return false;
72
+ }
73
+
74
+ if (!finish) previousNav = navNode;
75
+ });
76
+
77
+ if (book) {
78
+ //
79
+ // Can't lead out of current book (if givent content item is inside the book)
80
+ //
81
+
82
+ if (previousNav)
83
+ if (getNavBookOf(previousNav)?.fullId !== book.fullId)
84
+ previousNav = undefined;
85
+
86
+ if (nextNav)
87
+ if (getNavBookOf(nextNav)?.fullId !== book.fullId)
88
+ nextNav = undefined;
89
+ } else {
90
+ //
91
+ // If not inside the book and tries to lead inside a book, then force lead to book's about page
92
+ //
93
+
94
+ if (previousNav) previousNav = getNavBookOf(previousNav) || previousNav;
95
+
96
+ if (nextNav) nextNav = getNavBookOf(nextNav) || nextNav;
97
+ }
98
+
99
+ return {
100
+ previousNav,
101
+ nextNav,
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Find navigation node by mixed content ID.
107
+ * It can be full ID, short ID or any combination of present and missing skipped parts.
108
+ */
109
+ export function getNavNode(mixedContentId: string): NavNode {
110
+ const parts = mixedContentId.split('/');
111
+ let foundNode: NavNode | undefined;
112
+
113
+ function search(node: NavNode, partIdx: number): NavNode | undefined {
114
+ const targetIdPart = parts[partIdx];
115
+ const nodeIdPart = node.idPart;
116
+
117
+ if (nodeIdPart === targetIdPart) {
118
+ if (partIdx === parts.length - 1) {
119
+ return node;
120
+ }
121
+
122
+ for (const child of node.children || []) {
123
+ const deepResult = search(child, partIdx + 1);
124
+ if (deepResult) return deepResult;
125
+ }
126
+ }
127
+
128
+ if (node.skip) {
129
+ for (const child of node.children || []) {
130
+ const deepResult = search(child, partIdx);
131
+ if (deepResult) return deepResult;
132
+ }
133
+ }
134
+
135
+ return undefined;
136
+ }
137
+
138
+ for (const child of ERUDIT_SERVER.NAV?.children || []) {
139
+ foundNode = search(child, 0);
140
+ if (foundNode) break;
141
+ }
142
+
143
+ if (!foundNode) {
144
+ throw new Error(
145
+ `Failed to find navigation content node for ID: ${mixedContentId}`,
146
+ );
147
+ }
148
+
149
+ return foundNode;
150
+ }
151
+
152
+ export function getIdsUp(contentId: string): string[] {
153
+ const ids: string[] = [];
154
+ const startNavNode = getNavNode(contentId);
155
+
156
+ if (!startNavNode) return ids;
157
+
158
+ let currentNavNode: NavNode = startNavNode;
159
+
160
+ while (currentNavNode?.idPart) {
161
+ ids.push(currentNavNode.fullId);
162
+ currentNavNode = currentNavNode.parent as NavNode;
163
+ }
164
+
165
+ return ids;
166
+ }
167
+
168
+ export async function isSkipId(contentId: string) {
169
+ let hidden = false;
170
+
171
+ await walkNav(async (navNode) => {
172
+ if (navNode.fullId === contentId) {
173
+ hidden = navNode.skip;
174
+ return false;
175
+ }
176
+ });
177
+
178
+ return hidden;
179
+ }
@@ -1,21 +1,23 @@
1
- import { ERUDIT_SERVER } from '@server/global';
2
- import { getNavBookOf } from '@server/nav/utils';
3
- import { DbContent } from '@server/db/entities/Content';
4
-
5
- export async function getContentBookFor(contentId: string) {
6
- const navBook = getNavBookOf(contentId);
7
-
8
- if (!navBook) return undefined;
9
-
10
- const bookId = navBook.id;
11
-
12
- const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
13
- select: ['title'],
14
- where: { contentId: bookId },
15
- });
16
-
17
- return {
18
- contentId: bookId,
19
- title: dbContent?.title || bookId,
20
- };
21
- }
1
+ import { ERUDIT_SERVER } from '@server/global';
2
+ import { getNavBookOf } from '@server/nav/utils';
3
+ import { DbContent } from '@server/db/entities/Content';
4
+ import { getFullContentId } from './contentId';
5
+
6
+ export async function getContentBookFor(contentId: string) {
7
+ contentId = getFullContentId(contentId);
8
+ const navBook = getNavBookOf(contentId);
9
+
10
+ if (!navBook) return undefined;
11
+
12
+ const bookId = navBook.fullId;
13
+
14
+ const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
15
+ select: ['title'],
16
+ where: { contentId: bookId },
17
+ });
18
+
19
+ return {
20
+ contentId: bookId,
21
+ title: dbContent?.title || bookId,
22
+ };
23
+ }