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.
- package/app/app.vue +195 -172
- package/app/components/Loading.vue +23 -23
- package/app/components/SiteAside.vue +393 -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 +11 -11
- package/app/components/aside/major/panes/nav/Nav.vue +87 -91
- package/app/components/aside/major/panes/nav/NavBook.vue +87 -87
- 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 +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 +219 -203
- package/app/components/aside/minor/topic/TopicTocItem.vue +30 -31
- package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
- package/app/components/bitran/BitranContent.vue +70 -63
- package/app/components/bitran/RenderWrapper.vue +10 -10
- 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/ContentPopover.vue +188 -176
- package/app/components/main/utils/ContentPopovers.vue +105 -105
- 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 -39
- package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
- package/app/components/main/utils/reference/ReferenceItem.vue +68 -68
- package/app/components/main/utils/reference/ReferenceSource.vue +116 -116
- package/app/components/preview/Preview.vue +186 -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 +141 -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 +19 -19
- package/app/components/tree/TreeContainer.vue +11 -11
- package/app/components/tree/TreeItem.vue +89 -89
- package/app/composables/bitran.ts +129 -127
- package/app/composables/bitranContent.ts +39 -39
- package/app/composables/bitranLocation.ts +7 -7
- package/app/composables/contentData.ts +36 -36
- package/app/composables/contentPage.ts +157 -156
- package/app/composables/contentRoute.ts +45 -45
- package/app/composables/darkMagic.ts +24 -24
- package/app/composables/externalApi.ts +63 -63
- package/app/composables/favicon.ts +8 -8
- package/app/composables/formatText.ts +86 -86
- package/app/composables/majorPane.ts +60 -60
- package/app/composables/phrases.ts +81 -81
- 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 +65 -65
- 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/public/favicon/article.svg +5 -5
- package/app/public/favicon/default.svg +3 -3
- package/app/public/favicon/practice.svg +3 -3
- package/app/public/favicon/summary.svg +4 -4
- package/app/public/logotype.svg +2 -2
- 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 +73 -73
- 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 +22 -22
- package/app/scripts/preview/data/unique.ts +71 -71
- 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 +63 -63
- 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/globalPath.ts +21 -21
- package/globals/bitran.ts +2 -47
- package/globals/content.ts +22 -22
- package/globals/contributor.ts +5 -5
- 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/bitran.ts +35 -34
- package/module/config.ts +34 -34
- package/module/imports.ts +50 -46
- package/module/index.ts +47 -47
- package/module/logger.ts +10 -10
- package/module/paths.ts +22 -22
- package/module/restart.ts +61 -61
- package/nuxt.config.ts +99 -112
- package/package.json +10 -8
- 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 +8 -8
- package/server/api/bitran/toc/[location].ts +7 -7
- package/server/api/content/data.ts +72 -72
- 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/preview/page/[...parts].ts +51 -51
- package/server/api/preview/unique/[location].ts +57 -57
- package/server/plugin/bitran/content.ts +187 -187
- package/server/plugin/bitran/location.ts +25 -25
- package/server/plugin/bitran/products/include.ts +230 -230
- package/server/plugin/bitran/products/link.ts +116 -116
- package/server/plugin/bitran/setup.ts +11 -9
- package/server/plugin/bitran/toc.ts +83 -83
- package/server/plugin/bitran/transpiler.ts +48 -46
- package/server/plugin/build/close.ts +10 -10
- package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
- package/server/plugin/build/jobs/content/generic.ts +176 -176
- package/server/plugin/build/jobs/content/parse.ts +100 -100
- 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 +214 -210
- 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/content/absoluteId.ts +94 -94
- package/server/plugin/content/context.ts +116 -112
- package/server/plugin/db/entities/Book.ts +7 -7
- package/server/plugin/db/entities/Content.ts +49 -49
- package/server/plugin/db/entities/Contribution.ts +10 -10
- package/server/plugin/db/entities/Contributor.ts +16 -16
- 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/setup.ts +34 -34
- package/server/plugin/global.ts +17 -18
- package/server/plugin/importer.ts +12 -12
- package/server/plugin/index.ts +9 -9
- package/server/plugin/logger.ts +23 -23
- package/server/plugin/nav/node.ts +26 -26
- package/server/plugin/nav/utils.ts +129 -129
- package/server/plugin/repository/book.ts +21 -21
- package/server/plugin/repository/content.ts +238 -238
- package/server/plugin/repository/contributor.ts +8 -8
- package/server/plugin/repository/frontNav.ts +148 -148
- package/server/plugin/repository/topic.ts +32 -32
- package/server/tsconfig.json +9 -9
- package/shared/aside/minor.ts +50 -50
- package/shared/asset.ts +15 -15
- package/shared/bitran/context.ts +8 -8
- package/shared/bitran/default.ts +46 -46
- package/shared/bitran/link/Link.vue +166 -167
- package/shared/bitran/link/factory.ts +24 -24
- package/shared/bitran/link/languages/en.ts +7 -7
- package/shared/bitran/link/languages/ru.ts +7 -7
- package/shared/bitran/link/renderer.ts +21 -21
- package/shared/bitran/link/shared.ts +17 -17
- package/shared/bitran/link/target.ts +134 -134
- package/shared/bitran/link/transpiler.ts +10 -10
- package/shared/bitran/location.ts +166 -166
- package/shared/bitran/toc.ts +8 -8
- 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 +25 -25
- package/shared/popover.ts +8 -0
- package/shared/types/language.ts +75 -75
- package/shared/utils/objectsEqual.ts +4 -4
- package/shared/utils/stringColor.ts +9 -9
- package/test/bitran/link/target.test.ts +141 -141
- package/test/bitran/location.test.ts +143 -143
- package/tsconfig.json +8 -8
- package/utils/stress.ts +9 -9
- package/app/components/main/utils/ContentFlag.vue +0 -15
- package/app/styles/default.scss +0 -83
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
-
import { createBookFrontNav } from '@server/repository/frontNav';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler(async (event) => {
|
|
5
|
-
const bookId = getRouterParam(event, 'bookId');
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
!bookId ||
|
|
9
|
-
!ERUDIT_SERVER.NAV_BOOKS ||
|
|
10
|
-
!(bookId in ERUDIT_SERVER.NAV_BOOKS)
|
|
11
|
-
)
|
|
12
|
-
throw createError({
|
|
13
|
-
statusCode: 400,
|
|
14
|
-
statusText: `Unknown book id "${bookId}"!`,
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const bookNode = ERUDIT_SERVER.NAV_BOOKS[bookId]!;
|
|
18
|
-
|
|
19
|
-
return await createBookFrontNav(bookNode);
|
|
20
|
-
});
|
|
1
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
2
|
+
import { createBookFrontNav } from '@server/repository/frontNav';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler(async (event) => {
|
|
5
|
+
const bookId = getRouterParam(event, 'bookId');
|
|
6
|
+
|
|
7
|
+
if (
|
|
8
|
+
!bookId ||
|
|
9
|
+
!ERUDIT_SERVER.NAV_BOOKS ||
|
|
10
|
+
!(bookId in ERUDIT_SERVER.NAV_BOOKS)
|
|
11
|
+
)
|
|
12
|
+
throw createError({
|
|
13
|
+
statusCode: 400,
|
|
14
|
+
statusText: `Unknown book id "${bookId}"!`,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const bookNode = ERUDIT_SERVER.NAV_BOOKS[bookId]!;
|
|
18
|
+
|
|
19
|
+
return await createBookFrontNav(bookNode);
|
|
20
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { FrontNav } from '@erudit/shared/frontNav';
|
|
2
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
-
import { createGlobalFrontNav } from '@server/repository/frontNav';
|
|
4
|
-
|
|
5
|
-
export default defineEventHandler(async () => {
|
|
6
|
-
return (await createGlobalFrontNav(ERUDIT_SERVER.NAV, false)) as FrontNav;
|
|
7
|
-
});
|
|
1
|
+
import type { FrontNav } from '@erudit/shared/frontNav';
|
|
2
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
+
import { createGlobalFrontNav } from '@server/repository/frontNav';
|
|
4
|
+
|
|
5
|
+
export default defineEventHandler(async () => {
|
|
6
|
+
return (await createGlobalFrontNav(ERUDIT_SERVER.NAV, false)) as FrontNav;
|
|
7
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { AsideMinorNews } from '@shared/aside/minor';
|
|
2
|
-
|
|
3
|
-
export default defineEventHandler(async () => {
|
|
4
|
-
return <AsideMinorNews>{
|
|
5
|
-
type: 'news',
|
|
6
|
-
};
|
|
7
|
-
});
|
|
1
|
+
import type { AsideMinorNews } from '@shared/aside/minor';
|
|
2
|
+
|
|
3
|
+
export default defineEventHandler(async () => {
|
|
4
|
+
return <AsideMinorNews>{
|
|
5
|
+
type: 'news',
|
|
6
|
+
};
|
|
7
|
+
});
|
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import { isTopicPart } from 'erudit-cog/schema';
|
|
2
|
-
|
|
3
|
-
import type { AsideMinorContent, AsideMinorTopic } from '@shared/aside/minor';
|
|
4
|
-
import { getBitranToc } from '@erudit/server/plugin/bitran/toc';
|
|
5
|
-
import {
|
|
6
|
-
getContentContributors,
|
|
7
|
-
getFullContentId,
|
|
8
|
-
getPreviousNext,
|
|
9
|
-
} from '@erudit/server/plugin/repository/content';
|
|
10
|
-
import { getTopicPartsLinks } from '@erudit/server/plugin/repository/topic';
|
|
11
|
-
import { locationFromPath } from '@erudit/shared/bitran/location';
|
|
12
|
-
|
|
13
|
-
export default defineEventHandler(async (event) => {
|
|
14
|
-
const query = getQuery<{ path: string }>(event);
|
|
15
|
-
|
|
16
|
-
if (!query.path)
|
|
17
|
-
throw createError({
|
|
18
|
-
statusCode: 400,
|
|
19
|
-
statusText: 'Missing "path" query parameter!',
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const path = query.path.substring(1);
|
|
23
|
-
const pathStart = path.split('/')[0];
|
|
24
|
-
|
|
25
|
-
if (isTopicPart(pathStart)) return await createTopicData(path);
|
|
26
|
-
|
|
27
|
-
if (['book', 'group'].includes(pathStart))
|
|
28
|
-
return await createContentData(pathStart, path);
|
|
29
|
-
|
|
30
|
-
return 'news';
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
async function createTopicData(path: string): Promise<AsideMinorTopic> {
|
|
34
|
-
const location = locationFromPath(path);
|
|
35
|
-
|
|
36
|
-
if (!location)
|
|
37
|
-
throw createError({
|
|
38
|
-
statusCode: 400,
|
|
39
|
-
statusText: `Provided path "${path}" is not a valid topic location!`,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const contentId = location.path;
|
|
43
|
-
const fullContentId = (await getFullContentId(contentId))!;
|
|
44
|
-
|
|
45
|
-
const toc = await getBitranToc(location);
|
|
46
|
-
const previousNext = await getPreviousNext(contentId);
|
|
47
|
-
const topicPartsLinks = await getTopicPartsLinks(contentId);
|
|
48
|
-
const contributors = await getContentContributors(contentId);
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
type: 'topic',
|
|
52
|
-
fullContentId,
|
|
53
|
-
location,
|
|
54
|
-
toc,
|
|
55
|
-
nav: {
|
|
56
|
-
...previousNext,
|
|
57
|
-
...topicPartsLinks,
|
|
58
|
-
},
|
|
59
|
-
contributors,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async function createContentData(
|
|
64
|
-
type: string,
|
|
65
|
-
path: string,
|
|
66
|
-
): Promise<AsideMinorContent> {
|
|
67
|
-
const contentId = path.split('/').slice(1).join('/');
|
|
68
|
-
const fullContentId = (await getFullContentId(contentId))!;
|
|
69
|
-
const previousNext = await getPreviousNext(contentId);
|
|
70
|
-
const contributors = await getContentContributors(contentId);
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
type: type as any,
|
|
74
|
-
fullContentId,
|
|
75
|
-
nav: previousNext,
|
|
76
|
-
contributors,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
1
|
+
import { isTopicPart } from '@erudit-js/cog/schema';
|
|
2
|
+
|
|
3
|
+
import type { AsideMinorContent, AsideMinorTopic } from '@shared/aside/minor';
|
|
4
|
+
import { getBitranToc } from '@erudit/server/plugin/bitran/toc';
|
|
5
|
+
import {
|
|
6
|
+
getContentContributors,
|
|
7
|
+
getFullContentId,
|
|
8
|
+
getPreviousNext,
|
|
9
|
+
} from '@erudit/server/plugin/repository/content';
|
|
10
|
+
import { getTopicPartsLinks } from '@erudit/server/plugin/repository/topic';
|
|
11
|
+
import { locationFromPath } from '@erudit/shared/bitran/location';
|
|
12
|
+
|
|
13
|
+
export default defineEventHandler(async (event) => {
|
|
14
|
+
const query = getQuery<{ path: string }>(event);
|
|
15
|
+
|
|
16
|
+
if (!query.path)
|
|
17
|
+
throw createError({
|
|
18
|
+
statusCode: 400,
|
|
19
|
+
statusText: 'Missing "path" query parameter!',
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const path = query.path.substring(1);
|
|
23
|
+
const pathStart = path.split('/')[0];
|
|
24
|
+
|
|
25
|
+
if (isTopicPart(pathStart)) return await createTopicData(path);
|
|
26
|
+
|
|
27
|
+
if (['book', 'group'].includes(pathStart))
|
|
28
|
+
return await createContentData(pathStart, path);
|
|
29
|
+
|
|
30
|
+
return 'news';
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
async function createTopicData(path: string): Promise<AsideMinorTopic> {
|
|
34
|
+
const location = locationFromPath(path);
|
|
35
|
+
|
|
36
|
+
if (!location)
|
|
37
|
+
throw createError({
|
|
38
|
+
statusCode: 400,
|
|
39
|
+
statusText: `Provided path "${path}" is not a valid topic location!`,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const contentId = location.path;
|
|
43
|
+
const fullContentId = (await getFullContentId(contentId))!;
|
|
44
|
+
|
|
45
|
+
const toc = await getBitranToc(location);
|
|
46
|
+
const previousNext = await getPreviousNext(contentId);
|
|
47
|
+
const topicPartsLinks = await getTopicPartsLinks(contentId);
|
|
48
|
+
const contributors = await getContentContributors(contentId);
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
type: 'topic',
|
|
52
|
+
fullContentId,
|
|
53
|
+
location,
|
|
54
|
+
toc,
|
|
55
|
+
nav: {
|
|
56
|
+
...previousNext,
|
|
57
|
+
...topicPartsLinks,
|
|
58
|
+
},
|
|
59
|
+
contributors,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function createContentData(
|
|
64
|
+
type: string,
|
|
65
|
+
path: string,
|
|
66
|
+
): Promise<AsideMinorContent> {
|
|
67
|
+
const contentId = path.split('/').slice(1).join('/');
|
|
68
|
+
const fullContentId = (await getFullContentId(contentId))!;
|
|
69
|
+
const previousNext = await getPreviousNext(contentId);
|
|
70
|
+
const contributors = await getContentContributors(contentId);
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
type: type as any,
|
|
74
|
+
fullContentId,
|
|
75
|
+
nav: previousNext,
|
|
76
|
+
contributors,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { parseUrlLocation } from '@server/bitran/location';
|
|
2
|
-
import { getBitranContent } from '@server/bitran/content';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler(async (event) => {
|
|
5
|
-
setResponseHeader(event, 'Content-Type', 'application/json; charset=utf-8');
|
|
6
|
-
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
7
|
-
return await getBitranContent(location);
|
|
8
|
-
});
|
|
1
|
+
import { parseUrlLocation } from '@server/bitran/location';
|
|
2
|
+
import { getBitranContent } from '@server/bitran/content';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler(async (event) => {
|
|
5
|
+
setResponseHeader(event, 'Content-Type', 'application/json; charset=utf-8');
|
|
6
|
+
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
7
|
+
return await getBitranContent(location);
|
|
8
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { parseUrlLocation } from '@server/bitran/location';
|
|
2
|
-
import { getBitranToc } from '@server/bitran/toc';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler(async (event) => {
|
|
5
|
-
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
6
|
-
return await getBitranToc(location);
|
|
7
|
-
});
|
|
1
|
+
import { parseUrlLocation } from '@server/bitran/location';
|
|
2
|
+
import { getBitranToc } from '@server/bitran/toc';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler(async (event) => {
|
|
5
|
+
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
6
|
+
return await getBitranToc(location);
|
|
7
|
+
});
|
|
@@ -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,6 +1,6 @@
|
|
|
1
|
-
import { DbContributor } from '@server/db/entities/Contributor';
|
|
2
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
-
|
|
4
|
-
export default defineEventHandler(async () => {
|
|
5
|
-
return await ERUDIT_SERVER.DB.manager.count(DbContributor);
|
|
6
|
-
});
|
|
1
|
+
import { DbContributor } from '@server/db/entities/Contributor';
|
|
2
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
+
|
|
4
|
+
export default defineEventHandler(async () => {
|
|
5
|
+
return await ERUDIT_SERVER.DB.manager.count(DbContributor);
|
|
6
|
+
});
|
|
@@ -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
|
-
};
|
|
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
|
+
};
|
|
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
|
-
setResponseHeader(event, 'Content-Type', 'text/plain; charset=utf-8');
|
|
6
|
-
|
|
7
|
-
const phraseId = getRouterParam(event, 'phraseId');
|
|
8
|
-
const phrase =
|
|
9
|
-
ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
|
|
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
|
+
setResponseHeader(event, 'Content-Type', 'text/plain; charset=utf-8');
|
|
6
|
+
|
|
7
|
+
const phraseId = getRouterParam(event, 'phraseId');
|
|
8
|
+
const phrase =
|
|
9
|
+
ERUDIT_SERVER.LANGUAGE?.phrases?.[phraseId as EruditPhraseId];
|
|
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 '@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
|
+
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
|
+
);
|