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,57 +1,57 @@
|
|
|
1
|
-
import type { BitranContent } from '@bitran-js/renderer-vue';
|
|
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
|
-
setResponseHeader(event, 'Content-Type', 'application/json; charset=utf-8');
|
|
25
|
-
|
|
26
|
-
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
27
|
-
|
|
28
|
-
const context = await getLocationContext(location);
|
|
29
|
-
|
|
30
|
-
const dbUnique = await (async () => {
|
|
31
|
-
const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
32
|
-
select: ['productName', 'title', 'context'],
|
|
33
|
-
where: { location: stringifyBitranLocation(location) },
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
if (!dbUnique)
|
|
37
|
-
throw createError(
|
|
38
|
-
`Missing unique "${stringifyBitranLocation(location)}"!`,
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
return dbUnique as any as DbUnique;
|
|
42
|
-
})();
|
|
43
|
-
|
|
44
|
-
const bitran = await (async () => {
|
|
45
|
-
return {
|
|
46
|
-
content: await getBitranContent(location),
|
|
47
|
-
context: dbUnique.context,
|
|
48
|
-
productName: dbUnique.productName,
|
|
49
|
-
};
|
|
50
|
-
})();
|
|
51
|
-
|
|
52
|
-
return <ReturnType>{
|
|
53
|
-
context,
|
|
54
|
-
productTitle: dbUnique.title,
|
|
55
|
-
bitran,
|
|
56
|
-
};
|
|
57
|
-
});
|
|
1
|
+
import type { BitranContent } from '@bitran-js/renderer-vue';
|
|
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
|
+
setResponseHeader(event, 'Content-Type', 'application/json; charset=utf-8');
|
|
25
|
+
|
|
26
|
+
const location = parseUrlLocation(getRouterParam(event, 'location') || '');
|
|
27
|
+
|
|
28
|
+
const context = await getLocationContext(location);
|
|
29
|
+
|
|
30
|
+
const dbUnique = await (async () => {
|
|
31
|
+
const dbUnique = ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
32
|
+
select: ['productName', 'title', 'context'],
|
|
33
|
+
where: { location: stringifyBitranLocation(location) },
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (!dbUnique)
|
|
37
|
+
throw createError(
|
|
38
|
+
`Missing unique "${stringifyBitranLocation(location)}"!`,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return dbUnique as any as DbUnique;
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
const bitran = await (async () => {
|
|
45
|
+
return {
|
|
46
|
+
content: await getBitranContent(location),
|
|
47
|
+
context: dbUnique.context,
|
|
48
|
+
productName: dbUnique.productName,
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
|
|
52
|
+
return <ReturnType>{
|
|
53
|
+
context,
|
|
54
|
+
productTitle: dbUnique.title,
|
|
55
|
+
bitran,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
@@ -1,187 +1,187 @@
|
|
|
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
|
-
|
|
20
|
-
import type { BitranContext } from '@erudit/shared/bitran/context';
|
|
21
|
-
import {
|
|
22
|
-
stringifyBitranLocation,
|
|
23
|
-
type BitranLocation,
|
|
24
|
-
} from '@erudit/shared/bitran/location';
|
|
25
|
-
import { LinkNode } from '@erudit/shared/bitran/link/shared';
|
|
26
|
-
|
|
27
|
-
interface RawBitranContent {
|
|
28
|
-
context: BitranContext;
|
|
29
|
-
biCode: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export async function getBitranContent(
|
|
33
|
-
location: BitranLocation,
|
|
34
|
-
): Promise<BitranContent> {
|
|
35
|
-
const rawContent = await getRawBitranContent(location);
|
|
36
|
-
const bitranContent = await createBitranContent(
|
|
37
|
-
rawContent.context,
|
|
38
|
-
rawContent.biCode,
|
|
39
|
-
);
|
|
40
|
-
return bitranContent;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export async function getRawBitranContent(
|
|
44
|
-
location: BitranLocation,
|
|
45
|
-
): Promise<RawBitranContent> {
|
|
46
|
-
const throwNotFound = () => {
|
|
47
|
-
throw createError({
|
|
48
|
-
statusCode: 404,
|
|
49
|
-
statusText: `Can't find content for location "${stringifyBitranLocation(location)}"!`,
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
if (location.unique) {
|
|
54
|
-
const dbUnique = await ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
55
|
-
where: { location: stringifyBitranLocation(location) },
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
if (!dbUnique) throwNotFound();
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
biCode: dbUnique!.content,
|
|
62
|
-
context: dbUnique!.context,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (isTopicPart(location.type)) {
|
|
67
|
-
const topicPart = location.type as TopicPart;
|
|
68
|
-
|
|
69
|
-
const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
|
|
70
|
-
select: ['contentId', topicPart],
|
|
71
|
-
where: { contentId: location.path },
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
if (!dbTopic) throwNotFound();
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
biCode: dbTopic![topicPart]!,
|
|
78
|
-
context: { location, aliases: NO_ALIASES() },
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (location.type === 'group') {
|
|
83
|
-
const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
|
|
84
|
-
select: ['contentId', 'content'],
|
|
85
|
-
where: { contentId: location.path },
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
if (!dbGroup) throwNotFound();
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
biCode: dbGroup!.content!,
|
|
92
|
-
context: { location, aliases: NO_ALIASES() },
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return throwNotFound();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async function createBitranContent(
|
|
100
|
-
context: BitranContext,
|
|
101
|
-
biCode: string,
|
|
102
|
-
): Promise<BitranContent> {
|
|
103
|
-
const bitranTranspiler = await createBitranTranspiler();
|
|
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
|
-
}
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const finalContent = await bitranTranspiler.stringifier.stringify(root);
|
|
120
|
-
|
|
121
|
-
// Building render data
|
|
122
|
-
const preRenderDataMap: Record<string, PreRenderData> = {};
|
|
123
|
-
await bitranTranspiler.parser.parse(finalContent, {
|
|
124
|
-
step: async (node) => {
|
|
125
|
-
const id = node.
|
|
126
|
-
const elementTranspiler = bitranTranspiler.transpilers[node.name]!;
|
|
127
|
-
|
|
128
|
-
if (node instanceof LinkNode) {
|
|
129
|
-
try {
|
|
130
|
-
preRenderDataMap[id] = {
|
|
131
|
-
type: 'success',
|
|
132
|
-
data: await resolveLinkTarget(node.parseData, {
|
|
133
|
-
location: context.location,
|
|
134
|
-
aliases: context.aliases ?? {},
|
|
135
|
-
}),
|
|
136
|
-
};
|
|
137
|
-
} catch (error: any) {
|
|
138
|
-
preRenderDataMap[id] = {
|
|
139
|
-
type: 'error',
|
|
140
|
-
message: error?.message || String(error),
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (id) {
|
|
147
|
-
const preRenderData = await createPreRenderData(
|
|
148
|
-
node,
|
|
149
|
-
elementTranspiler,
|
|
150
|
-
);
|
|
151
|
-
if (preRenderData) preRenderDataMap[id] = preRenderData;
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
return {
|
|
157
|
-
biCode: finalContent,
|
|
158
|
-
preRenderData: preRenderDataMap,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
async function resolveInclude(
|
|
163
|
-
includeNode: IncludeNode,
|
|
164
|
-
context: BitranContext,
|
|
165
|
-
): Promise<IncludeNode> {
|
|
166
|
-
let _blocks;
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
const blocks: BlockNode[] = [];
|
|
170
|
-
|
|
171
|
-
await traverseInclude(includeNode, context, {
|
|
172
|
-
step: async ({ _node }) => {
|
|
173
|
-
if (_node instanceof BlockNode) blocks.push(_node);
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const blocksNode = new BlocksNode(includeNode);
|
|
178
|
-
blocksNode.setNodes(blocks);
|
|
179
|
-
_blocks = blocksNode;
|
|
180
|
-
includeNode.parseData.blocks = _blocks;
|
|
181
|
-
} catch (error: any) {
|
|
182
|
-
includeNode.parseData.error = error?.message || error;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
includeNode.parseData.resolved = true;
|
|
186
|
-
return includeNode;
|
|
187
|
-
}
|
|
1
|
+
import { isTopicPart, type TopicPart } from '@erudit-js/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
|
+
|
|
20
|
+
import type { BitranContext } from '@erudit/shared/bitran/context';
|
|
21
|
+
import {
|
|
22
|
+
stringifyBitranLocation,
|
|
23
|
+
type BitranLocation,
|
|
24
|
+
} from '@erudit/shared/bitran/location';
|
|
25
|
+
import { LinkNode } from '@erudit/shared/bitran/link/shared';
|
|
26
|
+
|
|
27
|
+
interface RawBitranContent {
|
|
28
|
+
context: BitranContext;
|
|
29
|
+
biCode: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function getBitranContent(
|
|
33
|
+
location: BitranLocation,
|
|
34
|
+
): Promise<BitranContent> {
|
|
35
|
+
const rawContent = await getRawBitranContent(location);
|
|
36
|
+
const bitranContent = await createBitranContent(
|
|
37
|
+
rawContent.context,
|
|
38
|
+
rawContent.biCode,
|
|
39
|
+
);
|
|
40
|
+
return bitranContent;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function getRawBitranContent(
|
|
44
|
+
location: BitranLocation,
|
|
45
|
+
): Promise<RawBitranContent> {
|
|
46
|
+
const throwNotFound = () => {
|
|
47
|
+
throw createError({
|
|
48
|
+
statusCode: 404,
|
|
49
|
+
statusText: `Can't find content for location "${stringifyBitranLocation(location)}"!`,
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (location.unique) {
|
|
54
|
+
const dbUnique = await ERUDIT_SERVER.DB.manager.findOne(DbUnique, {
|
|
55
|
+
where: { location: stringifyBitranLocation(location) },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (!dbUnique) throwNotFound();
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
biCode: dbUnique!.content,
|
|
62
|
+
context: dbUnique!.context,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (isTopicPart(location.type)) {
|
|
67
|
+
const topicPart = location.type as TopicPart;
|
|
68
|
+
|
|
69
|
+
const dbTopic = await ERUDIT_SERVER.DB.manager.findOne(DbTopic, {
|
|
70
|
+
select: ['contentId', topicPart],
|
|
71
|
+
where: { contentId: location.path },
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (!dbTopic) throwNotFound();
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
biCode: dbTopic![topicPart]!,
|
|
78
|
+
context: { location, aliases: NO_ALIASES() },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (location.type === 'group') {
|
|
83
|
+
const dbGroup = await ERUDIT_SERVER.DB.manager.findOne(DbGroup, {
|
|
84
|
+
select: ['contentId', 'content'],
|
|
85
|
+
where: { contentId: location.path },
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (!dbGroup) throwNotFound();
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
biCode: dbGroup!.content!,
|
|
92
|
+
context: { location, aliases: NO_ALIASES() },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return throwNotFound();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function createBitranContent(
|
|
100
|
+
context: BitranContext,
|
|
101
|
+
biCode: string,
|
|
102
|
+
): Promise<BitranContent> {
|
|
103
|
+
const bitranTranspiler = await createBitranTranspiler();
|
|
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
|
+
}
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const finalContent = await bitranTranspiler.stringifier.stringify(root);
|
|
120
|
+
|
|
121
|
+
// Building render data
|
|
122
|
+
const preRenderDataMap: Record<string, PreRenderData> = {};
|
|
123
|
+
await bitranTranspiler.parser.parse(finalContent, {
|
|
124
|
+
step: async (node) => {
|
|
125
|
+
const id = node.autoId;
|
|
126
|
+
const elementTranspiler = bitranTranspiler.transpilers[node.name]!;
|
|
127
|
+
|
|
128
|
+
if (node instanceof LinkNode) {
|
|
129
|
+
try {
|
|
130
|
+
preRenderDataMap[id] = {
|
|
131
|
+
type: 'success',
|
|
132
|
+
data: await resolveLinkTarget(node.parseData, {
|
|
133
|
+
location: context.location,
|
|
134
|
+
aliases: context.aliases ?? {},
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
} catch (error: any) {
|
|
138
|
+
preRenderDataMap[id] = {
|
|
139
|
+
type: 'error',
|
|
140
|
+
message: error?.message || String(error),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (id) {
|
|
147
|
+
const preRenderData = await createPreRenderData(
|
|
148
|
+
node,
|
|
149
|
+
elementTranspiler,
|
|
150
|
+
);
|
|
151
|
+
if (preRenderData) preRenderDataMap[id] = preRenderData;
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
biCode: finalContent,
|
|
158
|
+
preRenderData: preRenderDataMap,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async function resolveInclude(
|
|
163
|
+
includeNode: IncludeNode,
|
|
164
|
+
context: BitranContext,
|
|
165
|
+
): Promise<IncludeNode> {
|
|
166
|
+
let _blocks;
|
|
167
|
+
|
|
168
|
+
try {
|
|
169
|
+
const blocks: BlockNode[] = [];
|
|
170
|
+
|
|
171
|
+
await traverseInclude(includeNode, context, {
|
|
172
|
+
step: async ({ _node }) => {
|
|
173
|
+
if (_node instanceof BlockNode) blocks.push(_node);
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const blocksNode = new BlocksNode(includeNode);
|
|
178
|
+
blocksNode.setNodes(blocks);
|
|
179
|
+
_blocks = blocksNode;
|
|
180
|
+
includeNode.parseData.blocks = _blocks;
|
|
181
|
+
} catch (error: any) {
|
|
182
|
+
includeNode.parseData.error = error?.message || error;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
includeNode.parseData.resolved = true;
|
|
186
|
+
return includeNode;
|
|
187
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
decodeBitranLocation,
|
|
3
|
-
parseBitranLocation,
|
|
4
|
-
} from '@erudit/shared/bitran/location';
|
|
5
|
-
|
|
6
|
-
export function parseUrlLocation(urlLocation: string) {
|
|
7
|
-
urlLocation = decodeURIComponent(urlLocation);
|
|
8
|
-
urlLocation = decodeBitranLocation(urlLocation);
|
|
9
|
-
|
|
10
|
-
if (!urlLocation)
|
|
11
|
-
throw createError({
|
|
12
|
-
statusCode: 500,
|
|
13
|
-
statusText: 'Empty content location router parameter!',
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
return parseBitranLocation(urlLocation);
|
|
18
|
-
} catch (error: any) {
|
|
19
|
-
throw createError({
|
|
20
|
-
statusCode: 404,
|
|
21
|
-
statusText:
|
|
22
|
-
error?.message || `Can't parse location "${urlLocation}"!`,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
decodeBitranLocation,
|
|
3
|
+
parseBitranLocation,
|
|
4
|
+
} from '@erudit/shared/bitran/location';
|
|
5
|
+
|
|
6
|
+
export function parseUrlLocation(urlLocation: string) {
|
|
7
|
+
urlLocation = decodeURIComponent(urlLocation);
|
|
8
|
+
urlLocation = decodeBitranLocation(urlLocation);
|
|
9
|
+
|
|
10
|
+
if (!urlLocation)
|
|
11
|
+
throw createError({
|
|
12
|
+
statusCode: 500,
|
|
13
|
+
statusText: 'Empty content location router parameter!',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
return parseBitranLocation(urlLocation);
|
|
18
|
+
} catch (error: any) {
|
|
19
|
+
throw createError({
|
|
20
|
+
statusCode: 404,
|
|
21
|
+
statusText:
|
|
22
|
+
error?.message || `Can't parse location "${urlLocation}"!`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|