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,32 +1,32 @@
1
- import { resetDatabase } from '@server/db/reset';
2
- import { ERUDIT_SERVER } from '@server/global';
3
- import { debug, logger } from '@server/logger';
4
-
5
- import { setup } from './setup';
6
- import { setupLanguage } from './jobs/language';
7
- import { buildContributors } from './jobs/contributors';
8
- import { buildNav } from './jobs/nav';
9
- import { buildContent } from './jobs/content/generic';
10
-
11
- let initial = true;
12
-
13
- async function _build() {
14
- debug.start('Building data...');
15
-
16
- if (initial) {
17
- await setup();
18
- initial = false;
19
- }
20
-
21
- await resetDatabase();
22
- await setupLanguage();
23
- await buildContributors();
24
- await buildNav();
25
- await buildContent();
26
-
27
- logger.success('Build successful!');
28
- }
29
-
30
- export async function build() {
31
- ERUDIT_SERVER.BUILD_PROMISE = _build();
32
- }
1
+ import { resetDatabase } from '@server/db/reset';
2
+ import { ERUDIT_SERVER } from '@server/global';
3
+ import { debug, logger } from '@server/logger';
4
+
5
+ import { setup } from './setup';
6
+ import { setupLanguage } from './jobs/language';
7
+ import { buildContributors } from './jobs/contributors';
8
+ import { buildNav } from './jobs/nav';
9
+ import { buildContent } from './jobs/content/generic';
10
+
11
+ let initial = true;
12
+
13
+ async function _build() {
14
+ debug.start('Building data...');
15
+
16
+ if (initial) {
17
+ await setup();
18
+ initial = false;
19
+ }
20
+
21
+ await resetDatabase();
22
+ await setupLanguage();
23
+ await buildContributors();
24
+ await buildNav();
25
+ await buildContent();
26
+
27
+ logger.success('Build successful!');
28
+ }
29
+
30
+ export async function build() {
31
+ ERUDIT_SERVER.BUILD_PROMISE = _build();
32
+ }
@@ -1,66 +1,66 @@
1
- import chokidar, { type FSWatcher } from 'chokidar';
2
-
3
- import { ERUDIT_DIR, PROJECT_DIR } from '#erudit/globalPaths';
4
- import { ERUDIT_SERVER } from '@server/global';
5
- import { logger } from '@server/logger';
6
- import { build } from '@server/build/process';
7
- import { stress } from '@erudit/utils/stress';
8
-
9
- const watchTargets: string[] = [
10
- // Languages
11
- ERUDIT_DIR + '/languages',
12
- // Content directory
13
- PROJECT_DIR + '/content',
14
- // Contributors directory
15
- PROJECT_DIR + '/contributors',
16
- ];
17
-
18
- const ignoreTargets: string[] = [];
19
-
20
- const rebuildDelay = 300;
21
-
22
- //
23
- //
24
- //
25
-
26
- let watcher: FSWatcher;
27
- let rebuildTimeout: any;
28
- let rebuildRequested = false;
29
- let pendingRebuild = false;
30
-
31
- export async function setupRebuildWatcher() {
32
- if (watcher) return;
33
-
34
- watcher = chokidar.watch(watchTargets, {
35
- ignored: ignoreTargets,
36
- ignoreInitial: true,
37
- });
38
-
39
- watcher.on('all', (event, path) =>
40
- requestServerRebuild(`File change: ${stress(path)}`),
41
- );
42
- }
43
-
44
- export async function requestServerRebuild(reason?: string) {
45
- // If rebuild is in progress, set flag for another rebuild after completion
46
- if (rebuildRequested) {
47
- pendingRebuild = true;
48
- return;
49
- }
50
-
51
- clearTimeout(rebuildTimeout);
52
- rebuildTimeout = setTimeout(async () => {
53
- rebuildRequested = true;
54
- await ERUDIT_SERVER.BUILD_PROMISE;
55
- console.log('\n');
56
- logger.info(`Rebuilding server data!${reason ? ` ${reason}` : ''}\n\n`);
57
- await build();
58
- rebuildRequested = false;
59
-
60
- // If changes were detected during rebuild, start another rebuild
61
- if (pendingRebuild) {
62
- pendingRebuild = false;
63
- requestServerRebuild('Changes detected during previous rebuild');
64
- }
65
- }, rebuildDelay);
66
- }
1
+ import chokidar, { type FSWatcher } from 'chokidar';
2
+
3
+ import { ERUDIT_DIR, PROJECT_DIR } from '#erudit/globalPaths';
4
+ import { ERUDIT_SERVER } from '@server/global';
5
+ import { logger } from '@server/logger';
6
+ import { build } from '@server/build/process';
7
+ import { stress } from '@erudit/utils/stress';
8
+
9
+ const watchTargets: string[] = [
10
+ // Languages
11
+ ERUDIT_DIR + '/languages',
12
+ // Content directory
13
+ PROJECT_DIR + '/content',
14
+ // Contributors directory
15
+ PROJECT_DIR + '/contributors',
16
+ ];
17
+
18
+ const ignoreTargets: string[] = [];
19
+
20
+ const rebuildDelay = 300;
21
+
22
+ //
23
+ //
24
+ //
25
+
26
+ let watcher: FSWatcher;
27
+ let rebuildTimeout: any;
28
+ let rebuildRequested = false;
29
+ let pendingRebuild = false;
30
+
31
+ export async function setupRebuildWatcher() {
32
+ if (watcher) return;
33
+
34
+ watcher = chokidar.watch(watchTargets, {
35
+ ignored: ignoreTargets,
36
+ ignoreInitial: true,
37
+ });
38
+
39
+ watcher.on('all', (event, path) =>
40
+ requestServerRebuild(`File change: ${stress(path)}`),
41
+ );
42
+ }
43
+
44
+ export async function requestServerRebuild(reason?: string) {
45
+ // If rebuild is in progress, set flag for another rebuild after completion
46
+ if (rebuildRequested) {
47
+ pendingRebuild = true;
48
+ return;
49
+ }
50
+
51
+ clearTimeout(rebuildTimeout);
52
+ rebuildTimeout = setTimeout(async () => {
53
+ rebuildRequested = true;
54
+ await ERUDIT_SERVER.BUILD_PROMISE;
55
+ console.log('\n');
56
+ logger.info(`Rebuilding server data!${reason ? ` ${reason}` : ''}\n\n`);
57
+ await build();
58
+ rebuildRequested = false;
59
+
60
+ // If changes were detected during rebuild, start another rebuild
61
+ if (pendingRebuild) {
62
+ pendingRebuild = false;
63
+ requestServerRebuild('Changes detected during previous rebuild');
64
+ }
65
+ }, rebuildDelay);
66
+ }
@@ -1,19 +1,19 @@
1
- import eruditConfig from '#erudit/config';
2
-
3
- import { registerGlobals } from '@erudit/globals/register';
4
- import { debug } from '@server/logger';
5
- import { ERUDIT_SERVER } from '@server/global';
6
-
7
- import { setupRebuildWatcher } from './rebuild';
8
- import { setupDatabase } from '../db/setup';
9
-
10
- export async function setup() {
11
- debug.start('Running initial setup procedures...');
12
-
13
- if (import.meta.dev) await setupRebuildWatcher();
14
-
15
- registerGlobals();
16
- ERUDIT_SERVER.CONFIG = eruditConfig;
17
-
18
- await setupDatabase();
19
- }
1
+ import eruditConfig from '#erudit/config';
2
+
3
+ import { registerGlobals } from '@erudit/globals/register';
4
+ import { debug } from '@server/logger';
5
+ import { ERUDIT_SERVER } from '@server/global';
6
+
7
+ import { setupRebuildWatcher } from './rebuild';
8
+ import { setupDatabase } from '../db/setup';
9
+
10
+ export async function setup() {
11
+ debug.start('Running initial setup procedures...');
12
+
13
+ if (import.meta.dev) await setupRebuildWatcher();
14
+
15
+ registerGlobals();
16
+ ERUDIT_SERVER.CONFIG = eruditConfig;
17
+
18
+ await setupDatabase();
19
+ }
@@ -1,119 +1,119 @@
1
- import {
2
- isContentType,
3
- isTopicPart,
4
- type BitranLocation,
5
- type TopicPart,
6
- } from '@erudit-js/cog/schema';
7
-
8
- import { ERUDIT_SERVER } from '@server/global';
9
- import { getIdsUp, isSkipId } from '@server/nav/utils';
10
- import { DbContent } from '@server/db/entities/Content';
11
- import { DbContributor } from '@server/db/entities/Contributor';
12
- import { getFullContentId } from '@server/repository/contentId';
13
-
14
- import type { Context } from '@shared/content/context';
15
- import {
16
- createContentLink,
17
- createContributorLink,
18
- createTopicPartLink,
19
- } from '@shared/link';
20
- import { CONTENT_TYPE_ICON, ICON, TOPIC_PART_ICON } from '@erudit/shared/icons';
21
-
22
- export async function getContentContext(contentId: string): Promise<Context> {
23
- contentId = getFullContentId(contentId);
24
-
25
- const context: Context = [];
26
-
27
- for (const _contentId of getIdsUp(contentId).reverse()) {
28
- const dbContent = await getDbContent(_contentId);
29
-
30
- context.push({
31
- type: ERUDIT_SERVER.LANGUAGE.phrases[dbContent.type],
32
- icon: isTopicPart(dbContent.type)
33
- ? TOPIC_PART_ICON[dbContent.type]
34
- : isContentType(dbContent.type)
35
- ? CONTENT_TYPE_ICON[dbContent.type]
36
- : '',
37
- title: dbContent.title || dbContent.contentId,
38
- href: createContentLink(dbContent.type, dbContent.contentId),
39
- hidden: await isSkipId(dbContent.contentId),
40
- });
41
- }
42
-
43
- return context;
44
- }
45
-
46
- export async function getTopicPartContext(
47
- topicPart: TopicPart,
48
- contentId: string,
49
- ): Promise<Context> {
50
- const context = await getContentContext(contentId);
51
- const topicItem = context.pop()!;
52
-
53
- topicItem.type = ERUDIT_SERVER.LANGUAGE.phrases[topicPart];
54
- topicItem.icon = TOPIC_PART_ICON[topicPart];
55
- topicItem.href = createTopicPartLink(topicPart, contentId);
56
-
57
- return context.concat([topicItem]);
58
- }
59
-
60
- export async function getContributorContext(
61
- contributorId: string,
62
- ): Promise<Context> {
63
- const dbContributor = await ERUDIT_SERVER.DB.manager.findOne(
64
- DbContributor,
65
- {
66
- select: ['displayName'],
67
- where: { contributorId },
68
- },
69
- );
70
-
71
- if (!dbContributor)
72
- throw new Error(`Contributor "${contributorId}" not found!`);
73
-
74
- return [
75
- {
76
- type: ERUDIT_SERVER.LANGUAGE.phrases.contributor,
77
- icon: ICON.contributor,
78
- title: dbContributor.displayName || contributorId,
79
- href: createContributorLink(contributorId),
80
- hidden: false,
81
- },
82
- ];
83
- }
84
-
85
- export async function getLocationContext(
86
- location: BitranLocation,
87
- ): Promise<Context> {
88
- const contentId = location.path!;
89
-
90
- switch (location.type) {
91
- case 'article':
92
- case 'summary':
93
- case 'practice':
94
- return await getTopicPartContext(location.type, contentId);
95
- case 'group':
96
- return await getContentContext(contentId);
97
- case 'contributor':
98
- return await getContributorContext(contentId);
99
- }
100
-
101
- throw new Error(
102
- `Cant' build context for location unknown type "${location.type}"!`,
103
- );
104
- }
105
-
106
- //
107
- //
108
- //
109
-
110
- async function getDbContent(contentId: string): Promise<DbContent> {
111
- const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
112
- select: ['type', 'title', 'contentId'],
113
- where: { contentId },
114
- });
115
-
116
- if (!dbContent) throw new Error(`Content "${contentId}" not found!`);
117
-
118
- return dbContent;
119
- }
1
+ import {
2
+ isContentType,
3
+ isTopicPart,
4
+ type BitranLocation,
5
+ type TopicPart,
6
+ } from '@erudit-js/cog/schema';
7
+
8
+ import { ERUDIT_SERVER } from '@server/global';
9
+ import { getIdsUp, isSkipId } from '@server/nav/utils';
10
+ import { DbContent } from '@server/db/entities/Content';
11
+ import { DbContributor } from '@server/db/entities/Contributor';
12
+ import { getFullContentId } from '@server/repository/contentId';
13
+
14
+ import type { Context } from '@shared/content/context';
15
+ import {
16
+ createContentLink,
17
+ createContributorLink,
18
+ createTopicPartLink,
19
+ } from '@shared/link';
20
+ import { CONTENT_TYPE_ICON, ICON, TOPIC_PART_ICON } from '@erudit/shared/icons';
21
+
22
+ export async function getContentContext(contentId: string): Promise<Context> {
23
+ contentId = getFullContentId(contentId);
24
+
25
+ const context: Context = [];
26
+
27
+ for (const _contentId of getIdsUp(contentId).reverse()) {
28
+ const dbContent = await getDbContent(_contentId);
29
+
30
+ context.push({
31
+ type: ERUDIT_SERVER.LANGUAGE.phrases[dbContent.type],
32
+ icon: isTopicPart(dbContent.type)
33
+ ? TOPIC_PART_ICON[dbContent.type]
34
+ : isContentType(dbContent.type)
35
+ ? CONTENT_TYPE_ICON[dbContent.type]
36
+ : '',
37
+ title: dbContent.title || dbContent.contentId,
38
+ href: createContentLink(dbContent.type, dbContent.contentId),
39
+ hidden: await isSkipId(dbContent.contentId),
40
+ });
41
+ }
42
+
43
+ return context;
44
+ }
45
+
46
+ export async function getTopicPartContext(
47
+ topicPart: TopicPart,
48
+ contentId: string,
49
+ ): Promise<Context> {
50
+ const context = await getContentContext(contentId);
51
+ const topicItem = context.pop()!;
52
+
53
+ topicItem.type = ERUDIT_SERVER.LANGUAGE.phrases[topicPart];
54
+ topicItem.icon = TOPIC_PART_ICON[topicPart];
55
+ topicItem.href = createTopicPartLink(topicPart, contentId);
56
+
57
+ return context.concat([topicItem]);
58
+ }
59
+
60
+ export async function getContributorContext(
61
+ contributorId: string,
62
+ ): Promise<Context> {
63
+ const dbContributor = await ERUDIT_SERVER.DB.manager.findOne(
64
+ DbContributor,
65
+ {
66
+ select: ['displayName'],
67
+ where: { contributorId },
68
+ },
69
+ );
70
+
71
+ if (!dbContributor)
72
+ throw new Error(`Contributor "${contributorId}" not found!`);
73
+
74
+ return [
75
+ {
76
+ type: ERUDIT_SERVER.LANGUAGE.phrases.contributor,
77
+ icon: ICON.contributor,
78
+ title: dbContributor.displayName || contributorId,
79
+ href: createContributorLink(contributorId),
80
+ hidden: false,
81
+ },
82
+ ];
83
+ }
84
+
85
+ export async function getLocationContext(
86
+ location: BitranLocation,
87
+ ): Promise<Context> {
88
+ const contentId = location.path!;
89
+
90
+ switch (location.type) {
91
+ case 'article':
92
+ case 'summary':
93
+ case 'practice':
94
+ return await getTopicPartContext(location.type, contentId);
95
+ case 'group':
96
+ return await getContentContext(contentId);
97
+ case 'contributor':
98
+ return await getContributorContext(contentId);
99
+ }
100
+
101
+ throw new Error(
102
+ `Cant' build context for location unknown type "${location.type}"!`,
103
+ );
104
+ }
105
+
106
+ //
107
+ //
108
+ //
109
+
110
+ async function getDbContent(contentId: string): Promise<DbContent> {
111
+ const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
112
+ select: ['type', 'title', 'contentId'],
113
+ where: { contentId },
114
+ });
115
+
116
+ if (!dbContent) throw new Error(`Content "${contentId}" not found!`);
117
+
118
+ return dbContent;
119
+ }
@@ -1,7 +1,7 @@
1
- import { Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('book')
4
- export class DbBook {
5
- @PrimaryColumn('varchar')
6
- contentId!: string;
7
- }
1
+ import { Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('book')
4
+ export class DbBook {
5
+ @PrimaryColumn('varchar')
6
+ contentId!: string;
7
+ }
@@ -1,45 +1,45 @@
1
- import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
2
- import type {
3
- ContentFlag,
4
- ContentReferences,
5
- ContentSeo,
6
- ContentType,
7
- } from '@erudit-js/cog/schema';
8
-
9
- import type { ImageData } from '@erudit/shared/image';
10
-
11
- @Entity('content')
12
- export class DbContent {
13
- @PrimaryColumn('varchar')
14
- contentId!: string;
15
-
16
- @Column('varchar')
17
- type!: ContentType;
18
-
19
- @Column('varchar', { nullable: true })
20
- title?: string;
21
-
22
- @Column('varchar', { nullable: true })
23
- navTitle?: string;
24
-
25
- @Column('text', { nullable: true })
26
- description?: string;
27
-
28
- @Column('simple-json', { nullable: true })
29
- flags?: Partial<Record<ContentFlag, boolean>>;
30
-
31
- @Column('varchar', { nullable: true })
32
- decoration?: string;
33
-
34
- @Column('simple-json', { nullable: true })
35
- seo?: Partial<ContentSeo>;
36
-
37
- @Column('simple-json', { nullable: true })
38
- ogImage?: ImageData;
39
-
40
- @Column('simple-array', { nullable: true })
41
- dependencies?: string[];
42
-
43
- @Column('simple-json', { nullable: true })
44
- references?: ContentReferences;
45
- }
1
+ import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
2
+ import type {
3
+ ContentFlag,
4
+ ContentReferences,
5
+ ContentSeo,
6
+ ContentType,
7
+ } from '@erudit-js/cog/schema';
8
+
9
+ import type { ImageData } from '@erudit/shared/image';
10
+
11
+ @Entity('content')
12
+ export class DbContent {
13
+ @PrimaryColumn('varchar')
14
+ contentId!: string;
15
+
16
+ @Column('varchar')
17
+ type!: ContentType;
18
+
19
+ @Column('varchar', { nullable: true })
20
+ title?: string;
21
+
22
+ @Column('varchar', { nullable: true })
23
+ navTitle?: string;
24
+
25
+ @Column('text', { nullable: true })
26
+ description?: string;
27
+
28
+ @Column('simple-json', { nullable: true })
29
+ flags?: Partial<Record<ContentFlag, boolean>>;
30
+
31
+ @Column('varchar', { nullable: true })
32
+ decoration?: string;
33
+
34
+ @Column('simple-json', { nullable: true })
35
+ seo?: Partial<ContentSeo>;
36
+
37
+ @Column('simple-json', { nullable: true })
38
+ ogImage?: ImageData;
39
+
40
+ @Column('simple-array', { nullable: true })
41
+ dependencies?: string[];
42
+
43
+ @Column('simple-json', { nullable: true })
44
+ references?: ContentReferences;
45
+ }
@@ -1,10 +1,10 @@
1
- import { Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('contribution')
4
- export class DbContribution {
5
- @PrimaryColumn('varchar')
6
- contentId!: string;
7
-
8
- @PrimaryColumn('varchar')
9
- contributorId!: string;
10
- }
1
+ import { Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('contribution')
4
+ export class DbContribution {
5
+ @PrimaryColumn('varchar')
6
+ contentId!: string;
7
+
8
+ @PrimaryColumn('varchar')
9
+ contributorId!: string;
10
+ }
@@ -1,16 +1,16 @@
1
- import { Column, Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('contributor')
4
- export class DbContributor {
5
- @PrimaryColumn('varchar')
6
- contributorId!: string;
7
-
8
- @Column('varchar', { nullable: true })
9
- displayName?: string;
10
-
11
- @Column('text', { nullable: true })
12
- description?: string;
13
-
14
- @Column('varchar', { nullable: true })
15
- avatar?: string;
16
- }
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('contributor')
4
+ export class DbContributor {
5
+ @PrimaryColumn('varchar')
6
+ contributorId!: string;
7
+
8
+ @Column('varchar', { nullable: true })
9
+ displayName?: string;
10
+
11
+ @Column('text', { nullable: true })
12
+ description?: string;
13
+
14
+ @Column('varchar', { nullable: true })
15
+ avatar?: string;
16
+ }
@@ -1,10 +1,10 @@
1
- import { Column, Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('file')
4
- export class DbFile {
5
- @PrimaryColumn('varchar')
6
- path!: string;
7
-
8
- @Column('varchar', { unique: true })
9
- fullPath!: string;
10
- }
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('file')
4
+ export class DbFile {
5
+ @PrimaryColumn('varchar')
6
+ path!: string;
7
+
8
+ @Column('varchar', { unique: true })
9
+ fullPath!: string;
10
+ }