erudit 3.0.0-dev.2 → 3.0.0-dev.21

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 (321) hide show
  1. package/app/app.vue +195 -172
  2. package/app/assets/icons/cameo-add.svg +3 -0
  3. package/app/assets/icons/diamond.svg +3 -0
  4. package/app/assets/icons/graduation.svg +3 -0
  5. package/app/components/Avatar.vue +118 -0
  6. package/app/components/EruditLink.vue +17 -0
  7. package/app/components/Loading.vue +23 -23
  8. package/app/components/SiteAside.vue +393 -382
  9. package/app/components/SiteMain.vue +32 -35
  10. package/app/components/ads/Ads.vue +33 -0
  11. package/app/components/ads/AdsBannerAside.vue +61 -0
  12. package/app/components/ads/AdsBannerBottom.vue +22 -0
  13. package/app/components/ads/AdsProviderCustom.vue +35 -0
  14. package/app/components/ads/AdsProviderYandex.vue +91 -0
  15. package/app/components/ads/AdsReplacer.vue +73 -0
  16. package/app/components/aside/AsideListItem.vue +91 -74
  17. package/app/components/aside/AsideMajor.vue +56 -56
  18. package/app/components/aside/AsideMinor.vue +97 -71
  19. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  20. package/app/components/aside/major/PaneSwitch.vue +54 -54
  21. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  22. package/app/components/aside/major/SiteInfo.vue +85 -85
  23. package/app/components/aside/major/panes/Language.vue +79 -79
  24. package/app/components/aside/major/panes/Pages.vue +50 -34
  25. package/app/components/aside/major/panes/Search.vue +11 -11
  26. package/app/components/aside/major/panes/nav/Nav.vue +92 -91
  27. package/app/components/aside/major/panes/nav/NavBook.vue +95 -86
  28. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  29. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  30. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  31. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  32. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  33. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  34. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  35. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  36. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  37. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  38. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -15
  39. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  40. package/app/components/aside/major/panes/other/Other.vue +16 -16
  41. package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
  42. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  43. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  44. package/app/components/aside/minor/AsideMinorTopLink.vue +66 -67
  45. package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
  46. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
  47. package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
  48. package/app/components/aside/minor/topic/AsideMinorTopic.vue +31 -32
  49. package/app/components/aside/minor/topic/TopicContributors.vue +183 -177
  50. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  51. package/app/components/aside/minor/topic/TopicToc.vue +212 -203
  52. package/app/components/aside/minor/topic/TopicTocItem.vue +19 -31
  53. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  54. package/app/components/bitran/BitranContent.vue +90 -63
  55. package/app/components/bitran/RenderWrapper.vue +10 -10
  56. package/app/components/contributor/ContributorListItem.vue +43 -35
  57. package/app/components/main/MainActionButton.vue +51 -0
  58. package/app/components/main/MainBitranContent.vue +55 -0
  59. package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +63 -75
  60. package/app/components/main/MainDescription.vue +24 -0
  61. package/app/components/main/MainSection.vue +58 -0
  62. package/app/components/main/MainTitle.vue +76 -0
  63. package/app/components/main/cameo/MainCameo.vue +135 -0
  64. package/app/components/main/cameo/MainCameoData.vue +232 -0
  65. package/app/components/main/content/ContentBreadcrumb.vue +28 -0
  66. package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
  67. package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
  68. package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
  69. package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
  70. package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
  71. package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
  72. package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
  73. package/app/components/main/topic/MainTopic.vue +76 -79
  74. package/app/components/main/topic/TopicPartSwitch.vue +119 -118
  75. package/app/components/preview/Preview.vue +186 -177
  76. package/app/components/preview/PreviewDisplay.vue +139 -139
  77. package/app/components/preview/PreviewFooterAction.vue +73 -73
  78. package/app/components/preview/PreviewLoading.vue +14 -14
  79. package/app/components/preview/PreviewScreen.vue +141 -99
  80. package/app/components/preview/display/Alert.vue +50 -50
  81. package/app/components/preview/display/Custom.vue +18 -18
  82. package/app/components/preview/display/GenericLink.vue +48 -48
  83. package/app/components/preview/display/PageLink.vue +22 -20
  84. package/app/components/preview/display/Unique.vue +46 -49
  85. package/app/components/sponsor/SponsorTier1.vue +89 -0
  86. package/app/components/sponsor/SponsorTier2.vue +109 -0
  87. package/app/components/transition/Fade.vue +19 -19
  88. package/app/components/tree/TreeContainer.vue +11 -11
  89. package/app/components/tree/TreeItem.vue +93 -89
  90. package/app/composables/adsAllowed.ts +11 -0
  91. package/app/composables/asset.ts +12 -0
  92. package/app/composables/bitran.ts +108 -127
  93. package/app/composables/bitranLocation.ts +7 -7
  94. package/app/composables/contentData.ts +38 -36
  95. package/app/composables/contentPage.ts +168 -156
  96. package/app/composables/contentRoute.ts +45 -45
  97. package/app/composables/darkMagic.ts +24 -24
  98. package/app/composables/externalApi.ts +69 -63
  99. package/app/composables/favicon.ts +8 -8
  100. package/app/composables/formatText.ts +99 -86
  101. package/app/composables/head.ts +24 -0
  102. package/app/composables/majorPane.ts +62 -60
  103. package/app/composables/phrases.ts +77 -80
  104. package/app/composables/theme.ts +29 -29
  105. package/app/composables/url.ts +43 -33
  106. package/app/pages/_test/preview.vue +110 -110
  107. package/app/pages/article/[...articleId].vue +3 -3
  108. package/app/pages/book/[...bookId].vue +42 -47
  109. package/app/pages/contributor/[contributorId].vue +227 -0
  110. package/app/pages/contributors.vue +184 -0
  111. package/app/pages/group/[...groupId].vue +53 -65
  112. package/app/pages/index.vue +32 -32
  113. package/app/pages/practice/[...practice].vue +3 -3
  114. package/app/pages/sponsors.vue +95 -0
  115. package/app/pages/summary/[...summaryId].vue +3 -3
  116. package/app/plugins/analytics.ts +95 -0
  117. package/app/plugins/prerender.server.ts +34 -0
  118. package/app/public/favicon/article.svg +5 -5
  119. package/app/public/favicon/default.svg +3 -3
  120. package/app/public/favicon/practice.svg +3 -3
  121. package/app/public/favicon/summary.svg +4 -4
  122. package/app/public/logotype.svg +2 -2
  123. package/app/scripts/_immediate.js +9 -9
  124. package/app/scripts/aside/index.ts +59 -59
  125. package/app/scripts/aside/major/nav.ts +26 -26
  126. package/app/scripts/aside/minor/state.ts +37 -37
  127. package/app/scripts/flag.ts +28 -28
  128. package/app/scripts/og.ts +28 -27
  129. package/app/scripts/preview/build.ts +76 -73
  130. package/app/scripts/preview/data/alert.ts +19 -19
  131. package/app/scripts/preview/data/custom.ts +8 -8
  132. package/app/scripts/preview/data/genericLink.ts +24 -24
  133. package/app/scripts/preview/data/pageLink.ts +23 -20
  134. package/app/scripts/preview/data/unique.ts +69 -70
  135. package/app/scripts/preview/data.ts +24 -24
  136. package/app/scripts/preview/display.ts +37 -37
  137. package/app/scripts/preview/footer.ts +9 -9
  138. package/app/scripts/preview/request.ts +51 -51
  139. package/app/scripts/preview/state.ts +63 -63
  140. package/app/styles/_immediate.css +7 -7
  141. package/app/styles/_util.scss +43 -43
  142. package/app/styles/_utils.scss +44 -44
  143. package/app/styles/app.scss +91 -91
  144. package/app/styles/def/_bp.scss +27 -27
  145. package/app/styles/def/_size.scss +7 -7
  146. package/app/styles/def/_z.scss +5 -5
  147. package/app/styles/normalize.scss +49 -63
  148. package/app/styles/partials/_darkMagic.scss +5 -5
  149. package/app/styles/partials/_fnav.scss +15 -15
  150. package/app/styles/partials/_preview.scss +5 -5
  151. package/bin/erudit.mjs +2 -0
  152. package/const.ts +3 -0
  153. package/globalPath.ts +21 -21
  154. package/globals/bitran.ts +1 -47
  155. package/globals/cameo.ts +5 -0
  156. package/globals/content.ts +27 -22
  157. package/globals/contributor.ts +5 -5
  158. package/globals/erudit.ts +5 -5
  159. package/globals/register.ts +23 -18
  160. package/globals/sponsor.ts +17 -0
  161. package/languages/en.ts +108 -95
  162. package/languages/ru.ts +112 -99
  163. package/module/bitran.ts +66 -34
  164. package/module/config.ts +35 -34
  165. package/module/imports.ts +74 -46
  166. package/module/index.ts +47 -47
  167. package/module/logger.ts +10 -10
  168. package/module/paths.ts +22 -22
  169. package/module/restart.ts +61 -61
  170. package/nuxt.config.ts +126 -112
  171. package/package.json +22 -15
  172. package/server/api/aside/major/nav/bookIds.ts +5 -5
  173. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  174. package/server/api/aside/major/nav/global.ts +7 -7
  175. package/server/api/aside/minor/book/[...bookId].ts +18 -0
  176. package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
  177. package/server/api/aside/minor/group/[...groupId].ts +18 -0
  178. package/server/api/aside/minor/news.ts +7 -7
  179. package/server/api/aside/minor/topic.ts +36 -0
  180. package/server/api/bitran/content/[...location].ts +13 -0
  181. package/server/api/bitran/toc/[...location].ts +9 -0
  182. package/server/api/cameo/data/[cameoId].ts +42 -0
  183. package/server/api/cameo/ids.ts +5 -0
  184. package/server/api/content/data.ts +75 -72
  185. package/server/api/contributor/count.ts +6 -6
  186. package/server/api/contributor/list.ts +44 -0
  187. package/server/api/contributor/page/[contributorId].ts +14 -0
  188. package/server/api/fake/content.ts +11 -11
  189. package/server/api/fake/shared/languages.ts +12 -12
  190. package/server/api/language/functions.ts +12 -12
  191. package/server/api/language/phrase/[phraseId].ts +19 -19
  192. package/server/api/language/phraseIds.ts +8 -8
  193. package/server/api/prerender/assets/cameo.ts +14 -0
  194. package/server/api/prerender/assets/contributor.ts +12 -0
  195. package/server/api/prerender/assets/sponsor.ts +13 -0
  196. package/server/api/prerender/cameos.ts +12 -0
  197. package/server/api/prerender/language.ts +9 -0
  198. package/server/api/preview/page/[...parts].ts +78 -51
  199. package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
  200. package/server/api/problem/generator/[...path].ts +26 -0
  201. package/server/api/sponsor/cameo/data/[sponsorId].ts +51 -0
  202. package/server/api/sponsor/cameo/ids.ts +5 -0
  203. package/server/api/sponsor/count.ts +5 -0
  204. package/server/api/sponsor/list.ts +36 -0
  205. package/server/plugin/bitran/content.ts +252 -187
  206. package/server/plugin/bitran/{products → elements}/include.ts +229 -230
  207. package/server/plugin/bitran/location.ts +43 -25
  208. package/server/plugin/bitran/toc.ts +94 -83
  209. package/server/plugin/bitran/transpiler.ts +18 -46
  210. package/server/plugin/build/close.ts +12 -10
  211. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  212. package/server/plugin/build/jobs/content/generic.ts +191 -176
  213. package/server/plugin/build/jobs/content/parse.ts +113 -100
  214. package/server/plugin/build/jobs/content/path.ts +6 -6
  215. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  216. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  217. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  218. package/server/plugin/build/jobs/contributors.ts +69 -66
  219. package/server/plugin/build/jobs/language.ts +36 -36
  220. package/server/plugin/build/jobs/nav.ts +345 -210
  221. package/server/plugin/build/process.ts +34 -25
  222. package/server/plugin/build/rebuild.ts +68 -55
  223. package/server/plugin/build/setup.ts +19 -21
  224. package/server/plugin/content/context.ts +119 -112
  225. package/server/plugin/db/entities/Book.ts +7 -7
  226. package/server/plugin/db/entities/Content.ts +45 -49
  227. package/server/plugin/db/entities/Contribution.ts +10 -10
  228. package/server/plugin/db/entities/Contributor.ts +25 -16
  229. package/server/plugin/db/entities/File.ts +10 -0
  230. package/server/plugin/db/entities/Group.ts +14 -14
  231. package/server/plugin/db/entities/Hash.ts +15 -15
  232. package/server/plugin/db/entities/Topic.ts +20 -20
  233. package/server/plugin/db/entities/Unique.ts +21 -21
  234. package/server/plugin/db/reset.ts +12 -0
  235. package/server/plugin/db/setup.ts +49 -34
  236. package/server/plugin/global.ts +18 -18
  237. package/server/plugin/importer.ts +16 -12
  238. package/server/plugin/index.ts +9 -9
  239. package/server/plugin/logger.ts +23 -23
  240. package/server/plugin/nav/node.ts +27 -26
  241. package/server/plugin/nav/utils.ts +179 -129
  242. package/server/plugin/repository/asideMinor.ts +51 -0
  243. package/server/plugin/repository/book.ts +39 -21
  244. package/server/plugin/repository/cameo.ts +16 -0
  245. package/server/plugin/repository/content.ts +240 -238
  246. package/server/plugin/repository/contentId.ts +40 -0
  247. package/server/plugin/repository/contributor.ts +129 -8
  248. package/server/plugin/repository/file.ts +10 -0
  249. package/server/plugin/repository/frontNav.ts +145 -148
  250. package/server/plugin/repository/topic.ts +35 -32
  251. package/server/plugin/sponsor/build.ts +82 -0
  252. package/server/plugin/sponsor/index.ts +5 -0
  253. package/server/plugin/sponsor/repository.ts +56 -0
  254. package/server/routes/asset/[...assetPath].ts +34 -0
  255. package/server/routes/robots.txt.ts +9 -0
  256. package/server/routes/sitemap.xml.ts +103 -0
  257. package/server/tsconfig.json +9 -9
  258. package/shared/aside/minor.ts +55 -50
  259. package/shared/asset.ts +17 -15
  260. package/shared/bitran/content.ts +9 -0
  261. package/shared/bitran/contentId.ts +56 -0
  262. package/shared/bitran/toc.ts +8 -8
  263. package/shared/breadcrumb.ts +7 -0
  264. package/shared/content/bookId.ts +12 -0
  265. package/shared/content/context.ts +9 -9
  266. package/shared/content/data/base.ts +32 -32
  267. package/shared/content/data/index.ts +5 -5
  268. package/shared/content/data/type/book.ts +5 -5
  269. package/shared/content/data/type/group.ts +6 -6
  270. package/shared/content/data/type/topic.ts +11 -11
  271. package/shared/content/previousNext.ts +9 -9
  272. package/shared/contributor.ts +34 -5
  273. package/shared/frontNav.ts +41 -41
  274. package/shared/icons.ts +38 -38
  275. package/shared/image.ts +5 -5
  276. package/shared/link.ts +28 -25
  277. package/shared/popover.ts +8 -0
  278. package/shared/types/language.ts +84 -75
  279. package/shared/utils/objectsEqual.ts +4 -4
  280. package/shared/utils/stringColor.ts +9 -9
  281. package/test/contentId.test.ts +91 -0
  282. package/test/utils/url.test.ts +99 -0
  283. package/tsconfig.json +8 -8
  284. package/utils/contentPath.ts +67 -0
  285. package/utils/ext.ts +41 -0
  286. package/utils/stress.ts +9 -9
  287. package/utils/url.ts +23 -0
  288. package/app/components/ads/BannerTemplate.vue +0 -51
  289. package/app/components/ads/BottomBanner.vue +0 -45
  290. package/app/components/ads/LeftBanner.vue +0 -50
  291. package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
  292. package/app/components/contributor/ContributorAvatar.vue +0 -43
  293. package/app/components/main/utils/ContentDescription.vue +0 -19
  294. package/app/components/main/utils/ContentFlag.vue +0 -15
  295. package/app/components/main/utils/ContentSection.vue +0 -45
  296. package/app/components/main/utils/ContentTitle.vue +0 -39
  297. package/app/composables/bitranContent.ts +0 -37
  298. package/app/pages/members.vue +0 -6
  299. package/app/public/user.svg +0 -10
  300. package/app/scripts/aside/minor/topic.ts +0 -3
  301. package/app/styles/default.scss +0 -83
  302. package/server/api/aside/minor/path.ts +0 -78
  303. package/server/api/bitran/content/[location].ts +0 -7
  304. package/server/api/bitran/toc/[location].ts +0 -7
  305. package/server/plugin/bitran/products/link.ts +0 -116
  306. package/server/plugin/bitran/setup.ts +0 -9
  307. package/server/plugin/content/absoluteId.ts +0 -94
  308. package/shared/bitran/context.ts +0 -8
  309. package/shared/bitran/default.ts +0 -46
  310. package/shared/bitran/link/Link.vue +0 -167
  311. package/shared/bitran/link/factory.ts +0 -24
  312. package/shared/bitran/link/icon.svg +0 -3
  313. package/shared/bitran/link/languages/en.ts +0 -7
  314. package/shared/bitran/link/languages/ru.ts +0 -7
  315. package/shared/bitran/link/renderer.ts +0 -21
  316. package/shared/bitran/link/shared.ts +0 -17
  317. package/shared/bitran/link/target.ts +0 -134
  318. package/shared/bitran/link/transpiler.ts +0 -10
  319. package/shared/bitran/location.ts +0 -166
  320. package/test/bitran/link/target.test.ts +0 -141
  321. package/test/bitran/location.test.ts +0 -143
