erudit 3.0.0-dev.15 → 3.0.0-dev.17
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.
- package/app/app.vue +191 -195
- package/app/components/Loading.vue +23 -23
- package/app/components/SiteAside.vue +393 -393
- package/app/components/SiteMain.vue +32 -32
- package/app/components/ads/Ads.vue +35 -0
- package/app/components/ads/AdsBannerAside.vue +61 -0
- package/app/components/ads/AdsBannerBottom.vue +22 -0
- package/app/components/ads/AdsProviderCustom.vue +35 -0
- package/app/components/ads/AdsProviderYandex.vue +54 -0
- package/app/components/ads/AdsReplacer.vue +73 -0
- package/app/components/aside/AsideListItem.vue +74 -74
- package/app/components/aside/AsideMajor.vue +56 -56
- package/app/components/aside/AsideMinor.vue +73 -71
- package/app/components/aside/major/PaneContentScroll.vue +23 -23
- package/app/components/aside/major/PaneSwitch.vue +54 -54
- package/app/components/aside/major/PaneSwitchButton.vue +63 -63
- package/app/components/aside/major/SiteInfo.vue +85 -85
- package/app/components/aside/major/panes/Language.vue +79 -79
- package/app/components/aside/major/panes/Pages.vue +34 -34
- package/app/components/aside/major/panes/Search.vue +11 -11
- package/app/components/aside/major/panes/nav/Nav.vue +92 -92
- package/app/components/aside/major/panes/nav/NavBook.vue +95 -95
- package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
- package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
- package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
- package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
- package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
- package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
- package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
- package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
- package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
- package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
- package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -13
- package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
- package/app/components/aside/major/panes/other/Other.vue +16 -16
- package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
- package/app/components/aside/minor/AsideMinorNews.vue +11 -11
- package/app/components/aside/minor/AsideMinorPane.vue +15 -15
- package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
- package/app/components/aside/minor/Contribute.vue +145 -145
- package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
- package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
- package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
- package/app/components/aside/minor/topic/TopicNav.vue +49 -49
- package/app/components/aside/minor/topic/TopicToc.vue +214 -214
- package/app/components/aside/minor/topic/TopicTocItem.vue +32 -32
- package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
- package/app/components/bitran/BitranContent.vue +91 -91
- package/app/components/bitran/RenderWrapper.vue +10 -10
- package/app/components/contributor/ContributorAvatar.vue +45 -45
- package/app/components/contributor/ContributorListItem.vue +35 -35
- package/app/components/main/topic/MainTopic.vue +88 -78
- package/app/components/main/topic/TopicPartSwitch.vue +118 -118
- package/app/components/main/utils/Breadcrumb.vue +74 -70
- package/app/components/main/utils/ContentDecoration.vue +29 -29
- package/app/components/main/utils/ContentDescription.vue +19 -19
- package/app/components/main/utils/ContentPopover.vue +188 -188
- package/app/components/main/utils/ContentPopovers.vue +111 -111
- package/app/components/main/utils/ContentReferences.vue +70 -70
- package/app/components/main/utils/ContentSection.vue +45 -45
- package/app/components/main/utils/ContentTitle.vue +63 -63
- package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
- package/app/components/main/utils/reference/ReferenceItem.vue +70 -70
- package/app/components/main/utils/reference/ReferenceSource.vue +120 -118
- package/app/components/preview/Preview.vue +186 -186
- package/app/components/preview/PreviewDisplay.vue +139 -139
- package/app/components/preview/PreviewFooterAction.vue +73 -73
- package/app/components/preview/PreviewLoading.vue +14 -14
- package/app/components/preview/PreviewScreen.vue +141 -141
- package/app/components/preview/display/Alert.vue +50 -50
- package/app/components/preview/display/Custom.vue +18 -18
- package/app/components/preview/display/GenericLink.vue +48 -48
- package/app/components/preview/display/PageLink.vue +22 -20
- package/app/components/preview/display/Unique.vue +55 -55
- package/app/components/transition/Fade.vue +19 -19
- package/app/components/tree/TreeContainer.vue +11 -11
- package/app/components/tree/TreeItem.vue +89 -89
- package/app/composables/bitran.ts +108 -108
- package/app/composables/bitranContent.ts +92 -92
- package/app/composables/bitranLocation.ts +7 -7
- package/app/composables/contentData.ts +38 -38
- package/app/composables/contentPage.ts +158 -158
- package/app/composables/contentRoute.ts +45 -45
- package/app/composables/darkMagic.ts +24 -24
- package/app/composables/externalApi.ts +69 -63
- package/app/composables/favicon.ts +8 -8
- package/app/composables/formatText.ts +99 -99
- package/app/composables/majorPane.ts +60 -60
- package/app/composables/phrases.ts +65 -65
- package/app/composables/theme.ts +29 -29
- package/app/composables/url.ts +33 -33
- package/app/pages/_test/preview.vue +110 -110
- package/app/pages/article/[...articleId].vue +3 -3
- package/app/pages/book/[...bookId].vue +47 -47
- package/app/pages/group/[...groupId].vue +66 -64
- package/app/pages/index.vue +32 -32
- package/app/pages/members.vue +6 -6
- package/app/pages/practice/[...practice].vue +3 -3
- package/app/pages/summary/[...summaryId].vue +3 -3
- package/app/plugins/analytics.ts +87 -0
- package/app/plugins/prerender.server.ts +22 -22
- package/app/scripts/_immediate.js +9 -9
- package/app/scripts/aside/index.ts +59 -59
- package/app/scripts/aside/major/nav.ts +26 -26
- package/app/scripts/aside/minor/state.ts +37 -37
- package/app/scripts/aside/minor/topic.ts +3 -3
- package/app/scripts/flag.ts +28 -28
- package/app/scripts/og.ts +27 -27
- package/app/scripts/preview/build.ts +76 -76
- package/app/scripts/preview/data/alert.ts +19 -19
- package/app/scripts/preview/data/custom.ts +8 -8
- package/app/scripts/preview/data/genericLink.ts +24 -24
- package/app/scripts/preview/data/pageLink.ts +23 -23
- package/app/scripts/preview/data/unique.ts +72 -72
- package/app/scripts/preview/data.ts +24 -24
- package/app/scripts/preview/display.ts +37 -37
- package/app/scripts/preview/footer.ts +9 -9
- package/app/scripts/preview/request.ts +51 -51
- package/app/scripts/preview/state.ts +63 -63
- package/app/styles/_immediate.css +7 -7
- package/app/styles/_util.scss +43 -43
- package/app/styles/_utils.scss +44 -44
- package/app/styles/app.scss +91 -91
- package/app/styles/def/_bp.scss +27 -27
- package/app/styles/def/_size.scss +7 -7
- package/app/styles/def/_z.scss +5 -5
- package/app/styles/normalize.scss +49 -49
- package/app/styles/partials/_darkMagic.scss +5 -5
- package/app/styles/partials/_fnav.scss +15 -15
- package/app/styles/partials/_preview.scss +5 -5
- package/bin/erudit.mjs +2 -2
- package/const.ts +4 -4
- package/globalPath.ts +21 -21
- package/globals/bitran.ts +1 -1
- package/globals/content.ts +27 -27
- package/globals/contributor.ts +5 -5
- package/globals/erudit.ts +5 -5
- package/globals/register.ts +18 -18
- package/languages/en.ts +94 -94
- package/languages/ru.ts +98 -98
- package/module/bitran.ts +66 -66
- package/module/config.ts +35 -35
- package/module/imports.ts +67 -67
- package/module/index.ts +47 -49
- package/module/logger.ts +10 -10
- package/module/paths.ts +22 -22
- package/module/restart.ts +61 -61
- package/nuxt.config.ts +131 -134
- package/package.json +8 -7
- package/server/api/aside/major/nav/bookIds.ts +5 -5
- package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
- package/server/api/aside/major/nav/global.ts +7 -7
- package/server/api/aside/minor/news.ts +7 -7
- package/server/api/aside/minor/path.ts +82 -82
- package/server/api/bitran/content/[...location].ts +10 -10
- package/server/api/bitran/toc/[...location].ts +9 -9
- package/server/api/content/data.ts +75 -75
- package/server/api/contributor/count.ts +6 -6
- package/server/api/fake/content.ts +11 -11
- package/server/api/fake/shared/languages.ts +12 -12
- package/server/api/language/functions.ts +12 -12
- package/server/api/language/phrase/[phraseId].ts +19 -19
- package/server/api/language/phraseIds.ts +8 -8
- package/server/api/prerender.ts +120 -120
- package/server/api/preview/page/[...parts].ts +78 -78
- package/server/api/preview/unique/[...location].ts +61 -61
- package/server/api/problem/generator/[...path].ts +26 -0
- package/server/plugin/bitran/content.ts +190 -190
- package/server/plugin/bitran/elements/include.ts +229 -229
- package/server/plugin/bitran/location.ts +39 -39
- package/server/plugin/bitran/toc.ts +94 -94
- package/server/plugin/bitran/transpiler.ts +18 -18
- package/server/plugin/build/close.ts +12 -12
- package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
- package/server/plugin/build/jobs/content/generic.ts +191 -191
- package/server/plugin/build/jobs/content/parse.ts +113 -113
- package/server/plugin/build/jobs/content/path.ts +6 -6
- package/server/plugin/build/jobs/content/type/book.ts +9 -9
- package/server/plugin/build/jobs/content/type/group.ts +37 -37
- package/server/plugin/build/jobs/content/type/topic.ts +36 -36
- package/server/plugin/build/jobs/contributors.ts +66 -66
- package/server/plugin/build/jobs/language.ts +36 -36
- package/server/plugin/build/jobs/nav.ts +345 -265
- package/server/plugin/build/process.ts +32 -32
- package/server/plugin/build/rebuild.ts +66 -66
- package/server/plugin/build/setup.ts +19 -19
- package/server/plugin/content/context.ts +119 -119
- package/server/plugin/db/entities/Book.ts +7 -7
- package/server/plugin/db/entities/Content.ts +45 -45
- package/server/plugin/db/entities/Contribution.ts +10 -10
- package/server/plugin/db/entities/Contributor.ts +16 -16
- package/server/plugin/db/entities/File.ts +10 -10
- package/server/plugin/db/entities/Group.ts +14 -14
- package/server/plugin/db/entities/Hash.ts +15 -15
- package/server/plugin/db/entities/Topic.ts +20 -20
- package/server/plugin/db/entities/Unique.ts +21 -21
- package/server/plugin/db/reset.ts +12 -12
- package/server/plugin/db/setup.ts +49 -49
- package/server/plugin/global.ts +16 -16
- package/server/plugin/importer.ts +16 -16
- package/server/plugin/index.ts +9 -9
- package/server/plugin/logger.ts +23 -23
- package/server/plugin/nav/node.ts +27 -27
- package/server/plugin/nav/utils.ts +175 -175
- package/server/plugin/repository/book.ts +21 -21
- package/server/plugin/repository/content.ts +240 -240
- package/server/plugin/repository/contentId.ts +40 -40
- package/server/plugin/repository/contributor.ts +8 -8
- package/server/plugin/repository/file.ts +10 -10
- package/server/plugin/repository/frontNav.ts +145 -145
- package/server/plugin/repository/topic.ts +35 -35
- package/server/tsconfig.json +9 -9
- package/shared/aside/minor.ts +51 -51
- package/shared/asset.ts +22 -22
- package/shared/bitran/contentId.ts +56 -56
- package/shared/bitran/stringContent.ts +6 -6
- package/shared/bitran/toc.ts +8 -8
- package/shared/content/bookId.ts +12 -12
- package/shared/content/context.ts +9 -9
- package/shared/content/data/base.ts +32 -32
- package/shared/content/data/index.ts +5 -5
- package/shared/content/data/type/book.ts +5 -5
- package/shared/content/data/type/group.ts +6 -6
- package/shared/content/data/type/topic.ts +11 -11
- package/shared/content/previousNext.ts +9 -9
- package/shared/contributor.ts +5 -5
- package/shared/frontNav.ts +41 -41
- package/shared/icons.ts +38 -38
- package/shared/image.ts +5 -5
- package/shared/link.ts +28 -28
- package/shared/popover.ts +8 -8
- package/shared/types/language.ts +74 -74
- package/shared/utils/objectsEqual.ts +4 -4
- package/shared/utils/stringColor.ts +9 -9
- package/test/contentId.test.ts +91 -91
- package/tsconfig.json +8 -8
- package/utils/contentPath.ts +67 -67
- package/utils/slash.ts +11 -11
- package/utils/stress.ts +9 -9
- package/app/components/ads/BannerTemplate.vue +0 -51
- package/app/components/ads/BottomBanner.vue +0 -45
- package/app/components/ads/LeftBanner.vue +0 -50
- package/module/problemGenerators.ts +0 -46
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
FrontNav,
|
|
3
|
-
FrontNavBase,
|
|
4
|
-
FrontNavBook,
|
|
5
|
-
FrontNavFolder,
|
|
6
|
-
FrontNavItem,
|
|
7
|
-
FrontNavSeparator,
|
|
8
|
-
FrontNavTopic,
|
|
9
|
-
} from '@erudit/shared/frontNav';
|
|
10
|
-
|
|
11
|
-
import type { NavNode, RootNavNode } from '@server/nav/node';
|
|
12
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
13
|
-
import { DbContent } from '@server/db/entities/Content';
|
|
14
|
-
import { DbGroup } from '@server/db/entities/Group';
|
|
15
|
-
|
|
16
|
-
import { getTopicPart } from './topic';
|
|
17
|
-
|
|
18
|
-
export async function createGlobalFrontNav(
|
|
19
|
-
from: RootNavNode | NavNode | undefined,
|
|
20
|
-
): Promise<FrontNav | []> {
|
|
21
|
-
if (!from || !from.children) return [];
|
|
22
|
-
|
|
23
|
-
return await Promise.all(
|
|
24
|
-
from.children.map((node) =>
|
|
25
|
-
toFrontNavItem({ node, level: 0, includeBookNav: true }),
|
|
26
|
-
),
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function createBookFrontNav(from: NavNode): Promise<FrontNavBook> {
|
|
31
|
-
return await toFrontNavBook({ node: from, level: 0, includeBookNav: true });
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type ToFuncArg = {
|
|
35
|
-
node: NavNode;
|
|
36
|
-
level: number;
|
|
37
|
-
includeBookNav?: boolean;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
async function toFrontNavItem(arg: ToFuncArg): Promise<FrontNavItem> {
|
|
41
|
-
switch (arg.node.type) {
|
|
42
|
-
case 'book':
|
|
43
|
-
return await toFrontNavBook(arg);
|
|
44
|
-
case 'topic':
|
|
45
|
-
return await toFrontNavTopic(arg);
|
|
46
|
-
case 'group':
|
|
47
|
-
const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
|
|
48
|
-
select: ['type'],
|
|
49
|
-
where: { contentId: arg.node.fullId },
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
if (!dbGroup)
|
|
53
|
-
throw new Error(
|
|
54
|
-
`Missing group content item "${arg.node.fullId}" when creating front nav!`,
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
if (dbGroup.type === 'folder') return await toFrontNavFolder(arg);
|
|
58
|
-
else return await toFrontNavSeparator(arg);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function toFrontNavBook({
|
|
63
|
-
node,
|
|
64
|
-
level,
|
|
65
|
-
includeBookNav,
|
|
66
|
-
}: ToFuncArg): Promise<FrontNavBook> {
|
|
67
|
-
return {
|
|
68
|
-
type: 'book',
|
|
69
|
-
children: await toFrontNavChildren({
|
|
70
|
-
node,
|
|
71
|
-
level: 0,
|
|
72
|
-
includeBookNav,
|
|
73
|
-
}),
|
|
74
|
-
...(await toFrontNavBase({ node, level })),
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function toFrontNavSeparator({
|
|
79
|
-
node,
|
|
80
|
-
level,
|
|
81
|
-
includeBookNav,
|
|
82
|
-
}: ToFuncArg): Promise<FrontNavSeparator> {
|
|
83
|
-
return {
|
|
84
|
-
type: 'separator',
|
|
85
|
-
children: await toFrontNavChildren({ node, level, includeBookNav }),
|
|
86
|
-
...(await toFrontNavBase({ node, level })),
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async function toFrontNavFolder({
|
|
91
|
-
node,
|
|
92
|
-
level,
|
|
93
|
-
includeBookNav,
|
|
94
|
-
}: ToFuncArg): Promise<FrontNavFolder> {
|
|
95
|
-
return {
|
|
96
|
-
type: 'folder',
|
|
97
|
-
children: await toFrontNavChildren({
|
|
98
|
-
node,
|
|
99
|
-
level: level + 1,
|
|
100
|
-
includeBookNav,
|
|
101
|
-
}),
|
|
102
|
-
...(await toFrontNavBase({ node, level })),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function toFrontNavTopic({
|
|
107
|
-
node,
|
|
108
|
-
level,
|
|
109
|
-
}: ToFuncArg): Promise<FrontNavTopic> {
|
|
110
|
-
const topicPart = await getTopicPart(node.fullId);
|
|
111
|
-
return {
|
|
112
|
-
type: 'topic',
|
|
113
|
-
part: topicPart,
|
|
114
|
-
...(await toFrontNavBase({ node, level })),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async function toFrontNavBase({
|
|
119
|
-
node,
|
|
120
|
-
level,
|
|
121
|
-
}: ToFuncArg): Promise<Omit<FrontNavBase, 'type'>> {
|
|
122
|
-
const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
|
|
123
|
-
select: ['title', 'navTitle', 'flags'],
|
|
124
|
-
where: { contentId: node.fullId },
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
id: node.shortId,
|
|
129
|
-
fullId: node.fullId,
|
|
130
|
-
level,
|
|
131
|
-
flags: dbContent?.flags,
|
|
132
|
-
label: dbContent?.navTitle || dbContent?.title || node.idPart,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
async function toFrontNavChildren({ node, includeBookNav, level }: ToFuncArg) {
|
|
137
|
-
if (node.type === 'book' && !includeBookNav) return undefined;
|
|
138
|
-
if (!node.children) return undefined;
|
|
139
|
-
|
|
140
|
-
return Promise.all(
|
|
141
|
-
node.children!.map((child) =>
|
|
142
|
-
toFrontNavItem({ node: child, level, includeBookNav }),
|
|
143
|
-
),
|
|
144
|
-
);
|
|
145
|
-
}
|
|
1
|
+
import type {
|
|
2
|
+
FrontNav,
|
|
3
|
+
FrontNavBase,
|
|
4
|
+
FrontNavBook,
|
|
5
|
+
FrontNavFolder,
|
|
6
|
+
FrontNavItem,
|
|
7
|
+
FrontNavSeparator,
|
|
8
|
+
FrontNavTopic,
|
|
9
|
+
} from '@erudit/shared/frontNav';
|
|
10
|
+
|
|
11
|
+
import type { NavNode, RootNavNode } from '@server/nav/node';
|
|
12
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
13
|
+
import { DbContent } from '@server/db/entities/Content';
|
|
14
|
+
import { DbGroup } from '@server/db/entities/Group';
|
|
15
|
+
|
|
16
|
+
import { getTopicPart } from './topic';
|
|
17
|
+
|
|
18
|
+
export async function createGlobalFrontNav(
|
|
19
|
+
from: RootNavNode | NavNode | undefined,
|
|
20
|
+
): Promise<FrontNav | []> {
|
|
21
|
+
if (!from || !from.children) return [];
|
|
22
|
+
|
|
23
|
+
return await Promise.all(
|
|
24
|
+
from.children.map((node) =>
|
|
25
|
+
toFrontNavItem({ node, level: 0, includeBookNav: true }),
|
|
26
|
+
),
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function createBookFrontNav(from: NavNode): Promise<FrontNavBook> {
|
|
31
|
+
return await toFrontNavBook({ node: from, level: 0, includeBookNav: true });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type ToFuncArg = {
|
|
35
|
+
node: NavNode;
|
|
36
|
+
level: number;
|
|
37
|
+
includeBookNav?: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
async function toFrontNavItem(arg: ToFuncArg): Promise<FrontNavItem> {
|
|
41
|
+
switch (arg.node.type) {
|
|
42
|
+
case 'book':
|
|
43
|
+
return await toFrontNavBook(arg);
|
|
44
|
+
case 'topic':
|
|
45
|
+
return await toFrontNavTopic(arg);
|
|
46
|
+
case 'group':
|
|
47
|
+
const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
|
|
48
|
+
select: ['type'],
|
|
49
|
+
where: { contentId: arg.node.fullId },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
if (!dbGroup)
|
|
53
|
+
throw new Error(
|
|
54
|
+
`Missing group content item "${arg.node.fullId}" when creating front nav!`,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
if (dbGroup.type === 'folder') return await toFrontNavFolder(arg);
|
|
58
|
+
else return await toFrontNavSeparator(arg);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function toFrontNavBook({
|
|
63
|
+
node,
|
|
64
|
+
level,
|
|
65
|
+
includeBookNav,
|
|
66
|
+
}: ToFuncArg): Promise<FrontNavBook> {
|
|
67
|
+
return {
|
|
68
|
+
type: 'book',
|
|
69
|
+
children: await toFrontNavChildren({
|
|
70
|
+
node,
|
|
71
|
+
level: 0,
|
|
72
|
+
includeBookNav,
|
|
73
|
+
}),
|
|
74
|
+
...(await toFrontNavBase({ node, level })),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function toFrontNavSeparator({
|
|
79
|
+
node,
|
|
80
|
+
level,
|
|
81
|
+
includeBookNav,
|
|
82
|
+
}: ToFuncArg): Promise<FrontNavSeparator> {
|
|
83
|
+
return {
|
|
84
|
+
type: 'separator',
|
|
85
|
+
children: await toFrontNavChildren({ node, level, includeBookNav }),
|
|
86
|
+
...(await toFrontNavBase({ node, level })),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function toFrontNavFolder({
|
|
91
|
+
node,
|
|
92
|
+
level,
|
|
93
|
+
includeBookNav,
|
|
94
|
+
}: ToFuncArg): Promise<FrontNavFolder> {
|
|
95
|
+
return {
|
|
96
|
+
type: 'folder',
|
|
97
|
+
children: await toFrontNavChildren({
|
|
98
|
+
node,
|
|
99
|
+
level: level + 1,
|
|
100
|
+
includeBookNav,
|
|
101
|
+
}),
|
|
102
|
+
...(await toFrontNavBase({ node, level })),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function toFrontNavTopic({
|
|
107
|
+
node,
|
|
108
|
+
level,
|
|
109
|
+
}: ToFuncArg): Promise<FrontNavTopic> {
|
|
110
|
+
const topicPart = await getTopicPart(node.fullId);
|
|
111
|
+
return {
|
|
112
|
+
type: 'topic',
|
|
113
|
+
part: topicPart,
|
|
114
|
+
...(await toFrontNavBase({ node, level })),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function toFrontNavBase({
|
|
119
|
+
node,
|
|
120
|
+
level,
|
|
121
|
+
}: ToFuncArg): Promise<Omit<FrontNavBase, 'type'>> {
|
|
122
|
+
const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
|
|
123
|
+
select: ['title', 'navTitle', 'flags'],
|
|
124
|
+
where: { contentId: node.fullId },
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
id: node.shortId,
|
|
129
|
+
fullId: node.fullId,
|
|
130
|
+
level,
|
|
131
|
+
flags: dbContent?.flags,
|
|
132
|
+
label: dbContent?.navTitle || dbContent?.title || node.idPart,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function toFrontNavChildren({ node, includeBookNav, level }: ToFuncArg) {
|
|
137
|
+
if (node.type === 'book' && !includeBookNav) return undefined;
|
|
138
|
+
if (!node.children) return undefined;
|
|
139
|
+
|
|
140
|
+
return Promise.all(
|
|
141
|
+
node.children!.map((child) =>
|
|
142
|
+
toFrontNavItem({ node: child, level, includeBookNav }),
|
|
143
|
+
),
|
|
144
|
+
);
|
|
145
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import type { TopicPart } from '@erudit-js/cog/schema';
|
|
2
|
-
|
|
3
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
4
|
-
import { DbTopic } from '@server/db/entities/Topic';
|
|
5
|
-
import { getShortContentId } from '@server/repository/contentId';
|
|
6
|
-
|
|
7
|
-
import type { TopicPartLinks } from '@shared/content/data/type/topic';
|
|
8
|
-
import { createTopicPartLink } from '@shared/link';
|
|
9
|
-
|
|
10
|
-
export async function getTopicParts(contentId: string) {
|
|
11
|
-
const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
|
|
12
|
-
select: ['parts'],
|
|
13
|
-
where: { contentId },
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
if (!dbTopic) throw new Error(`Missing topic "${contentId}".`);
|
|
17
|
-
|
|
18
|
-
return dbTopic.parts;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export async function getTopicPart(contentId: string): Promise<TopicPart> {
|
|
22
|
-
const topicParts = await getTopicParts(contentId);
|
|
23
|
-
return topicParts.shift()!;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function getTopicPartsLinks(topicId: string) {
|
|
27
|
-
const existingTopicParts = await getTopicParts(topicId);
|
|
28
|
-
const shortTopicId = await getShortContentId(topicId);
|
|
29
|
-
const links: TopicPartLinks = {};
|
|
30
|
-
|
|
31
|
-
for (const topicPart of existingTopicParts)
|
|
32
|
-
links[topicPart] = createTopicPartLink(topicPart, shortTopicId);
|
|
33
|
-
|
|
34
|
-
return links;
|
|
35
|
-
}
|
|
1
|
+
import type { TopicPart } from '@erudit-js/cog/schema';
|
|
2
|
+
|
|
3
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
4
|
+
import { DbTopic } from '@server/db/entities/Topic';
|
|
5
|
+
import { getShortContentId } from '@server/repository/contentId';
|
|
6
|
+
|
|
7
|
+
import type { TopicPartLinks } from '@shared/content/data/type/topic';
|
|
8
|
+
import { createTopicPartLink } from '@shared/link';
|
|
9
|
+
|
|
10
|
+
export async function getTopicParts(contentId: string) {
|
|
11
|
+
const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
|
|
12
|
+
select: ['parts'],
|
|
13
|
+
where: { contentId },
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (!dbTopic) throw new Error(`Missing topic "${contentId}".`);
|
|
17
|
+
|
|
18
|
+
return dbTopic.parts;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function getTopicPart(contentId: string): Promise<TopicPart> {
|
|
22
|
+
const topicParts = await getTopicParts(contentId);
|
|
23
|
+
return topicParts.shift()!;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function getTopicPartsLinks(topicId: string) {
|
|
27
|
+
const existingTopicParts = await getTopicParts(topicId);
|
|
28
|
+
const shortTopicId = await getShortContentId(topicId);
|
|
29
|
+
const links: TopicPartLinks = {};
|
|
30
|
+
|
|
31
|
+
for (const topicPart of existingTopicParts)
|
|
32
|
+
links[topicPart] = createTopicPartLink(topicPart, shortTopicId);
|
|
33
|
+
|
|
34
|
+
return links;
|
|
35
|
+
}
|
package/server/tsconfig.json
CHANGED
|
@@ -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
|
+
}
|
package/shared/aside/minor.ts
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import type { BitranLocation } from '@erudit-js/cog/schema';
|
|
2
|
-
|
|
3
|
-
import type { Toc } from '../bitran/toc';
|
|
4
|
-
import type { PreviousNextItem } from '../content/previousNext';
|
|
5
|
-
import type { ContentContributor } from '../contributor';
|
|
6
|
-
|
|
7
|
-
interface AsideMinorBase {
|
|
8
|
-
type: AsideMinorType;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type AsideMinorType =
|
|
12
|
-
| 'topic'
|
|
13
|
-
| 'group'
|
|
14
|
-
| 'book'
|
|
15
|
-
| 'contributor'
|
|
16
|
-
| 'news';
|
|
17
|
-
|
|
18
|
-
export interface AsideMinorTopic extends AsideMinorBase {
|
|
19
|
-
type: 'topic';
|
|
20
|
-
topicId: string;
|
|
21
|
-
location: BitranLocation;
|
|
22
|
-
nav: Partial<{
|
|
23
|
-
previous: PreviousNextItem;
|
|
24
|
-
next: PreviousNextItem;
|
|
25
|
-
article: string;
|
|
26
|
-
summary: string;
|
|
27
|
-
practice: string;
|
|
28
|
-
}>;
|
|
29
|
-
toc: Toc;
|
|
30
|
-
contributors?: ContentContributor[];
|
|
31
|
-
// todos: TodoItem[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface AsideMinorContent extends AsideMinorBase {
|
|
35
|
-
type: 'group' | 'book';
|
|
36
|
-
contentId: string;
|
|
37
|
-
nav: Partial<{
|
|
38
|
-
previous: PreviousNextItem;
|
|
39
|
-
next: PreviousNextItem;
|
|
40
|
-
}>;
|
|
41
|
-
contributors?: ContentContributor[];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface AsideMinorNews extends AsideMinorBase {
|
|
45
|
-
type: 'news';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export type AsideMinorData =
|
|
49
|
-
| AsideMinorTopic
|
|
50
|
-
| AsideMinorContent
|
|
51
|
-
| AsideMinorNews;
|
|
1
|
+
import type { BitranLocation } from '@erudit-js/cog/schema';
|
|
2
|
+
|
|
3
|
+
import type { Toc } from '../bitran/toc';
|
|
4
|
+
import type { PreviousNextItem } from '../content/previousNext';
|
|
5
|
+
import type { ContentContributor } from '../contributor';
|
|
6
|
+
|
|
7
|
+
interface AsideMinorBase {
|
|
8
|
+
type: AsideMinorType;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type AsideMinorType =
|
|
12
|
+
| 'topic'
|
|
13
|
+
| 'group'
|
|
14
|
+
| 'book'
|
|
15
|
+
| 'contributor'
|
|
16
|
+
| 'news';
|
|
17
|
+
|
|
18
|
+
export interface AsideMinorTopic extends AsideMinorBase {
|
|
19
|
+
type: 'topic';
|
|
20
|
+
topicId: string;
|
|
21
|
+
location: BitranLocation;
|
|
22
|
+
nav: Partial<{
|
|
23
|
+
previous: PreviousNextItem;
|
|
24
|
+
next: PreviousNextItem;
|
|
25
|
+
article: string;
|
|
26
|
+
summary: string;
|
|
27
|
+
practice: string;
|
|
28
|
+
}>;
|
|
29
|
+
toc: Toc;
|
|
30
|
+
contributors?: ContentContributor[];
|
|
31
|
+
// todos: TodoItem[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface AsideMinorContent extends AsideMinorBase {
|
|
35
|
+
type: 'group' | 'book';
|
|
36
|
+
contentId: string;
|
|
37
|
+
nav: Partial<{
|
|
38
|
+
previous: PreviousNextItem;
|
|
39
|
+
next: PreviousNextItem;
|
|
40
|
+
}>;
|
|
41
|
+
contributors?: ContentContributor[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface AsideMinorNews extends AsideMinorBase {
|
|
45
|
+
type: 'news';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type AsideMinorData =
|
|
49
|
+
| AsideMinorTopic
|
|
50
|
+
| AsideMinorContent
|
|
51
|
+
| AsideMinorNews;
|
package/shared/asset.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PUBLIC_CONTENT_ASSET,
|
|
3
|
-
PUBLIC_CONTRIBUTOR_ASSET,
|
|
4
|
-
PUBLIC_ERUDIT_ASSET,
|
|
5
|
-
PUBLIC_USER_ASSET,
|
|
6
|
-
} from '@erudit/const';
|
|
7
|
-
|
|
8
|
-
export function eruditAsset(path: string) {
|
|
9
|
-
return PUBLIC_ERUDIT_ASSET + path;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function contributorAsset(path: string) {
|
|
13
|
-
return PUBLIC_CONTRIBUTOR_ASSET + path;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function contentAsset(path: string) {
|
|
17
|
-
return PUBLIC_CONTENT_ASSET + path;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function publicAsset(path: string) {
|
|
21
|
-
return PUBLIC_USER_ASSET + path;
|
|
22
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
PUBLIC_CONTENT_ASSET,
|
|
3
|
+
PUBLIC_CONTRIBUTOR_ASSET,
|
|
4
|
+
PUBLIC_ERUDIT_ASSET,
|
|
5
|
+
PUBLIC_USER_ASSET,
|
|
6
|
+
} from '@erudit/const';
|
|
7
|
+
|
|
8
|
+
export function eruditAsset(path: string) {
|
|
9
|
+
return PUBLIC_ERUDIT_ASSET + path;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function contributorAsset(path: string) {
|
|
13
|
+
return PUBLIC_CONTRIBUTOR_ASSET + path;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function contentAsset(path: string) {
|
|
17
|
+
return PUBLIC_CONTENT_ASSET + path;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function publicAsset(path: string) {
|
|
21
|
+
return PUBLIC_USER_ASSET + path;
|
|
22
|
+
}
|
|
@@ -1,56 +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
|
+
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,6 +1,6 @@
|
|
|
1
|
-
import type { RenderDataStorage } from '@bitran-js/core';
|
|
2
|
-
|
|
3
|
-
export interface StringBitranContent {
|
|
4
|
-
biCode: string;
|
|
5
|
-
renderDataStorage: RenderDataStorage;
|
|
6
|
-
}
|
|
1
|
+
import type { RenderDataStorage } from '@bitran-js/core';
|
|
2
|
+
|
|
3
|
+
export interface StringBitranContent {
|
|
4
|
+
biCode: string;
|
|
5
|
+
renderDataStorage: RenderDataStorage;
|
|
6
|
+
}
|
package/shared/bitran/toc.ts
CHANGED
|
@@ -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[];
|