erudit 3.0.0-dev.17 → 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 (233) 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/aside/AsideListItem.vue +74 -74
  6. package/app/components/aside/AsideMajor.vue +56 -56
  7. package/app/components/aside/AsideMinor.vue +73 -73
  8. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  9. package/app/components/aside/major/PaneSwitch.vue +54 -54
  10. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  11. package/app/components/aside/major/SiteInfo.vue +85 -85
  12. package/app/components/aside/major/panes/Language.vue +79 -79
  13. package/app/components/aside/major/panes/Pages.vue +34 -34
  14. package/app/components/aside/major/panes/Search.vue +11 -11
  15. package/app/components/aside/major/panes/nav/Nav.vue +92 -92
  16. package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
  17. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  18. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  19. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  20. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  21. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  22. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  23. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  24. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  25. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  26. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  27. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
  28. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  29. package/app/components/aside/major/panes/other/Other.vue +16 -16
  30. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  31. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  32. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  33. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  34. package/app/components/aside/minor/Contribute.vue +145 -145
  35. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  36. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  37. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  38. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  39. package/app/components/aside/minor/topic/TopicToc.vue +214 -214
  40. package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
  41. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  42. package/app/components/bitran/BitranContent.vue +91 -91
  43. package/app/components/bitran/RenderWrapper.vue +10 -10
  44. package/app/components/contributor/ContributorAvatar.vue +45 -45
  45. package/app/components/contributor/ContributorListItem.vue +35 -35
  46. package/app/components/main/topic/MainTopic.vue +88 -88
  47. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  48. package/app/components/main/utils/Breadcrumb.vue +74 -74
  49. package/app/components/main/utils/ContentDecoration.vue +29 -29
  50. package/app/components/main/utils/ContentDescription.vue +19 -19
  51. package/app/components/main/utils/ContentPopover.vue +188 -188
  52. package/app/components/main/utils/ContentPopovers.vue +111 -111
  53. package/app/components/main/utils/ContentReferences.vue +70 -70
  54. package/app/components/main/utils/ContentSection.vue +45 -45
  55. package/app/components/main/utils/ContentTitle.vue +63 -63
  56. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  57. package/app/components/main/utils/reference/ReferenceItem.vue +70 -70
  58. package/app/components/main/utils/reference/ReferenceSource.vue +120 -120
  59. package/app/components/preview/Preview.vue +186 -186
  60. package/app/components/preview/PreviewDisplay.vue +139 -139
  61. package/app/components/preview/PreviewFooterAction.vue +73 -73
  62. package/app/components/preview/PreviewLoading.vue +14 -14
  63. package/app/components/preview/PreviewScreen.vue +141 -141
  64. package/app/components/preview/display/Alert.vue +50 -50
  65. package/app/components/preview/display/Custom.vue +18 -18
  66. package/app/components/preview/display/GenericLink.vue +48 -48
  67. package/app/components/preview/display/PageLink.vue +22 -22
  68. package/app/components/preview/display/Unique.vue +55 -55
  69. package/app/components/transition/Fade.vue +19 -19
  70. package/app/components/tree/TreeContainer.vue +11 -11
  71. package/app/components/tree/TreeItem.vue +89 -89
  72. package/app/composables/adsAllowed.ts +11 -0
  73. package/app/composables/bitran.ts +108 -108
  74. package/app/composables/bitranContent.ts +96 -92
  75. package/app/composables/bitranLocation.ts +7 -7
  76. package/app/composables/contentData.ts +38 -38
  77. package/app/composables/contentPage.ts +168 -158
  78. package/app/composables/contentRoute.ts +45 -45
  79. package/app/composables/darkMagic.ts +24 -24
  80. package/app/composables/externalApi.ts +69 -69
  81. package/app/composables/favicon.ts +8 -8
  82. package/app/composables/formatText.ts +99 -99
  83. package/app/composables/majorPane.ts +60 -60
  84. package/app/composables/phrases.ts +65 -65
  85. package/app/composables/theme.ts +29 -29
  86. package/app/composables/url.ts +33 -33
  87. package/app/pages/_test/preview.vue +110 -110
  88. package/app/pages/article/[...articleId].vue +3 -3
  89. package/app/pages/book/[...bookId].vue +47 -47
  90. package/app/pages/group/[...groupId].vue +66 -66
  91. package/app/pages/index.vue +32 -32
  92. package/app/pages/members.vue +5 -6
  93. package/app/pages/practice/[...practice].vue +3 -3
  94. package/app/pages/summary/[...summaryId].vue +3 -3
  95. package/app/plugins/analytics.ts +8 -0
  96. package/app/plugins/prerender.server.ts +22 -22
  97. package/app/scripts/_immediate.js +9 -9
  98. package/app/scripts/aside/index.ts +59 -59
  99. package/app/scripts/aside/major/nav.ts +26 -26
  100. package/app/scripts/aside/minor/state.ts +37 -37
  101. package/app/scripts/aside/minor/topic.ts +3 -3
  102. package/app/scripts/flag.ts +28 -28
  103. package/app/scripts/og.ts +27 -27
  104. package/app/scripts/preview/build.ts +76 -76
  105. package/app/scripts/preview/data/alert.ts +19 -19
  106. package/app/scripts/preview/data/custom.ts +8 -8
  107. package/app/scripts/preview/data/genericLink.ts +24 -24
  108. package/app/scripts/preview/data/pageLink.ts +23 -23
  109. package/app/scripts/preview/data/unique.ts +72 -72
  110. package/app/scripts/preview/data.ts +24 -24
  111. package/app/scripts/preview/display.ts +37 -37
  112. package/app/scripts/preview/footer.ts +9 -9
  113. package/app/scripts/preview/request.ts +51 -51
  114. package/app/scripts/preview/state.ts +63 -63
  115. package/app/styles/_immediate.css +7 -7
  116. package/app/styles/_util.scss +43 -43
  117. package/app/styles/_utils.scss +44 -44
  118. package/app/styles/app.scss +91 -91
  119. package/app/styles/def/_bp.scss +27 -27
  120. package/app/styles/def/_size.scss +7 -7
  121. package/app/styles/def/_z.scss +5 -5
  122. package/app/styles/normalize.scss +49 -49
  123. package/app/styles/partials/_darkMagic.scss +5 -5
  124. package/app/styles/partials/_fnav.scss +15 -15
  125. package/app/styles/partials/_preview.scss +5 -5
  126. package/bin/erudit.mjs +2 -2
  127. package/const.ts +4 -4
  128. package/globalPath.ts +21 -21
  129. package/globals/bitran.ts +1 -1
  130. package/globals/content.ts +27 -27
  131. package/globals/contributor.ts +5 -5
  132. package/globals/erudit.ts +5 -5
  133. package/globals/register.ts +18 -18
  134. package/languages/en.ts +94 -94
  135. package/languages/ru.ts +98 -98
  136. package/module/bitran.ts +66 -66
  137. package/module/config.ts +35 -35
  138. package/module/imports.ts +67 -67
  139. package/module/index.ts +47 -47
  140. package/module/logger.ts +10 -10
  141. package/module/paths.ts +22 -22
  142. package/module/restart.ts +61 -61
  143. package/nuxt.config.ts +131 -131
  144. package/package.json +4 -4
  145. package/server/api/aside/major/nav/bookIds.ts +5 -5
  146. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  147. package/server/api/aside/major/nav/global.ts +7 -7
  148. package/server/api/aside/minor/news.ts +7 -7
  149. package/server/api/aside/minor/path.ts +82 -82
  150. package/server/api/bitran/content/[...location].ts +10 -10
  151. package/server/api/bitran/toc/[...location].ts +9 -9
  152. package/server/api/content/data.ts +75 -75
  153. package/server/api/contributor/count.ts +6 -6
  154. package/server/api/fake/content.ts +11 -11
  155. package/server/api/fake/shared/languages.ts +12 -12
  156. package/server/api/language/functions.ts +12 -12
  157. package/server/api/language/phrase/[phraseId].ts +19 -19
  158. package/server/api/language/phraseIds.ts +8 -8
  159. package/server/api/prerender.ts +19 -120
  160. package/server/api/preview/page/[...parts].ts +78 -78
  161. package/server/api/preview/unique/[...location].ts +61 -61
  162. package/server/plugin/bitran/content.ts +237 -190
  163. package/server/plugin/bitran/elements/include.ts +229 -229
  164. package/server/plugin/bitran/location.ts +39 -39
  165. package/server/plugin/bitran/toc.ts +94 -94
  166. package/server/plugin/bitran/transpiler.ts +18 -18
  167. package/server/plugin/build/close.ts +12 -12
  168. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  169. package/server/plugin/build/jobs/content/generic.ts +191 -191
  170. package/server/plugin/build/jobs/content/parse.ts +113 -113
  171. package/server/plugin/build/jobs/content/path.ts +6 -6
  172. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  173. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  174. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  175. package/server/plugin/build/jobs/contributors.ts +66 -66
  176. package/server/plugin/build/jobs/language.ts +36 -36
  177. package/server/plugin/build/jobs/nav.ts +345 -345
  178. package/server/plugin/build/process.ts +32 -32
  179. package/server/plugin/build/rebuild.ts +66 -66
  180. package/server/plugin/build/setup.ts +19 -19
  181. package/server/plugin/content/context.ts +119 -119
  182. package/server/plugin/db/entities/Book.ts +7 -7
  183. package/server/plugin/db/entities/Content.ts +45 -45
  184. package/server/plugin/db/entities/Contribution.ts +10 -10
  185. package/server/plugin/db/entities/Contributor.ts +16 -16
  186. package/server/plugin/db/entities/File.ts +10 -10
  187. package/server/plugin/db/entities/Group.ts +14 -14
  188. package/server/plugin/db/entities/Hash.ts +15 -15
  189. package/server/plugin/db/entities/Topic.ts +20 -20
  190. package/server/plugin/db/entities/Unique.ts +21 -21
  191. package/server/plugin/db/reset.ts +12 -12
  192. package/server/plugin/db/setup.ts +49 -49
  193. package/server/plugin/global.ts +16 -16
  194. package/server/plugin/importer.ts +16 -16
  195. package/server/plugin/index.ts +9 -9
  196. package/server/plugin/logger.ts +23 -23
  197. package/server/plugin/nav/node.ts +27 -27
  198. package/server/plugin/nav/utils.ts +179 -175
  199. package/server/plugin/repository/book.ts +23 -21
  200. package/server/plugin/repository/content.ts +240 -240
  201. package/server/plugin/repository/contentId.ts +40 -40
  202. package/server/plugin/repository/contributor.ts +8 -8
  203. package/server/plugin/repository/file.ts +10 -10
  204. package/server/plugin/repository/frontNav.ts +145 -145
  205. package/server/plugin/repository/topic.ts +35 -35
  206. package/server/tsconfig.json +9 -9
  207. package/shared/aside/minor.ts +51 -51
  208. package/shared/asset.ts +22 -22
  209. package/shared/bitran/contentId.ts +56 -56
  210. package/shared/bitran/stringContent.ts +6 -6
  211. package/shared/bitran/toc.ts +8 -8
  212. package/shared/content/bookId.ts +12 -12
  213. package/shared/content/context.ts +9 -9
  214. package/shared/content/data/base.ts +32 -32
  215. package/shared/content/data/index.ts +5 -5
  216. package/shared/content/data/type/book.ts +5 -5
  217. package/shared/content/data/type/group.ts +6 -6
  218. package/shared/content/data/type/topic.ts +11 -11
  219. package/shared/content/previousNext.ts +9 -9
  220. package/shared/contributor.ts +5 -5
  221. package/shared/frontNav.ts +41 -41
  222. package/shared/icons.ts +38 -38
  223. package/shared/image.ts +5 -5
  224. package/shared/link.ts +28 -28
  225. package/shared/popover.ts +8 -8
  226. package/shared/types/language.ts +74 -74
  227. package/shared/utils/objectsEqual.ts +4 -4
  228. package/shared/utils/stringColor.ts +9 -9
  229. package/test/contentId.test.ts +91 -91
  230. package/tsconfig.json +8 -8
  231. package/utils/contentPath.ts +67 -67
  232. package/utils/slash.ts +11 -11
  233. 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
+ }