erudit 2.0.0-dev.7 → 2.0.0-dev.9

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 (212) hide show
  1. package/.nuxtrc +1 -1
  2. package/app/app.vue +172 -172
  3. package/app/components/Loading.vue +23 -23
  4. package/app/components/SiteAside.vue +382 -382
  5. package/app/components/SiteMain.vue +35 -35
  6. package/app/components/ads/BannerTemplate.vue +51 -51
  7. package/app/components/ads/BottomBanner.vue +45 -45
  8. package/app/components/ads/LeftBanner.vue +50 -50
  9. package/app/components/aside/AsideListItem.vue +74 -74
  10. package/app/components/aside/AsideMajor.vue +56 -56
  11. package/app/components/aside/AsideMinor.vue +71 -71
  12. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  13. package/app/components/aside/major/PaneSwitch.vue +54 -54
  14. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  15. package/app/components/aside/major/SiteInfo.vue +85 -85
  16. package/app/components/aside/major/panes/Language.vue +79 -79
  17. package/app/components/aside/major/panes/Pages.vue +34 -34
  18. package/app/components/aside/major/panes/Search.vue +2 -2
  19. package/app/components/aside/major/panes/nav/Nav.vue +91 -91
  20. package/app/components/aside/major/panes/nav/NavBook.vue +86 -86
  21. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  22. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  23. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  24. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  25. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  26. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  27. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  28. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  29. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  30. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  31. package/app/components/aside/major/panes/other/ItemGenerator.vue +15 -15
  32. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  33. package/app/components/aside/major/panes/other/Other.vue +16 -16
  34. package/app/components/aside/minor/AsideMinorContributor.vue +4 -4
  35. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  36. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  37. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  38. package/app/components/aside/minor/Contribute.vue +145 -145
  39. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  40. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  41. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  42. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  43. package/app/components/aside/minor/topic/TopicToc.vue +203 -202
  44. package/app/components/aside/minor/topic/TopicTocItem.vue +31 -31
  45. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  46. package/app/components/bitran/BitranContent.vue +63 -64
  47. package/app/components/bitran/RenderWrapper.vue +10 -12
  48. package/app/components/contributor/ContributorAvatar.vue +43 -43
  49. package/app/components/contributor/ContributorListItem.vue +35 -35
  50. package/app/components/main/topic/MainTopic.vue +79 -79
  51. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  52. package/app/components/main/utils/Breadcrumb.vue +75 -75
  53. package/app/components/main/utils/ContentDecoration.vue +29 -29
  54. package/app/components/main/utils/ContentDescription.vue +19 -19
  55. package/app/components/main/utils/ContentFlag.vue +15 -15
  56. package/app/components/main/utils/ContentPopover.vue +176 -176
  57. package/app/components/main/utils/ContentPopovers.vue +105 -105
  58. package/app/components/main/utils/ContentReferences.vue +75 -75
  59. package/app/components/main/utils/ContentSection.vue +41 -41
  60. package/app/components/main/utils/ContentTitle.vue +36 -36
  61. package/app/components/main/utils/reference/ReferenceGroup.vue +40 -40
  62. package/app/components/main/utils/reference/ReferenceItem.vue +63 -63
  63. package/app/components/main/utils/reference/ReferenceSource.vue +109 -109
  64. package/app/components/preview/Preview.vue +177 -177
  65. package/app/components/preview/PreviewDisplay.vue +139 -139
  66. package/app/components/preview/PreviewFooterAction.vue +73 -73
  67. package/app/components/preview/PreviewLoading.vue +14 -14
  68. package/app/components/preview/PreviewScreen.vue +99 -99
  69. package/app/components/preview/display/Alert.vue +50 -50
  70. package/app/components/preview/display/Custom.vue +18 -18
  71. package/app/components/preview/display/GenericLink.vue +48 -48
  72. package/app/components/preview/display/PageLink.vue +20 -20
  73. package/app/components/preview/display/Unique.vue +49 -49
  74. package/app/components/transition/Fade.vue +21 -21
  75. package/app/components/tree/TreeContainer.vue +11 -11
  76. package/app/components/tree/TreeItem.vue +89 -89
  77. package/app/composables/bitran.ts +98 -103
  78. package/app/composables/bitranContent.ts +2 -1
  79. package/app/composables/contentPage.ts +1 -1
  80. package/app/composables/phrases.ts +80 -80
  81. package/app/pages/_test/preview.vue +110 -110
  82. package/app/pages/article/[...articleId].vue +2 -2
  83. package/app/pages/book/[...bookId].vue +47 -47
  84. package/app/pages/group/[...groupId].vue +65 -64
  85. package/app/pages/index.vue +32 -32
  86. package/app/pages/members.vue +6 -6
  87. package/app/pages/practice/[...practice].vue +2 -2
  88. package/app/pages/summary/[...summaryId].vue +2 -2
  89. package/app/public/favicon/article.svg +9 -9
  90. package/app/public/favicon/default.svg +9 -9
  91. package/app/public/favicon/practice.svg +9 -9
  92. package/app/public/favicon/summary.svg +9 -9
  93. package/app/public/logotype.svg +16 -16
  94. package/app/public/user.svg +9 -9
  95. package/app/scripts/_immediate.js +3 -3
  96. package/app/scripts/flag.ts +28 -28
  97. package/app/scripts/og.ts +27 -27
  98. package/app/scripts/preview/data/unique.ts +3 -3
  99. package/app/scripts/preview/display.ts +5 -7
  100. package/app/scripts/preview/request.ts +2 -2
  101. package/app/styles/_immediate.css +2 -2
  102. package/app/styles/_util.scss +49 -49
  103. package/app/styles/_utils.scss +44 -44
  104. package/app/styles/default.scss +84 -84
  105. package/app/styles/partials/_darkMagic.scss +6 -6
  106. package/app/styles/partials/_fnav.scss +17 -17
  107. package/app/styles/partials/_preview.scss +6 -6
  108. package/globalPath.ts +21 -24
  109. package/globals/bitran.ts +21 -13
  110. package/globals/erudit.ts +5 -5
  111. package/globals/register.ts +18 -18
  112. package/languages/en.ts +95 -95
  113. package/languages/ru.ts +99 -99
  114. package/module/config.ts +34 -34
  115. package/module/imports.ts +46 -46
  116. package/module/index.ts +47 -35
  117. package/module/logger.ts +10 -10
  118. package/module/restart.ts +61 -61
  119. package/nuxt.config.ts +107 -96
  120. package/package.json +9 -6
  121. package/server/api/aside/major/nav/bookIds.ts +5 -5
  122. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  123. package/server/api/aside/major/nav/global.ts +7 -7
  124. package/server/api/aside/minor/news.ts +7 -7
  125. package/server/api/aside/minor/path.ts +78 -78
  126. package/server/api/bitran/content/[location].ts +7 -7
  127. package/server/api/bitran/toc/[location].ts +7 -7
  128. package/server/api/content/data.ts +72 -72
  129. package/server/api/fake/content.ts +10 -10
  130. package/server/api/fake/shared/languages.ts +12 -12
  131. package/server/api/language/functions.ts +12 -12
  132. package/server/api/language/phrase/[phraseId].ts +19 -19
  133. package/server/api/language/phraseIds.ts +8 -8
  134. package/server/api/preview/page/[...parts].ts +51 -51
  135. package/server/api/preview/unique/[location].ts +55 -55
  136. package/server/plugin/bitran/content.ts +55 -44
  137. package/server/plugin/bitran/products/include.ts +28 -27
  138. package/server/plugin/bitran/products/link.ts +11 -9
  139. package/server/plugin/bitran/setup.ts +0 -1
  140. package/server/plugin/bitran/toc.ts +25 -24
  141. package/server/plugin/bitran/transpiler.ts +46 -0
  142. package/server/plugin/build/close.ts +10 -10
  143. package/server/plugin/build/jobs/content/parse.ts +37 -27
  144. package/server/plugin/build/jobs/language.ts +36 -36
  145. package/server/plugin/build/process.ts +25 -25
  146. package/server/plugin/build/rebuild.ts +55 -55
  147. package/server/plugin/build/setup.ts +21 -21
  148. package/server/plugin/global.ts +18 -18
  149. package/server/plugin/importer.ts +12 -12
  150. package/server/plugin/index.ts +9 -9
  151. package/server/plugin/logger.ts +23 -23
  152. package/server/tsconfig.json +7 -7
  153. package/shared/bitran/context.ts +3 -2
  154. package/shared/bitran/default.ts +46 -0
  155. package/shared/bitran/{products/link/render → link}/Link.vue +7 -14
  156. package/shared/bitran/link/factory.ts +24 -0
  157. package/shared/bitran/link/languages/en.ts +7 -0
  158. package/shared/bitran/link/languages/ru.ts +7 -0
  159. package/shared/bitran/link/renderer.ts +21 -0
  160. package/shared/bitran/link/shared.ts +17 -0
  161. package/shared/bitran/{products/link → link}/target.ts +1 -1
  162. package/shared/bitran/link/transpiler.ts +10 -0
  163. package/shared/content/context.ts +9 -9
  164. package/shared/content/data/base.ts +32 -32
  165. package/shared/content/data/index.ts +5 -5
  166. package/shared/content/data/type/book.ts +5 -5
  167. package/shared/content/data/type/group.ts +6 -6
  168. package/shared/content/data/type/topic.ts +11 -11
  169. package/shared/content/previousNext.ts +9 -9
  170. package/shared/link.ts +25 -25
  171. package/shared/types/language.ts +75 -75
  172. package/test/bitran/{products/link → link}/target.test.ts +5 -2
  173. package/tsconfig.json +8 -8
  174. package/utils/stress.ts +9 -9
  175. package/server/plugin/bitran/core.ts +0 -51
  176. package/shared/bitran/alias.ts +0 -17
  177. package/shared/bitran/products/alias/core/factory.ts +0 -46
  178. package/shared/bitran/products/alias/core/index.ts +0 -13
  179. package/shared/bitran/products/alias/render/Alias.vue +0 -10
  180. package/shared/bitran/products/alias/render/icon.svg +0 -3
  181. package/shared/bitran/products/alias/render/index.ts +0 -17
  182. package/shared/bitran/products/alias/render/languages/en.ts +0 -5
  183. package/shared/bitran/products/alias/render/languages/ru.ts +0 -5
  184. package/shared/bitran/products/alias/shared.ts +0 -11
  185. package/shared/bitran/products/heading/core/factory.ts +0 -53
  186. package/shared/bitran/products/heading/core/index.ts +0 -19
  187. package/shared/bitran/products/heading/render/Heading.vue +0 -47
  188. package/shared/bitran/products/heading/render/icon.svg +0 -3
  189. package/shared/bitran/products/heading/render/index.ts +0 -17
  190. package/shared/bitran/products/heading/render/languages/en.ts +0 -5
  191. package/shared/bitran/products/heading/render/languages/ru.ts +0 -5
  192. package/shared/bitran/products/heading/shared.ts +0 -13
  193. package/shared/bitran/products/include/core/factory.ts +0 -61
  194. package/shared/bitran/products/include/core/index.ts +0 -13
  195. package/shared/bitran/products/include/render/Include.vue +0 -13
  196. package/shared/bitran/products/include/render/icon.svg +0 -3
  197. package/shared/bitran/products/include/render/index.ts +0 -18
  198. package/shared/bitran/products/include/render/languages/en.ts +0 -5
  199. package/shared/bitran/products/include/render/languages/ru.ts +0 -5
  200. package/shared/bitran/products/include/shared.ts +0 -15
  201. package/shared/bitran/products/link/core/factory.ts +0 -20
  202. package/shared/bitran/products/link/core/index.ts +0 -17
  203. package/shared/bitran/products/link/render/index.ts +0 -17
  204. package/shared/bitran/products/link/render/languages/en.ts +0 -5
  205. package/shared/bitran/products/link/render/languages/ru.ts +0 -5
  206. package/shared/bitran/products/link/shared.ts +0 -15
  207. package/test/bitran/alias.test.ts +0 -44
  208. package/test/bitran/products/alias.test.ts +0 -83
  209. package/test/bitran/products/heading.test.ts +0 -119
  210. package/test/bitran/products/include.test.ts +0 -77
  211. package/test/bitran/products/link/factory.test.ts +0 -30
  212. /package/shared/bitran/{products/link/render → link}/icon.svg +0 -0
