erudit 3.0.0-dev.1 → 3.0.0-dev.10

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 (252) 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 +34 -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 -86
  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 +13 -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 +91 -63
  46. package/app/components/bitran/RenderWrapper.vue +10 -10
  47. package/app/components/contributor/ContributorAvatar.vue +45 -43
  48. package/app/components/contributor/ContributorListItem.vue +35 -35
  49. package/app/components/main/topic/MainTopic.vue +78 -79
  50. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  51. package/app/components/main/utils/Breadcrumb.vue +70 -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 +111 -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 +55 -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 +108 -127
  76. package/app/composables/bitranContent.ts +69 -37
  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 -80
  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 +64 -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 -20
  114. package/app/scripts/preview/data/unique.ts +72 -70
  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/bin/erudit.mjs +2 -0
  132. package/const.ts +4 -0
  133. package/globalPath.ts +21 -21
  134. package/globals/bitran.ts +1 -47
  135. package/globals/content.ts +22 -22
  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 -95
  140. package/languages/ru.ts +98 -99
  141. package/module/bitran.ts +66 -34
  142. package/module/config.ts +35 -34
  143. package/module/imports.ts +61 -46
  144. package/module/index.ts +47 -47
  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 +123 -111
  149. package/package.json +19 -13
  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 +77 -78
  155. package/server/api/bitran/content/{[location].ts → [...location].ts} +8 -7
  156. package/server/api/bitran/toc/{[location].ts → [...location].ts} +7 -7
  157. package/server/api/content/data.ts +72 -72
  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/preview/page/[...parts].ts +52 -51
  165. package/server/api/preview/unique/[location].ts +60 -55
  166. package/server/plugin/bitran/content.ts +214 -187
  167. package/server/plugin/bitran/{products → elements}/include.ts +216 -230
  168. package/server/plugin/bitran/location.ts +25 -25
  169. package/server/plugin/bitran/toc.ts +75 -83
  170. package/server/plugin/bitran/transpiler.ts +9 -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/files.ts +79 -0
  174. package/server/plugin/build/jobs/content/generic.ts +192 -176
  175. package/server/plugin/build/jobs/content/parse.ts +109 -100
  176. package/server/plugin/build/jobs/content/path.ts +6 -6
  177. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  178. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  179. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  180. package/server/plugin/build/jobs/contributors.ts +66 -66
  181. package/server/plugin/build/jobs/language.ts +36 -36
  182. package/server/plugin/build/jobs/nav.ts +214 -209
  183. package/server/plugin/build/process.ts +25 -25
  184. package/server/plugin/build/rebuild.ts +55 -55
  185. package/server/plugin/build/setup.ts +19 -21
  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/File.ts +10 -0
  192. package/server/plugin/db/entities/Group.ts +14 -14
  193. package/server/plugin/db/entities/Hash.ts +15 -15
  194. package/server/plugin/db/entities/Topic.ts +20 -20
  195. package/server/plugin/db/entities/Unique.ts +21 -21
  196. package/server/plugin/db/setup.ts +36 -34
  197. package/server/plugin/global.ts +16 -18
  198. package/server/plugin/importer.ts +12 -12
  199. package/server/plugin/index.ts +9 -9
  200. package/server/plugin/logger.ts +23 -23
  201. package/server/plugin/nav/node.ts +26 -26
  202. package/server/plugin/nav/utils.ts +133 -129
  203. package/server/plugin/repository/book.ts +21 -21
  204. package/server/plugin/repository/content.ts +237 -238
  205. package/server/plugin/repository/contributor.ts +8 -8
  206. package/server/plugin/repository/file.ts +10 -0
  207. package/server/plugin/repository/frontNav.ts +148 -148
  208. package/server/plugin/repository/topic.ts +32 -32
  209. package/server/tsconfig.json +9 -7
  210. package/shared/aside/minor.ts +51 -50
  211. package/shared/asset.ts +22 -15
  212. package/shared/bitran/contentId.ts +88 -0
  213. package/shared/bitran/stringContent.ts +6 -0
  214. package/shared/bitran/toc.ts +8 -8
  215. package/shared/content/context.ts +9 -9
  216. package/shared/content/data/base.ts +32 -32
  217. package/shared/content/data/index.ts +5 -5
  218. package/shared/content/data/type/book.ts +5 -5
  219. package/shared/content/data/type/group.ts +6 -6
  220. package/shared/content/data/type/topic.ts +11 -11
  221. package/shared/content/previousNext.ts +9 -9
  222. package/shared/contributor.ts +5 -5
  223. package/shared/frontNav.ts +41 -41
  224. package/shared/icons.ts +38 -38
  225. package/shared/image.ts +5 -5
  226. package/shared/link.ts +28 -25
  227. package/shared/popover.ts +8 -0
  228. package/shared/types/language.ts +74 -75
  229. package/shared/utils/objectsEqual.ts +4 -4
  230. package/shared/utils/stringColor.ts +9 -9
  231. package/test/contentId.test.ts +91 -0
  232. package/tsconfig.json +8 -8
  233. package/utils/stress.ts +9 -9
  234. package/app/components/main/utils/ContentFlag.vue +0 -15
  235. package/app/styles/default.scss +0 -83
  236. package/server/plugin/bitran/products/link.ts +0 -116
  237. package/server/plugin/bitran/setup.ts +0 -9
  238. package/server/plugin/content/absoluteId.ts +0 -94
  239. package/shared/bitran/context.ts +0 -8
  240. package/shared/bitran/default.ts +0 -46
  241. package/shared/bitran/link/Link.vue +0 -167
  242. package/shared/bitran/link/factory.ts +0 -24
  243. package/shared/bitran/link/icon.svg +0 -3
  244. package/shared/bitran/link/languages/en.ts +0 -7
  245. package/shared/bitran/link/languages/ru.ts +0 -7
  246. package/shared/bitran/link/renderer.ts +0 -21
  247. package/shared/bitran/link/shared.ts +0 -17
  248. package/shared/bitran/link/target.ts +0 -134
  249. package/shared/bitran/link/transpiler.ts +0 -10
  250. package/shared/bitran/location.ts +0 -166
  251. package/test/bitran/link/target.test.ts +0 -141
  252. package/test/bitran/location.test.ts +0 -143
