erudit 3.0.0-dev.4 → 3.0.0-dev.6

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 +195 -172
  2. package/app/components/Loading.vue +23 -23
  3. package/app/components/SiteAside.vue +393 -382
  4. package/app/components/SiteMain.vue +35 -35
  5. package/app/components/ads/BannerTemplate.vue +51 -51
  6. package/app/components/ads/BottomBanner.vue +45 -45
  7. package/app/components/ads/LeftBanner.vue +50 -50
  8. package/app/components/aside/AsideListItem.vue +74 -74
  9. package/app/components/aside/AsideMajor.vue +56 -56
  10. package/app/components/aside/AsideMinor.vue +71 -71
  11. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  12. package/app/components/aside/major/PaneSwitch.vue +54 -54
  13. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  14. package/app/components/aside/major/SiteInfo.vue +85 -85
  15. package/app/components/aside/major/panes/Language.vue +79 -79
  16. package/app/components/aside/major/panes/Pages.vue +34 -34
  17. package/app/components/aside/major/panes/Search.vue +11 -11
  18. package/app/components/aside/major/panes/nav/Nav.vue +87 -91
  19. package/app/components/aside/major/panes/nav/NavBook.vue +87 -87
  20. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  21. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  22. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  23. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  24. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  25. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  26. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  27. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  28. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  29. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  30. package/app/components/aside/major/panes/other/ItemGenerator.vue +15 -15
  31. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  32. package/app/components/aside/major/panes/other/Other.vue +16 -16
  33. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  34. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  35. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  36. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  37. package/app/components/aside/minor/Contribute.vue +145 -145
  38. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  39. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  40. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  41. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  42. package/app/components/aside/minor/topic/TopicToc.vue +219 -203
  43. package/app/components/aside/minor/topic/TopicTocItem.vue +30 -31
  44. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  45. package/app/components/bitran/BitranContent.vue +70 -63
  46. package/app/components/bitran/RenderWrapper.vue +10 -10
  47. package/app/components/contributor/ContributorAvatar.vue +43 -43
  48. package/app/components/contributor/ContributorListItem.vue +35 -35
  49. package/app/components/main/topic/MainTopic.vue +79 -79
  50. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  51. package/app/components/main/utils/Breadcrumb.vue +75 -75
  52. package/app/components/main/utils/ContentDecoration.vue +29 -29
  53. package/app/components/main/utils/ContentDescription.vue +19 -19
  54. package/app/components/main/utils/ContentPopover.vue +188 -176
  55. package/app/components/main/utils/ContentPopovers.vue +105 -105
  56. package/app/components/main/utils/ContentReferences.vue +70 -70
  57. package/app/components/main/utils/ContentSection.vue +45 -45
  58. package/app/components/main/utils/ContentTitle.vue +63 -39
  59. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  60. package/app/components/main/utils/reference/ReferenceItem.vue +68 -68
  61. package/app/components/main/utils/reference/ReferenceSource.vue +116 -116
  62. package/app/components/preview/Preview.vue +186 -177
  63. package/app/components/preview/PreviewDisplay.vue +139 -139
  64. package/app/components/preview/PreviewFooterAction.vue +73 -73
  65. package/app/components/preview/PreviewLoading.vue +14 -14
  66. package/app/components/preview/PreviewScreen.vue +141 -99
  67. package/app/components/preview/display/Alert.vue +50 -50
  68. package/app/components/preview/display/Custom.vue +18 -18
  69. package/app/components/preview/display/GenericLink.vue +48 -48
  70. package/app/components/preview/display/PageLink.vue +20 -20
  71. package/app/components/preview/display/Unique.vue +49 -49
  72. package/app/components/transition/Fade.vue +19 -19
  73. package/app/components/tree/TreeContainer.vue +11 -11
  74. package/app/components/tree/TreeItem.vue +89 -89
  75. package/app/composables/bitran.ts +129 -127
  76. package/app/composables/bitranContent.ts +39 -39
  77. package/app/composables/bitranLocation.ts +7 -7
  78. package/app/composables/contentData.ts +36 -36
  79. package/app/composables/contentPage.ts +157 -156
  80. package/app/composables/contentRoute.ts +45 -45
  81. package/app/composables/darkMagic.ts +24 -24
  82. package/app/composables/externalApi.ts +63 -63
  83. package/app/composables/favicon.ts +8 -8
  84. package/app/composables/formatText.ts +86 -86
  85. package/app/composables/majorPane.ts +60 -60
  86. package/app/composables/phrases.ts +81 -81
  87. package/app/composables/theme.ts +29 -29
  88. package/app/composables/url.ts +33 -33
  89. package/app/pages/_test/preview.vue +110 -110
  90. package/app/pages/article/[...articleId].vue +3 -3
  91. package/app/pages/book/[...bookId].vue +47 -47
  92. package/app/pages/group/[...groupId].vue +65 -65
  93. package/app/pages/index.vue +32 -32
  94. package/app/pages/members.vue +6 -6
  95. package/app/pages/practice/[...practice].vue +3 -3
  96. package/app/pages/summary/[...summaryId].vue +3 -3
  97. package/app/public/favicon/article.svg +5 -5
  98. package/app/public/favicon/default.svg +3 -3
  99. package/app/public/favicon/practice.svg +3 -3
  100. package/app/public/favicon/summary.svg +4 -4
  101. package/app/public/logotype.svg +2 -2
  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 +73 -73
  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 +22 -22
  114. package/app/scripts/preview/data/unique.ts +71 -71
  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 +63 -63
  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/globalPath.ts +21 -21
  132. package/globals/bitran.ts +2 -47
  133. package/globals/content.ts +22 -22
  134. package/globals/contributor.ts +5 -5
  135. package/globals/erudit.ts +5 -5
  136. package/globals/register.ts +18 -18
  137. package/languages/en.ts +95 -95
  138. package/languages/ru.ts +99 -99
  139. package/module/bitran.ts +35 -34
  140. package/module/config.ts +34 -34
  141. package/module/imports.ts +50 -46
  142. package/module/index.ts +47 -47
  143. package/module/logger.ts +10 -10
  144. package/module/paths.ts +22 -22
  145. package/module/restart.ts +61 -61
  146. package/nuxt.config.ts +99 -112
  147. package/package.json +10 -8
  148. package/server/api/aside/major/nav/bookIds.ts +5 -5
  149. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  150. package/server/api/aside/major/nav/global.ts +7 -7
  151. package/server/api/aside/minor/news.ts +7 -7
  152. package/server/api/aside/minor/path.ts +78 -78
  153. package/server/api/bitran/content/[location].ts +8 -8
  154. package/server/api/bitran/toc/[location].ts +7 -7
  155. package/server/api/content/data.ts +72 -72
  156. package/server/api/contributor/count.ts +6 -6
  157. package/server/api/fake/content.ts +11 -11
  158. package/server/api/fake/shared/languages.ts +12 -12
  159. package/server/api/language/functions.ts +12 -12
  160. package/server/api/language/phrase/[phraseId].ts +19 -19
  161. package/server/api/language/phraseIds.ts +8 -8
  162. package/server/api/preview/page/[...parts].ts +51 -51
  163. package/server/api/preview/unique/[location].ts +57 -57
  164. package/server/plugin/bitran/content.ts +187 -187
  165. package/server/plugin/bitran/location.ts +25 -25
  166. package/server/plugin/bitran/products/include.ts +230 -230
  167. package/server/plugin/bitran/products/link.ts +116 -116
  168. package/server/plugin/bitran/setup.ts +11 -9
  169. package/server/plugin/bitran/toc.ts +83 -83
  170. package/server/plugin/bitran/transpiler.ts +48 -46
  171. package/server/plugin/build/close.ts +10 -10
  172. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  173. package/server/plugin/build/jobs/content/generic.ts +176 -176
  174. package/server/plugin/build/jobs/content/parse.ts +100 -100
  175. package/server/plugin/build/jobs/content/path.ts +6 -6
  176. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  177. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  178. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  179. package/server/plugin/build/jobs/contributors.ts +66 -66
  180. package/server/plugin/build/jobs/language.ts +36 -36
  181. package/server/plugin/build/jobs/nav.ts +214 -210
  182. package/server/plugin/build/process.ts +25 -25
  183. package/server/plugin/build/rebuild.ts +55 -55
  184. package/server/plugin/build/setup.ts +21 -21
  185. package/server/plugin/content/absoluteId.ts +94 -94
  186. package/server/plugin/content/context.ts +116 -112
  187. package/server/plugin/db/entities/Book.ts +7 -7
  188. package/server/plugin/db/entities/Content.ts +49 -49
  189. package/server/plugin/db/entities/Contribution.ts +10 -10
  190. package/server/plugin/db/entities/Contributor.ts +16 -16
  191. package/server/plugin/db/entities/Group.ts +14 -14
  192. package/server/plugin/db/entities/Hash.ts +15 -15
  193. package/server/plugin/db/entities/Topic.ts +20 -20
  194. package/server/plugin/db/entities/Unique.ts +21 -21
  195. package/server/plugin/db/setup.ts +34 -34
  196. package/server/plugin/global.ts +17 -18
  197. package/server/plugin/importer.ts +12 -12
  198. package/server/plugin/index.ts +9 -9
  199. package/server/plugin/logger.ts +23 -23
  200. package/server/plugin/nav/node.ts +26 -26
  201. package/server/plugin/nav/utils.ts +129 -129
  202. package/server/plugin/repository/book.ts +21 -21
  203. package/server/plugin/repository/content.ts +238 -238
  204. package/server/plugin/repository/contributor.ts +8 -8
  205. package/server/plugin/repository/frontNav.ts +148 -148
  206. package/server/plugin/repository/topic.ts +32 -32
  207. package/server/tsconfig.json +9 -9
  208. package/shared/aside/minor.ts +50 -50
  209. package/shared/asset.ts +15 -15
  210. package/shared/bitran/context.ts +8 -8
  211. package/shared/bitran/default.ts +46 -46
  212. package/shared/bitran/link/Link.vue +166 -167
  213. package/shared/bitran/link/factory.ts +24 -24
  214. package/shared/bitran/link/languages/en.ts +7 -7
  215. package/shared/bitran/link/languages/ru.ts +7 -7
  216. package/shared/bitran/link/renderer.ts +21 -21
  217. package/shared/bitran/link/shared.ts +17 -17
  218. package/shared/bitran/link/target.ts +134 -134
  219. package/shared/bitran/link/transpiler.ts +10 -10
  220. package/shared/bitran/location.ts +166 -166
  221. package/shared/bitran/toc.ts +8 -8
  222. package/shared/content/context.ts +9 -9
  223. package/shared/content/data/base.ts +32 -32
  224. package/shared/content/data/index.ts +5 -5
  225. package/shared/content/data/type/book.ts +5 -5
  226. package/shared/content/data/type/group.ts +6 -6
  227. package/shared/content/data/type/topic.ts +11 -11
  228. package/shared/content/previousNext.ts +9 -9
  229. package/shared/contributor.ts +5 -5
  230. package/shared/frontNav.ts +41 -41
  231. package/shared/icons.ts +38 -38
  232. package/shared/image.ts +5 -5
  233. package/shared/link.ts +25 -25
  234. package/shared/popover.ts +8 -0
  235. package/shared/types/language.ts +75 -75
  236. package/shared/utils/objectsEqual.ts +4 -4
  237. package/shared/utils/stringColor.ts +9 -9
  238. package/test/bitran/link/target.test.ts +141 -141
  239. package/test/bitran/location.test.ts +143 -143
  240. package/tsconfig.json +8 -8
  241. package/utils/stress.ts +9 -9
  242. package/app/components/main/utils/ContentFlag.vue +0 -15
  243. package/app/styles/default.scss +0 -83