@@ -1,9 +1,9 @@
1
- {
2
- "extends": "../../../playground/.erudit/nuxt/.nuxt/tsconfig.server.json",
3
- "compilerOptions": {
4
- "verbatimModuleSyntax": true,
5
- "experimentalDecorators": true,
6
- "emitDecoratorMetadata": true
7
- },
8
- "exclude": ["../module/**/*", "../globalPath.ts"]
9
- }
1
+ {
2
+ "extends": "../../../playground/.erudit/nuxt/.nuxt/tsconfig.server.json",
3
+ "compilerOptions": {
4
+ "verbatimModuleSyntax": true,
5
+ "experimentalDecorators": true,
6
+ "emitDecoratorMetadata": true
7
+ },
8
+ "exclude": ["../module/**/*", "../globalPath.ts"]
9
+ }
@@ -1,50 +1,55 @@
1
- import type { BitranLocation } from '../bitran/location';
2
- import type { Toc } from '../bitran/toc';
3
- import type { PreviousNextItem } from '../content/previousNext';
4
- import type { ContentContributor } from '../contributor';
5
-
6
- interface AsideMinorBase {
7
- type: AsideMinorType;
8
- }
9
-
10
- export type AsideMinorType =
11
- | 'topic'
12
- | 'group'
13
- | 'book'
14
- | 'contributor'
15
- | 'news';
16
-
17
- export interface AsideMinorTopic extends AsideMinorBase {
18
- type: 'topic';
19
- fullContentId: string;
20
- location: BitranLocation;
21
- nav: Partial<{
22
- previous: PreviousNextItem;
23
- next: PreviousNextItem;
24
- article: string;
25
- summary: string;
26
- practice: string;
27
- }>;
28
- toc: Toc;
29
- contributors?: ContentContributor[];
30
- // todos: TodoItem[];
31
- }
32
-
33
- export interface AsideMinorContent extends AsideMinorBase {
34
- type: 'group' | 'book';
35
- fullContentId: string;
36
- nav: Partial<{
37
- previous: PreviousNextItem;
38
- next: PreviousNextItem;
39
- }>;
40
- contributors?: ContentContributor[];
41
- }
42
-
43
- export interface AsideMinorNews extends AsideMinorBase {
44
- type: 'news';
45
- }
46
-
47
- export type AsideMinorData =
48
- | AsideMinorTopic
49
- | AsideMinorContent
50
- | AsideMinorNews;
1
+ import type { ContentType, TopicPart } from '@erudit-js/cog/schema';
2
+
3
+ import type { Toc } from '@shared/bitran/toc';
4
+ import type { PreviousNext } from '@shared/content/previousNext';
5
+ import type { ContentContributor, Contribution } from '@shared/contributor';
6
+
7
+ export type AsideMinorType = ContentType | 'contributor' | 'news';
8
+
9
+ interface AsideMinorBase {
10
+ type: AsideMinorType;
11
+ }
12
+
13
+ export interface AsideMinorContentBase extends AsideMinorBase {
14
+ type: ContentType;
15
+ fullContentId: string;
16
+ shortContentId: string;
17
+ fsContentDirectory: string;
18
+ previousNext: PreviousNext;
19
+ contributors?: ContentContributor[];
20
+ }
21
+
22
+ export interface AsideMinorBook extends AsideMinorContentBase {
23
+ type: 'book';
24
+ }
25
+
26
+ export interface AsideMinorGroup extends AsideMinorContentBase {
27
+ type: 'group';
28
+ }
29
+
30
+ export interface AsideMinorTopic extends AsideMinorContentBase {
31
+ type: 'topic';
32
+ toc: Toc;
33
+ part: TopicPart;
34
+ partLinks: Partial<{
35
+ article: string;
36
+ summary: string;
37
+ practice: string;
38
+ }>;
39
+ }
40
+
41
+ export interface AsideMinorContributor extends AsideMinorBase {
42
+ type: 'contributor';
43
+ contributions: Contribution[];
44
+ }
45
+
46
+ export interface AsideMinorNews extends AsideMinorBase {
47
+ type: 'news';
48
+ }
49
+
50
+ export type AsideMinorData =
51
+ | AsideMinorBook
52
+ | AsideMinorGroup
53
+ | AsideMinorTopic
54
+ | AsideMinorContributor
55
+ | AsideMinorNews;
package/shared/asset.ts CHANGED
@@ -1,15 +1,17 @@
1
- export function eruditAsset(path: string) {
2
- return '/_erudit-asset/' + path;
3
- }
4
-
5
- export function contributorAsset(path: string) {
6
- return '/_user-asset/contributor/' + path;
7
- }
8
-
9
- export function contentAsset(path: string) {
10
- return '/_user-asset/content/' + path;
11
- }
12
-
13
- export function publicAsset(path: string) {
14
- return '/_user-asset/public/' + path;
15
- }
1
+ import {
2
+ PUBLIC_CONTENT_ASSET,
3
+ PUBLIC_ERUDIT_ASSET,
4
+ PUBLIC_USER_ASSET,
5
+ } from '@erudit/const';
6
+
7
+ export function eruditAsset(path: string) {
8
+ return PUBLIC_ERUDIT_ASSET + path;
9
+ }
10
+
11
+ export function contentAsset(path: string) {
12
+ return PUBLIC_CONTENT_ASSET + path;
13
+ }
14
+
15
+ export function publicAsset(path: string) {
16
+ return PUBLIC_USER_ASSET + path;
17
+ }
@@ -0,0 +1,9 @@
1
+ import type { RenderDataStorage } from '@bitran-js/core';
2
+ import type { BitranContext } from '@erudit-js/cog/schema';
3
+
4
+ export interface RawBitranContent {
5
+ biCode: string;
6
+ storage: RenderDataStorage;
7
+ routes: string[];
8
+ context: BitranContext;
9
+ }
@@ -0,0 +1,56 @@
1
+ import { detectContentBookId } from '../content/bookId';
2
+
3
+ export function toAbsoluteContentPath(
4
+ contentPath: string,
5
+ contextPath: string,
6
+ bookIds?: string[],
7
+ ) {
8
+ const unresolvedPath = (() => {
9
+ if (contentPath.startsWith('/')) {
10
+ return contentPath;
11
+ }
12
+
13
+ if (contentPath.startsWith('~/')) {
14
+ const restPath = contentPath.substring(2);
15
+ const bookId = detectContentBookId(contextPath, bookIds ?? []);
16
+
17
+ if (bookId) {
18
+ return bookId + '/' + restPath;
19
+ }
20
+
21
+ // Not in any book, convert to absolute path
22
+ return '/' + restPath;
23
+ }
24
+
25
+ return contextPath + '/' + contentPath;
26
+ })();
27
+
28
+ return resolveContentPath(unresolvedPath);
29
+ }
30
+
31
+ export function resolveContentPath(toResolvePath: string) {
32
+ const reverseParts = toResolvePath.split('/').reverse();
33
+ const resolvedParts: string[] = [];
34
+
35
+ let skipCounter = 0;
36
+
37
+ for (let i = 0; i < reverseParts.length; i++) {
38
+ const part = reverseParts[i];
39
+
40
+ if (part === '..') {
41
+ skipCounter++;
42
+ continue;
43
+ }
44
+
45
+ if (skipCounter) {
46
+ skipCounter--;
47
+ continue;
48
+ }
49
+
50
+ if (part && part !== '.') {
51
+ resolvedParts.unshift(part);
52
+ }
53
+ }
54
+
55
+ return resolvedParts.join('/');
56
+ }
@@ -1,8 +1,8 @@
1
- export interface TocItem {
2
- id: string;
3
- level: number;
4
- productName: string;
5
- title?: string;
6
- }
7
-
8
- export type Toc = TocItem[];
1
+ export interface TocItem {
2
+ id: string;
3
+ level: number;
4
+ productName: string;
5
+ title?: string;
6
+ }
7
+
8
+ export type Toc = TocItem[];
@@ -0,0 +1,7 @@
1
+ import type { MyIconName } from '#my-icons';
2
+
3
+ export interface BreadcrumbItem {
4
+ title: string;
5
+ icon: MyIconName;
6
+ link: string;
7
+ }
@@ -0,0 +1,12 @@
1
+ export function detectContentBookId(contentId: string, bookIds: string[]) {
2
+ let bestMatch: string | undefined = undefined;
3
+ for (const bookId of bookIds) {
4
+ if (contentId.startsWith(bookId)) {
5
+ if (!bestMatch || bookId.length > bestMatch.length) {
6
+ bestMatch = bookId;
7
+ }
8
+ }
9
+ }
10
+
11
+ return bestMatch;
12
+ }
@@ -1,9 +1,9 @@
1
- export interface ContextItem {
2
- type: string;
3
- icon: string;
4
- title: string;
5
- href: string;
6
- hidden: boolean;
7
- }
8
-
9
- export type Context = ContextItem[];
1
+ export interface ContextItem {
2
+ type: string;
3
+ icon: string;
4
+ title: string;
5
+ href: string;
6
+ hidden: boolean;
7
+ }
8
+
9
+ export type Context = ContextItem[];
@@ -1,32 +1,32 @@
1
- import type {
2
- ContentFlag,
3
- ContentReferences,
4
- ContentSeo,
5
- ContentType,
6
- TopicPart,
7
- } from 'erudit-cog/schema';
8
-
9
- import type { Context } from '@shared/content/context';
10
- import type { PreviousNext } from '@shared/content/previousNext';
11
- import type { ImageData } from '@shared/image';
12
-
13
- export interface ContentGenericData {
14
- contentId: string;
15
- title?: string;
16
- description?: string;
17
- decoration?: string;
18
- type: ContentType;
19
- context: Context;
20
- flags: Record<ContentFlag, boolean>;
21
- topicPart?: TopicPart;
22
- seo?: Partial<ContentSeo>;
23
- ogImage?: ImageData;
24
- previousNext: PreviousNext;
25
- dependencies?: Record<string, string>;
26
- references?: ContentReferences;
27
- }
28
-
29
- export interface ContentBaseData {
30
- type: ContentType;
31
- generic: ContentGenericData;
32
- }
1
+ import type {
2
+ ContentFlag,
3
+ ContentReferences,
4
+ ContentSeo,
5
+ ContentType,
6
+ TopicPart,
7
+ } from '@erudit-js/cog/schema';
8
+
9
+ import type { Context } from '@shared/content/context';
10
+ import type { PreviousNext } from '@shared/content/previousNext';
11
+ import type { ImageData } from '@shared/image';
12
+
13
+ export interface ContentGenericData {
14
+ contentId: string;
15
+ title?: string;
16
+ description?: string;
17
+ decoration?: string;
18
+ type: ContentType;
19
+ context: Context;
20
+ flags: Record<ContentFlag, boolean>;
21
+ topicPart?: TopicPart;
22
+ seo?: Partial<ContentSeo>;
23
+ ogImage?: ImageData;
24
+ previousNext: PreviousNext;
25
+ dependencies?: Record<string, string>;
26
+ references?: ContentReferences;
27
+ }
28
+
29
+ export interface ContentBaseData {
30
+ type: ContentType;
31
+ generic: ContentGenericData;
32
+ }
@@ -1,5 +1,5 @@
1
- import type { ContentTopicData } from './type/topic';
2
- import type { ContentGroupData } from './type/group';
3
- import type { ContentBookData } from './type/book';
4
-
5
- export type ContentData = ContentTopicData | ContentGroupData | ContentBookData;
1
+ import type { ContentTopicData } from './type/topic';
2
+ import type { ContentGroupData } from './type/group';
3
+ import type { ContentBookData } from './type/book';
4
+
5
+ export type ContentData = ContentTopicData | ContentGroupData | ContentBookData;
@@ -1,5 +1,5 @@
1
- import type { ContentBaseData } from '../base';
2
-
3
- export interface ContentBookData extends ContentBaseData {
4
- type: 'book';
5
- }
1
+ import type { ContentBaseData } from '../base';
2
+
3
+ export interface ContentBookData extends ContentBaseData {
4
+ type: 'book';
5
+ }
@@ -1,6 +1,6 @@
1
- import type { ContentBaseData } from '../base';
2
-
3
- export interface ContentGroupData extends ContentBaseData {
4
- type: 'group';
5
- bookTitle?: string;
6
- }
1
+ import type { ContentBaseData } from '../base';
2
+
3
+ export interface ContentGroupData extends ContentBaseData {
4
+ type: 'group';
5
+ bookTitle?: string;
6
+ }
@@ -1,11 +1,11 @@
1
- import type { TopicPart } from 'erudit-cog/schema';
2
-
3
- import type { ContentBaseData } from '../base';
4
-
5
- export type TopicPartLinks = Partial<Record<TopicPart, string>>;
6
-
7
- export interface ContentTopicData extends ContentBaseData {
8
- type: 'topic';
9
- topicPartLinks: TopicPartLinks;
10
- bookTitle?: string;
11
- }
1
+ import type { TopicPart } from '@erudit-js/cog/schema';
2
+
3
+ import type { ContentBaseData } from '../base';
4
+
5
+ export type TopicPartLinks = Partial<Record<TopicPart, string>>;
6
+
7
+ export interface ContentTopicData extends ContentBaseData {
8
+ type: 'topic';
9
+ topicPartLinks: TopicPartLinks;
10
+ bookTitle?: string;
11
+ }
@@ -1,9 +1,9 @@
1
- export interface PreviousNext {
2
- next?: PreviousNextItem;
3
- previous?: PreviousNextItem;
4
- }
5
-
6
- export interface PreviousNextItem {
7
- title: string;
8
- link: string;
9
- }
1
+ export interface PreviousNext {
2
+ next?: PreviousNextItem;
3
+ previous?: PreviousNextItem;
4
+ }
5
+
6
+ export interface PreviousNextItem {
7
+ title: string;
8
+ link: string;
9
+ }
@@ -1,5 +1,34 @@
1
- export interface ContentContributor {
2
- contributorId: string;
3
- displayName?: string;
4
- avatar?: string;
5
- }
1
+ import type { ContentType } from '@erudit-js/cog/schema';
2
+
3
+ export interface ContentContributor {
4
+ contributorId: string;
5
+ displayName?: string;
6
+ avatar?: string;
7
+ }
8
+
9
+ export interface Contribution {
10
+ bookId?: string;
11
+ bookTitle?: string;
12
+ contentType: ContentType;
13
+ contentTitle: string;
14
+ contentLink: string;
15
+ }
16
+
17
+ export interface PageContributor {
18
+ contributorId: string;
19
+ displayName?: string;
20
+ slogan?: string;
21
+ links?: Record<string, string>;
22
+ avatar?: string;
23
+ isEditor?: boolean;
24
+ hasDescription?: boolean;
25
+ contributions?: Contribution[];
26
+ }
27
+
28
+ export interface ContributorListItem {
29
+ contributorId: string;
30
+ displayName?: string;
31
+ isEditor?: boolean;
32
+ avatar?: string;
33
+ contributions: number;
34
+ }
@@ -1,41 +1,41 @@
1
- import type { ContentFlag, TopicPart } from 'erudit-cog/schema';
2
-
3
- export type FrontNavType = 'book' | 'topic' | 'separator' | 'folder';
4
-
5
- export interface FrontNavBase {
6
- type: FrontNavType;
7
- id: string;
8
- fullId: string;
9
- label: string;
10
- level: number;
11
- flags?: Record<ContentFlag, boolean>;
12
- }
13
-
14
- export interface FrontNavTopic extends FrontNavBase {
15
- type: 'topic';
16
- part: TopicPart;
17
- }
18
-
19
- export interface FrontNavContainer extends FrontNavBase {
20
- children?: FrontNavItem[];
21
- }
22
-
23
- export interface FrontNavBook extends FrontNavContainer {
24
- type: 'book';
25
- }
26
-
27
- export interface FrontNavSeparator extends FrontNavContainer {
28
- type: 'separator';
29
- }
30
-
31
- export interface FrontNavFolder extends FrontNavContainer {
32
- type: 'folder';
33
- }
34
-
35
- export type FrontNavItem =
36
- | FrontNavTopic
37
- | FrontNavBook
38
- | FrontNavSeparator
39
- | FrontNavFolder;
40
-
41
- export type FrontNav = FrontNavItem[];
1
+ import type { ContentFlag, TopicPart } from '@erudit-js/cog/schema';
2
+
3
+ export type FrontNavType = 'book' | 'topic' | 'separator' | 'folder';
4
+
5
+ export interface FrontNavBase {
6
+ type: FrontNavType;
7
+ id: string;
8
+ fullId: string;
9
+ label: string;
10
+ level: number;
11
+ flags?: Partial<Record<ContentFlag, boolean>>;
12
+ }
13
+
14
+ export interface FrontNavTopic extends FrontNavBase {
15
+ type: 'topic';
16
+ part: TopicPart;
17
+ }
18
+
19
+ export interface FrontNavContainer extends FrontNavBase {
20
+ children?: FrontNavItem[];
21
+ }
22
+
23
+ export interface FrontNavBook extends FrontNavContainer {
24
+ type: 'book';
25
+ }
26
+
27
+ export interface FrontNavSeparator extends FrontNavContainer {
28
+ type: 'separator';
29
+ }
30
+
31
+ export interface FrontNavFolder extends FrontNavContainer {
32
+ type: 'folder';
33
+ }
34
+
35
+ export type FrontNavItem =
36
+ | FrontNavTopic
37
+ | FrontNavBook
38
+ | FrontNavSeparator
39
+ | FrontNavFolder;
40
+
41
+ export type FrontNav = FrontNavItem[];
package/shared/icons.ts CHANGED
@@ -1,38 +1,38 @@
1
- import {
2
- isContentType,
3
- isTopicPart,
4
- type ContentType,
5
- type TopicPart,
6
- } from 'erudit-cog/schema';
7
-
8
- import type { MyIconName } from '#my-icons';
9
- import type { BitranLocation } from './bitran/location';
10
-
11
- export const TOPIC_PART_ICON = {
12
- article: 'outline/file-lines',
13
- summary: 'file-star',
14
- practice: 'file-check',
15
- } satisfies Record<TopicPart, MyIconName>;
16
-
17
- export const CONTENT_TYPE_ICON = {
18
- book: 'outline/book',
19
- group: 'folder',
20
- topic: 'outline/file-lines',
21
- } satisfies Record<ContentType, MyIconName>;
22
-
23
- export const ICON = {
24
- contributor: 'user',
25
- } satisfies Record<string, MyIconName>;
26
-
27
- export function locationIcon(location: BitranLocation): MyIconName {
28
- if (isTopicPart(location.type)) return TOPIC_PART_ICON[location.type];
29
-
30
- if (isContentType(location.type)) return CONTENT_TYPE_ICON[location.type];
31
-
32
- switch (location.type) {
33
- case 'contributor':
34
- return ICON['contributor'];
35
- }
36
-
37
- return '__missing';
38
- }
1
+ import {
2
+ isContentType,
3
+ isTopicPart,
4
+ type BitranLocation,
5
+ type ContentType,
6
+ type TopicPart,
7
+ } from '@erudit-js/cog/schema';
8
+
9
+ import type { MyIconName } from '#my-icons';
10
+
11
+ export const TOPIC_PART_ICON = {
12
+ article: 'outline/file-lines',
13
+ summary: 'file-star',
14
+ practice: 'file-check',
15
+ } satisfies Record<TopicPart, MyIconName>;
16
+
17
+ export const CONTENT_TYPE_ICON = {
18
+ book: 'outline/book',
19
+ group: 'folder',
20
+ topic: 'outline/file-lines',
21
+ } satisfies Record<ContentType, MyIconName>;
22
+
23
+ export const ICON = {
24
+ contributor: 'user',
25
+ } satisfies Record<string, MyIconName>;
26
+
27
+ export function locationIcon(location: BitranLocation): MyIconName {
28
+ if (isTopicPart(location.type)) return TOPIC_PART_ICON[location.type];
29
+
30
+ if (isContentType(location.type)) return CONTENT_TYPE_ICON[location.type];
31
+
32
+ switch (location.type) {
33
+ case 'contributor':
34
+ return ICON['contributor'];
35
+ }
36
+
37
+ return '__missing';
38
+ }
package/shared/image.ts CHANGED
@@ -1,5 +1,5 @@
1
- export interface ImageData {
2
- src: string;
3
- width: number;
4
- height: number;
5
- }
1
+ export interface ImageData {
2
+ src: string;
3
+ width: number;
4
+ height: number;
5
+ }