erudit 3.0.0-dev.2 → 3.0.0-dev.21
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/assets/icons/cameo-add.svg +3 -0
- package/app/assets/icons/diamond.svg +3 -0
- package/app/assets/icons/graduation.svg +3 -0
- package/app/components/Avatar.vue +118 -0
- package/app/components/EruditLink.vue +17 -0
- package/app/components/Loading.vue +23 -23
- package/app/components/SiteAside.vue +393 -382
- package/app/components/SiteMain.vue +32 -35
- package/app/components/ads/Ads.vue +33 -0
- package/app/components/ads/AdsBannerAside.vue +61 -0
- package/app/components/ads/AdsBannerBottom.vue +22 -0
- package/app/components/ads/AdsProviderCustom.vue +35 -0
- package/app/components/ads/AdsProviderYandex.vue +91 -0
- package/app/components/ads/AdsReplacer.vue +73 -0
- package/app/components/aside/AsideListItem.vue +91 -74
- package/app/components/aside/AsideMajor.vue +56 -56
- package/app/components/aside/AsideMinor.vue +97 -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 +50 -34
- package/app/components/aside/major/panes/Search.vue +11 -11
- package/app/components/aside/major/panes/nav/Nav.vue +92 -91
- package/app/components/aside/major/panes/nav/NavBook.vue +95 -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 +13 -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/{Contribute.vue → AsideMinorContribute.vue} +175 -145
- 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 +66 -67
- package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
- package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
- package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
- package/app/components/aside/minor/topic/AsideMinorTopic.vue +31 -32
- package/app/components/aside/minor/topic/TopicContributors.vue +183 -177
- package/app/components/aside/minor/topic/TopicNav.vue +49 -49
- package/app/components/aside/minor/topic/TopicToc.vue +212 -203
- package/app/components/aside/minor/topic/TopicTocItem.vue +19 -31
- package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
- package/app/components/bitran/BitranContent.vue +90 -63
- package/app/components/bitran/RenderWrapper.vue +10 -10
- package/app/components/contributor/ContributorListItem.vue +43 -35
- package/app/components/main/MainActionButton.vue +51 -0
- package/app/components/main/MainBitranContent.vue +55 -0
- package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +63 -75
- package/app/components/main/MainDescription.vue +24 -0
- package/app/components/main/MainSection.vue +58 -0
- package/app/components/main/MainTitle.vue +76 -0
- package/app/components/main/cameo/MainCameo.vue +135 -0
- package/app/components/main/cameo/MainCameoData.vue +232 -0
- package/app/components/main/content/ContentBreadcrumb.vue +28 -0
- package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
- package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
- package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
- package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
- package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
- package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
- package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
- package/app/components/main/topic/MainTopic.vue +76 -79
- package/app/components/main/topic/TopicPartSwitch.vue +119 -118
- 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 +22 -20
- package/app/components/preview/display/Unique.vue +46 -49
- package/app/components/sponsor/SponsorTier1.vue +89 -0
- package/app/components/sponsor/SponsorTier2.vue +109 -0
- package/app/components/transition/Fade.vue +19 -19
- package/app/components/tree/TreeContainer.vue +11 -11
- package/app/components/tree/TreeItem.vue +93 -89
- package/app/composables/adsAllowed.ts +11 -0
- package/app/composables/asset.ts +12 -0
- package/app/composables/bitran.ts +108 -127
- package/app/composables/bitranLocation.ts +7 -7
- package/app/composables/contentData.ts +38 -36
- package/app/composables/contentPage.ts +168 -156
- package/app/composables/contentRoute.ts +45 -45
- package/app/composables/darkMagic.ts +24 -24
- package/app/composables/externalApi.ts +69 -63
- package/app/composables/favicon.ts +8 -8
- package/app/composables/formatText.ts +99 -86
- package/app/composables/head.ts +24 -0
- package/app/composables/majorPane.ts +62 -60
- package/app/composables/phrases.ts +77 -80
- package/app/composables/theme.ts +29 -29
- package/app/composables/url.ts +43 -33
- package/app/pages/_test/preview.vue +110 -110
- package/app/pages/article/[...articleId].vue +3 -3
- package/app/pages/book/[...bookId].vue +42 -47
- package/app/pages/contributor/[contributorId].vue +227 -0
- package/app/pages/contributors.vue +184 -0
- package/app/pages/group/[...groupId].vue +53 -65
- package/app/pages/index.vue +32 -32
- package/app/pages/practice/[...practice].vue +3 -3
- package/app/pages/sponsors.vue +95 -0
- package/app/pages/summary/[...summaryId].vue +3 -3
- package/app/plugins/analytics.ts +95 -0
- package/app/plugins/prerender.server.ts +34 -0
- 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/flag.ts +28 -28
- package/app/scripts/og.ts +28 -27
- package/app/scripts/preview/build.ts +76 -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 +23 -20
- package/app/scripts/preview/data/unique.ts +69 -70
- package/app/scripts/preview/data.ts +24 -24
- package/app/scripts/preview/display.ts +37 -37
- package/app/scripts/preview/footer.ts +9 -9
- package/app/scripts/preview/request.ts +51 -51
- package/app/scripts/preview/state.ts +63 -63
- package/app/styles/_immediate.css +7 -7
- package/app/styles/_util.scss +43 -43
- package/app/styles/_utils.scss +44 -44
- package/app/styles/app.scss +91 -91
- package/app/styles/def/_bp.scss +27 -27
- package/app/styles/def/_size.scss +7 -7
- package/app/styles/def/_z.scss +5 -5
- package/app/styles/normalize.scss +49 -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/bin/erudit.mjs +2 -0
- package/const.ts +3 -0
- package/globalPath.ts +21 -21
- package/globals/bitran.ts +1 -47
- package/globals/cameo.ts +5 -0
- package/globals/content.ts +27 -22
- package/globals/contributor.ts +5 -5
- package/globals/erudit.ts +5 -5
- package/globals/register.ts +23 -18
- package/globals/sponsor.ts +17 -0
- package/languages/en.ts +108 -95
- package/languages/ru.ts +112 -99
- package/module/bitran.ts +66 -34
- package/module/config.ts +35 -34
- package/module/imports.ts +74 -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 +126 -112
- package/package.json +22 -15
- package/server/api/aside/major/nav/bookIds.ts +5 -5
- package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
- package/server/api/aside/major/nav/global.ts +7 -7
- package/server/api/aside/minor/book/[...bookId].ts +18 -0
- package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
- package/server/api/aside/minor/group/[...groupId].ts +18 -0
- package/server/api/aside/minor/news.ts +7 -7
- package/server/api/aside/minor/topic.ts +36 -0
- package/server/api/bitran/content/[...location].ts +13 -0
- package/server/api/bitran/toc/[...location].ts +9 -0
- package/server/api/cameo/data/[cameoId].ts +42 -0
- package/server/api/cameo/ids.ts +5 -0
- package/server/api/content/data.ts +75 -72
- package/server/api/contributor/count.ts +6 -6
- package/server/api/contributor/list.ts +44 -0
- package/server/api/contributor/page/[contributorId].ts +14 -0
- package/server/api/fake/content.ts +11 -11
- package/server/api/fake/shared/languages.ts +12 -12
- package/server/api/language/functions.ts +12 -12
- package/server/api/language/phrase/[phraseId].ts +19 -19
- package/server/api/language/phraseIds.ts +8 -8
- package/server/api/prerender/assets/cameo.ts +14 -0
- package/server/api/prerender/assets/contributor.ts +12 -0
- package/server/api/prerender/assets/sponsor.ts +13 -0
- package/server/api/prerender/cameos.ts +12 -0
- package/server/api/prerender/language.ts +9 -0
- package/server/api/preview/page/[...parts].ts +78 -51
- package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
- package/server/api/problem/generator/[...path].ts +26 -0
- package/server/api/sponsor/cameo/data/[sponsorId].ts +51 -0
- package/server/api/sponsor/cameo/ids.ts +5 -0
- package/server/api/sponsor/count.ts +5 -0
- package/server/api/sponsor/list.ts +36 -0
- package/server/plugin/bitran/content.ts +252 -187
- package/server/plugin/bitran/{products → elements}/include.ts +229 -230
- package/server/plugin/bitran/location.ts +43 -25
- package/server/plugin/bitran/toc.ts +94 -83
- package/server/plugin/bitran/transpiler.ts +18 -46
- package/server/plugin/build/close.ts +12 -10
- package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
- package/server/plugin/build/jobs/content/generic.ts +191 -176
- package/server/plugin/build/jobs/content/parse.ts +113 -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 +69 -66
- package/server/plugin/build/jobs/language.ts +36 -36
- package/server/plugin/build/jobs/nav.ts +345 -210
- package/server/plugin/build/process.ts +34 -25
- package/server/plugin/build/rebuild.ts +68 -55
- package/server/plugin/build/setup.ts +19 -21
- package/server/plugin/content/context.ts +119 -112
- package/server/plugin/db/entities/Book.ts +7 -7
- package/server/plugin/db/entities/Content.ts +45 -49
- package/server/plugin/db/entities/Contribution.ts +10 -10
- package/server/plugin/db/entities/Contributor.ts +25 -16
- package/server/plugin/db/entities/File.ts +10 -0
- package/server/plugin/db/entities/Group.ts +14 -14
- package/server/plugin/db/entities/Hash.ts +15 -15
- package/server/plugin/db/entities/Topic.ts +20 -20
- package/server/plugin/db/entities/Unique.ts +21 -21
- package/server/plugin/db/reset.ts +12 -0
- package/server/plugin/db/setup.ts +49 -34
- package/server/plugin/global.ts +18 -18
- package/server/plugin/importer.ts +16 -12
- package/server/plugin/index.ts +9 -9
- package/server/plugin/logger.ts +23 -23
- package/server/plugin/nav/node.ts +27 -26
- package/server/plugin/nav/utils.ts +179 -129
- package/server/plugin/repository/asideMinor.ts +51 -0
- package/server/plugin/repository/book.ts +39 -21
- package/server/plugin/repository/cameo.ts +16 -0
- package/server/plugin/repository/content.ts +240 -238
- package/server/plugin/repository/contentId.ts +40 -0
- package/server/plugin/repository/contributor.ts +129 -8
- package/server/plugin/repository/file.ts +10 -0
- package/server/plugin/repository/frontNav.ts +145 -148
- package/server/plugin/repository/topic.ts +35 -32
- package/server/plugin/sponsor/build.ts +82 -0
- package/server/plugin/sponsor/index.ts +5 -0
- package/server/plugin/sponsor/repository.ts +56 -0
- package/server/routes/asset/[...assetPath].ts +34 -0
- package/server/routes/robots.txt.ts +9 -0
- package/server/routes/sitemap.xml.ts +103 -0
- package/server/tsconfig.json +9 -9
- package/shared/aside/minor.ts +55 -50
- package/shared/asset.ts +17 -15
- package/shared/bitran/content.ts +9 -0
- package/shared/bitran/contentId.ts +56 -0
- package/shared/bitran/toc.ts +8 -8
- package/shared/breadcrumb.ts +7 -0
- package/shared/content/bookId.ts +12 -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/contributor.ts +34 -5
- package/shared/frontNav.ts +41 -41
- package/shared/icons.ts +38 -38
- package/shared/image.ts +5 -5
- package/shared/link.ts +28 -25
- package/shared/popover.ts +8 -0
- package/shared/types/language.ts +84 -75
- package/shared/utils/objectsEqual.ts +4 -4
- package/shared/utils/stringColor.ts +9 -9
- package/test/contentId.test.ts +91 -0
- package/test/utils/url.test.ts +99 -0
- package/tsconfig.json +8 -8
- package/utils/contentPath.ts +67 -0
- package/utils/ext.ts +41 -0
- package/utils/stress.ts +9 -9
- package/utils/url.ts +23 -0
- package/app/components/ads/BannerTemplate.vue +0 -51
- package/app/components/ads/BottomBanner.vue +0 -45
- package/app/components/ads/LeftBanner.vue +0 -50
- package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
- package/app/components/contributor/ContributorAvatar.vue +0 -43
- package/app/components/main/utils/ContentDescription.vue +0 -19
- package/app/components/main/utils/ContentFlag.vue +0 -15
- package/app/components/main/utils/ContentSection.vue +0 -45
- package/app/components/main/utils/ContentTitle.vue +0 -39
- package/app/composables/bitranContent.ts +0 -37
- package/app/pages/members.vue +0 -6
- package/app/public/user.svg +0 -10
- package/app/scripts/aside/minor/topic.ts +0 -3
- package/app/styles/default.scss +0 -83
- package/server/api/aside/minor/path.ts +0 -78
- package/server/api/bitran/content/[location].ts +0 -7
- package/server/api/bitran/toc/[location].ts +0 -7
- package/server/plugin/bitran/products/link.ts +0 -116
- package/server/plugin/bitran/setup.ts +0 -9
- package/server/plugin/content/absoluteId.ts +0 -94
- package/shared/bitran/context.ts +0 -8
- package/shared/bitran/default.ts +0 -46
- package/shared/bitran/link/Link.vue +0 -167
- package/shared/bitran/link/factory.ts +0 -24
- package/shared/bitran/link/icon.svg +0 -3
- package/shared/bitran/link/languages/en.ts +0 -7
- package/shared/bitran/link/languages/ru.ts +0 -7
- package/shared/bitran/link/renderer.ts +0 -21
- package/shared/bitran/link/shared.ts +0 -17
- package/shared/bitran/link/target.ts +0 -134
- package/shared/bitran/link/transpiler.ts +0 -10
- package/shared/bitran/location.ts +0 -166
- package/test/bitran/link/target.test.ts +0 -141
- package/test/bitran/location.test.ts +0 -143
|
@@ -1,100 +1,113 @@
|
|
|
1
|
-
import { ElementNode, walkForward } from '@bitran-js/core';
|
|
2
|
-
import { type BitranTranspiler } from '@bitran-js/transpiler';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
mergeAliases,
|
|
6
|
-
NO_ALIASES,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
context.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
await
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
1
|
+
import { ElementNode, walkForward } from '@bitran-js/core';
|
|
2
|
+
import { type BitranTranspiler } from '@bitran-js/transpiler';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
mergeAliases,
|
|
6
|
+
NO_ALIASES,
|
|
7
|
+
stringifyBitranLocation,
|
|
8
|
+
type BitranContext,
|
|
9
|
+
type BitranLocation,
|
|
10
|
+
} from '@erudit-js/cog/schema';
|
|
11
|
+
import { AliasesNode } from '@erudit-js/bitran-elements/aliases/shared';
|
|
12
|
+
import { DetailsNode } from '@erudit-js/bitran-elements/details/shared';
|
|
13
|
+
import { HeadingNode } from '@erudit-js/bitran-elements/heading/shared';
|
|
14
|
+
|
|
15
|
+
import { createBitranTranspiler } from '@server/bitran/transpiler';
|
|
16
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
17
|
+
import { DbUnique } from '@server/db/entities/Unique';
|
|
18
|
+
|
|
19
|
+
let context: BitranContext = {} as any;
|
|
20
|
+
let bitranTranspiler: BitranTranspiler;
|
|
21
|
+
|
|
22
|
+
const blocksAfterHeading = 2;
|
|
23
|
+
|
|
24
|
+
export async function parseBitranContent(
|
|
25
|
+
location: BitranLocation,
|
|
26
|
+
biCode: string,
|
|
27
|
+
) {
|
|
28
|
+
// Reset Bitran context in order not to create core each time
|
|
29
|
+
context.location = location;
|
|
30
|
+
context.aliases = NO_ALIASES();
|
|
31
|
+
|
|
32
|
+
bitranTranspiler ||= await createBitranTranspiler({
|
|
33
|
+
context,
|
|
34
|
+
eruditConfig: ERUDIT_SERVER.CONFIG,
|
|
35
|
+
insideInclude: false,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Tracking heading nodes to deal with them later
|
|
39
|
+
const headings: HeadingNode[] = [];
|
|
40
|
+
|
|
41
|
+
await bitranTranspiler.parser.parse(biCode, {
|
|
42
|
+
async step(node) {
|
|
43
|
+
const meta = node.meta;
|
|
44
|
+
const uniqueId = meta?.id;
|
|
45
|
+
|
|
46
|
+
if (node instanceof AliasesNode) {
|
|
47
|
+
mergeAliases(context.aliases, node.parseData);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (uniqueId) {
|
|
51
|
+
if (node instanceof HeadingNode) {
|
|
52
|
+
headings.push(node);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (node instanceof DetailsNode) {
|
|
57
|
+
await addUnique(
|
|
58
|
+
node,
|
|
59
|
+
await bitranTranspiler.stringifier.stringify(
|
|
60
|
+
node.parseData,
|
|
61
|
+
),
|
|
62
|
+
);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
await addUnique(node);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
for (const heading of headings) {
|
|
72
|
+
let blocksAfter = 0;
|
|
73
|
+
let content = await bitranTranspiler.stringifier.stringify(heading);
|
|
74
|
+
|
|
75
|
+
await walkForward(heading, async (node) => {
|
|
76
|
+
if (blocksAfter >= blocksAfterHeading) return false;
|
|
77
|
+
|
|
78
|
+
if (node instanceof AliasesNode) return;
|
|
79
|
+
if (node instanceof DetailsNode) return;
|
|
80
|
+
// Todo
|
|
81
|
+
|
|
82
|
+
content +=
|
|
83
|
+
'\n\n' + (await bitranTranspiler.stringifier.stringify(node));
|
|
84
|
+
|
|
85
|
+
blocksAfter++;
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
await addUnique(heading, content);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//
|
|
92
|
+
//
|
|
93
|
+
//
|
|
94
|
+
|
|
95
|
+
function createUniqueLocation(node: ElementNode) {
|
|
96
|
+
return stringifyBitranLocation({
|
|
97
|
+
...location,
|
|
98
|
+
...{ unique: node.meta.id! },
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function addUnique(node: ElementNode, content?: string) {
|
|
103
|
+
const dbUnique = new DbUnique();
|
|
104
|
+
dbUnique.location = createUniqueLocation(node);
|
|
105
|
+
dbUnique.content =
|
|
106
|
+
content || (await bitranTranspiler.stringifier.stringify(node));
|
|
107
|
+
dbUnique.title = node.parseData?.title || node.meta?.title || null;
|
|
108
|
+
dbUnique.productName = node.name;
|
|
109
|
+
dbUnique.context = context;
|
|
110
|
+
|
|
111
|
+
await ERUDIT_SERVER.DB.manager.save(dbUnique);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PROJECT_DIR } from '#erudit/globalPaths';
|
|
2
|
-
import type { NavNode } from '@server/nav/node';
|
|
3
|
-
|
|
4
|
-
export function contentItemPath(navNode: NavNode, path?: string) {
|
|
5
|
-
return PROJECT_DIR + `/content/${navNode.
|
|
6
|
-
}
|
|
1
|
+
import { PROJECT_DIR } from '#erudit/globalPaths';
|
|
2
|
+
import type { NavNode } from '@server/nav/node';
|
|
3
|
+
|
|
4
|
+
export function contentItemPath(navNode: NavNode, path?: string) {
|
|
5
|
+
return PROJECT_DIR + `/content/${navNode.fsPath}${path ? '/' + path : ''}`;
|
|
6
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DbBook } from '@server/db/entities/Book';
|
|
2
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
-
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
4
|
-
|
|
5
|
-
export async function buildBook({ dbContent }: BuilderFunctionArgs) {
|
|
6
|
-
const dbBook = new DbBook();
|
|
7
|
-
dbBook.contentId = dbContent.contentId;
|
|
8
|
-
await ERUDIT_SERVER.DB.manager.save(dbBook);
|
|
9
|
-
}
|
|
1
|
+
import { DbBook } from '@server/db/entities/Book';
|
|
2
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
3
|
+
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
4
|
+
|
|
5
|
+
export async function buildBook({ dbContent }: BuilderFunctionArgs) {
|
|
6
|
+
const dbBook = new DbBook();
|
|
7
|
+
dbBook.contentId = dbContent.contentId;
|
|
8
|
+
await ERUDIT_SERVER.DB.manager.save(dbBook);
|
|
9
|
+
}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import type { GroupConfig } from 'erudit-cog/schema';
|
|
3
|
-
|
|
4
|
-
import { DbGroup } from '@server/db/entities/Group';
|
|
5
|
-
import { ERUDIT_SERVER } from '@erudit/server/plugin/global';
|
|
6
|
-
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
7
|
-
import { contentItemPath } from '../path';
|
|
8
|
-
import { parseBitranContent } from '../parse';
|
|
9
|
-
|
|
10
|
-
export async function buildGroup({
|
|
11
|
-
navNode,
|
|
12
|
-
config,
|
|
13
|
-
}: BuilderFunctionArgs<GroupConfig>) {
|
|
14
|
-
const dbGroup = new DbGroup();
|
|
15
|
-
dbGroup.contentId = navNode.
|
|
16
|
-
dbGroup.type = config?.type || 'folder';
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const strContent = readFileSync(
|
|
20
|
-
contentItemPath(navNode, 'content.bi'),
|
|
21
|
-
'utf-8',
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
if (strContent) {
|
|
25
|
-
dbGroup.content = strContent;
|
|
26
|
-
await parseBitranContent(
|
|
27
|
-
{
|
|
28
|
-
type: 'group',
|
|
29
|
-
path:
|
|
30
|
-
},
|
|
31
|
-
strContent,
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
} catch {}
|
|
35
|
-
|
|
36
|
-
await ERUDIT_SERVER.DB.manager.save(dbGroup);
|
|
37
|
-
}
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import type { GroupConfig } from '@erudit-js/cog/schema';
|
|
3
|
+
|
|
4
|
+
import { DbGroup } from '@server/db/entities/Group';
|
|
5
|
+
import { ERUDIT_SERVER } from '@erudit/server/plugin/global';
|
|
6
|
+
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
7
|
+
import { contentItemPath } from '../path';
|
|
8
|
+
import { parseBitranContent } from '../parse';
|
|
9
|
+
|
|
10
|
+
export async function buildGroup({
|
|
11
|
+
navNode,
|
|
12
|
+
config,
|
|
13
|
+
}: BuilderFunctionArgs<GroupConfig>) {
|
|
14
|
+
const dbGroup = new DbGroup();
|
|
15
|
+
dbGroup.contentId = navNode.fullId;
|
|
16
|
+
dbGroup.type = config?.type || 'folder';
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const strContent = readFileSync(
|
|
20
|
+
contentItemPath(navNode, 'content.bi'),
|
|
21
|
+
'utf-8',
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
if (strContent) {
|
|
25
|
+
dbGroup.content = strContent;
|
|
26
|
+
await parseBitranContent(
|
|
27
|
+
{
|
|
28
|
+
type: 'group',
|
|
29
|
+
path: dbGroup.contentId,
|
|
30
|
+
},
|
|
31
|
+
strContent,
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
} catch {}
|
|
35
|
+
|
|
36
|
+
await ERUDIT_SERVER.DB.manager.save(dbGroup);
|
|
37
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { topicParts, type TopicPart } from 'erudit-cog/schema';
|
|
3
|
-
|
|
4
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
5
|
-
import { DbTopic } from '@server/db/entities/Topic';
|
|
6
|
-
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
7
|
-
import { contentItemPath } from '../path';
|
|
8
|
-
import { parseBitranContent } from '../parse';
|
|
9
|
-
|
|
10
|
-
export async function buildTopic({ navNode }: BuilderFunctionArgs) {
|
|
11
|
-
const dbTopic = new DbTopic();
|
|
12
|
-
dbTopic.contentId = navNode.
|
|
13
|
-
const existingTopicParts: TopicPart[] = [];
|
|
14
|
-
|
|
15
|
-
for (const topicPart of topicParts) {
|
|
16
|
-
const partPath = contentItemPath(navNode, `${topicPart}.bi`);
|
|
17
|
-
const strContent =
|
|
18
|
-
existsSync(partPath) && readFileSync(partPath, 'utf-8');
|
|
19
|
-
|
|
20
|
-
if (strContent === false) continue;
|
|
21
|
-
|
|
22
|
-
existingTopicParts.push(topicPart);
|
|
23
|
-
dbTopic[topicPart] = strContent;
|
|
24
|
-
|
|
25
|
-
await parseBitranContent(
|
|
26
|
-
{
|
|
27
|
-
type: topicPart,
|
|
28
|
-
path:
|
|
29
|
-
},
|
|
30
|
-
strContent,
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
dbTopic.parts = existingTopicParts;
|
|
35
|
-
await ERUDIT_SERVER.DB.manager.save(dbTopic);
|
|
36
|
-
}
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { topicParts, type TopicPart } from '@erudit-js/cog/schema';
|
|
3
|
+
|
|
4
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
5
|
+
import { DbTopic } from '@server/db/entities/Topic';
|
|
6
|
+
import type { BuilderFunctionArgs } from '../builderArgs';
|
|
7
|
+
import { contentItemPath } from '../path';
|
|
8
|
+
import { parseBitranContent } from '../parse';
|
|
9
|
+
|
|
10
|
+
export async function buildTopic({ navNode }: BuilderFunctionArgs) {
|
|
11
|
+
const dbTopic = new DbTopic();
|
|
12
|
+
dbTopic.contentId = navNode.fullId;
|
|
13
|
+
const existingTopicParts: TopicPart[] = [];
|
|
14
|
+
|
|
15
|
+
for (const topicPart of topicParts) {
|
|
16
|
+
const partPath = contentItemPath(navNode, `${topicPart}.bi`);
|
|
17
|
+
const strContent =
|
|
18
|
+
existsSync(partPath) && readFileSync(partPath, 'utf-8');
|
|
19
|
+
|
|
20
|
+
if (strContent === false) continue;
|
|
21
|
+
|
|
22
|
+
existingTopicParts.push(topicPart);
|
|
23
|
+
dbTopic[topicPart] = strContent;
|
|
24
|
+
|
|
25
|
+
await parseBitranContent(
|
|
26
|
+
{
|
|
27
|
+
type: topicPart,
|
|
28
|
+
path: dbTopic.contentId,
|
|
29
|
+
},
|
|
30
|
+
strContent,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
dbTopic.parts = existingTopicParts;
|
|
35
|
+
await ERUDIT_SERVER.DB.manager.save(dbTopic);
|
|
36
|
+
}
|
|
@@ -1,66 +1,69 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { globSync } from 'glob';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { resolvePaths } from 'erudit-cog/kit';
|
|
6
|
-
import type { ContributorConfig } from 'erudit-cog/schema';
|
|
7
|
-
|
|
8
|
-
import { PROJECT_DIR } from '#erudit/globalPaths';
|
|
9
|
-
import { stress } from '@erudit/utils/stress';
|
|
10
|
-
import { debug, logger } from '@server/logger';
|
|
11
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
12
|
-
import { IMPORT } from '@server/importer';
|
|
13
|
-
import { DbContributor } from '@server/db/entities/Contributor';
|
|
14
|
-
|
|
15
|
-
export async function buildContributors() {
|
|
16
|
-
debug.start('Building contributors...');
|
|
17
|
-
|
|
18
|
-
const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
|
|
19
|
-
for (const contributorPath of contributorPaths)
|
|
20
|
-
await addContributor(resolvePaths(contributorPath));
|
|
21
|
-
|
|
22
|
-
logger.success(
|
|
23
|
-
`Contributors built successfully!`,
|
|
24
|
-
chalk.dim(`(${contributorPaths.length})`),
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async function addContributor(contributorPath: string) {
|
|
29
|
-
const contributorId = contributorPath.split('/').pop() as string;
|
|
30
|
-
|
|
31
|
-
debug.start(`Adding contributor ${stress(contributorId)}...`);
|
|
32
|
-
|
|
33
|
-
const avatarFilename = (() => {
|
|
34
|
-
const avatarPaths = globSync(`${contributorPath}/avatar.*`);
|
|
35
|
-
if (avatarPaths[0])
|
|
36
|
-
return avatarPaths[0].split(path.sep).slice(-2).join('/');
|
|
37
|
-
|
|
38
|
-
return undefined;
|
|
39
|
-
})();
|
|
40
|
-
|
|
41
|
-
const config: Partial<ContributorConfig> = await (async () => {
|
|
42
|
-
try {
|
|
43
|
-
return await IMPORT(`${contributorPath}/contributor`, {
|
|
44
|
-
default: true,
|
|
45
|
-
});
|
|
46
|
-
} catch {
|
|
47
|
-
return {};
|
|
48
|
-
}
|
|
49
|
-
})();
|
|
50
|
-
|
|
51
|
-
const description = (() => {
|
|
52
|
-
try {
|
|
53
|
-
return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
|
|
54
|
-
} catch {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
})();
|
|
58
|
-
|
|
59
|
-
const dbContributor = new DbContributor();
|
|
60
|
-
dbContributor.contributorId = contributorId;
|
|
61
|
-
dbContributor.avatar = avatarFilename;
|
|
62
|
-
dbContributor.displayName = config.displayName;
|
|
63
|
-
dbContributor.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { globSync } from 'glob';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { resolvePaths } from '@erudit-js/cog/kit';
|
|
6
|
+
import type { ContributorConfig } from '@erudit-js/cog/schema';
|
|
7
|
+
|
|
8
|
+
import { PROJECT_DIR } from '#erudit/globalPaths';
|
|
9
|
+
import { stress } from '@erudit/utils/stress';
|
|
10
|
+
import { debug, logger } from '@server/logger';
|
|
11
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
12
|
+
import { IMPORT } from '@server/importer';
|
|
13
|
+
import { DbContributor } from '@server/db/entities/Contributor';
|
|
14
|
+
|
|
15
|
+
export async function buildContributors() {
|
|
16
|
+
debug.start('Building contributors...');
|
|
17
|
+
|
|
18
|
+
const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
|
|
19
|
+
for (const contributorPath of contributorPaths)
|
|
20
|
+
await addContributor(resolvePaths(contributorPath));
|
|
21
|
+
|
|
22
|
+
logger.success(
|
|
23
|
+
`Contributors built successfully!`,
|
|
24
|
+
chalk.dim(`(${contributorPaths.length})`),
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function addContributor(contributorPath: string) {
|
|
29
|
+
const contributorId = contributorPath.split('/').pop() as string;
|
|
30
|
+
|
|
31
|
+
debug.start(`Adding contributor ${stress(contributorId)}...`);
|
|
32
|
+
|
|
33
|
+
const avatarFilename = (() => {
|
|
34
|
+
const avatarPaths = globSync(`${contributorPath}/avatar.*`);
|
|
35
|
+
if (avatarPaths[0])
|
|
36
|
+
return avatarPaths[0].split(path.sep).slice(-2).join('/');
|
|
37
|
+
|
|
38
|
+
return undefined;
|
|
39
|
+
})();
|
|
40
|
+
|
|
41
|
+
const config: Partial<ContributorConfig> = await (async () => {
|
|
42
|
+
try {
|
|
43
|
+
return await IMPORT(`${contributorPath}/contributor`, {
|
|
44
|
+
default: true,
|
|
45
|
+
});
|
|
46
|
+
} catch {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
|
|
51
|
+
const description = (() => {
|
|
52
|
+
try {
|
|
53
|
+
return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
|
|
54
|
+
} catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
})();
|
|
58
|
+
|
|
59
|
+
const dbContributor = new DbContributor();
|
|
60
|
+
dbContributor.contributorId = contributorId;
|
|
61
|
+
dbContributor.avatar = avatarFilename;
|
|
62
|
+
dbContributor.displayName = config.displayName;
|
|
63
|
+
dbContributor.isEditor = Boolean(config.editor);
|
|
64
|
+
dbContributor.slogan = config.slogan;
|
|
65
|
+
dbContributor.links = config.links;
|
|
66
|
+
dbContributor.description = description;
|
|
67
|
+
|
|
68
|
+
await ERUDIT_SERVER.DB.manager.save(dbContributor);
|
|
69
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
|
|
3
|
-
import { ERUDIT_DIR } from '#erudit/globalPaths';
|
|
4
|
-
import { stress } from '@erudit/utils/stress';
|
|
5
|
-
import { ERUDIT_SERVER } from '@server/global';
|
|
6
|
-
import { IMPORT } from '@server/importer';
|
|
7
|
-
|
|
8
|
-
export async function setupLanguage() {
|
|
9
|
-
const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
|
|
10
|
-
const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
|
|
11
|
-
|
|
12
|
-
if (!existsSync(languageFilePath))
|
|
13
|
-
throw new Error(`Language file for ${stress(languageCode)} not found!`);
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const languageModule = await IMPORT(languageFilePath);
|
|
17
|
-
|
|
18
|
-
if (!languageModule.default)
|
|
19
|
-
throw new Error(
|
|
20
|
-
`Language file for ${stress(languageCode)} is missing default export with phrases!`,
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
const { default: phrases, ...context } = { ...languageModule };
|
|
24
|
-
|
|
25
|
-
ERUDIT_SERVER.LANGUAGE = {
|
|
26
|
-
phrases,
|
|
27
|
-
functions: Object.entries(context)
|
|
28
|
-
.filter(([, value]) => typeof value === 'function')
|
|
29
|
-
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
|
|
30
|
-
};
|
|
31
|
-
} catch (error) {
|
|
32
|
-
throw new Error(
|
|
33
|
-
`Error while loading language ${stress(languageCode)}!\n\n${error}`,
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
import { ERUDIT_DIR } from '#erudit/globalPaths';
|
|
4
|
+
import { stress } from '@erudit/utils/stress';
|
|
5
|
+
import { ERUDIT_SERVER } from '@server/global';
|
|
6
|
+
import { IMPORT } from '@server/importer';
|
|
7
|
+
|
|
8
|
+
export async function setupLanguage() {
|
|
9
|
+
const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
|
|
10
|
+
const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
|
|
11
|
+
|
|
12
|
+
if (!existsSync(languageFilePath))
|
|
13
|
+
throw new Error(`Language file for ${stress(languageCode)} not found!`);
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const languageModule = await IMPORT(languageFilePath);
|
|
17
|
+
|
|
18
|
+
if (!languageModule.default)
|
|
19
|
+
throw new Error(
|
|
20
|
+
`Language file for ${stress(languageCode)} is missing default export with phrases!`,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const { default: phrases, ...context } = { ...languageModule };
|
|
24
|
+
|
|
25
|
+
ERUDIT_SERVER.LANGUAGE = {
|
|
26
|
+
phrases,
|
|
27
|
+
functions: Object.entries(context)
|
|
28
|
+
.filter(([, value]) => typeof value === 'function')
|
|
29
|
+
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
|
|
30
|
+
};
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Error while loading language ${stress(languageCode)}!\n\n${error}`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|