erudit 2.0.0-dev.7 → 2.0.0-dev.9
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/.nuxtrc +1 -1
- package/app/app.vue +172 -172
- package/app/components/Loading.vue +23 -23
- package/app/components/SiteAside.vue +382 -382
- package/app/components/SiteMain.vue +35 -35
- package/app/components/ads/BannerTemplate.vue +51 -51
- package/app/components/ads/BottomBanner.vue +45 -45
- package/app/components/ads/LeftBanner.vue +50 -50
- package/app/components/aside/AsideListItem.vue +74 -74
- package/app/components/aside/AsideMajor.vue +56 -56
- package/app/components/aside/AsideMinor.vue +71 -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 +2 -2
- package/app/components/aside/major/panes/nav/Nav.vue +91 -91
- package/app/components/aside/major/panes/nav/NavBook.vue +86 -86
- 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 +15 -15
- 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 +4 -4
- 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 +203 -202
- package/app/components/aside/minor/topic/TopicTocItem.vue +31 -31
- package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
- package/app/components/bitran/BitranContent.vue +63 -64
- package/app/components/bitran/RenderWrapper.vue +10 -12
- package/app/components/contributor/ContributorAvatar.vue +43 -43
- package/app/components/contributor/ContributorListItem.vue +35 -35
- package/app/components/main/topic/MainTopic.vue +79 -79
- package/app/components/main/topic/TopicPartSwitch.vue +118 -118
- package/app/components/main/utils/Breadcrumb.vue +75 -75
- package/app/components/main/utils/ContentDecoration.vue +29 -29
- package/app/components/main/utils/ContentDescription.vue +19 -19
- package/app/components/main/utils/ContentFlag.vue +15 -15
- package/app/components/main/utils/ContentPopover.vue +176 -176
- package/app/components/main/utils/ContentPopovers.vue +105 -105
- package/app/components/main/utils/ContentReferences.vue +75 -75
- package/app/components/main/utils/ContentSection.vue +41 -41
- package/app/components/main/utils/ContentTitle.vue +36 -36
- package/app/components/main/utils/reference/ReferenceGroup.vue +40 -40
- package/app/components/main/utils/reference/ReferenceItem.vue +63 -63
- package/app/components/main/utils/reference/ReferenceSource.vue +109 -109
- package/app/components/preview/Preview.vue +177 -177
- 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 +99 -99
- 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 +20 -20
- package/app/components/preview/display/Unique.vue +49 -49
- package/app/components/transition/Fade.vue +21 -21
- package/app/components/tree/TreeContainer.vue +11 -11
- package/app/components/tree/TreeItem.vue +89 -89
- package/app/composables/bitran.ts +98 -103
- package/app/composables/bitranContent.ts +2 -1
- package/app/composables/contentPage.ts +1 -1
- package/app/composables/phrases.ts +80 -80
- package/app/pages/_test/preview.vue +110 -110
- package/app/pages/article/[...articleId].vue +2 -2
- package/app/pages/book/[...bookId].vue +47 -47
- package/app/pages/group/[...groupId].vue +65 -64
- package/app/pages/index.vue +32 -32
- package/app/pages/members.vue +6 -6
- package/app/pages/practice/[...practice].vue +2 -2
- package/app/pages/summary/[...summaryId].vue +2 -2
- package/app/public/favicon/article.svg +9 -9
- package/app/public/favicon/default.svg +9 -9
- package/app/public/favicon/practice.svg +9 -9
- package/app/public/favicon/summary.svg +9 -9
- package/app/public/logotype.svg +16 -16
- package/app/public/user.svg +9 -9
- package/app/scripts/_immediate.js +3 -3
- package/app/scripts/flag.ts +28 -28
- package/app/scripts/og.ts +27 -27
- package/app/scripts/preview/data/unique.ts +3 -3
- package/app/scripts/preview/display.ts +5 -7
- package/app/scripts/preview/request.ts +2 -2
- package/app/styles/_immediate.css +2 -2
- package/app/styles/_util.scss +49 -49
- package/app/styles/_utils.scss +44 -44
- package/app/styles/default.scss +84 -84
- package/app/styles/partials/_darkMagic.scss +6 -6
- package/app/styles/partials/_fnav.scss +17 -17
- package/app/styles/partials/_preview.scss +6 -6
- package/globalPath.ts +21 -24
- package/globals/bitran.ts +21 -13
- package/globals/erudit.ts +5 -5
- package/globals/register.ts +18 -18
- package/languages/en.ts +95 -95
- package/languages/ru.ts +99 -99
- package/module/config.ts +34 -34
- package/module/imports.ts +46 -46
- package/module/index.ts +47 -35
- package/module/logger.ts +10 -10
- package/module/restart.ts +61 -61
- package/nuxt.config.ts +107 -96
- package/package.json +9 -6
- 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 +78 -78
- package/server/api/bitran/content/[location].ts +7 -7
- package/server/api/bitran/toc/[location].ts +7 -7
- package/server/api/content/data.ts +72 -72
- package/server/api/fake/content.ts +10 -10
- 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/preview/page/[...parts].ts +51 -51
- package/server/api/preview/unique/[location].ts +55 -55
- package/server/plugin/bitran/content.ts +55 -44
- package/server/plugin/bitran/products/include.ts +28 -27
- package/server/plugin/bitran/products/link.ts +11 -9
- package/server/plugin/bitran/setup.ts +0 -1
- package/server/plugin/bitran/toc.ts +25 -24
- package/server/plugin/bitran/transpiler.ts +46 -0
- package/server/plugin/build/close.ts +10 -10
- package/server/plugin/build/jobs/content/parse.ts +37 -27
- package/server/plugin/build/jobs/language.ts +36 -36
- package/server/plugin/build/process.ts +25 -25
- package/server/plugin/build/rebuild.ts +55 -55
- package/server/plugin/build/setup.ts +21 -21
- package/server/plugin/global.ts +18 -18
- package/server/plugin/importer.ts +12 -12
- package/server/plugin/index.ts +9 -9
- package/server/plugin/logger.ts +23 -23
- package/server/tsconfig.json +7 -7
- package/shared/bitran/context.ts +3 -2
- package/shared/bitran/default.ts +46 -0
- package/shared/bitran/{products/link/render → link}/Link.vue +7 -14
- package/shared/bitran/link/factory.ts +24 -0
- package/shared/bitran/link/languages/en.ts +7 -0
- package/shared/bitran/link/languages/ru.ts +7 -0
- package/shared/bitran/link/renderer.ts +21 -0
- package/shared/bitran/link/shared.ts +17 -0
- package/shared/bitran/{products/link → link}/target.ts +1 -1
- package/shared/bitran/link/transpiler.ts +10 -0
- 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/link.ts +25 -25
- package/shared/types/language.ts +75 -75
- package/test/bitran/{products/link → link}/target.test.ts +5 -2
- package/tsconfig.json +8 -8
- package/utils/stress.ts +9 -9
- package/server/plugin/bitran/core.ts +0 -51
- package/shared/bitran/alias.ts +0 -17
- package/shared/bitran/products/alias/core/factory.ts +0 -46
- package/shared/bitran/products/alias/core/index.ts +0 -13
- package/shared/bitran/products/alias/render/Alias.vue +0 -10
- package/shared/bitran/products/alias/render/icon.svg +0 -3
- package/shared/bitran/products/alias/render/index.ts +0 -17
- package/shared/bitran/products/alias/render/languages/en.ts +0 -5
- package/shared/bitran/products/alias/render/languages/ru.ts +0 -5
- package/shared/bitran/products/alias/shared.ts +0 -11
- package/shared/bitran/products/heading/core/factory.ts +0 -53
- package/shared/bitran/products/heading/core/index.ts +0 -19
- package/shared/bitran/products/heading/render/Heading.vue +0 -47
- package/shared/bitran/products/heading/render/icon.svg +0 -3
- package/shared/bitran/products/heading/render/index.ts +0 -17
- package/shared/bitran/products/heading/render/languages/en.ts +0 -5
- package/shared/bitran/products/heading/render/languages/ru.ts +0 -5
- package/shared/bitran/products/heading/shared.ts +0 -13
- package/shared/bitran/products/include/core/factory.ts +0 -61
- package/shared/bitran/products/include/core/index.ts +0 -13
- package/shared/bitran/products/include/render/Include.vue +0 -13
- package/shared/bitran/products/include/render/icon.svg +0 -3
- package/shared/bitran/products/include/render/index.ts +0 -18
- package/shared/bitran/products/include/render/languages/en.ts +0 -5
- package/shared/bitran/products/include/render/languages/ru.ts +0 -5
- package/shared/bitran/products/include/shared.ts +0 -15
- package/shared/bitran/products/link/core/factory.ts +0 -20
- package/shared/bitran/products/link/core/index.ts +0 -17
- package/shared/bitran/products/link/render/index.ts +0 -17
- package/shared/bitran/products/link/render/languages/en.ts +0 -5
- package/shared/bitran/products/link/render/languages/ru.ts +0 -5
- package/shared/bitran/products/link/shared.ts +0 -15
- package/test/bitran/alias.test.ts +0 -44
- package/test/bitran/products/alias.test.ts +0 -83
- package/test/bitran/products/heading.test.ts +0 -119
- package/test/bitran/products/include.test.ts +0 -77
- package/test/bitran/products/link/factory.test.ts +0 -30
- /package/shared/bitran/{products/link/render → link}/icon.svg +0 -0
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
import { getTopicPartsLinks } from '@server/repository/topic';
|
|
2
|
-
import { getContentBookFor } from '@server/repository/book';
|
|
3
|
-
import { getContentGenericData } from '@server/repository/content';
|
|
4
|
-
|
|
5
|
-
import type { ContentGenericData } from '@shared/content/data/base';
|
|
6
|
-
import type { ContentTopicData } from '@shared/content/data/type/topic';
|
|
7
|
-
import type { ContentGroupData } from '@shared/content/data/type/group';
|
|
8
|
-
import type { ContentBookData } from '@shared/content/data/type/book';
|
|
9
|
-
|
|
10
|
-
export default defineEventHandler(async (event) => {
|
|
11
|
-
const contentId = getQuery(event)?.contentId as string;
|
|
12
|
-
|
|
13
|
-
if (!contentId)
|
|
14
|
-
throw createError({
|
|
15
|
-
statusCode: 400,
|
|
16
|
-
statusText: 'Missing content ID!',
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const generic = await getContentGenericData(contentId);
|
|
20
|
-
|
|
21
|
-
switch (generic.type) {
|
|
22
|
-
case 'topic':
|
|
23
|
-
return await getTopicData(generic);
|
|
24
|
-
case 'group':
|
|
25
|
-
return await getGroupData(generic);
|
|
26
|
-
case 'book':
|
|
27
|
-
return await getBookData(generic);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
throw createError({
|
|
31
|
-
statusCode: 400,
|
|
32
|
-
statusText: `Unknown content data type "${generic.type}"!`,
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
async function getTopicData(
|
|
41
|
-
generic: ContentGenericData,
|
|
42
|
-
): Promise<ContentTopicData> {
|
|
43
|
-
const contentBook = await getContentBookFor(generic.contentId);
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
type: 'topic',
|
|
47
|
-
generic,
|
|
48
|
-
bookTitle: contentBook?.title,
|
|
49
|
-
topicPartLinks: await getTopicPartsLinks(generic.contentId),
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function getGroupData(
|
|
54
|
-
generic: ContentGenericData,
|
|
55
|
-
): Promise<ContentGroupData> {
|
|
56
|
-
const contentBook = await getContentBookFor(generic.contentId);
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
type: 'group',
|
|
60
|
-
generic,
|
|
61
|
-
bookTitle: contentBook?.title,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
async function getBookData(
|
|
66
|
-
generic: ContentGenericData,
|
|
67
|
-
): Promise<ContentBookData> {
|
|
68
|
-
return {
|
|
69
|
-
type: 'book',
|
|
70
|
-
generic,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
1
|
+
import { getTopicPartsLinks } from '@server/repository/topic';
|
|
2
|
+
import { getContentBookFor } from '@server/repository/book';
|
|
3
|
+
import { getContentGenericData } from '@server/repository/content';
|
|
4
|
+
|
|
5
|
+
import type { ContentGenericData } from '@shared/content/data/base';
|
|
6
|
+
import type { ContentTopicData } from '@shared/content/data/type/topic';
|
|
7
|
+
import type { ContentGroupData } from '@shared/content/data/type/group';
|
|
8
|
+
import type { ContentBookData } from '@shared/content/data/type/book';
|
|
9
|
+
|
|
10
|
+
export default defineEventHandler(async (event) => {
|
|
11
|
+
const contentId = getQuery(event)?.contentId as string;
|
|
12
|
+
|
|
13
|
+
if (!contentId)
|
|
14
|
+
throw createError({
|
|
15
|
+
statusCode: 400,
|
|
16
|
+
statusText: 'Missing content ID!',
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const generic = await getContentGenericData(contentId);
|
|
20
|
+
|
|
21
|
+
switch (generic.type) {
|
|
22
|
+
case 'topic':
|
|
23
|
+
return await getTopicData(generic);
|
|
24
|
+
case 'group':
|
|
25
|
+
return await getGroupData(generic);
|
|
26
|
+
case 'book':
|
|
27
|
+
return await getBookData(generic);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
throw createError({
|
|
31
|
+
statusCode: 400,
|
|
32
|
+
statusText: `Unknown content data type "${generic.type}"!`,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
//
|
|
37
|
+
//
|
|
38
|
+
//
|
|
39
|
+
|
|
40
|
+
async function getTopicData(
|
|
41
|
+
generic: ContentGenericData,
|
|
42
|
+
): Promise<ContentTopicData> {
|
|
43
|
+
const contentBook = await getContentBookFor(generic.contentId);
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
type: 'topic',
|
|
47
|
+
generic,
|
|
48
|
+
bookTitle: contentBook?.title,
|
|
49
|
+
topicPartLinks: await getTopicPartsLinks(generic.contentId),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function getGroupData(
|
|
54
|
+
generic: ContentGenericData,
|
|
55
|
+
): Promise<ContentGroupData> {
|
|
56
|
+
const contentBook = await getContentBookFor(generic.contentId);
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
type: 'group',
|
|
60
|
+
generic,
|
|
61
|
+
bookTitle: contentBook?.title,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function getBookData(
|
|
66
|
+
generic: ContentGenericData,
|
|
67
|
+
): Promise<ContentBookData> {
|
|
68
|
+
return {
|
|
69
|
+
type: 'book',
|
|
70
|
+
generic,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export default defineEventHandler(() => {
|
|
2
|
-
return {
|
|
3
|
-
commit: {
|
|
4
|
-
commit: {
|
|
5
|
-
author: {
|
|
6
|
-
date: '2019-08-30T14:57:06.000Z'
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
export default defineEventHandler(() => {
|
|
2
|
+
return {
|
|
3
|
+
commit: {
|
|
4
|
+
commit: {
|
|
5
|
+
author: {
|
|
6
|
+
date: '2019-08-30T14:57:06.000Z'
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
11
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export default defineEventHandler(() => {
|
|
2
|
-
return {
|
|
3
|
-
en: {
|
|
4
|
-
name: 'English',
|
|
5
|
-
link: 'https://en.omath.net',
|
|
6
|
-
},
|
|
7
|
-
ru: {
|
|
8
|
-
name: 'Русский',
|
|
9
|
-
link: 'https://omath.ru',
|
|
10
|
-
},
|
|
11
|
-
};
|
|
12
|
-
});
|
|
1
|
+
export default defineEventHandler(() => {
|
|
2
|
+
return {
|
|
3
|
+
en: {
|
|
4
|
+
name: 'English',
|
|
5
|
+
link: 'https://en.omath.net',
|
|
6
|
+
},
|
|
7
|
+
ru: {
|
|
8
|
+
name: 'Русский',
|
|
9
|
+
link: 'https://omath.ru',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
-
|
|
3
|
-
export default defineEventHandler(() => {
|
|
4
|
-
const strFunctions: Record<string, string> = {};
|
|
5
|
-
|
|
6
|
-
for (const [key, func] of Object.entries(
|
|
7
|
-
ERUDIT_SERVER.LANGUAGE?.functions || {},
|
|
8
|
-
))
|
|
9
|
-
strFunctions[key] = 'return ' + func.toString();
|
|
10
|
-
|
|
11
|
-
return strFunctions;
|
|
12
|
-
});
|
|
1
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
+
|
|
3
|
+
export default defineEventHandler(() => {
|
|
4
|
+
const strFunctions: Record<string, string> = {};
|
|
5
|
+
|
|
6
|
+
for (const [key, func] of Object.entries(
|
|
7
|
+
ERUDIT_SERVER.LANGUAGE?.functions || {},
|
|
8
|
+
))
|
|
9
|
+
strFunctions[key] = 'return ' + func.toString();
|
|
10
|
+
|
|
11
|
+
return strFunctions;
|
|
12
|
+
});
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type { EruditPhraseId } from '@shared/types/language';
|
|
2
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler((event) => {
|
|
5
|
-
const phraseId = getRouterParam(event, 'phraseId');
|
|
6
|
-
const phrase =
|
|
7
|
-
ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
|
|
8
|
-
|
|
9
|
-
setResponseHeader(event, 'content-type', 'text/plain');
|
|
10
|
-
|
|
11
|
-
if (typeof phrase === 'string') return phrase;
|
|
12
|
-
else if (typeof phrase === 'function')
|
|
13
|
-
return '~!~FUNC~!~' + 'return ' + phrase.toString();
|
|
14
|
-
|
|
15
|
-
throw createError({
|
|
16
|
-
statusCode: 400,
|
|
17
|
-
statusText: `Unknown phrase id "${phraseId}"!`,
|
|
18
|
-
});
|
|
19
|
-
});
|
|
1
|
+
import type { EruditPhraseId } from '@shared/types/language';
|
|
2
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler((event) => {
|
|
5
|
+
const phraseId = getRouterParam(event, 'phraseId');
|
|
6
|
+
const phrase =
|
|
7
|
+
ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
|
|
8
|
+
|
|
9
|
+
setResponseHeader(event, 'content-type', 'text/plain');
|
|
10
|
+
|
|
11
|
+
if (typeof phrase === 'string') return phrase;
|
|
12
|
+
else if (typeof phrase === 'function')
|
|
13
|
+
return '~!~FUNC~!~' + 'return ' + phrase.toString();
|
|
14
|
+
|
|
15
|
+
throw createError({
|
|
16
|
+
statusCode: 400,
|
|
17
|
+
statusText: `Unknown phrase id "${phraseId}"!`,
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
-
import type { EruditPhraseId } from '@shared/types/language';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler(() => {
|
|
5
|
-
return Object.keys(
|
|
6
|
-
ERUDIT_SERVER.LANGUAGE?.phrases || [],
|
|
7
|
-
) as EruditPhraseId[];
|
|
8
|
-
});
|
|
1
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
+
import type { EruditPhraseId } from '@shared/types/language';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler(() => {
|
|
5
|
+
return Object.keys(
|
|
6
|
+
ERUDIT_SERVER.LANGUAGE?.phrases || [],
|
|
7
|
+
) as EruditPhraseId[];
|
|
8
|
+
});
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getContentContext,
|
|
3
|
-
getTopicPartContext,
|
|
4
|
-
getContributorContext,
|
|
5
|
-
} from '@erudit/server/plugin/content/context';
|
|
6
|
-
|
|
7
|
-
import type { PreviewDataPageLink } from '
|
|
8
|
-
import type { LinkTargetPageType } from '@erudit/shared/bitran/
|
|
9
|
-
import type { Context, ContextItem } from '@erudit/shared/content/context';
|
|
10
|
-
|
|
11
|
-
export default defineEventHandler<Promise<PreviewDataPageLink>>(
|
|
12
|
-
async (event) => {
|
|
13
|
-
const urlParts = (event.context.params?.parts || '').split('/');
|
|
14
|
-
const pageType: LinkTargetPageType = urlParts.shift() as any;
|
|
15
|
-
const contentId: string = urlParts.join('/');
|
|
16
|
-
|
|
17
|
-
const context: Context = await (async () => {
|
|
18
|
-
switch (pageType) {
|
|
19
|
-
case 'book':
|
|
20
|
-
case 'group':
|
|
21
|
-
return await getContentContext(contentId);
|
|
22
|
-
case 'article':
|
|
23
|
-
case 'summary':
|
|
24
|
-
case 'practice':
|
|
25
|
-
return await getTopicPartContext(pageType, contentId);
|
|
26
|
-
case 'contributor':
|
|
27
|
-
return await getContributorContext(contentId);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
throw createError(`Can't handle "${pageType}" page type!`);
|
|
31
|
-
})();
|
|
32
|
-
|
|
33
|
-
const lastContextItem = context.pop() as ContextItem;
|
|
34
|
-
const contextStr = context
|
|
35
|
-
.filter((c) => !c.hidden)
|
|
36
|
-
.map((c) => c.title)
|
|
37
|
-
.join(' / ');
|
|
38
|
-
|
|
39
|
-
return <PreviewDataPageLink>{
|
|
40
|
-
type: 'page-link',
|
|
41
|
-
footer: {
|
|
42
|
-
secondary:
|
|
43
|
-
(contextStr ? contextStr + ' • ' : '') +
|
|
44
|
-
lastContextItem.type,
|
|
45
|
-
primary: lastContextItem.title,
|
|
46
|
-
href: lastContextItem.href,
|
|
47
|
-
iconName: lastContextItem.icon,
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
);
|
|
1
|
+
import {
|
|
2
|
+
getContentContext,
|
|
3
|
+
getTopicPartContext,
|
|
4
|
+
getContributorContext,
|
|
5
|
+
} from '@erudit/server/plugin/content/context';
|
|
6
|
+
|
|
7
|
+
import type { PreviewDataPageLink } from '../../../../app/scripts/preview/data/pageLink';
|
|
8
|
+
import type { LinkTargetPageType } from '@erudit/shared/bitran/link/target';
|
|
9
|
+
import type { Context, ContextItem } from '@erudit/shared/content/context';
|
|
10
|
+
|
|
11
|
+
export default defineEventHandler<Promise<PreviewDataPageLink>>(
|
|
12
|
+
async (event) => {
|
|
13
|
+
const urlParts = (event.context.params?.parts || '').split('/');
|
|
14
|
+
const pageType: LinkTargetPageType = urlParts.shift() as any;
|
|
15
|
+
const contentId: string = urlParts.join('/');
|
|
16
|
+
|
|
17
|
+
const context: Context = await (async () => {
|
|
18
|
+
switch (pageType) {
|
|
19
|
+
case 'book':
|
|
20
|
+
case 'group':
|
|
21
|
+
return await getContentContext(contentId);
|
|
22
|
+
case 'article':
|
|
23
|
+
case 'summary':
|
|
24
|
+
case 'practice':
|
|
25
|
+
return await getTopicPartContext(pageType, contentId);
|
|
26
|
+
case 'contributor':
|
|
27
|
+
return await getContributorContext(contentId);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
throw createError(`Can't handle "${pageType}" page type!`);
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
const lastContextItem = context.pop() as ContextItem;
|
|
34
|
+
const contextStr = context
|
|
35
|
+
.filter((c) => !c.hidden)
|
|
36
|
+
.map((c) => c.title)
|
|
37
|
+
.join(' / ');
|
|
38
|
+
|
|
39
|
+
return <PreviewDataPageLink>{
|
|
40
|
+
type: 'page-link',
|
|
41
|
+
footer: {
|
|
42
|
+
secondary:
|
|
43
|
+
(contextStr ? contextStr + ' • ' : '') +
|
|
44
|
+
lastContextItem.type,
|
|
45
|
+
primary: lastContextItem.title,
|
|
46
|
+
href: lastContextItem.href,
|
|
47
|
+
iconName: lastContextItem.icon,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
);
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import type { BitranContent } from 'bitran';
|
|
2
|
-
|
|
3
|
-
import { parseUrlLocation } from '@server/bitran/location';
|
|
4
|
-
import { getLocationContext } from '@server/content/context';
|
|
5
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
6
|
-
import { DbUnique } from '@server/db/entities/Unique';
|
|
7
|
-
import { getBitranContent } from '@server/bitran/content';
|
|
8
|
-
|
|
9
|
-
import type { Context } from '@shared/content/context';
|
|
10
|
-
import type { BitranContext } from '@shared/bitran/context';
|
|
11
|
-
import { stringifyBitranLocation } from '@shared/bitran/location';
|
|
12
|
-
|
|
13
|
-
interface ReturnType {
|
|
14
|
-
context: Context;
|
|
15
|
-
productTitle?: string;
|
|
16
|
-
bitran: {
|
|
17
|
-
productName: string;
|
|
18
|
-
context: BitranContext;
|
|
19
|
-
content: BitranContent;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default defineEventHandler<Promise<ReturnType>>(async (event) => {
|
|
24
|
-
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
25
|
-
|
|
26
|
-
const context = await getLocationContext(location);
|
|
27
|
-
|
|
28
|
-
const dbUnique = await (async () => {
|
|
29
|
-
const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
30
|
-
select: ['productName', 'title', 'context'],
|
|
31
|
-
where: { location: stringifyBitranLocation(location) },
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
if (!dbUnique)
|
|
35
|
-
throw createError(
|
|
36
|
-
`Missing unique "${stringifyBitranLocation(location)}"!`,
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
return dbUnique as any as DbUnique;
|
|
40
|
-
})();
|
|
41
|
-
|
|
42
|
-
const bitran = await (async () => {
|
|
43
|
-
return {
|
|
44
|
-
content: await getBitranContent(location),
|
|
45
|
-
context: dbUnique.context,
|
|
46
|
-
productName: dbUnique.productName,
|
|
47
|
-
};
|
|
48
|
-
})();
|
|
49
|
-
|
|
50
|
-
return <ReturnType>{
|
|
51
|
-
context,
|
|
52
|
-
productTitle: dbUnique.title,
|
|
53
|
-
bitran,
|
|
54
|
-
};
|
|
55
|
-
});
|
|
1
|
+
import type { BitranContent } from 'bitran';
|
|
2
|
+
|
|
3
|
+
import { parseUrlLocation } from '@server/bitran/location';
|
|
4
|
+
import { getLocationContext } from '@server/content/context';
|
|
5
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
6
|
+
import { DbUnique } from '@server/db/entities/Unique';
|
|
7
|
+
import { getBitranContent } from '@server/bitran/content';
|
|
8
|
+
|
|
9
|
+
import type { Context } from '@shared/content/context';
|
|
10
|
+
import type { BitranContext } from '@shared/bitran/context';
|
|
11
|
+
import { stringifyBitranLocation } from '@shared/bitran/location';
|
|
12
|
+
|
|
13
|
+
interface ReturnType {
|
|
14
|
+
context: Context;
|
|
15
|
+
productTitle?: string;
|
|
16
|
+
bitran: {
|
|
17
|
+
productName: string;
|
|
18
|
+
context: BitranContext;
|
|
19
|
+
content: BitranContent;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default defineEventHandler<Promise<ReturnType>>(async (event) => {
|
|
24
|
+
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
25
|
+
|
|
26
|
+
const context = await getLocationContext(location);
|
|
27
|
+
|
|
28
|
+
const dbUnique = await (async () => {
|
|
29
|
+
const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
30
|
+
select: ['productName', 'title', 'context'],
|
|
31
|
+
where: { location: stringifyBitranLocation(location) },
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (!dbUnique)
|
|
35
|
+
throw createError(
|
|
36
|
+
`Missing unique "${stringifyBitranLocation(location)}"!`,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return dbUnique as any as DbUnique;
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
const bitran = await (async () => {
|
|
43
|
+
return {
|
|
44
|
+
content: await getBitranContent(location),
|
|
45
|
+
context: dbUnique.context,
|
|
46
|
+
productName: dbUnique.productName,
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
|
|
50
|
+
return <ReturnType>{
|
|
51
|
+
context,
|
|
52
|
+
productTitle: dbUnique.title,
|
|
53
|
+
bitran,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { BlockNode } from 'bitran/
|
|
4
|
-
import {
|
|
1
|
+
import { isTopicPart, type TopicPart } from 'erudit-cog/schema';
|
|
2
|
+
import { createPreRenderData, type PreRenderData } from '@bitran-js/transpiler';
|
|
3
|
+
import { BlockNode, BlocksNode } from '@bitran-js/core';
|
|
4
|
+
import { type BitranContent } from '@bitran-js/renderer-vue';
|
|
5
|
+
import {
|
|
6
|
+
AliasesNode,
|
|
7
|
+
mergeAliases,
|
|
8
|
+
NO_ALIASES,
|
|
9
|
+
} from '@erudit-js/bitran-elements/aliases/shared';
|
|
10
|
+
import { IncludeNode } from '@erudit-js/bitran-elements/include/shared';
|
|
11
|
+
|
|
12
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
13
|
+
import { DbUnique } from '@server/db/entities/Unique';
|
|
14
|
+
import { DbTopic } from '@server/db/entities/Topic';
|
|
15
|
+
import { DbGroup } from '@server/db/entities/Group';
|
|
16
|
+
import { resolveLinkTarget } from '@server/bitran/products/link';
|
|
17
|
+
import { traverseInclude } from '@server/bitran/products/include';
|
|
18
|
+
import { createBitranTranspiler } from '@server/bitran/transpiler';
|
|
19
|
+
|
|
5
20
|
import type { BitranContext } from '@erudit/shared/bitran/context';
|
|
6
21
|
import {
|
|
7
22
|
stringifyBitranLocation,
|
|
8
23
|
type BitranLocation,
|
|
9
24
|
} from '@erudit/shared/bitran/location';
|
|
10
|
-
import {
|
|
11
|
-
import { DbUnique } from '../db/entities/Unique';
|
|
12
|
-
import { isTopicPart, type TopicPart } from 'erudit-cog/schema';
|
|
13
|
-
import { DbTopic } from '../db/entities/Topic';
|
|
14
|
-
import { DbGroup } from '../db/entities/Group';
|
|
15
|
-
import { NO_ALIASES } from '@erudit/shared/bitran/alias';
|
|
16
|
-
import { createBitranCore } from './core';
|
|
17
|
-
import { IncludeNode } from '@erudit/shared/bitran/products/include/core';
|
|
18
|
-
import { LinkNode } from '@erudit/shared/bitran/products/link/core';
|
|
19
|
-
import { resolveLinkTarget } from './products/link';
|
|
20
|
-
import { traverseInclude } from './products/include';
|
|
25
|
+
import { LinkNode } from '@erudit/shared/bitran/link/shared';
|
|
21
26
|
|
|
22
27
|
interface RawBitranContent {
|
|
23
28
|
context: BitranContext;
|
|
@@ -37,7 +42,6 @@ export async function getBitranContent(
|
|
|
37
42
|
|
|
38
43
|
export async function getRawBitranContent(
|
|
39
44
|
location: BitranLocation,
|
|
40
|
-
// @ts-ignore
|
|
41
45
|
): Promise<RawBitranContent> {
|
|
42
46
|
const throwNotFound = () => {
|
|
43
47
|
throw createError({
|
|
@@ -89,82 +93,89 @@ export async function getRawBitranContent(
|
|
|
89
93
|
};
|
|
90
94
|
}
|
|
91
95
|
|
|
92
|
-
throwNotFound();
|
|
96
|
+
return throwNotFound();
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
async function createBitranContent(
|
|
96
100
|
context: BitranContext,
|
|
97
101
|
biCode: string,
|
|
98
102
|
): Promise<BitranContent> {
|
|
99
|
-
const
|
|
103
|
+
const bitranTranspiler = await createBitranTranspiler();
|
|
100
104
|
|
|
101
|
-
const root = await
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
|
|
105
|
+
const root = await bitranTranspiler.parser.parse(biCode, {
|
|
106
|
+
async step(node) {
|
|
107
|
+
if (node instanceof AliasesNode) {
|
|
108
|
+
mergeAliases(context.aliases, node.parseData);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (node instanceof IncludeNode) {
|
|
113
|
+
await resolveInclude(node, context);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
105
116
|
},
|
|
106
117
|
});
|
|
107
118
|
|
|
108
|
-
const finalContent =
|
|
119
|
+
const finalContent = await bitranTranspiler.stringifier.stringify(root);
|
|
109
120
|
|
|
110
121
|
// Building render data
|
|
111
|
-
const
|
|
112
|
-
await
|
|
113
|
-
step: async (
|
|
114
|
-
const id =
|
|
115
|
-
const
|
|
122
|
+
const preRenderDataMap: Record<string, PreRenderData> = {};
|
|
123
|
+
await bitranTranspiler.parser.parse(finalContent, {
|
|
124
|
+
step: async (node) => {
|
|
125
|
+
const id = node.id;
|
|
126
|
+
const elementTranspiler = bitranTranspiler.transpilers[node.name]!;
|
|
116
127
|
|
|
117
|
-
if (
|
|
128
|
+
if (node instanceof LinkNode) {
|
|
118
129
|
try {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
data: await resolveLinkTarget(
|
|
130
|
+
preRenderDataMap[id] = {
|
|
131
|
+
type: 'success',
|
|
132
|
+
data: await resolveLinkTarget(node.parseData, {
|
|
122
133
|
location: context.location,
|
|
123
134
|
aliases: context.aliases ?? {},
|
|
124
135
|
}),
|
|
125
136
|
};
|
|
126
137
|
} catch (error: any) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
138
|
+
preRenderDataMap[id] = {
|
|
139
|
+
type: 'error',
|
|
140
|
+
message: error?.message || String(error),
|
|
130
141
|
};
|
|
131
142
|
}
|
|
132
143
|
return;
|
|
133
144
|
}
|
|
134
145
|
|
|
135
|
-
if (id)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
productCore,
|
|
146
|
+
if (id) {
|
|
147
|
+
const preRenderData = await createPreRenderData(
|
|
148
|
+
node,
|
|
149
|
+
elementTranspiler,
|
|
140
150
|
);
|
|
151
|
+
if (preRenderData) preRenderDataMap[id] = preRenderData;
|
|
152
|
+
}
|
|
141
153
|
},
|
|
142
154
|
});
|
|
143
155
|
|
|
144
156
|
return {
|
|
145
157
|
biCode: finalContent,
|
|
146
|
-
|
|
158
|
+
preRenderData: preRenderDataMap,
|
|
147
159
|
};
|
|
148
160
|
}
|
|
149
161
|
|
|
150
162
|
async function resolveInclude(
|
|
151
163
|
includeNode: IncludeNode,
|
|
152
164
|
context: BitranContext,
|
|
153
|
-
): Promise<IncludeNode
|
|
165
|
+
): Promise<IncludeNode> {
|
|
154
166
|
let _blocks;
|
|
155
167
|
|
|
156
168
|
try {
|
|
157
169
|
const blocks: BlockNode[] = [];
|
|
158
170
|
|
|
159
171
|
await traverseInclude(includeNode, context, {
|
|
160
|
-
step: async ({
|
|
172
|
+
step: async ({ _node }) => {
|
|
161
173
|
if (_node instanceof BlockNode) blocks.push(_node);
|
|
162
174
|
},
|
|
163
175
|
});
|
|
164
176
|
|
|
165
177
|
const blocksNode = new BlocksNode(includeNode);
|
|
166
178
|
blocksNode.setNodes(blocks);
|
|
167
|
-
|
|
168
179
|
_blocks = blocksNode;
|
|
169
180
|
includeNode.parseData.blocks = _blocks;
|
|
170
181
|
} catch (error: any) {
|