@@ -1,156 +1,157 @@
1
- import eruditConfig from '#erudit/config';
2
-
3
- import { createOgImageTags, defaultOgImage } from '@app/scripts/og';
4
- import type { ContentData } from '@shared/content/data';
5
-
6
- export function useContentPage(contentData: Ref<ContentData>) {
7
- const contentRoute = useContentRoute();
8
- const siteUrl = useSiteUrl();
9
- const favicon = useFavicon();
10
-
11
- const phrasePromise = usePhrases(
12
- 'article',
13
- 'summary',
14
- 'practice',
15
- 'site_info_title',
16
- 'seo_article_description',
17
- 'seo_summary_description',
18
- 'seo_practice_description',
19
- );
20
-
21
- //
22
- // Favicon
23
- //
24
-
25
- const contentFavicon = () => {
26
- setTimeout(() => {
27
- const newFavicon = (() => {
28
- switch (contentRoute.value?.type) {
29
- case 'topic':
30
- const topicPart = contentRoute.value.topicPart;
31
- return (
32
- eruditConfig.site?.favicon?.[topicPart] ||
33
- eruditAsset(`favicon/${topicPart}.svg`)
34
- );
35
- }
36
-
37
- return defaultFavicon;
38
- })();
39
-
40
- favicon.value = newFavicon;
41
- }, 500);
42
- };
43
-
44
- //
45
- // SEO
46
- //
47
-
48
- let seoTitlePromise: Promise<void>, seoDescriptionPromise: Promise<void>;
49
-
50
- const seo = {
51
- title: ref<string>(),
52
- description: ref<string>(),
53
- };
54
-
55
- const setupSeoTitle = () => {
56
- seoTitlePromise = (async () => {
57
- const phrase = await phrasePromise;
58
-
59
- let title: string = '';
60
- title +=
61
- contentData.value.generic?.seo?.title ||
62
- contentData.value.generic.title ||
63
- contentData.value.generic.contentId.split('/').pop();
64
-
65
- if (contentData.value.type !== 'book') {
66
- const bookTitle = contentData.value?.bookTitle;
67
- title += bookTitle ? ` | ${bookTitle}` : '';
68
- }
69
-
70
- if (contentRoute.value!.type === 'topic') {
71
- const topicPart = contentRoute.value!.topicPart;
72
-
73
- if (topicPart !== 'article') title += ` | ${phrase[topicPart]}`;
74
- }
75
-
76
- title +=
77
- ' - ' + eruditConfig.seo?.title ||
78
- eruditConfig.site?.title ||
79
- phrase.site_info_title;
80
-
81
- seo.title.value = title;
82
- })();
83
- };
84
-
85
- const setupSeoDescription = () => {
86
- seoDescriptionPromise = (async () => {
87
- const phrase = await phrasePromise;
88
- const customDescription =
89
- contentData.value.generic?.seo?.description ||
90
- contentData.value.generic?.description;
91
-
92
- if (customDescription) {
93
- seo.description.value = customDescription;
94
- return;
95
- }
96
-
97
- if (contentRoute.value!.type === 'topic') {
98
- const phraseFunc =
99
- phrase[`seo_${contentRoute.value!.topicPart}_description`];
100
- seo.description.value = phraseFunc(
101
- contentData.value.generic?.seo?.title ||
102
- contentData.value.generic.title!,
103
- );
104
- return;
105
- }
106
-
107
- seo.description.value = '';
108
- })();
109
- };
110
-
111
- useSeoMeta({
112
- // @ts-ignore
113
- title: seo.title,
114
- ogTitle: seo.title,
115
- description: seo.description,
116
- ogDescription: seo.description,
117
- });
118
-
119
- const meta = computed(() => {
120
- return [
121
- ...createOgImageTags(siteUrl, defaultOgImage),
122
- ...(contentData.value.generic?.ogImage
123
- ? createOgImageTags(siteUrl, contentData.value.generic?.ogImage)
124
- : []),
125
- ];
126
- });
127
-
128
- useHead({
129
- meta,
130
- });
131
-
132
- //
133
- //
134
- //
135
-
136
- watchEffect(() => {
137
- setupSeoTitle();
138
- setupSeoDescription();
139
- });
140
-
141
- onMounted(() => {
142
- watchEffect(() => {
143
- contentFavicon();
144
- });
145
- });
146
-
147
- onBeforeUnmount(() => {
148
- favicon.value = defaultFavicon;
149
- });
150
-
151
- //
152
- //
153
- //
154
-
155
- return Promise.all([seoTitlePromise!, seoDescriptionPromise!]);
156
- }
1
+ import eruditConfig from '#erudit/config';
2
+
3
+ import { createOgImageTags, defaultOgImage } from '@app/scripts/og';
4
+ import type { ContentData } from '@shared/content/data';
5
+
6
+ export function useContentPage(contentData: Ref<ContentData>) {
7
+ const contentRoute = useContentRoute();
8
+ const siteUrl = useSiteUrl();
9
+ const favicon = useFavicon();
10
+
11
+ const phrasePromise = usePhrases(
12
+ 'article',
13
+ 'summary',
14
+ 'practice',
15
+ 'site_info_title',
16
+ 'seo_article_description',
17
+ 'seo_summary_description',
18
+ 'seo_practice_description',
19
+ );
20
+
21
+ //
22
+ // Favicon
23
+ //
24
+
25
+ const contentFavicon = () => {
26
+ setTimeout(() => {
27
+ const newFavicon = (() => {
28
+ switch (contentRoute.value?.type) {
29
+ case 'topic':
30
+ const topicPart = contentRoute.value.topicPart;
31
+ return (
32
+ eruditConfig.site?.favicon?.[topicPart] ||
33
+ eruditAsset(`favicon/${topicPart}.svg`)
34
+ );
35
+ }
36
+
37
+ return defaultFavicon;
38
+ })();
39
+
40
+ favicon.value = newFavicon;
41
+ }, 500);
42
+ };
43
+
44
+ //
45
+ // SEO
46
+ //
47
+
48
+ let seoTitlePromise: Promise<void>, seoDescriptionPromise: Promise<void>;
49
+
50
+ const seo = {
51
+ title: ref<string>(),
52
+ description: ref<string>(),
53
+ };
54
+
55
+ const setupSeoTitle = () => {
56
+ seoTitlePromise = (async () => {
57
+ const phrase = await phrasePromise;
58
+
59
+ let title: string = '';
60
+ title +=
61
+ contentData.value.generic?.seo?.title ||
62
+ contentData.value.generic.title ||
63
+ contentData.value.generic.contentId.split('/').pop();
64
+
65
+ if (contentData.value.type !== 'book') {
66
+ const bookTitle = contentData.value?.bookTitle;
67
+ title += bookTitle ? ` | ${bookTitle}` : '';
68
+ }
69
+
70
+ if (contentRoute.value!.type === 'topic') {
71
+ const topicPart = contentRoute.value!.topicPart;
72
+
73
+ if (topicPart !== 'article') title += ` | ${phrase[topicPart]}`;
74
+ }
75
+
76
+ title +=
77
+ ' - ' +
78
+ (eruditConfig.seo?.title ||
79
+ eruditConfig.site?.title ||
80
+ phrase.site_info_title);
81
+
82
+ seo.title.value = title;
83
+ })();
84
+ };
85
+
86
+ const setupSeoDescription = () => {
87
+ seoDescriptionPromise = (async () => {
88
+ const phrase = await phrasePromise;
89
+ const customDescription =
90
+ contentData.value.generic?.seo?.description ||
91
+ contentData.value.generic?.description;
92
+
93
+ if (customDescription) {
94
+ seo.description.value = customDescription;
95
+ return;
96
+ }
97
+
98
+ if (contentRoute.value!.type === 'topic') {
99
+ const phraseFunc =
100
+ phrase[`seo_${contentRoute.value!.topicPart}_description`];
101
+ seo.description.value = phraseFunc(
102
+ contentData.value.generic?.seo?.title ||
103
+ contentData.value.generic.title!,
104
+ );
105
+ return;
106
+ }
107
+
108
+ seo.description.value = '';
109
+ })();
110
+ };
111
+
112
+ useSeoMeta({
113
+ // @ts-ignore
114
+ title: seo.title,
115
+ ogTitle: seo.title,
116
+ description: seo.description,
117
+ ogDescription: seo.description,
118
+ });
119
+
120
+ const meta = computed(() => {
121
+ return [
122
+ ...createOgImageTags(siteUrl, defaultOgImage),
123
+ ...(contentData.value.generic?.ogImage
124
+ ? createOgImageTags(siteUrl, contentData.value.generic?.ogImage)
125
+ : []),
126
+ ];
127
+ });
128
+
129
+ useHead({
130
+ meta,
131
+ });
132
+
133
+ //
134
+ //
135
+ //
136
+
137
+ watchEffect(() => {
138
+ setupSeoTitle();
139
+ setupSeoDescription();
140
+ });
141
+
142
+ onMounted(() => {
143
+ watchEffect(() => {
144
+ contentFavicon();
145
+ });
146
+ });
147
+
148
+ onBeforeUnmount(() => {
149
+ favicon.value = defaultFavicon;
150
+ });
151
+
152
+ //
153
+ //
154
+ //
155
+
156
+ return Promise.all([seoTitlePromise!, seoDescriptionPromise!]);
157
+ }
@@ -1,45 +1,45 @@
1
- import type { ContentType, TopicPart } from 'erudit-cog/schema';
2
-
3
- interface ContentRouteBase {
4
- type: ContentType;
5
- contentId: string;
6
- }
7
-
8
- interface TopicRoute extends ContentRouteBase {
9
- type: 'topic';
10
- topicPart: TopicPart;
11
- }
12
-
13
- interface ContentRoute extends ContentRouteBase {
14
- type: Exclude<ContentType, 'topic'>;
15
- }
16
-
17
- export function useContentRoute(): ComputedRef<
18
- TopicRoute | ContentRoute | undefined
19
- > {
20
- const route = useRoute();
21
- return computed(() => {
22
- const match = route.path.match(/\/(.+?)\/(.+)/);
23
-
24
- if (!match || !match[1] || !match[2]) return undefined;
25
-
26
- switch (match[1]) {
27
- case 'article':
28
- case 'summary':
29
- case 'practice':
30
- return <TopicRoute>{
31
- type: 'topic',
32
- contentId: match[2],
33
- topicPart: match[1],
34
- };
35
- case 'group':
36
- case 'book':
37
- return <ContentRoute>{
38
- type: match[1],
39
- contentId: match[2],
40
- };
41
- }
42
-
43
- return undefined;
44
- });
45
- }
1
+ import type { ContentType, TopicPart } from '@erudit-js/cog/schema';
2
+
3
+ interface ContentRouteBase {
4
+ type: ContentType;
5
+ contentId: string;
6
+ }
7
+
8
+ interface TopicRoute extends ContentRouteBase {
9
+ type: 'topic';
10
+ topicPart: TopicPart;
11
+ }
12
+
13
+ interface ContentRoute extends ContentRouteBase {
14
+ type: Exclude<ContentType, 'topic'>;
15
+ }
16
+
17
+ export function useContentRoute(): ComputedRef<
18
+ TopicRoute | ContentRoute | undefined
19
+ > {
20
+ const route = useRoute();
21
+ return computed(() => {
22
+ const match = route.path.match(/\/(.+?)\/(.+)/);
23
+
24
+ if (!match || !match[1] || !match[2]) return undefined;
25
+
26
+ switch (match[1]) {
27
+ case 'article':
28
+ case 'summary':
29
+ case 'practice':
30
+ return <TopicRoute>{
31
+ type: 'topic',
32
+ contentId: match[2],
33
+ topicPart: match[1],
34
+ };
35
+ case 'group':
36
+ case 'book':
37
+ return <ContentRoute>{
38
+ type: match[1],
39
+ contentId: match[2],
40
+ };
41
+ }
42
+
43
+ return undefined;
44
+ });
45
+ }
@@ -1,24 +1,24 @@
1
- declare let Ya: any;
2
-
3
- const getElementId = (bannerId: string) => {
4
- return `DarkMagic_${bannerId}`;
5
- };
6
-
7
- const registerBanner = (bannerId: string) => {
8
- const { binaryTheme } = useTheme();
9
-
10
- (window['yaContextCb'] ||= []).push(() => {
11
- Ya.Context.AdvManager.render({
12
- renderTo: getElementId(bannerId),
13
- blockId: bannerId,
14
- darkTheme: binaryTheme.value === 'dark',
15
- });
16
- });
17
- };
18
-
19
- export function useDarkMagic() {
20
- return {
21
- getElementId,
22
- registerBanner,
23
- };
24
- }
1
+ declare let Ya: any;
2
+
3
+ const getElementId = (bannerId: string) => {
4
+ return `DarkMagic_${bannerId}`;
5
+ };
6
+
7
+ const registerBanner = (bannerId: string) => {
8
+ const { binaryTheme } = useTheme();
9
+
10
+ (window['yaContextCb'] ||= []).push(() => {
11
+ Ya.Context.AdvManager.render({
12
+ renderTo: getElementId(bannerId),
13
+ blockId: bannerId,
14
+ darkTheme: binaryTheme.value === 'dark',
15
+ });
16
+ });
17
+ };
18
+
19
+ export function useDarkMagic() {
20
+ return {
21
+ getElementId,
22
+ registerBanner,
23
+ };
24
+ }
@@ -1,63 +1,63 @@
1
- import type { EruditConfigDebug } from 'erudit-cog/schema';
2
-
3
- import eruditConfig from '#erudit/config';
4
-
5
- function useFakeUrl(
6
- fakeApiTarget: keyof EruditConfigDebug['fakeApi'],
7
- ): boolean {
8
- return eruditConfig.debug?.fakeApi?.[fakeApiTarget] ?? import.meta.dev;
9
- }
10
-
11
- function getPayload() {
12
- const nuxt = useNuxtApp();
13
- const payloadKey = 'external-api';
14
- const payload =
15
- (nuxt.static.data[payloadKey] ||=
16
- nuxt.payload.data[payloadKey] ||=
17
- {});
18
-
19
- return payload;
20
- }
21
-
22
- export async function useExternalApiLanguages() {
23
- const sharedUrl = eruditConfig.repository?.sharedUrl;
24
- if (!sharedUrl) return {};
25
-
26
- const payload = getPayload();
27
- const fake = useFakeUrl('languages');
28
-
29
- if (fake) {
30
- payload.languages ||= await $fetch('/api/fake/shared/languages');
31
- } else {
32
- payload.languages ||= await $fetch(
33
- `https://api.github.com/repos/${sharedUrl}/contents/languages.json`,
34
- {
35
- headers: { Accept: 'application/vnd.github.v3.raw' },
36
- responseType: 'json',
37
- //transform: (response: string) => JSON.parse(response),
38
- },
39
- );
40
- }
41
-
42
- return payload.languages;
43
- }
44
-
45
- export async function useExternalApiRepository() {
46
- const repositoryName = eruditConfig.repository?.name;
47
- const repositoryBranch = eruditConfig.repository?.branch;
48
-
49
- if (!repositoryName || !repositoryBranch) return undefined;
50
-
51
- const payload = getPayload();
52
- const fake = useFakeUrl('repository');
53
-
54
- if (fake) {
55
- payload.repository ||= await $fetch('/api/fake/content');
56
- } else {
57
- payload.repository ||= await $fetch(
58
- `https://api.github.com/repos/${repositoryName}/branches/${repositoryBranch}`,
59
- );
60
- }
61
-
62
- return payload.repository;
63
- }
1
+ import type { EruditConfigDebug } from '@erudit-js/cog/schema';
2
+
3
+ import eruditConfig from '#erudit/config';
4
+
5
+ function useFakeUrl(
6
+ fakeApiTarget: keyof EruditConfigDebug['fakeApi'],
7
+ ): boolean {
8
+ return eruditConfig.debug?.fakeApi?.[fakeApiTarget] ?? import.meta.dev;
9
+ }
10
+
11
+ function getPayload() {
12
+ const nuxt = useNuxtApp();
13
+ const payloadKey = 'external-api';
14
+ const payload =
15
+ (nuxt.static.data[payloadKey] ||=
16
+ nuxt.payload.data[payloadKey] ||=
17
+ {});
18
+
19
+ return payload;
20
+ }
21
+
22
+ export async function useExternalApiLanguages() {
23
+ const sharedUrl = eruditConfig.repository?.sharedUrl;
24
+ if (!sharedUrl) return {};
25
+
26
+ const payload = getPayload();
27
+ const fake = useFakeUrl('languages');
28
+
29
+ if (fake) {
30
+ payload.languages ||= await $fetch('/api/fake/shared/languages');
31
+ } else {
32
+ payload.languages ||= await $fetch(
33
+ `https://api.github.com/repos/${sharedUrl}/contents/languages.json`,
34
+ {
35
+ headers: { Accept: 'application/vnd.github.v3.raw' },
36
+ responseType: 'json',
37
+ //transform: (response: string) => JSON.parse(response),
38
+ },
39
+ );
40
+ }
41
+
42
+ return payload.languages;
43
+ }
44
+
45
+ export async function useExternalApiRepository() {
46
+ const repositoryName = eruditConfig.repository?.name;
47
+ const repositoryBranch = eruditConfig.repository?.branch;
48
+
49
+ if (!repositoryName || !repositoryBranch) return undefined;
50
+
51
+ const payload = getPayload();
52
+ const fake = useFakeUrl('repository');
53
+
54
+ if (fake) {
55
+ payload.repository ||= await $fetch('/api/fake/content');
56
+ } else {
57
+ payload.repository ||= await $fetch(
58
+ `https://api.github.com/repos/${repositoryName}/branches/${repositoryBranch}`,
59
+ );
60
+ }
61
+
62
+ return payload.repository;
63
+ }
@@ -1,8 +1,8 @@
1
- import eruditConfig from '#erudit/config';
2
-
3
- export const defaultFavicon =
4
- eruditConfig.site?.favicon?.default || eruditAsset('favicon/default.svg');
5
-
6
- export function useFavicon() {
7
- return useState('favicon', () => defaultFavicon);
8
- }
1
+ import eruditConfig from '#erudit/config';
2
+
3
+ export const defaultFavicon =
4
+ eruditConfig.site?.favicon?.default || eruditAsset('favicon/default.svg');
5
+
6
+ export function useFavicon() {
7
+ return useState('favicon', () => defaultFavicon);
8
+ }