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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/app/app.vue +195 -172
  2. package/app/components/Loading.vue +23 -23
  3. package/app/components/SiteAside.vue +393 -382
  4. package/app/components/SiteMain.vue +35 -35
  5. package/app/components/ads/BannerTemplate.vue +51 -51
  6. package/app/components/ads/BottomBanner.vue +45 -45
  7. package/app/components/ads/LeftBanner.vue +50 -50
  8. package/app/components/aside/AsideListItem.vue +74 -74
  9. package/app/components/aside/AsideMajor.vue +56 -56
  10. package/app/components/aside/AsideMinor.vue +71 -71
  11. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  12. package/app/components/aside/major/PaneSwitch.vue +54 -54
  13. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  14. package/app/components/aside/major/SiteInfo.vue +85 -85
  15. package/app/components/aside/major/panes/Language.vue +79 -79
  16. package/app/components/aside/major/panes/Pages.vue +34 -34
  17. package/app/components/aside/major/panes/Search.vue +11 -11
  18. package/app/components/aside/major/panes/nav/Nav.vue +87 -91
  19. package/app/components/aside/major/panes/nav/NavBook.vue +87 -87
  20. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  21. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  22. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  23. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  24. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  25. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  26. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  27. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  28. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  29. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  30. package/app/components/aside/major/panes/other/ItemGenerator.vue +15 -15
  31. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  32. package/app/components/aside/major/panes/other/Other.vue +16 -16
  33. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  34. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  35. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  36. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  37. package/app/components/aside/minor/Contribute.vue +145 -145
  38. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  39. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  40. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  41. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  42. package/app/components/aside/minor/topic/TopicToc.vue +219 -203
  43. package/app/components/aside/minor/topic/TopicTocItem.vue +30 -31
  44. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  45. package/app/components/bitran/BitranContent.vue +70 -63
  46. package/app/components/bitran/RenderWrapper.vue +10 -10
  47. package/app/components/contributor/ContributorAvatar.vue +43 -43
  48. package/app/components/contributor/ContributorListItem.vue +35 -35
  49. package/app/components/main/topic/MainTopic.vue +79 -79
  50. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  51. package/app/components/main/utils/Breadcrumb.vue +75 -75
  52. package/app/components/main/utils/ContentDecoration.vue +29 -29
  53. package/app/components/main/utils/ContentDescription.vue +19 -19
  54. package/app/components/main/utils/ContentPopover.vue +188 -176
  55. package/app/components/main/utils/ContentPopovers.vue +105 -105
  56. package/app/components/main/utils/ContentReferences.vue +70 -70
  57. package/app/components/main/utils/ContentSection.vue +45 -45
  58. package/app/components/main/utils/ContentTitle.vue +63 -39
  59. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  60. package/app/components/main/utils/reference/ReferenceItem.vue +68 -68
  61. package/app/components/main/utils/reference/ReferenceSource.vue +116 -116
  62. package/app/components/preview/Preview.vue +186 -177
  63. package/app/components/preview/PreviewDisplay.vue +139 -139
  64. package/app/components/preview/PreviewFooterAction.vue +73 -73
  65. package/app/components/preview/PreviewLoading.vue +14 -14
  66. package/app/components/preview/PreviewScreen.vue +141 -99
  67. package/app/components/preview/display/Alert.vue +50 -50
  68. package/app/components/preview/display/Custom.vue +18 -18
  69. package/app/components/preview/display/GenericLink.vue +48 -48
  70. package/app/components/preview/display/PageLink.vue +20 -20
  71. package/app/components/preview/display/Unique.vue +49 -49
  72. package/app/components/transition/Fade.vue +19 -19
  73. package/app/components/tree/TreeContainer.vue +11 -11
  74. package/app/components/tree/TreeItem.vue +89 -89
  75. package/app/composables/bitran.ts +129 -127
  76. package/app/composables/bitranContent.ts +39 -39
  77. package/app/composables/bitranLocation.ts +7 -7
  78. package/app/composables/contentData.ts +36 -36
  79. package/app/composables/contentPage.ts +157 -156
  80. package/app/composables/contentRoute.ts +45 -45
  81. package/app/composables/darkMagic.ts +24 -24
  82. package/app/composables/externalApi.ts +63 -63
  83. package/app/composables/favicon.ts +8 -8
  84. package/app/composables/formatText.ts +86 -86
  85. package/app/composables/majorPane.ts +60 -60
  86. package/app/composables/phrases.ts +81 -81
  87. package/app/composables/theme.ts +29 -29
  88. package/app/composables/url.ts +33 -33
  89. package/app/pages/_test/preview.vue +110 -110
  90. package/app/pages/article/[...articleId].vue +3 -3
  91. package/app/pages/book/[...bookId].vue +47 -47
  92. package/app/pages/group/[...groupId].vue +65 -65
  93. package/app/pages/index.vue +32 -32
  94. package/app/pages/members.vue +6 -6
  95. package/app/pages/practice/[...practice].vue +3 -3
  96. package/app/pages/summary/[...summaryId].vue +3 -3
  97. package/app/public/favicon/article.svg +5 -5
  98. package/app/public/favicon/default.svg +3 -3
  99. package/app/public/favicon/practice.svg +3 -3
  100. package/app/public/favicon/summary.svg +4 -4
  101. package/app/public/logotype.svg +2 -2
  102. package/app/scripts/_immediate.js +9 -9
  103. package/app/scripts/aside/index.ts +59 -59
  104. package/app/scripts/aside/major/nav.ts +26 -26
  105. package/app/scripts/aside/minor/state.ts +37 -37
  106. package/app/scripts/aside/minor/topic.ts +3 -3
  107. package/app/scripts/flag.ts +28 -28
  108. package/app/scripts/og.ts +27 -27
  109. package/app/scripts/preview/build.ts +73 -73
  110. package/app/scripts/preview/data/alert.ts +19 -19
  111. package/app/scripts/preview/data/custom.ts +8 -8
  112. package/app/scripts/preview/data/genericLink.ts +24 -24
  113. package/app/scripts/preview/data/pageLink.ts +22 -22
  114. package/app/scripts/preview/data/unique.ts +71 -71
  115. package/app/scripts/preview/data.ts +24 -24
  116. package/app/scripts/preview/display.ts +37 -37
  117. package/app/scripts/preview/footer.ts +9 -9
  118. package/app/scripts/preview/request.ts +51 -51
  119. package/app/scripts/preview/state.ts +63 -63
  120. package/app/styles/_immediate.css +7 -7
  121. package/app/styles/_util.scss +43 -43
  122. package/app/styles/_utils.scss +44 -44
  123. package/app/styles/app.scss +91 -91
  124. package/app/styles/def/_bp.scss +27 -27
  125. package/app/styles/def/_size.scss +7 -7
  126. package/app/styles/def/_z.scss +5 -5
  127. package/app/styles/normalize.scss +63 -63
  128. package/app/styles/partials/_darkMagic.scss +5 -5
  129. package/app/styles/partials/_fnav.scss +15 -15
  130. package/app/styles/partials/_preview.scss +5 -5
  131. package/globalPath.ts +21 -21
  132. package/globals/bitran.ts +2 -47
  133. package/globals/content.ts +22 -22
  134. package/globals/contributor.ts +5 -5
  135. package/globals/erudit.ts +5 -5
  136. package/globals/register.ts +18 -18
  137. package/languages/en.ts +95 -95
  138. package/languages/ru.ts +99 -99
  139. package/module/bitran.ts +35 -34
  140. package/module/config.ts +34 -34
  141. package/module/imports.ts +50 -46
  142. package/module/index.ts +47 -47
  143. package/module/logger.ts +10 -10
  144. package/module/paths.ts +22 -22
  145. package/module/restart.ts +61 -61
  146. package/nuxt.config.ts +99 -112
  147. package/package.json +10 -8
  148. package/server/api/aside/major/nav/bookIds.ts +5 -5
  149. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  150. package/server/api/aside/major/nav/global.ts +7 -7
  151. package/server/api/aside/minor/news.ts +7 -7
  152. package/server/api/aside/minor/path.ts +78 -78
  153. package/server/api/bitran/content/[location].ts +8 -8
  154. package/server/api/bitran/toc/[location].ts +7 -7
  155. package/server/api/content/data.ts +72 -72
  156. package/server/api/contributor/count.ts +6 -6
  157. package/server/api/fake/content.ts +11 -11
  158. package/server/api/fake/shared/languages.ts +12 -12
  159. package/server/api/language/functions.ts +12 -12
  160. package/server/api/language/phrase/[phraseId].ts +19 -19
  161. package/server/api/language/phraseIds.ts +8 -8
  162. package/server/api/preview/page/[...parts].ts +51 -51
  163. package/server/api/preview/unique/[location].ts +57 -57
  164. package/server/plugin/bitran/content.ts +187 -187
  165. package/server/plugin/bitran/location.ts +25 -25
  166. package/server/plugin/bitran/products/include.ts +230 -230
  167. package/server/plugin/bitran/products/link.ts +116 -116
  168. package/server/plugin/bitran/setup.ts +11 -9
  169. package/server/plugin/bitran/toc.ts +83 -83
  170. package/server/plugin/bitran/transpiler.ts +48 -46
  171. package/server/plugin/build/close.ts +10 -10
  172. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  173. package/server/plugin/build/jobs/content/generic.ts +176 -176
  174. package/server/plugin/build/jobs/content/parse.ts +100 -100
  175. package/server/plugin/build/jobs/content/path.ts +6 -6
  176. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  177. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  178. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  179. package/server/plugin/build/jobs/contributors.ts +66 -66
  180. package/server/plugin/build/jobs/language.ts +36 -36
  181. package/server/plugin/build/jobs/nav.ts +214 -210
  182. package/server/plugin/build/process.ts +25 -25
  183. package/server/plugin/build/rebuild.ts +55 -55
  184. package/server/plugin/build/setup.ts +21 -21
  185. package/server/plugin/content/absoluteId.ts +94 -94
  186. package/server/plugin/content/context.ts +116 -112
  187. package/server/plugin/db/entities/Book.ts +7 -7
  188. package/server/plugin/db/entities/Content.ts +49 -49
  189. package/server/plugin/db/entities/Contribution.ts +10 -10
  190. package/server/plugin/db/entities/Contributor.ts +16 -16
  191. package/server/plugin/db/entities/Group.ts +14 -14
  192. package/server/plugin/db/entities/Hash.ts +15 -15
  193. package/server/plugin/db/entities/Topic.ts +20 -20
  194. package/server/plugin/db/entities/Unique.ts +21 -21
  195. package/server/plugin/db/setup.ts +34 -34
  196. package/server/plugin/global.ts +17 -18
  197. package/server/plugin/importer.ts +12 -12
  198. package/server/plugin/index.ts +9 -9
  199. package/server/plugin/logger.ts +23 -23
  200. package/server/plugin/nav/node.ts +26 -26
  201. package/server/plugin/nav/utils.ts +129 -129
  202. package/server/plugin/repository/book.ts +21 -21
  203. package/server/plugin/repository/content.ts +238 -238
  204. package/server/plugin/repository/contributor.ts +8 -8
  205. package/server/plugin/repository/frontNav.ts +148 -148
  206. package/server/plugin/repository/topic.ts +32 -32
  207. package/server/tsconfig.json +9 -9
  208. package/shared/aside/minor.ts +50 -50
  209. package/shared/asset.ts +15 -15
  210. package/shared/bitran/context.ts +8 -8
  211. package/shared/bitran/default.ts +46 -46
  212. package/shared/bitran/link/Link.vue +166 -167
  213. package/shared/bitran/link/factory.ts +24 -24
  214. package/shared/bitran/link/languages/en.ts +7 -7
  215. package/shared/bitran/link/languages/ru.ts +7 -7
  216. package/shared/bitran/link/renderer.ts +21 -21
  217. package/shared/bitran/link/shared.ts +17 -17
  218. package/shared/bitran/link/target.ts +134 -134
  219. package/shared/bitran/link/transpiler.ts +10 -10
  220. package/shared/bitran/location.ts +166 -166
  221. package/shared/bitran/toc.ts +8 -8
  222. package/shared/content/context.ts +9 -9
  223. package/shared/content/data/base.ts +32 -32
  224. package/shared/content/data/index.ts +5 -5
  225. package/shared/content/data/type/book.ts +5 -5
  226. package/shared/content/data/type/group.ts +6 -6
  227. package/shared/content/data/type/topic.ts +11 -11
  228. package/shared/content/previousNext.ts +9 -9
  229. package/shared/contributor.ts +5 -5
  230. package/shared/frontNav.ts +41 -41
  231. package/shared/icons.ts +38 -38
  232. package/shared/image.ts +5 -5
  233. package/shared/link.ts +25 -25
  234. package/shared/popover.ts +8 -0
  235. package/shared/types/language.ts +75 -75
  236. package/shared/utils/objectsEqual.ts +4 -4
  237. package/shared/utils/stringColor.ts +9 -9
  238. package/test/bitran/link/target.test.ts +141 -141
  239. package/test/bitran/location.test.ts +143 -143
  240. package/tsconfig.json +8 -8
  241. package/utils/stress.ts +9 -9
  242. package/app/components/main/utils/ContentFlag.vue +0 -15
  243. package/app/styles/default.scss +0 -83