@@ -1,72 +1,72 @@
1
- import { getTopicPartsLinks } from '@server/repository/topic';
2
- import { getContentBookFor } from '@server/repository/book';
3
- import { getContentGenericData } from '@server/repository/content';
4
-
5
- import type { ContentGenericData } from '@shared/content/data/base';
6
- import type { ContentTopicData } from '@shared/content/data/type/topic';
7
- import type { ContentGroupData } from '@shared/content/data/type/group';
8
- import type { ContentBookData } from '@shared/content/data/type/book';
9
-
10
- export default defineEventHandler(async (event) => {
11
- const contentId = getQuery(event)?.contentId as string;
12
-
13
- if (!contentId)
14
- throw createError({
15
- statusCode: 400,
16
- statusText: 'Missing content ID!',
17
- });
18
-
19
- const generic = await getContentGenericData(contentId);
20
-
21
- switch (generic.type) {
22
- case 'topic':
23
- return await getTopicData(generic);
24
- case 'group':
25
- return await getGroupData(generic);
26
- case 'book':
27
- return await getBookData(generic);
28
- }
29
-
30
- throw createError({
31
- statusCode: 400,
32
- statusText: `Unknown content data type "${generic.type}"!`,
33
- });
34
- });
35
-
36
- //
37
- //
38
- //
39
-
40
- async function getTopicData(
41
- generic: ContentGenericData,
42
- ): Promise<ContentTopicData> {
43
- const contentBook = await getContentBookFor(generic.contentId);
44
-
45
- return {
46
- type: 'topic',
47
- generic,
48
- bookTitle: contentBook?.title,
49
- topicPartLinks: await getTopicPartsLinks(generic.contentId),
50
- };
51
- }
52
-
53
- async function getGroupData(
54
- generic: ContentGenericData,
55
- ): Promise<ContentGroupData> {
56
- const contentBook = await getContentBookFor(generic.contentId);
57
-
58
- return {
59
- type: 'group',
60
- generic,
61
- bookTitle: contentBook?.title,
62
- };
63
- }
64
-
65
- async function getBookData(
66
- generic: ContentGenericData,
67
- ): Promise<ContentBookData> {
68
- return {
69
- type: 'book',
70
- generic,
71
- };
72
- }
1
+ import { getTopicPartsLinks } from '@server/repository/topic';
2
+ import { getContentBookFor } from '@server/repository/book';
3
+ import { getContentGenericData } from '@server/repository/content';
4
+
5
+ import type { ContentGenericData } from '@shared/content/data/base';
6
+ import type { ContentTopicData } from '@shared/content/data/type/topic';
7
+ import type { ContentGroupData } from '@shared/content/data/type/group';
8
+ import type { ContentBookData } from '@shared/content/data/type/book';
9
+
10
+ export default defineEventHandler(async (event) => {
11
+ const contentId = getQuery(event)?.contentId as string;
12
+
13
+ if (!contentId)
14
+ throw createError({
15
+ statusCode: 400,
16
+ statusText: 'Missing content ID!',
17
+ });
18
+
19
+ const generic = await getContentGenericData(contentId);
20
+
21
+ switch (generic.type) {
22
+ case 'topic':
23
+ return await getTopicData(generic);
24
+ case 'group':
25
+ return await getGroupData(generic);
26
+ case 'book':
27
+ return await getBookData(generic);
28
+ }
29
+
30
+ throw createError({
31
+ statusCode: 400,
32
+ statusText: `Unknown content data type "${generic.type}"!`,
33
+ });
34
+ });
35
+
36
+ //
37
+ //
38
+ //
39
+
40
+ async function getTopicData(
41
+ generic: ContentGenericData,
42
+ ): Promise<ContentTopicData> {
43
+ const contentBook = await getContentBookFor(generic.contentId);
44
+
45
+ return {
46
+ type: 'topic',
47
+ generic,
48
+ bookTitle: contentBook?.title,
49
+ topicPartLinks: await getTopicPartsLinks(generic.contentId),
50
+ };
51
+ }
52
+
53
+ async function getGroupData(
54
+ generic: ContentGenericData,
55
+ ): Promise<ContentGroupData> {
56
+ const contentBook = await getContentBookFor(generic.contentId);
57
+
58
+ return {
59
+ type: 'group',
60
+ generic,
61
+ bookTitle: contentBook?.title,
62
+ };
63
+ }
64
+
65
+ async function getBookData(
66
+ generic: ContentGenericData,
67
+ ): Promise<ContentBookData> {
68
+ return {
69
+ type: 'book',
70
+ generic,
71
+ };
72
+ }
@@ -1,11 +1,11 @@
1
- export default defineEventHandler(() => {
2
- return {
3
- commit: {
4
- commit: {
5
- author: {
6
- date: '2019-08-30T14:57:06.000Z'
7
- }
8
- }
9
- }
10
- }
1
+ export default defineEventHandler(() => {
2
+ return {
3
+ commit: {
4
+ commit: {
5
+ author: {
6
+ date: '2019-08-30T14:57:06.000Z'
7
+ }
8
+ }
9
+ }
10
+ }
11
11
  });
@@ -1,12 +1,12 @@
1
- export default defineEventHandler(() => {
2
- return {
3
- en: {
4
- name: 'English',
5
- link: 'https://en.omath.net',
6
- },
7
- ru: {
8
- name: 'Русский',
9
- link: 'https://omath.ru',
10
- },
11
- };
12
- });
1
+ export default defineEventHandler(() => {
2
+ return {
3
+ en: {
4
+ name: 'English',
5
+ link: 'https://en.omath.net',
6
+ },
7
+ ru: {
8
+ name: 'Русский',
9
+ link: 'https://omath.ru',
10
+ },
11
+ };
12
+ });
@@ -1,12 +1,12 @@
1
- import { ERUDIT_SERVER } from '@server/global';
2
-
3
- export default defineEventHandler(() => {
4
- const strFunctions: Record<string, string> = {};
5
-
6
- for (const [key, func] of Object.entries(
7
- ERUDIT_SERVER.LANGUAGE?.functions || {},
8
- ))
9
- strFunctions[key] = 'return ' + func.toString();
10
-
11
- return strFunctions;
12
- });
1
+ import { ERUDIT_SERVER } from '@server/global';
2
+
3
+ export default defineEventHandler(() => {
4
+ const strFunctions: Record<string, string> = {};
5
+
6
+ for (const [key, func] of Object.entries(
7
+ ERUDIT_SERVER.LANGUAGE?.functions || {},
8
+ ))
9
+ strFunctions[key] = 'return ' + func.toString();
10
+
11
+ return strFunctions;
12
+ });
@@ -1,19 +1,19 @@
1
- import type { EruditPhraseId } from '@shared/types/language';
2
- import { ERUDIT_SERVER } from '@server/global';
3
-
4
- export default defineEventHandler((event) => {
5
- const phraseId = getRouterParam(event, 'phraseId');
6
- const phrase =
7
- ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
8
-
9
- setResponseHeader(event, 'content-type', 'text/plain');
10
-
11
- if (typeof phrase === 'string') return phrase;
12
- else if (typeof phrase === 'function')
13
- return '~!~FUNC~!~' + 'return ' + phrase.toString();
14
-
15
- throw createError({
16
- statusCode: 400,
17
- statusText: `Unknown phrase id "${phraseId}"!`,
18
- });
19
- });
1
+ import type { EruditPhraseId } from '@shared/types/language';
2
+ import { ERUDIT_SERVER } from '@server/global';
3
+
4
+ export default defineEventHandler((event) => {
5
+ const phraseId = getRouterParam(event, 'phraseId');
6
+ const phrase =
7
+ ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
8
+
9
+ setResponseHeader(event, 'content-type', 'text/plain');
10
+
11
+ if (typeof phrase === 'string') return phrase;
12
+ else if (typeof phrase === 'function')
13
+ return '~!~FUNC~!~' + 'return ' + phrase.toString();
14
+
15
+ throw createError({
16
+ statusCode: 400,
17
+ statusText: `Unknown phrase id "${phraseId}"!`,
18
+ });
19
+ });
@@ -1,8 +1,8 @@
1
- import { ERUDIT_SERVER } from '@server/global';
2
- import type { EruditPhraseId } from '@shared/types/language';
3
-
4
- export default defineEventHandler(() => {
5
- return Object.keys(
6
- ERUDIT_SERVER.LANGUAGE?.phrases || [],
7
- ) as EruditPhraseId[];
8
- });
1
+ import { ERUDIT_SERVER } from '@server/global';
2
+ import type { EruditPhraseId } from '@shared/types/language';
3
+
4
+ export default defineEventHandler(() => {
5
+ return Object.keys(
6
+ ERUDIT_SERVER.LANGUAGE?.phrases || [],
7
+ ) as EruditPhraseId[];
8
+ });
@@ -1,51 +1,51 @@
1
- import {
2
- getContentContext,
3
- getTopicPartContext,
4
- getContributorContext,
5
- } from '@erudit/server/plugin/content/context';
6
-
7
- import type { PreviewDataPageLink } from '@app/scripts/preview/data/pageLink';
8
- import type { LinkTargetPageType } from '@erudit/shared/bitran/products/link/target';
9
- import type { Context, ContextItem } from '@erudit/shared/content/context';
10
-
11
- export default defineEventHandler<Promise<PreviewDataPageLink>>(
12
- async (event) => {
13
- const urlParts = (event.context.params?.parts || '').split('/');
14
- const pageType: LinkTargetPageType = urlParts.shift() as any;
15
- const contentId: string = urlParts.join('/');
16
-
17
- const context: Context = await (async () => {
18
- switch (pageType) {
19
- case 'book':
20
- case 'group':
21
- return await getContentContext(contentId);
22
- case 'article':
23
- case 'summary':
24
- case 'practice':
25
- return await getTopicPartContext(pageType, contentId);
26
- case 'contributor':
27
- return await getContributorContext(contentId);
28
- }
29
-
30
- throw createError(`Can't handle "${pageType}" page type!`);
31
- })();
32
-
33
- const lastContextItem = context.pop() as ContextItem;
34
- const contextStr = context
35
- .filter((c) => !c.hidden)
36
- .map((c) => c.title)
37
- .join(' / ');
38
-
39
- return <PreviewDataPageLink>{
40
- type: 'page-link',
41
- footer: {
42
- secondary:
43
- (contextStr ? contextStr + ' • ' : '') +
44
- lastContextItem.type,
45
- primary: lastContextItem.title,
46
- href: lastContextItem.href,
47
- iconName: lastContextItem.icon,
48
- },
49
- };
50
- },
51
- );
1
+ import {
2
+ getContentContext,
3
+ getTopicPartContext,
4
+ getContributorContext,
5
+ } from '@erudit/server/plugin/content/context';
6
+
7
+ import type { PreviewDataPageLink } from '../../../../app/scripts/preview/data/pageLink';
8
+ import type { LinkTargetPageType } from '@erudit/shared/bitran/link/target';
9
+ import type { Context, ContextItem } from '@erudit/shared/content/context';
10
+
11
+ export default defineEventHandler<Promise<PreviewDataPageLink>>(
12
+ async (event) => {
13
+ const urlParts = (event.context.params?.parts || '').split('/');
14
+ const pageType: LinkTargetPageType = urlParts.shift() as any;
15
+ const contentId: string = urlParts.join('/');
16
+
17
+ const context: Context = await (async () => {
18
+ switch (pageType) {
19
+ case 'book':
20
+ case 'group':
21
+ return await getContentContext(contentId);
22
+ case 'article':
23
+ case 'summary':
24
+ case 'practice':
25
+ return await getTopicPartContext(pageType, contentId);
26
+ case 'contributor':
27
+ return await getContributorContext(contentId);
28
+ }
29
+
30
+ throw createError(`Can't handle "${pageType}" page type!`);
31
+ })();
32
+
33
+ const lastContextItem = context.pop() as ContextItem;
34
+ const contextStr = context
35
+ .filter((c) => !c.hidden)
36
+ .map((c) => c.title)
37
+ .join(' / ');
38
+
39
+ return <PreviewDataPageLink>{
40
+ type: 'page-link',
41
+ footer: {
42
+ secondary:
43
+ (contextStr ? contextStr + ' • ' : '') +
44
+ lastContextItem.type,
45
+ primary: lastContextItem.title,
46
+ href: lastContextItem.href,
47
+ iconName: lastContextItem.icon,
48
+ },
49
+ };
50
+ },
51
+ );
@@ -1,55 +1,55 @@
1
- import type { BitranContent } from 'bitran';
2
-
3
- import { parseUrlLocation } from '@server/bitran/location';
4
- import { getLocationContext } from '@server/content/context';
5
- import { ERUDIT_SERVER } from '@server/global';
6
- import { DbUnique } from '@server/db/entities/Unique';
7
- import { getBitranContent } from '@server/bitran/content';
8
-
9
- import type { Context } from '@shared/content/context';
10
- import type { BitranContext } from '@shared/bitran/context';
11
- import { stringifyBitranLocation } from '@shared/bitran/location';
12
-
13
- interface ReturnType {
14
- context: Context;
15
- productTitle?: string;
16
- bitran: {
17
- productName: string;
18
- context: BitranContext;
19
- content: BitranContent;
20
- };
21
- }
22
-
23
- export default defineEventHandler<Promise<ReturnType>>(async (event) => {
24
- const location = parseUrlLocation(getRouterParam(event, 'location') || '');
25
-
26
- const context = await getLocationContext(location);
27
-
28
- const dbUnique = await (async () => {
29
- const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
30
- select: ['productName', 'title', 'context'],
31
- where: { location: stringifyBitranLocation(location) },
32
- });
33
-
34
- if (!dbUnique)
35
- throw createError(
36
- `Missing unique "${stringifyBitranLocation(location)}"!`,
37
- );
38
-
39
- return dbUnique as any as DbUnique;
40
- })();
41
-
42
- const bitran = await (async () => {
43
- return {
44
- content: await getBitranContent(location),
45
- context: dbUnique.context,
46
- productName: dbUnique.productName,
47
- };
48
- })();
49
-
50
- return <ReturnType>{
51
- context,
52
- productTitle: dbUnique.title,
53
- bitran,
54
- };
55
- });
1
+ import type { BitranContent } from 'bitran';
2
+
3
+ import { parseUrlLocation } from '@server/bitran/location';
4
+ import { getLocationContext } from '@server/content/context';
5
+ import { ERUDIT_SERVER } from '@server/global';
6
+ import { DbUnique } from '@server/db/entities/Unique';
7
+ import { getBitranContent } from '@server/bitran/content';
8
+
9
+ import type { Context } from '@shared/content/context';
10
+ import type { BitranContext } from '@shared/bitran/context';
11
+ import { stringifyBitranLocation } from '@shared/bitran/location';
12
+
13
+ interface ReturnType {
14
+ context: Context;
15
+ productTitle?: string;
16
+ bitran: {
17
+ productName: string;
18
+ context: BitranContext;
19
+ content: BitranContent;
20
+ };
21
+ }
22
+
23
+ export default defineEventHandler<Promise<ReturnType>>(async (event) => {
24
+ const location = parseUrlLocation(getRouterParam(event, 'location') || '');
25
+
26
+ const context = await getLocationContext(location);
27
+
28
+ const dbUnique = await (async () => {
29
+ const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
30
+ select: ['productName', 'title', 'context'],
31
+ where: { location: stringifyBitranLocation(location) },
32
+ });
33
+
34
+ if (!dbUnique)
35
+ throw createError(
36
+ `Missing unique "${stringifyBitranLocation(location)}"!`,
37
+ );
38
+
39
+ return dbUnique as any as DbUnique;
40
+ })();
41
+
42
+ const bitran = await (async () => {
43
+ return {
44
+ content: await getBitranContent(location),
45
+ context: dbUnique.context,
46
+ productName: dbUnique.productName,
47
+ };
48
+ })();
49
+
50
+ return <ReturnType>{
51
+ context,
52
+ productTitle: dbUnique.title,
53
+ bitran,
54
+ };
55
+ });
@@ -1,23 +1,28 @@
1
- import type { BitranContent, BitranPreRenderData } from 'bitran';
2
- import { createRenderData } from 'bitran/core';
3
- import { BlockNode } from 'bitran/dom';
4
- import { BlocksNode, ErrorNode } from 'bitran/default';
1
+ import { isTopicPart, type TopicPart } from 'erudit-cog/schema';
2
+ import { createPreRenderData, type PreRenderData } from '@bitran-js/transpiler';
3
+ import { BlockNode, BlocksNode } from '@bitran-js/core';
4
+ import { type BitranContent } from '@bitran-js/renderer-vue';
5
+ import {
6
+ AliasesNode,
7
+ mergeAliases,
8
+ NO_ALIASES,
9
+ } from '@erudit-js/bitran-elements/aliases/shared';
10
+ import { IncludeNode } from '@erudit-js/bitran-elements/include/shared';
11
+
12
+ import { ERUDIT_SERVER } from '@server/global';
13
+ import { DbUnique } from '@server/db/entities/Unique';
14
+ import { DbTopic } from '@server/db/entities/Topic';
15
+ import { DbGroup } from '@server/db/entities/Group';
16
+ import { resolveLinkTarget } from '@server/bitran/products/link';
17
+ import { traverseInclude } from '@server/bitran/products/include';
18
+ import { createBitranTranspiler } from '@server/bitran/transpiler';
19
+
5
20
  import type { BitranContext } from '@erudit/shared/bitran/context';