@@ -1,11 +1,11 @@
1
- <template>
2
- <div :class="$style.treeContainer">
3
- <slot></slot>
4
- </div>
5
- </template>
6
-
7
- <style lang="scss" module>
8
- .treeContainer {
9
- padding: calc(var(--gap) / 2) 0;
10
- }
11
- </style>
1
+ <template>
2
+ <div :class="$style.treeContainer">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <style lang="scss" module>
8
+ .treeContainer {
9
+ padding: calc(var(--gap) / 2) 0;
10
+ }
11
+ </style>
@@ -1,89 +1,89 @@
1
- <script lang="ts" setup>
2
- import type { MyIconName } from '#my-icons';
3
-
4
- defineProps<{
5
- label: string;
6
- icon?: MyIconName;
7
- svg?: string;
8
- level?: number;
9
- link?: string;
10
- active?: boolean;
11
- accent?: boolean;
12
- }>();
13
- </script>
14
-
15
- <template>
16
- <NuxtLink
17
- :prefetch="false"
18
- :to="link"
19
- :class="[
20
- $style.treeItem,
21
- active && $style.active,
22
- accent && $style.accent,
23
- ]"
24
- :style="{ ['--_level']: level ?? 0 }"
25
- >
26
- <MyIcon v-if="icon" :class="$style.icon" :name="icon" />
27
- <MyRuntimeIcon v-else :class="$style.icon" name="tree-item-icon" :svg />
28
- <div :class="$style.main">{{ label }}</div>
29
- <div v-if="$slots.default" :class="$style.after">
30
- <slot></slot>
31
- </div>
32
- </NuxtLink>
33
- </template>
34
-
35
- <style lang="scss" module>
36
- .treeItem {
37
- display: flex;
38
- flex-direction: row;
39
- align-items: center;
40
- gap: calc(var(--gap) / 1.6);
41
- padding: calc(var(--gap) / 2) var(--gap);
42
- padding-left: calc((var(--_level) + 1) * var(--gap));
43
- font-size: 0.95em;
44
- color: var(--textMuted);
45
- text-decoration: none;
46
- cursor: pointer;
47
-
48
- @include transition(background);
49
-
50
- &:hover {
51
- background: var(--bgAccent);
52
- .icon,
53
- .main {
54
- color: var(--text);
55
- }
56
- }
57
-
58
- &.active {
59
- .icon,
60
- .main {
61
- color: var(--brand);
62
- }
63
- }
64
- &.accent {
65
- .icon,
66
- .main {
67
- color: var(--text);
68
- }
69
- }
70
-
71
- .icon,
72
- .main {
73
- @include transition(color);
74
- }
75
-
76
- .main {
77
- flex: 1;
78
- }
79
-
80
- .icon,
81
- .after {
82
- flex-shrink: 0;
83
- }
84
-
85
- .icon {
86
- font-size: 16px;
87
- }
88
- }
89
- </style>
1
+ <script lang="ts" setup>
2
+ import type { MyIconName } from '#my-icons';
3
+
4
+ defineProps<{
5
+ label: string;
6
+ icon?: MyIconName;
7
+ svg?: string;
8
+ level?: number;
9
+ link?: string;
10
+ active?: boolean;
11
+ accent?: boolean;
12
+ }>();
13
+ </script>
14
+
15
+ <template>
16
+ <NuxtLink
17
+ :prefetch="false"
18
+ :to="link"
19
+ :class="[
20
+ $style.treeItem,
21
+ active && $style.active,
22
+ accent && $style.accent,
23
+ ]"
24
+ :style="{ ['--_level']: level ?? 0 }"
25
+ >
26
+ <MyIcon v-if="icon" :class="$style.icon" :name="icon" />
27
+ <MyRuntimeIcon v-else :class="$style.icon" name="tree-item-icon" :svg />
28
+ <div :class="$style.main">{{ label }}</div>
29
+ <div v-if="$slots.default" :class="$style.after">
30
+ <slot></slot>
31
+ </div>
32
+ </NuxtLink>
33
+ </template>
34
+
35
+ <style lang="scss" module>
36
+ .treeItem {
37
+ display: flex;
38
+ flex-direction: row;
39
+ align-items: center;
40
+ gap: calc(var(--gap) / 1.6);
41
+ padding: calc(var(--gap) / 2) var(--gap);
42
+ padding-left: calc((var(--_level) + 1) * var(--gap));
43
+ font-size: 0.95em;
44
+ color: var(--textMuted);
45
+ text-decoration: none;
46
+ cursor: pointer;
47
+
48
+ @include transition(background);
49
+
50
+ &:hover {
51
+ background: var(--bgAccent);
52
+ .icon,
53
+ .main {
54
+ color: var(--text);
55
+ }
56
+ }
57
+
58
+ &.active {
59
+ .icon,
60
+ .main {
61
+ color: var(--brand);
62
+ }
63
+ }
64
+ &.accent {
65
+ .icon,
66
+ .main {
67
+ color: var(--text);
68
+ }
69
+ }
70
+
71
+ .icon,
72
+ .main {
73
+ @include transition(color);
74
+ }
75
+
76
+ .main {
77
+ flex: 1;
78
+ }
79
+
80
+ .icon,
81
+ .after {
82
+ flex-shrink: 0;
83
+ }
84
+
85
+ .icon {
86
+ font-size: 16px;
87
+ }
88
+ }
89
+ </style>
@@ -1,127 +1,129 @@
1
- import eruditConfig from '#erudit/config';
2
- import bitranConfig from '#erudit/client/bitran';
3
-
4
- import {
5
- createPhraseCaller,
6
- getDefaultRenderers,
7
- getElementIcon,
8
- type ElementVueRenderers,
9
- } from '@bitran-js/renderer-vue';
10
- import {
11
- defineBitranTranspiler,
12
- type BitranTranspiler,
13
- type ElementTranspilers,
14
- } from '@bitran-js/transpiler';
15
- import { aliasesName } from '@erudit-js/bitran-elements/aliases/shared';
16
- import { aliasesTranspiler } from '@erudit-js/bitran-elements/aliases/transpiler';
17
- import { headingName } from '@erudit-js/bitran-elements/heading/shared';
18
- import { headingTranspiler } from '@erudit-js/bitran-elements/heading/transpiler';
19
- import { includeName } from '@erudit-js/bitran-elements/include/shared';
20
- import { includeTranspiler } from '@erudit-js/bitran-elements/include/transpiler';
21
- import { linkName } from '@erudit/shared/bitran/link/shared';
22
- import { linkTranspiler } from '@erudit/shared/bitran/link/transpiler';
23
- import { aliasesRenderer } from '@erudit-js/bitran-elements/aliases/renderer';
24
- import { headingRenderer } from '@erudit-js/bitran-elements/heading/renderer';
25
- import { includeRenderer } from '@erudit-js/bitran-elements/include/renderer';
26
- import { linkRenderer } from '@erudit/shared/bitran/link/renderer';
27
-
28
- let bitranTranspiler!: BitranTranspiler;
29
- let bitranRenderers!: ElementVueRenderers;
30
-
31
- //
32
- // Transpiler
33
- //
34
-
35
- export async function useBitranTranspiler() {
36
- if (bitranTranspiler) return bitranTranspiler;
37
-
38
- const projectTranspilers = await getProjectTranspilers();
39
-
40
- const defaultTranspilers = {
41
- [aliasesName]: aliasesTranspiler,
42
- [includeName]: includeTranspiler,
43
- [headingName]: headingTranspiler,
44
- [linkName]: linkTranspiler,
45
- };
46
-
47
- bitranTranspiler = defineBitranTranspiler({
48
- ...projectTranspilers,
49
- ...defaultTranspilers,
50
- });
51
-
52
- return bitranTranspiler;
53
- }
54
-
55
- async function getProjectTranspilers(): Promise<ElementTranspilers> {
56
- const bitranElements = bitranConfig.elements;
57
-
58
- if (!bitranElements) return {};
59
-
60
- const projectTranspilers: ElementTranspilers = {};
61
- for (const [name, bitranElement] of Object.entries(bitranElements))
62
- projectTranspilers[name] = await bitranElement.transpiler();
63
-
64
- return projectTranspilers;
65
- }
66
-
67
- //
68
- // Renderers
69
- //
70
-
71
- export async function useBitranRenderers() {
72
- if (bitranRenderers) return bitranRenderers;
73
-
74
- const projectRenderers = await getProjectRenderers();
75
-
76
- const defaultRenderers = {
77
- [aliasesName]: aliasesRenderer,
78
- [includeName]: includeRenderer,
79
- [headingName]: headingRenderer,
80
- [linkName]: linkRenderer,
81
- };
82
-
83
- // @ts-ignore
84
- bitranRenderers = {
85
- ...projectRenderers,
86
- ...defaultRenderers,
87
- };
88
-
89
- return bitranRenderers!;
90
- }
91
-
92
- async function getProjectRenderers() {
93
- const bitranElements = bitranConfig.elements;
94
-
95
- if (!bitranElements) return {};
96
-
97
- const projectRenderers: ElementVueRenderers = {};
98
- for (const [name, bitranElement] of Object.entries(bitranElements))
99
- projectRenderers[name] = await bitranElement.renderer();
100
-
101
- return projectRenderers;
102
- }
103
-
104
- //
105
- // Utils
106
- //
107
-
108
- export async function useBitranElementRenderer(productName: string) {
109
- const renderer =
110
- (await useBitranRenderers())[productName] ||
111
- getDefaultRenderers()[productName];
112
-
113
- if (!renderer)
114
- throw new Error(`Missing Bitran product render "${productName}"!`);
115
-
116
- return renderer;
117
- }
118
-
119
- export async function useBitranElementIcon(productName: string) {
120
- const renderer = await useBitranElementRenderer(productName);
121
- return await getElementIcon(renderer);
122
- }
123
-
124
- export async function useBitranElementLanguage(productName: string) {
125
- const renderer = await useBitranElementRenderer(productName);
126
- return await createPhraseCaller(renderer, eruditConfig?.language || 'en');
127
- }
1
+ import eruditConfig from '#erudit/config';
2
+ import bitranConfig from '#erudit/client/bitran';
3
+
4
+ import {
5
+ createPhraseCaller,
6
+ getDefaultRenderers,
7
+ getElementIcon,
8
+ type ElementVueRenderers,
9
+ } from '@bitran-js/renderer-vue';
10
+ import {
11
+ defineBitranTranspiler,
12
+ type BitranTranspiler,
13
+ type ElementTranspilers,
14
+ } from '@bitran-js/transpiler';
15
+ import { aliasesName } from '@erudit-js/bitran-elements/aliases/shared';
16
+ import { aliasesTranspiler } from '@erudit-js/bitran-elements/aliases/transpiler';
17
+ import { headingName } from '@erudit-js/bitran-elements/heading/shared';
18
+ import { defineHeadingTranspiler } from '@erudit-js/bitran-elements/heading/transpiler';
19
+ import { includeName } from '@erudit-js/bitran-elements/include/shared';
20
+ import { includeTranspiler } from '@erudit-js/bitran-elements/include/transpiler';
21
+ import { linkName } from '@erudit/shared/bitran/link/shared';
22
+ import { linkTranspiler } from '@erudit/shared/bitran/link/transpiler';
23
+ import { aliasesRenderer } from '@erudit-js/bitran-elements/aliases/renderer';
24
+ import { headingRenderer } from '@erudit-js/bitran-elements/heading/renderer';
25
+ import { includeRenderer } from '@erudit-js/bitran-elements/include/renderer';
26
+ import { linkRenderer } from '@erudit/shared/bitran/link/renderer';
27
+
28
+ let bitranTranspiler!: BitranTranspiler;
29
+ let bitranRenderers!: ElementVueRenderers;
30
+
31
+ //
32
+ // Transpiler
33
+ //
34
+
35
+ export async function useBitranTranspiler() {
36
+ if (bitranTranspiler) return bitranTranspiler;
37
+
38
+ const projectTranspilers = await getProjectTranspilers();
39
+
40
+ const defaultTranspilers = {
41
+ [aliasesName]: aliasesTranspiler,
42
+ [includeName]: includeTranspiler,
43
+ [headingName]: defineHeadingTranspiler({
44
+ language: eruditConfig?.language,
45
+ }),
46
+ [linkName]: linkTranspiler,
47
+ };
48
+
49
+ bitranTranspiler = defineBitranTranspiler({
50
+ ...projectTranspilers,
51
+ ...defaultTranspilers,
52
+ });
53
+
54
+ return bitranTranspiler;
55
+ }
56
+
57
+ async function getProjectTranspilers(): Promise<ElementTranspilers> {
58
+ const bitranElements = bitranConfig.elements;
59
+
60
+ if (!bitranElements) return {};
61
+
62
+ const projectTranspilers: ElementTranspilers = {};
63
+ for (const [name, bitranElement] of Object.entries(bitranElements))
64
+ projectTranspilers[name] = await bitranElement.transpiler();
65
+
66
+ return projectTranspilers;
67
+ }
68
+
69
+ //
70
+ // Renderers
71
+ //
72
+
73
+ export async function useBitranRenderers() {
74
+ if (bitranRenderers) return bitranRenderers;
75
+
76
+ const projectRenderers = await getProjectRenderers();
77
+
78
+ const defaultRenderers = {
79
+ [aliasesName]: aliasesRenderer,
80
+ [includeName]: includeRenderer,
81
+ [headingName]: headingRenderer,
82
+ [linkName]: linkRenderer,
83
+ };
84
+
85
+ // @ts-ignore
86
+ bitranRenderers = {
87
+ ...projectRenderers,
88
+ ...defaultRenderers,
89
+ };
90
+
91
+ return bitranRenderers!;
92
+ }
93
+
94
+ async function getProjectRenderers() {
95
+ const bitranElements = bitranConfig.elements;
96
+
97
+ if (!bitranElements) return {};
98
+
99
+ const projectRenderers: ElementVueRenderers = {};
100
+ for (const [name, bitranElement] of Object.entries(bitranElements))
101
+ projectRenderers[name] = await bitranElement.renderer();
102
+
103
+ return projectRenderers;
104
+ }
105
+
106
+ //
107
+ // Utils
108
+ //
109
+
110
+ export async function useBitranElementRenderer(productName: string) {
111
+ const renderer =
112
+ (await useBitranRenderers())[productName] ||
113
+ getDefaultRenderers()[productName];
114
+
115
+ if (!renderer)
116
+ throw new Error(`Missing Bitran product render "${productName}"!`);
117
+
118
+ return renderer;
119
+ }
120
+
121
+ export async function useBitranElementIcon(productName: string) {
122
+ const renderer = await useBitranElementRenderer(productName);
123
+ return await getElementIcon(renderer);
124
+ }
125
+
126
+ export async function useBitranElementLanguage(productName: string) {
127
+ const renderer = await useBitranElementRenderer(productName);
128
+ return await createPhraseCaller(renderer, eruditConfig?.language || 'en');
129
+ }
@@ -1,39 +1,39 @@
1
- import type { ShallowRef } from 'vue';
2
- import type { BitranContent } from '@bitran-js/renderer-vue';
3
-
4
- import {
5
- encodeBitranLocation,
6
- stringifyBitranLocation,
7
- type BitranLocation,
8
- } from '@erudit/shared/bitran/location';
9
-
10
- export async function useBitranContent(
11
- location: Ref<BitranLocation | undefined>,
12
- ) {
13
- const nuxtApp = useNuxtApp();
14
- const content = shallowRef<BitranContent>();
15
-
16
- let contentPromise: Promise<ShallowRef<BitranContent>>;
17
-
18
- watchEffect(() => {
19
- if (!location.value) {
20
- // @ts-ignore
21
- contentPromise = (() => {
22
- content.value = undefined;
23
- return content;
24
- })();
25
- }
26
-
27
- const apiRoute = `/api/bitran/content/${encodeBitranLocation(stringifyBitranLocation(location.value!))}`;
28
- nuxtApp.runWithContext(() => prerenderRoutes(apiRoute));
29
- // @ts-ignore
30
- contentPromise = (async () => {
31
- content.value = (await $fetch(apiRoute, {
32
- responseType: 'json',
33
- })) as BitranContent;
34
- return content;
35
- })();
36
- });
37
-
38
- return contentPromise!;
39
- }
1
+ import type { ShallowRef } from 'vue';
2
+ import type { BitranContent } from '@bitran-js/renderer-vue';
3
+
4
+ import {
5
+ encodeBitranLocation,
6
+ stringifyBitranLocation,
7
+ type BitranLocation,
8
+ } from '@erudit/shared/bitran/location';
9
+
10
+ export async function useBitranContent(
11
+ location: Ref<BitranLocation | undefined>,
12
+ ) {
13
+ const nuxtApp = useNuxtApp();
14
+ const content = shallowRef<BitranContent>();
15
+
16
+ let contentPromise: Promise<ShallowRef<BitranContent>>;
17
+
18
+ watchEffect(() => {
19
+ if (!location.value) {
20
+ // @ts-ignore
21
+ contentPromise = (() => {
22
+ content.value = undefined;
23
+ return content;
24
+ })();
25
+ }
26
+
27
+ const apiRoute = `/api/bitran/content/${encodeBitranLocation(stringifyBitranLocation(location.value!))}`;
28
+ nuxtApp.runWithContext(() => prerenderRoutes(apiRoute));
29
+ // @ts-ignore
30
+ contentPromise = (async () => {
31
+ content.value = (await $fetch(apiRoute, {
32
+ responseType: 'json',
33
+ })) as BitranContent;
34
+ return content;
35
+ })();
36
+ });
37
+
38
+ return contentPromise!;
39
+ }
@@ -1,7 +1,7 @@
1
- import { locationFromPath, type BitranLocation } from '@shared/bitran/location';
2
-
3
- export function useBitranLocation(): ComputedRef<BitranLocation | undefined> {
4
- const route = useRoute();
5
-
6
- return computed(() => locationFromPath(route.path));
7
- }
1
+ import { locationFromPath, type BitranLocation } from '@shared/bitran/location';
2
+
3
+ export function useBitranLocation(): ComputedRef<BitranLocation | undefined> {
4
+ const route = useRoute();
5
+
6
+ return computed(() => locationFromPath(route.path));
7
+ }
@@ -1,36 +1,36 @@
1
- import type { ContentData } from '@shared/content/data';
2
-
3
- export function useContentData<T extends ContentData>() {
4
- const nuxtApp = useNuxtApp();
5
- const contentRoute = useContentRoute();
6
-
7
- const payloadKey = 'content-data';
8
- const payload =
9
- (nuxtApp.static.data[payloadKey] ||=
10
- nuxtApp.payload.data[payloadKey] ||=
11
- {});
12
-
13
- const data = ref<T>();
14
- let promise: Promise<typeof data> | undefined;
15
-
16
- watchEffect(() => {
17
- // @ts-ignore
18
- promise = (async () => {
19
- if (!contentRoute.value) {
20
- data.value = undefined;
21
- return;
22
- }
23
-
24
- const contentId = contentRoute.value.contentId;
25
-
26
- const payloadValue = (payload[contentId] ||= await $fetch(
27
- '/api/content/data',
28
- { query: { contentId } },
29
- ));
30
- data.value = payloadValue as T;
31
- return data;
32
- })();
33
- });
34
-
35
- return promise as any as Promise<Ref<T>>;
36
- }
1
+ import type { ContentData } from '@shared/content/data';
2
+
3
+ export function useContentData<T extends ContentData>() {
4
+ const nuxtApp = useNuxtApp();
5
+ const contentRoute = useContentRoute();
6
+
7
+ const payloadKey = 'content-data';
8
+ const payload =
9
+ (nuxtApp.static.data[payloadKey] ||=
10
+ nuxtApp.payload.data[payloadKey] ||=
11
+ {});
12
+
13
+ const data = ref<T>();
14
+ let promise: Promise<typeof data> | undefined;
15
+
16
+ watchEffect(() => {
17
+ // @ts-ignore
18
+ promise = (async () => {
19
+ if (!contentRoute.value) {
20
+ data.value = undefined;
21
+ return;
22
+ }
23
+
24
+ const contentId = contentRoute.value.contentId;
25
+
26
+ const payloadValue = (payload[contentId] ||= await $fetch(
27
+ '/api/content/data',
28
+ { query: { contentId } },
29
+ ));
30
+ data.value = payloadValue as T;
31
+ return data;
32
+ })();
33
+ });
34
+
35
+ return promise as any as Promise<Ref<T>>;
36
+ }