@@ -1,134 +1,134 @@
1
- import { isTopicPart } from 'erudit-cog/schema';
2
- import { tryReplaceAlias } from '@erudit-js/bitran-elements/aliases/shared';
3
-
4
- import type { BitranContext } from '@shared/bitran/context';
5
- import {
6
- bitranLocationTypes,
7
- parsePartialBitranLocation,
8
- stringifyBitranLocation,
9
- } from '@shared/bitran/location';
10
-
11
- export type LinkTargetType = 'unique' | 'page' | 'absolute' | 'external';
12
-
13
- interface LinkTargetBase {
14
- type: LinkTargetType;
15
- }
16
-
17
- export interface UniqueLinkTarget extends LinkTargetBase {
18
- type: 'unique';
19
- strlocation: string;
20
- _productName?: string;
21
- _absoluteStrLocation?: string;
22
- _href?: string;
23
- }
24
-
25
- export const linkTargetPageTypes = {
26
- ...bitranLocationTypes,
27
- // Custom page types, that does not have Bitran content
28
- book: true,
29
- };
30
-
31
- export type LinkTargetPageType = keyof typeof linkTargetPageTypes;
32
-
33
- export function isLinkTargetPageType(
34
- pageType: any,
35
- ): pageType is LinkTargetPageType {
36
- return pageType in linkTargetPageTypes;
37
- }
38
-
39
- function pageTypeRequiresPath(type: LinkTargetPageType) {
40
- return linkTargetPageTypes[type];
41
- }
42
-
43
- export interface PageLinkTarget extends LinkTargetBase {
44
- type: 'page';
45
- pageType: LinkTargetPageType;
46
- path?: string;
47
- _href?: string;
48
- }
49
-
50
- export interface AbsoluteLinkTarget extends LinkTargetBase {
51
- type: 'absolute';
52
- href: string;
53
- }
54
-
55
- export interface ExternalLinkTarget extends LinkTargetBase {
56
- type: 'external';
57
- href: string;
58
- }
59
-
60
- export type LinkTarget =
61
- | UniqueLinkTarget
62
- | PageLinkTarget
63
- | AbsoluteLinkTarget
64
- | ExternalLinkTarget;
65
-
66
- export function createLinkTarget(
67
- target: string,
68
- context: BitranContext,
69
- ): LinkTarget {
70
- target = tryReplaceAlias(target, context.aliases);
71
-
72
- if (target.startsWith('/'))
73
- return {
74
- type: 'absolute',
75
- href: target,
76
- };
77
-
78
- try {
79
- new URL(target);
80
- return {
81
- type: 'external',
82
- href: target,
83
- };
84
- } catch {}
85
-
86
- if (target.startsWith('page|')) {
87
- let [, pageType, path] = target.split('|');
88
-
89
- if (!isLinkTargetPageType(pageType))
90
- throw new Error(
91
- `Unknown page type "${pageType}" in link "${target}"!`,
92
- );
93
-
94
- if (!path) {
95
- if (isTopicPart(pageType)) {
96
- if (!isTopicPart(context.location.type))
97
- throw new Error(
98
- `Page link "${target}" is referencing topic part "${pageType}" without path in non-topic context!`,
99
- );
100
-
101
- path = context.location.path;
102
- } else {
103
- if (pageTypeRequiresPath(pageType))
104
- throw new Error(
105
- `Page link "${target}" does not have a path!`,
106
- );
107
- }
108
- }
109
-
110
- return {
111
- type: 'page',
112
- pageType,
113
- path,
114
- };
115
- }
116
-
117
- const location = parsePartialBitranLocation(target, context.location);
118
-
119
- if (
120
- !location.unique &&
121
- isLinkTargetPageType(location.type) &&
122
- !isTopicPart(location.type)
123
- )
124
- return {
125
- type: 'page',
126
- pageType: location.type,
127
- path: location.path,
128
- };
129
-
130
- return {
131
- type: 'unique',
132
- strlocation: stringifyBitranLocation(location),
133
- };
134
- }
1
+ import { isTopicPart } from '@erudit-js/cog/schema';
2
+ import { tryReplaceAlias } from '@erudit-js/bitran-elements/aliases/shared';
3
+
4
+ import type { BitranContext } from '@shared/bitran/context';
5
+ import {
6
+ bitranLocationTypes,
7
+ parsePartialBitranLocation,
8
+ stringifyBitranLocation,
9
+ } from '@shared/bitran/location';
10
+
11
+ export type LinkTargetType = 'unique' | 'page' | 'absolute' | 'external';
12
+
13
+ interface LinkTargetBase {
14
+ type: LinkTargetType;
15
+ }
16
+
17
+ export interface UniqueLinkTarget extends LinkTargetBase {
18
+ type: 'unique';
19
+ strlocation: string;
20
+ _productName?: string;
21
+ _absoluteStrLocation?: string;
22
+ _href?: string;
23
+ }
24
+
25
+ export const linkTargetPageTypes = {
26
+ ...bitranLocationTypes,
27
+ // Custom page types, that does not have Bitran content
28
+ book: true,
29
+ };
30
+
31
+ export type LinkTargetPageType = keyof typeof linkTargetPageTypes;
32
+
33
+ export function isLinkTargetPageType(
34
+ pageType: any,
35
+ ): pageType is LinkTargetPageType {
36
+ return pageType in linkTargetPageTypes;
37
+ }
38
+
39
+ function pageTypeRequiresPath(type: LinkTargetPageType) {
40
+ return linkTargetPageTypes[type];
41
+ }
42
+
43
+ export interface PageLinkTarget extends LinkTargetBase {
44
+ type: 'page';
45
+ pageType: LinkTargetPageType;
46
+ path?: string;
47
+ _href?: string;
48
+ }
49
+
50
+ export interface AbsoluteLinkTarget extends LinkTargetBase {
51
+ type: 'absolute';
52
+ href: string;
53
+ }
54
+
55
+ export interface ExternalLinkTarget extends LinkTargetBase {
56
+ type: 'external';
57
+ href: string;
58
+ }
59
+
60
+ export type LinkTarget =
61
+ | UniqueLinkTarget
62
+ | PageLinkTarget
63
+ | AbsoluteLinkTarget
64
+ | ExternalLinkTarget;
65
+
66
+ export function createLinkTarget(
67
+ target: string,
68
+ context: BitranContext,
69
+ ): LinkTarget {
70
+ target = tryReplaceAlias(target, context.aliases);
71
+
72
+ if (target.startsWith('/'))
73
+ return {
74
+ type: 'absolute',
75
+ href: target,
76
+ };
77
+
78
+ try {
79
+ new URL(target);
80
+ return {
81
+ type: 'external',
82
+ href: target,
83
+ };
84
+ } catch {}
85
+
86
+ if (target.startsWith('page|')) {
87
+ let [, pageType, path] = target.split('|');
88
+
89
+ if (!isLinkTargetPageType(pageType))
90
+ throw new Error(
91
+ `Unknown page type "${pageType}" in link "${target}"!`,
92
+ );
93
+
94
+ if (!path) {
95
+ if (isTopicPart(pageType)) {
96
+ if (!isTopicPart(context.location.type))
97
+ throw new Error(
98
+ `Page link "${target}" is referencing topic part "${pageType}" without path in non-topic context!`,
99
+ );
100
+
101
+ path = context.location.path;
102
+ } else {
103
+ if (pageTypeRequiresPath(pageType))
104
+ throw new Error(
105
+ `Page link "${target}" does not have a path!`,
106
+ );
107
+ }
108
+ }
109
+
110
+ return {
111
+ type: 'page',
112
+ pageType,
113
+ path,
114
+ };
115
+ }
116
+
117
+ const location = parsePartialBitranLocation(target, context.location);
118
+
119
+ if (
120
+ !location.unique &&
121
+ isLinkTargetPageType(location.type) &&
122
+ !isTopicPart(location.type)
123
+ )
124
+ return {
125
+ type: 'page',
126
+ pageType: location.type,
127
+ path: location.path,
128
+ };
129
+
130
+ return {
131
+ type: 'unique',
132
+ strlocation: stringifyBitranLocation(location),
133
+ };
134
+ }
@@ -1,10 +1,10 @@
1
- import { defineElementTranspiler } from '@bitran-js/transpiler';
2
-
3
- import { LinkNode, type LinkSchema } from './shared';
4
- import { LinkParser, LinkStringifier } from './factory';
5
-
6
- export const linkTranspiler = defineElementTranspiler<LinkSchema>({
7
- Node: LinkNode,
8
- Parsers: [LinkParser],
9
- Stringifier: LinkStringifier,
10
- });
1
+ import { defineElementTranspiler } from '@bitran-js/transpiler';
2
+
3
+ import { LinkNode, type LinkSchema } from './shared';
4
+ import { LinkParser, LinkStringifier } from './factory';
5
+
6
+ export const linkTranspiler = defineElementTranspiler<LinkSchema>({
7
+ Node: LinkNode,
8
+ Parsers: [LinkParser],
9
+ Stringifier: LinkStringifier,
10
+ });
@@ -1,166 +1,166 @@
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
+ import { isTopicPart } from '@erudit-js/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,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[];
@@ -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[];