6
21
  import {
7
22
  stringifyBitranLocation,
8
23
  type BitranLocation,
9
24
  } from '@erudit/shared/bitran/location';
10
- import { ERUDIT_SERVER } from '../global';
11
- import { DbUnique } from '../db/entities/Unique';
12
- import { isTopicPart, type TopicPart } from 'erudit-cog/schema';
13
- import { DbTopic } from '../db/entities/Topic';
14
- import { DbGroup } from '../db/entities/Group';
15
- import { NO_ALIASES } from '@erudit/shared/bitran/alias';
16
- import { createBitranCore } from './core';
17
- import { IncludeNode } from '@erudit/shared/bitran/products/include/core';
18
- import { LinkNode } from '@erudit/shared/bitran/products/link/core';
19
- import { resolveLinkTarget } from './products/link';
20
- import { traverseInclude } from './products/include';
25
+ import { LinkNode } from '@erudit/shared/bitran/link/shared';
21
26
 
22
27
  interface RawBitranContent {
23
28
  context: BitranContext;
@@ -37,7 +42,6 @@ export async function getBitranContent(
37
42
 
38
43
  export async function getRawBitranContent(
39
44
  location: BitranLocation,
40
- // @ts-ignore
41
45
  ): Promise<RawBitranContent> {
42
46
  const throwNotFound = () => {
43
47
  throw createError({
@@ -89,82 +93,89 @@ export async function getRawBitranContent(
89
93
  };
90
94
  }
91
95
 
92
- throwNotFound();
96
+ return throwNotFound();
93
97
  }
94
98
 
95
99
  async function createBitranContent(
96
100
  context: BitranContext,
97
101
  biCode: string,
98
102
  ): Promise<BitranContent> {
99
- const bitranCore = await createBitranCore(context);
103
+ const bitranTranspiler = await createBitranTranspiler();
100
104
 
101
- const root = await bitranCore.parser.parse(biCode, {
102
- step: async (productNode) => {
103
- if (productNode instanceof IncludeNode)
104
- await resolveInclude(productNode, context);
105
+ const root = await bitranTranspiler.parser.parse(biCode, {
106
+ async step(node) {
107
+ if (node instanceof AliasesNode) {
108
+ mergeAliases(context.aliases, node.parseData);
109
+ return;
110
+ }
111
+
112
+ if (node instanceof IncludeNode) {
113
+ await resolveInclude(node, context);
114
+ return;
115
+ }
105
116
  },
106
117
  });
107
118
 
108
- const finalContent = bitranCore.stringifier.stringify(root);
119
+ const finalContent = await bitranTranspiler.stringifier.stringify(root);
109
120
 
110
121
  // Building render data
111
- const renderData: BitranPreRenderData = {};
112
- await bitranCore.parser.parse(finalContent, {
113
- step: async (productNode) => {
114
- const id = productNode.getId();
115
- const productCore = bitranCore.products[productNode.name]!;
122
+ const preRenderDataMap: Record<string, PreRenderData> = {};
123
+ await bitranTranspiler.parser.parse(finalContent, {
124
+ step: async (node) => {
125
+ const id = node.id;
126
+ const elementTranspiler = bitranTranspiler.transpilers[node.name]!;
116
127
 
117
- if (productNode instanceof LinkNode) {
128
+ if (node instanceof LinkNode) {
118
129
  try {
119
- renderData[id] = {
120
- status: 'success',
121
- data: await resolveLinkTarget(productNode.parseData, {
130
+ preRenderDataMap[id] = {
131
+ type: 'success',
132
+ data: await resolveLinkTarget(node.parseData, {
122
133
  location: context.location,
123
134
  aliases: context.aliases ?? {},
124
135
  }),
125
136
  };
126
137
  } catch (error: any) {
127
- renderData[id] = {
128
- status: 'error',
129
- errorMessage: error?.message || error,
138
+ preRenderDataMap[id] = {
139
+ type: 'error',
140
+ message: error?.message || String(error),
130
141
  };
131
142
  }
132
143
  return;
133
144
  }
134
145
 
135
- if (id)
136
- renderData[id] = await createRenderData(
137
- 'pre',
138
- productNode,
139
- productCore,
146
+ if (id) {
147
+ const preRenderData = await createPreRenderData(
148
+ node,
149
+ elementTranspiler,
140
150
  );
151
+ if (preRenderData) preRenderDataMap[id] = preRenderData;
152
+ }
141
153
  },
142
154
  });
143
155
 
144
156
  return {
145
157
  biCode: finalContent,
146
- renderData,
158
+ preRenderData: preRenderDataMap,
147
159
  };
148
160
  }
149
161
 
150
162
  async function resolveInclude(
151
163
  includeNode: IncludeNode,
152
164
  context: BitranContext,
153
- ): Promise<IncludeNode | ErrorNode> {
165
+ ): Promise<IncludeNode> {
154
166
  let _blocks;
155
167
 
156
168
  try {
157
169
  const blocks: BlockNode[] = [];
158
170
 
159
171
  await traverseInclude(includeNode, context, {
160
- step: async ({ _location, _node, _bitranCore }) => {
172
+ step: async ({ _node }) => {
161
173
  if (_node instanceof BlockNode) blocks.push(_node);
162
174
  },
163
175
  });
164
176
 
165
177
  const blocksNode = new BlocksNode(includeNode);
166
178
  blocksNode.setNodes(blocks);
167
-
168
179
  _blocks = blocksNode;
169
180
  includeNode.parseData.blocks = _blocks;
170
181
  } catch (error: any) {