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,166 +0,0 @@
1
- import { isTopicPart } from 'erudit-cog/schema';
2
-
3
- export const bitranLocationTypes = {
4
- article: true,
5
- summary: true,
6
- practice: true,
7
- group: true,
8
- contributor: true,
9
- };
10
-
11
- export type BitranLocationType = keyof typeof bitranLocationTypes;
12
-
13
- export function isBitranLocationType(type: any): type is BitranLocationType {
14
- return type in bitranLocationTypes;
15
- }
16
-
17
- function typeRequiresPath(type: BitranLocationType) {
18
- return bitranLocationTypes[type];
19
- }
20
-
21
- export interface BitranLocation {
22
- type: BitranLocationType;
23
- path?: string;
24
- unique?: string;
25
- }
26
-
27
- export function stringifyBitranLocation(location: BitranLocation): string {
28
- try {
29
- if (!isBitranLocationType(location.type))
30
- throw `Unknown Bitran location type "${location.type}"!`;
31
-
32
- if (!location.path && typeRequiresPath(location.type))
33
- throw 'Missing Bitran location path!';
34
-
35
- if (location.unique === '')
36
- throw 'Bitran location unique cannot be empty string!';
37
- } catch (reason) {
38
- let message = `${reason}\n\n` + JSON.stringify(location, null, 4);
39
- throw new Error(message);
40
- }
41
-
42
- return (
43
- location.type +
44
- '|' +
45
- (location.path || '') +
46
- (location.unique ? '|' + location.unique : '')
47
- );
48
- }
49
-
50
- export function parseBitranLocation(strLocation: string): BitranLocation {
51
- const [strType, strPath, strUnique] = strLocation.split('|');
52
-
53
- if (!isBitranLocationType(strType))
54
- throw new Error(`Unknown Bitran location type "${strType}"!`);
55
-
56
- const location: BitranLocation = { type: strType };
57
-
58
- if (!strPath) {
59
- if (typeRequiresPath(location.type))
60
- throw new Error(
61
- `Missing Bitran location path for type "${strType}"!`,
62
- );
63
- } else location.path = strPath;
64
-
65
- if (strUnique === '')
66
- throw `Bitran location "${strLocation}" unique cannot be empty string!`;
67
- else if (strUnique) location.unique = strUnique;
68
-
69
- return location;
70
- }
71
-
72
- export function parsePartialBitranLocation(
73
- strLocation: string,
74
- contextLocation: BitranLocation,
75
- ): BitranLocation {
76
- const parts = strLocation.split('|');
77
-
78
- // Only unique provided. Restoring type + path
79
- // function -> article|foo/bar|function
80
- if (parts.length === 1)
81
- return {
82
- type: contextLocation.type,
83
- path: contextLocation.path,
84
- unique: parts[0],
85
- };
86
-
87
- if (parts.length === 2) {
88
- //
89
- // If there are two parts, the result depends on location type
90
- //
91
-
92
- // In topics we can reference topic parts without specifying content path
93
- // practice|function -> practice|foo/bar|function
94
- if (isTopicPart(parts[0])) {
95
- const [type, unique] = parts as [BitranLocationType, string];
96
-
97
- if (!isTopicPart(contextLocation.type))
98
- throw new Error(
99
- `String Bitran location "${strLocation}" referencing topic part "${type}" in non-topic context!`,
100
- );
101
-
102
- return {
103
- type,
104
- path: contextLocation.path,
105
- unique,
106
- };
107
- }
108
- }
109
-
110
- return parseBitranLocation(strLocation);
111
- }
112
-
113
- export const { encodeBitranLocation, decodeBitranLocation } = (() => {
114
- const encodeSymbols = {
115
- '|': '┃',
116
- '/': '╱',
117
- ':': '﹕',
118
- };
119
-
120
- const decodeSymbols = Object.entries(encodeSymbols).reduce(
121
- (map, [key, value]) => ((map[value] = key), map),
122
- {} as Record<string, string>,
123
- );
124
-
125
- const replaceSymbols = (text: string, symbols: Record<string, string>) => {
126
- for (const [find, replace] of Object.entries(symbols))
127
- text = text.replaceAll(find, replace);
128
-
129
- return text;
130
- };
131
-
132
- return {
133
- encodeBitranLocation: (strLocation: string) =>
134
- replaceSymbols(strLocation, encodeSymbols),
135
-
136
- decodeBitranLocation: (strLocation: string) =>
137
- replaceSymbols(strLocation, decodeSymbols),
138
- };
139
- })();
140
-
141
- export function locationFromPath(routePath: string) {
142
- const pathParts = (
143
- routePath.startsWith('/') ? routePath.substring(1) : routePath
144
- ).split('/');
145
- const firstPart = pathParts.shift() as any;
146
- const locationPath = pathParts.join('/');
147
-
148
- if (!locationPath) return undefined;
149
-
150
- if (isTopicPart(firstPart))
151
- return {
152
- type: firstPart,
153
- path: locationPath,
154
- };
155
-
156
- switch (firstPart) {
157
- case 'group':
158
- case 'contributor':
159
- return {
160
- type: firstPart,
161
- path: locationPath,
162
- };
163
- }
164
-
165
- return undefined;
166
- }
@@ -1,141 +0,0 @@
1
- import { NO_ALIASES } from '@erudit-js/bitran-elements/aliases/shared';
2
-
3
- console.log(NO_ALIASES());
4
-
5
- import type { BitranContext } from '@erudit/shared/bitran/context';
6
- import {
7
- createLinkTarget,
8
- type AbsoluteLinkTarget,
9
- type ExternalLinkTarget,
10
- type LinkTargetType,
11
- type PageLinkTarget,
12
- type UniqueLinkTarget,
13
- } from '@erudit/shared/bitran/link/target';
14
-
15
- const articleContext: BitranContext = {
16
- location: {
17
- type: 'article',
18
- path: 'a/b/c',
19
- },
20
- aliases: {
21
- a1: 'alias1',
22
- },
23
- };
24
-
25
- const contributorContext: BitranContext = {
26
- location: {
27
- type: 'contributor',
28
- path: 'john',
29
- },
30
- aliases: NO_ALIASES(),
31
- };
32
-
33
- //
34
- //
35
- //
36
-
37
- const absoluteTargets = ['/', '/foo/bar/baz'];
38
-
39
- const externalTargets = [
40
- 'http://www.google.com',
41
- 'http://www.google.com/',
42
- 'https://www.google.com/foo/bar/baz',
43
- 'https://www.google.com/foo/bar/baz?a=1&b=2#anchor',
44
- ];
45
-
46
- const validPageTargets: [string, Pick<PageLinkTarget, 'pageType' | 'path'>][] =
47
- [
48
- // With "page|" prefix
49
- ['page|contributor|john', { pageType: 'contributor', path: 'john' }],
50
- ['page|article|foo/bar', { pageType: 'article', path: 'foo/bar' }],
51
- [
52
- 'page|book|combinatorics',
53
- { pageType: 'book', path: 'combinatorics' },
54
- ],
55
- [
56
- 'page|summary',
57
- { pageType: 'summary', path: articleContext.location.path },
58
- ],
59
- // Without "page|" prefix for non-topic parts
60
- ['contributor|john', { pageType: 'contributor', path: 'john' }],
61
- ];
62
-
63
- const invalidPageTargets = [
64
- // Reference topic part in non-topic context
65
- 'page|article',
66
- // Unknown page type
67
- 'page|foo|a/b/c',
68
- // Unkown Bitran location type
69
- 'book|combinatorics',
70
- ];
71
-
72
- const validUniqueTargets: [string, string][] = [
73
- ['definition', 'article|a/b/c|definition'],
74
- ['practice|term', 'practice|a/b/c|term'],
75
- ['contributor|john|theorem', 'contributor|john|theorem'],
76
- ];
77
-
78
- //
79
- //
80
- //
81
-
82
- describe('createLinkTarget', () => {
83
- it.each(absoluteTargets)(
84
- 'should create absolute link target for %p',
85
- (absoluteTarget) => {
86
- const target = createLinkTarget(
87
- absoluteTarget,
88
- articleContext,
89
- ) as AbsoluteLinkTarget;
90
-
91
- expect(target.type).toBe<LinkTargetType>('absolute');
92
- expect(target.href).toBe(absoluteTarget);
93
- },
94
- );
95
-
96
- it.each(externalTargets)(
97
- 'should create external link target for %p',
98
- (externalTarget) => {
99
- const target = createLinkTarget(
100
- externalTarget,
101
- articleContext,
102
- ) as ExternalLinkTarget;
103
-
104
- expect(target.type).toBe<LinkTargetType>('external');
105
- expect(target.href).toBe(externalTarget);
106
- },
107
- );
108
-
109
- for (const [pageTarget, expected] of validPageTargets) {
110
- it(`should create page link target for "${pageTarget}"`, () => {
111
- const target = createLinkTarget(
112
- pageTarget,
113
- articleContext,
114
- ) as PageLinkTarget;
115
-
116
- expect(target.type).toBe<LinkTargetType>('page');
117
- expect(target.pageType).toBe(expected.pageType);
118
- expect(target.path).toBe(expected.path);
119
- });
120
- }
121
-
122
- for (const invalidPageTarget of invalidPageTargets) {
123
- it(`should throw on page link target "${invalidPageTarget}"`, () => {
124
- expect(() =>
125
- createLinkTarget(invalidPageTarget, contributorContext),
126
- ).toThrow();
127
- });
128
- }
129
-
130
- for (const [uniqueTarget, expected] of validUniqueTargets) {
131
- it(`should create unique link target for "${uniqueTarget}"`, () => {
132
- const target = createLinkTarget(
133
- uniqueTarget,
134
- articleContext,
135
- ) as UniqueLinkTarget;
136
-
137
- expect(target.type).toBe<LinkTargetType>('unique');
138
- expect(target.strlocation).toBe(expected);
139
- });
140
- }
141
- });
@@ -1,143 +0,0 @@
1
- import {
2
- decodeBitranLocation,
3
- encodeBitranLocation,
4
- parseBitranLocation,
5
- parsePartialBitranLocation,
6
- stringifyBitranLocation,
7
- type BitranLocation,
8
- } from '@erudit/shared/bitran/location';
9
-
10
- const locations: [BitranLocation, string][] = [
11
- // Full locations
12
- [{ type: 'article', path: 'foo', unique: 'bar' }, 'article|foo|bar'],
13
- [{ type: 'group', path: 'foo', unique: 'bar' }, 'group|foo|bar'],
14
- // Type + path
15
- [{ type: 'article', path: 'foo' }, 'article|foo'],
16
- [{ type: 'group', path: 'foo' }, 'group|foo'],
17
- ];
18
-
19
- const partialLocations: [string, BitranLocation, BitranLocation][] = [
20
- // Full string location
21
- [
22
- 'article|foo/bar|baz',
23
- { type: 'group', path: 'qux' },
24
- { type: 'article', path: 'foo/bar', unique: 'baz' },
25
- ],
26
- // Only unique
27
- [
28
- 'baz',
29
- { type: 'summary', path: 'foo/bar' },
30
- { type: 'summary', path: 'foo/bar', unique: 'baz' },
31
- ],
32
- [
33
- 'baz',
34
- { type: 'contributor', path: 'John' },
35
- { type: 'contributor', path: 'John', unique: 'baz' },
36
- ],
37
- // Topic context
38
- [
39
- 'article|baz',
40
- { type: 'practice', path: 'foo/bar' },
41
- { type: 'article', path: 'foo/bar', unique: 'baz' },
42
- ],
43
- ];
44
-
45
- const invalidPartialLocations: [string, BitranLocation][] = [
46
- // Referencing topic part in non-topic context
47
- ['article|bar', { type: 'contributor', path: 'foo' }],
48
- ];
49
-
50
- const invalidLocations = [
51
- // Too few parts
52
- { type: 'article' },
53
- { path: 'foo' },
54
- { unique: 'foo' },
55
- // Unknown type
56
- { type: 'foo' },
57
- { type: 'foo', path: 'bar', unique: 'baz' },
58
- // Locations that require path
59
- { type: 'article', unique: 'foo' },
60
- { type: 'summary', unique: 'foo' },
61
- { type: 'practice', unique: 'foo' },
62
- { type: 'group', unique: 'foo' },
63
- { type: 'contributor', unique: 'foo' },
64
- ];
65
-
66
- const invalidStrLocations = [
67
- // Too few parts
68
- 'article',
69
- 'group',
70
- // Unknown type
71
- 'foo',
72
- 'foo|bar',
73
- 'foo|bar|baz',
74
- // Empty string unique
75
- 'article|foo/bar|',
76
- ];
77
-
78
- //
79
- //
80
- //
81
-
82
- describe('stringifyBitranLocation', () => {
83
- for (const [location, expected] of locations) {
84
- it(`should produce "${expected}"`, () => {
85
- expect(stringifyBitranLocation(location)).toBe(expected);
86
- });
87
- }
88
-
89
- for (const invalidLocation of invalidLocations) {
90
- it(`should throw on location ${JSON.stringify(invalidLocation)}`, () => {
91
- expect(() =>
92
- stringifyBitranLocation(invalidLocation as BitranLocation),
93
- ).toThrow();
94
- });
95
- }
96
- });
97
-
98
- describe('parseBitranLocation', () => {
99
- for (const [location, expected] of locations) {
100
- it(`should produce ${JSON.stringify(expected)}`, () => {
101
- expect(parseBitranLocation(expected)).toEqual(location);
102
- });
103
- }
104
-
105
- for (const invalidStrLocation of invalidStrLocations) {
106
- it(`should throw on location "${invalidStrLocation}"`, () => {
107
- expect(() => parseBitranLocation(invalidStrLocation)).toThrow();
108
- });
109
- }
110
- });
111
-
112
- describe('parsePartialBitranLocation', () => {
113
- for (const [locationStr, context, expected] of partialLocations) {
114
- it(`should produce ${JSON.stringify(expected)}`, () => {
115
- expect(parsePartialBitranLocation(locationStr, context)).toEqual(
116
- expected,
117
- );
118
- });
119
- }
120
-
121
- for (const [locationStr, context] of invalidPartialLocations) {
122
- it(`should throw on location "${locationStr}"`, () => {
123
- expect(() =>
124
- parsePartialBitranLocation(locationStr, context),
125
- ).toThrow();
126
- });
127
- }
128
- });
129
-
130
- describe('decode/encodeBitranLocation', () => {
131
- it.each([
132
- '',
133
- 'foo',
134
- 'foo|bar',
135
- 'foo|bar|baz',
136
- 'foo|bar/baz|qux',
137
- 'foo|bar/baz/qux|corge:grault:waldo',
138
- ])('should not change string location %p', (testCase) =>
139
- expect(decodeBitranLocation(encodeBitranLocation(testCase))).toBe(
140
- testCase,
141
- ),
142
- );
143
- });