erudit 4.0.0-dev.5 → 4.0.1
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 +34 -34
- package/app/assets/icons/array-check.svg +2 -2
- package/app/assets/icons/array-lines.svg +2 -2
- package/app/assets/icons/array-star.svg +2 -2
- package/app/assets/icons/arrow/from-circle.svg +2 -2
- package/app/assets/icons/arrow/left.svg +2 -2
- package/app/assets/icons/arrow/outward.svg +2 -2
- package/app/assets/icons/arrow/to-circle.svg +2 -2
- package/app/assets/icons/arrow/up-to-right.svg +2 -2
- package/app/assets/icons/aside-open.svg +2 -2
- package/app/assets/icons/asterisk.svg +2 -2
- package/app/assets/icons/book-question.svg +2 -2
- package/app/assets/icons/construction.svg +2 -2
- package/app/assets/icons/draw.svg +2 -2
- package/app/assets/icons/erudit.svg +2 -2
- package/app/assets/icons/file-lines.svg +2 -2
- package/app/assets/icons/files.svg +2 -2
- package/app/assets/icons/folder-open.svg +2 -2
- package/app/assets/icons/folder.svg +2 -2
- package/app/assets/icons/graduation.svg +2 -2
- package/app/assets/icons/handshake.svg +2 -2
- package/app/assets/icons/lines.svg +2 -2
- package/app/assets/icons/plus-circle.svg +2 -2
- package/app/assets/icons/puzzle.svg +2 -2
- package/app/assets/icons/rocket.svg +2 -2
- package/app/assets/icons/search/check.svg +2 -2
- package/app/assets/icons/search/dead.svg +2 -2
- package/app/assets/icons/search/glass.svg +2 -2
- package/app/assets/icons/search/wtf.svg +2 -2
- package/app/assets/icons/sun-moon.svg +2 -2
- package/app/assets/icons/translate.svg +2 -2
- package/app/assets/icons/warning.svg +2 -2
- package/app/components/EruditLink.ts +9 -9
- package/app/components/FancyBold.vue +16 -16
- package/app/components/FancyCard.vue +52 -52
- package/app/components/FancyCardTag.vue +16 -16
- package/app/components/Loading.vue +7 -7
- package/app/components/Prose.vue +55 -55
- package/app/components/ScrollHolder.vue +20 -20
- package/app/components/SmartMedia.vue +107 -107
- package/app/components/ads/Ads.vue +39 -39
- package/app/components/ads/AdsBannerAside.vue +45 -45
- package/app/components/ads/AdsBannerBottom.vue +17 -17
- package/app/components/ads/AdsReplacer.vue +26 -26
- package/app/components/ads/provider/Custom.vue +19 -19
- package/app/components/ads/provider/Yandex.vue +84 -84
- package/app/components/aside/AsideListItem.vue +61 -61
- package/app/components/aside/AsideMajor.vue +8 -8
- package/app/components/aside/AsideMinor.vue +68 -68
- package/app/components/aside/AsidePlainMessage.vue +9 -9
- package/app/components/aside/AsideSwitch.vue +76 -76
- package/app/components/aside/major/PaneHolder.vue +106 -106
- package/app/components/aside/major/PaneSwitcher.vue +68 -68
- package/app/components/aside/major/PaneSwitcherButton.vue +38 -38
- package/app/components/aside/major/PaneTemplate.vue +5 -5
- package/app/components/aside/major/SiteInfo.vue +66 -66
- package/app/components/aside/major/contentNav/PaneBookNav.vue +107 -107
- package/app/components/aside/major/contentNav/PaneGlobalNav.vue +19 -19
- package/app/components/aside/major/contentNav/items/ContentNavBook.vue +21 -21
- package/app/components/aside/major/contentNav/items/ContentNavFolder.vue +91 -91
- package/app/components/aside/major/contentNav/items/ContentNavItem.vue +33 -33
- package/app/components/aside/major/contentNav/items/ContentNavPage.vue +14 -14
- package/app/components/aside/major/contentNav/items/ContentNavSeparator.vue +61 -61
- package/app/components/aside/major/contentNav/items/ContentNavTopic.vue +18 -18
- package/app/components/aside/major/contentNav/items/Flags.vue +50 -50
- package/app/components/aside/major/contentNav/items/ItemTemplate.vue +27 -27
- package/app/components/aside/major/languages/PaneLanguages.vue +55 -55
- package/app/components/aside/major/pages/PanePages.vue +60 -60
- package/app/components/aside/major/search/PaneSearch.vue +156 -156
- package/app/components/aside/major/search/SearchInput.vue +103 -103
- package/app/components/aside/major/search/SearchResult.vue +154 -154
- package/app/components/aside/major/search/SearchStatus.vue +48 -48
- package/app/components/aside/major/search/search.worker.ts +164 -164
- package/app/components/aside/major/settings/BuildTime.vue +25 -25
- package/app/components/aside/major/settings/EngineVersion.vue +14 -14
- package/app/components/aside/major/settings/PaneSettings.vue +17 -17
- package/app/components/aside/major/settings/ThemeSwitcher.vue +55 -55
- package/app/components/aside/major/settings/repository/Repository.vue +33 -33
- package/app/components/aside/major/settings/repository/SecondaryGitHub.vue +71 -71
- package/app/components/aside/minor/AsideMinorPane.vue +5 -5
- package/app/components/aside/minor/AsideMinorPlainHeader.vue +20 -20
- package/app/components/aside/minor/content/AsideMinorContentContributions.vue +47 -47
- package/app/components/aside/minor/content/AsideMinorContentPage.vue +37 -37
- package/app/components/aside/minor/content/AsideMinorContentTopic.vue +61 -61
- package/app/components/aside/minor/content/ButtonPaneContributions.vue +101 -101
- package/app/components/aside/minor/content/ButtonPaneImprove.vue +112 -112
- package/app/components/aside/minor/content/Contribution.vue +36 -36
- package/app/components/aside/minor/content/Toc.vue +163 -163
- package/app/components/aside/minor/content/TocItem.vue +91 -91
- package/app/components/aside/minor/content/TopicPartButton.vue +35 -35
- package/app/components/aside/minor/contributor/AsideMinorContributor.vue +36 -36
- package/app/components/aside/minor/contributor/ItemBook.vue +33 -33
- package/app/components/aside/minor/contributor/ItemContent.vue +17 -17
- package/app/components/aside/minor/news/AsideMinorNews.vue +132 -132
- package/app/components/aside/minor/news/NewsItem.vue +69 -69
- package/app/components/aside/minor/news/RenderNewsElement.vue +42 -42
- package/app/components/aside/minor/news/elements/Mix.vue +11 -11
- package/app/components/aside/minor/news/elements/P.vue +14 -14
- package/app/components/aside/minor/news/elements/Ref.vue +59 -59
- package/app/components/aside/minor/news/elements/Text.vue +18 -18
- package/app/components/indexPage/IndexPagePersons.vue +116 -116
- package/app/components/main/MainAction.vue +26 -26
- package/app/components/main/MainBreadcrumbs.vue +28 -28
- package/app/components/main/MainContentChild.vue +44 -44
- package/app/components/main/MainContentChildren.vue +13 -13
- package/app/components/main/MainDecoration.vue +15 -15
- package/app/components/main/MainDescription.vue +13 -13
- package/app/components/main/MainFlag.vue +129 -129
- package/app/components/main/MainFlags.vue +17 -17
- package/app/components/main/MainGlow.vue +12 -12
- package/app/components/main/MainQuickLink.vue +90 -90
- package/app/components/main/MainQuickLinks.vue +40 -40
- package/app/components/main/MainQuote.vue +149 -149
- package/app/components/main/MainQuoteLoader.vue +86 -86
- package/app/components/main/MainSection.vue +44 -44
- package/app/components/main/MainSectionPreamble.vue +5 -5
- package/app/components/main/MainSubTitle.vue +11 -11
- package/app/components/main/MainTitle.vue +32 -32
- package/app/components/main/MainTopicPartPage.vue +88 -88
- package/app/components/main/MainTopicPartSwitch.vue +67 -67
- package/app/components/main/connections/Deps.vue +30 -30
- package/app/components/main/connections/Externals.vue +80 -80
- package/app/components/main/connections/MainConnections.vue +90 -90
- package/app/components/main/connections/MainConnectionsButton.vue +81 -81
- package/app/components/main/connections/ScrollPane.vue +10 -10
- package/app/components/main/contentStats/Item.vue +28 -28
- package/app/components/main/contentStats/ItemElement.vue +19 -19
- package/app/components/main/contentStats/ItemMaterials.vue +11 -11
- package/app/components/main/contentStats/MainContentStats.vue +50 -50
- package/app/components/preview/Preview.vue +161 -161
- package/app/components/preview/PreviewError.vue +10 -10
- package/app/components/preview/PreviewLoading.vue +5 -5
- package/app/components/preview/PreviewScreen.vue +64 -64
- package/app/components/preview/PreviewScreenButton.vue +39 -39
- package/app/components/preview/screen/ContentPage.vue +47 -47
- package/app/components/preview/screen/DirectLink.vue +23 -23
- package/app/components/preview/screen/Unique.vue +53 -53
- package/app/components/site/SiteAside.vue +67 -67
- package/app/components/site/SiteAsideOverlay.vue +21 -21
- package/app/components/site/SiteMain.vue +13 -13
- package/app/components/transition/Fade.vue +30 -30
- package/app/components/transition/Slide.vue +47 -47
- package/app/components/tree/TreeContainer.vue +5 -5
- package/app/components/tree/TreeItem.vue +36 -36
- package/app/composables/ads.ts +23 -23
- package/app/composables/analytics.ts +102 -102
- package/app/composables/appElements.ts +40 -40
- package/app/composables/aside.ts +28 -28
- package/app/composables/asideMajorPane.ts +135 -135
- package/app/composables/asideMinor.ts +109 -109
- package/app/composables/contentNav.ts +7 -7
- package/app/composables/favicon.ts +103 -103
- package/app/composables/file.ts +4 -4
- package/app/composables/formatText.ts +100 -100
- package/app/composables/loading.ts +26 -26
- package/app/composables/mainContent.ts +31 -31
- package/app/composables/og.ts +184 -184
- package/app/composables/phrases.ts +126 -126
- package/app/composables/preview.ts +53 -53
- package/app/composables/route.ts +6 -6
- package/app/composables/theme.ts +67 -67
- package/app/composables/url.ts +30 -30
- package/app/formatters/ru.ts +14 -14
- package/app/pages/article/[...articleId].vue +12 -12
- package/app/pages/book/[...bookId].vue +56 -56
- package/app/pages/contributor/[contributorId].vue +144 -144
- package/app/pages/contributors.vue +95 -95
- package/app/pages/group/[...groupId].vue +58 -58
- package/app/pages/index.vue +113 -113
- package/app/pages/page/[...pageId].vue +60 -60
- package/app/pages/practice/[...practiceId].vue +12 -12
- package/app/pages/sponsors.vue +88 -88
- package/app/pages/summary/[...summaryId].vue +12 -12
- package/app/plugins/appSetup/client/htmlBranding.ts +6 -6
- package/app/plugins/appSetup/client/welcome.ts +37 -37
- package/app/plugins/appSetup/config.ts +6 -6
- package/app/plugins/appSetup/global.ts +3 -3
- package/app/plugins/appSetup/index.ts +27 -27
- package/app/plugins/prerender.server.ts +40 -40
- package/app/router.options.ts +5 -5
- package/app/scripts/theme.js +30 -30
- package/app/styles/main.css +176 -176
- package/bin/erudit.js +12 -12
- package/modules/erudit/env.ts +8 -8
- package/modules/erudit/globals/content.ts +4 -4
- package/modules/erudit/globals/contributor.ts +1 -1
- package/modules/erudit/globals/eruditConfig.ts +5 -5
- package/modules/erudit/globals/problem.ts +1 -1
- package/modules/erudit/globals/prose.ts +5 -1
- package/modules/erudit/globals/public.ts +18 -18
- package/modules/erudit/index.ts +50 -50
- package/modules/erudit/logger.ts +10 -10
- package/modules/erudit/setup/elements/appTemplate.ts +44 -44
- package/modules/erudit/setup/elements/globalTemplate.ts +82 -82
- package/modules/erudit/setup/elements/globalTypes.ts +259 -259
- package/modules/erudit/setup/elements/setup.ts +163 -163
- package/modules/erudit/setup/elements/shared.ts +10 -10
- package/modules/erudit/setup/elements/tagsTable.ts +28 -28
- package/modules/erudit/setup/fullRestart.ts +61 -61
- package/modules/erudit/setup/globals.ts +210 -206
- package/modules/erudit/setup/publicAssets.ts +43 -43
- package/modules/erudit/setup/runtimeConfig.ts +106 -106
- package/modules/erudit/watcher.ts +20 -20
- package/nuxt.config.ts +102 -102
- package/package.json +5 -5
- package/proxy/prose.app.ts +1 -1
- package/proxy/prose.ts +1 -1
- package/server/api/aside/major/frontNav/book/[...shortId].ts +10 -10
- package/server/api/aside/major/frontNav/global.ts +5 -5
- package/server/api/aside/major/pages.ts +6 -6
- package/server/api/contributor/list.ts +60 -60
- package/server/api/contributor/page/[contributorId].ts +68 -68
- package/server/api/indexPage.ts +81 -81
- package/server/api/language/functions.ts +11 -11
- package/server/api/language/phrase/[phraseKey].ts +35 -35
- package/server/api/main/content/[...contentTypePath].ts +149 -149
- package/server/api/news/batch/[batchIndex].ts +5 -5
- package/server/api/pageSponsors.ts +56 -56
- package/server/api/prerender/content.ts +79 -79
- package/server/api/prerender/default.ts +35 -35
- package/server/api/prerender/files.ts +10 -10
- package/server/api/prerender/frontNav.ts +13 -13
- package/server/api/prerender/language.ts +7 -7
- package/server/api/prerender/news.ts +8 -8
- package/server/api/prerender/quotes.ts +15 -15
- package/server/api/preview/contentPage/[...contentTypePath].ts +63 -63
- package/server/api/preview/contentUnique/[...contentTypePathUnique].ts +73 -73
- package/server/api/problemScript/[...problemScriptPath].ts +88 -88
- package/server/api/quote/data/[quoteId].ts +84 -84
- package/server/api/quote/ids.ts +3 -3
- package/server/erudit/build.ts +132 -132
- package/server/erudit/cameos/build.ts +161 -161
- package/server/erudit/config.ts +13 -13
- package/server/erudit/content/global/build.ts +300 -300
- package/server/erudit/content/global/singleton.ts +5 -5
- package/server/erudit/content/nav/build.ts +459 -459
- package/server/erudit/content/nav/front.ts +125 -125
- package/server/erudit/content/nav/repository/books.ts +37 -37
- package/server/erudit/content/nav/repository/get.ts +33 -33
- package/server/erudit/content/nav/repository/hasChildren.ts +5 -5
- package/server/erudit/content/nav/repository/hasNav.ts +3 -3
- package/server/erudit/content/nav/repository/hasParent.ts +5 -5
- package/server/erudit/content/nav/repository/id.ts +9 -9
- package/server/erudit/content/nav/repository/index.ts +9 -9
- package/server/erudit/content/nav/repository/order.ts +14 -14
- package/server/erudit/content/nav/repository/previousNext.ts +35 -35
- package/server/erudit/content/nav/repository/walk.ts +127 -127
- package/server/erudit/content/nav/setup.ts +13 -13
- package/server/erudit/content/nav/types.ts +24 -24
- package/server/erudit/content/repository/breadcrumbs.ts +24 -24
- package/server/erudit/content/repository/children.ts +47 -47
- package/server/erudit/content/repository/connections.ts +35 -35
- package/server/erudit/content/repository/contentLink.ts +16 -16
- package/server/erudit/content/repository/decoration.ts +23 -23
- package/server/erudit/content/repository/deps.ts +121 -121
- package/server/erudit/content/repository/description.ts +11 -11
- package/server/erudit/content/repository/elementSnippets.ts +105 -105
- package/server/erudit/content/repository/externals.ts +50 -50
- package/server/erudit/content/repository/flags.ts +33 -33
- package/server/erudit/content/repository/seo.ts +12 -12
- package/server/erudit/content/repository/stats.ts +97 -97
- package/server/erudit/content/repository/title.ts +27 -27
- package/server/erudit/content/repository/topicParts.ts +39 -39
- package/server/erudit/content/repository/unique.ts +76 -76
- package/server/erudit/content/resolve/book.ts +29 -29
- package/server/erudit/content/resolve/group.ts +34 -34
- package/server/erudit/content/resolve/index.ts +272 -272
- package/server/erudit/content/resolve/page.ts +80 -80
- package/server/erudit/content/resolve/topic.ts +220 -220
- package/server/erudit/content/resolve/utils/contentError.ts +10 -10
- package/server/erudit/content/resolve/utils/insertContentItem.ts +113 -113
- package/server/erudit/content/resolve/utils/insertContentResolved.ts +126 -126
- package/server/erudit/content/search.ts +146 -146
- package/server/erudit/contributors/build.ts +158 -158
- package/server/erudit/contributors/global.ts +3 -3
- package/server/erudit/contributors/repository/avatarUrl.ts +10 -10
- package/server/erudit/contributors/repository/contributions.ts +171 -171
- package/server/erudit/contributors/repository/count.ts +3 -3
- package/server/erudit/contributors/search.ts +34 -34
- package/server/erudit/db/repository/pushFile.ts +23 -23
- package/server/erudit/db/repository/pushProblemScript.ts +19 -19
- package/server/erudit/db/repository/pushProseLink.ts +40 -40
- package/server/erudit/db/schema/cameos.ts +7 -7
- package/server/erudit/db/schema/content.ts +18 -18
- package/server/erudit/db/schema/contentContributions.ts +15 -15
- package/server/erudit/db/schema/contentDeps.ts +21 -21
- package/server/erudit/db/schema/contentElementStats.ts +20 -20
- package/server/erudit/db/schema/contentProseLinks.ts +23 -23
- package/server/erudit/db/schema/contentSnippets.ts +15 -15
- package/server/erudit/db/schema/contentToc.ts +16 -16
- package/server/erudit/db/schema/contentUniques.ts +19 -19
- package/server/erudit/db/schema/contributors.ts +12 -12
- package/server/erudit/db/schema/files.ts +11 -11
- package/server/erudit/db/schema/groups.ts +6 -6
- package/server/erudit/db/schema/index.ts +17 -17
- package/server/erudit/db/schema/news.ts +7 -7
- package/server/erudit/db/schema/pages.ts +7 -7
- package/server/erudit/db/schema/problemScripts.ts +14 -14
- package/server/erudit/db/schema/sponsors.ts +9 -9
- package/server/erudit/db/schema/topics.ts +9 -9
- package/server/erudit/db/setup.ts +62 -62
- package/server/erudit/db/types.ts +10 -10
- package/server/erudit/global.ts +38 -38
- package/server/erudit/importer.ts +94 -94
- package/server/erudit/index.ts +96 -96
- package/server/erudit/language/list/en.ts +116 -116
- package/server/erudit/language/list/ru.ts +120 -120
- package/server/erudit/language/list.ts +6 -6
- package/server/erudit/language/setup.ts +36 -36
- package/server/erudit/language/types.ts +16 -16
- package/server/erudit/logger.ts +73 -73
- package/server/erudit/news/build.ts +112 -112
- package/server/erudit/news/repository/batch.ts +61 -61
- package/server/erudit/path.ts +19 -19
- package/server/erudit/prose/repository/finalize.ts +68 -68
- package/server/erudit/prose/repository/get.ts +54 -54
- package/server/erudit/prose/repository/resolve.ts +17 -17
- package/server/erudit/prose/storage/callout.ts +16 -16
- package/server/erudit/prose/storage/image.ts +22 -22
- package/server/erudit/prose/storage/link.ts +222 -222
- package/server/erudit/prose/storage/problemScript.ts +23 -23
- package/server/erudit/prose/storage/video.ts +16 -16
- package/server/erudit/prose/transform/bundleProblemScript.ts +6 -6
- package/server/erudit/prose/transform/extensions.ts +15 -15
- package/server/erudit/quote/repository/ids.ts +31 -31
- package/server/erudit/repository.ts +96 -96
- package/server/erudit/sponsors/build.ts +161 -161
- package/server/erudit/sponsors/repository/avatarUrl.ts +10 -10
- package/server/erudit/sponsors/repository/count.ts +4 -4
- package/server/erudit/staticFile.ts +28 -28
- package/server/plugins/augmentCss.ts +17 -17
- package/server/plugins/lang.ts +5 -5
- package/server/plugins/metaViewport.ts +15 -15
- package/server/plugins/theme.ts +13 -13
- package/server/routes/file/[...path].ts +18 -18
- package/server/routes/robots.txt.ts +9 -9
- package/server/routes/search.json.gz.ts +76 -76
- package/server/routes/sitemap.xml.ts +83 -83
- package/shared/search/encoders.ts +20 -20
- package/shared/types/asideMajorPages.ts +4 -4
- package/shared/types/breadcrumbs.ts +9 -9
- package/shared/types/contentChildren.ts +10 -10
- package/shared/types/contentConnections.ts +27 -27
- package/shared/types/contentStats.ts +6 -6
- package/shared/types/elementSnippet.ts +14 -14
- package/shared/types/frontContentNav.ts +38 -38
- package/shared/types/indexPage.ts +20 -20
- package/shared/types/language.ts +191 -191
- package/shared/types/mainContent.ts +69 -69
- package/shared/types/news.ts +13 -13
- package/shared/types/preview.ts +28 -28
- package/shared/types/runtimeConfig.ts +46 -46
- package/shared/types/search.ts +79 -79
- package/shared/utils/contentTypePath.ts +63 -63
- package/shared/utils/icons.ts +11 -11
- package/shared/utils/pages.ts +23 -23
- package/shared/utils/stringColor.ts +13 -13
- package/shared/utils/toStringEqual.ts +21 -21
- package/shared/utils/zip.ts +64 -64
- package/test/shared/utils/zip.test.ts +8 -8
- package/tsconfig.json +17 -17
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
import { Document, Encoder } from 'flexsearch';
|
|
2
|
-
|
|
3
|
-
import { unzip } from '#layers/erudit/shared/utils/zip';
|
|
4
|
-
import { encoderAugments } from '#layers/erudit/shared/search/encoders';
|
|
5
|
-
|
|
6
|
-
const batchSize = 50;
|
|
7
|
-
|
|
8
|
-
let baseUrl: string;
|
|
9
|
-
let initPromise: Promise<void>;
|
|
10
|
-
let initError: string | undefined;
|
|
11
|
-
let latestSearchId: number = -1;
|
|
12
|
-
let documentIndex: Document;
|
|
13
|
-
let categoryPriorityById: Record<string, number>;
|
|
14
|
-
|
|
15
|
-
let currentOrdered: (string | number)[] = [];
|
|
16
|
-
let currentOffset = 0;
|
|
17
|
-
|
|
18
|
-
onmessage = async (e) => {
|
|
19
|
-
const command = e.data as SearchCommand;
|
|
20
|
-
switch (command.type) {
|
|
21
|
-
case 'init':
|
|
22
|
-
baseUrl = command.baseUrl;
|
|
23
|
-
initPromise = init(command);
|
|
24
|
-
break;
|
|
25
|
-
case 'search': {
|
|
26
|
-
await initPromise;
|
|
27
|
-
trySendInitError();
|
|
28
|
-
latestSearchId = command.id;
|
|
29
|
-
currentOrdered = buildOrderedResults(command.query);
|
|
30
|
-
currentOffset = 0;
|
|
31
|
-
sendResults(command.id, batchSize);
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
case 'more': {
|
|
35
|
-
await initPromise;
|
|
36
|
-
trySendInitError();
|
|
37
|
-
sendResults(command.id, batchSize);
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
async function init(initCommand: SearchCommandInit) {
|
|
44
|
-
try {
|
|
45
|
-
const fetchedSearch = await fetch(
|
|
46
|
-
baseUrl + 'search.json.gz?' + initCommand.cacheId,
|
|
47
|
-
);
|
|
48
|
-
const gzipSearch = await fetchedSearch.text();
|
|
49
|
-
const textSearch = await unzip(gzipSearch);
|
|
50
|
-
const jsonSearch = JSON.parse(textSearch);
|
|
51
|
-
|
|
52
|
-
const encoder = new Encoder();
|
|
53
|
-
encoderAugments[initCommand.language as LanguageCode]?.(encoder);
|
|
54
|
-
|
|
55
|
-
documentIndex = new Document({
|
|
56
|
-
document: {
|
|
57
|
-
...jsonSearch.documentDescriptor,
|
|
58
|
-
encoder,
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
categoryPriorityById = Object.create(null);
|
|
63
|
-
for (const cat of jsonSearch.categories as {
|
|
64
|
-
id: string;
|
|
65
|
-
priority: number;
|
|
66
|
-
}[]) {
|
|
67
|
-
categoryPriorityById[cat.id] = cat.priority;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
for (const key in jsonSearch.export) {
|
|
71
|
-
documentIndex.import(key, jsonSearch.export[key]);
|
|
72
|
-
}
|
|
73
|
-
} catch (error) {
|
|
74
|
-
initError =
|
|
75
|
-
'Search init error: ' +
|
|
76
|
-
(error instanceof Error ? error.message : String(error));
|
|
77
|
-
|
|
78
|
-
const errorResponse: SearchResponseError = {
|
|
79
|
-
type: 'error',
|
|
80
|
-
message: initError,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
postMessage(errorResponse);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function trySendInitError() {
|
|
88
|
-
if (initError) {
|
|
89
|
-
const errorResponse: SearchResponseError = {
|
|
90
|
-
type: 'error',
|
|
91
|
-
message: initError,
|
|
92
|
-
};
|
|
93
|
-
postMessage(errorResponse);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function buildOrderedResults(query: string): (string | number)[] {
|
|
98
|
-
// 1. Fast-path: ignore empty or whitespace-only queries.
|
|
99
|
-
if (!query || !query.trim()) return [];
|
|
100
|
-
|
|
101
|
-
// 2. Perform search. FlexSearch Document#search returns groups (by field/tag).
|
|
102
|
-
// Each group contains a .result array of ids. We set a reasonably high limit
|
|
103
|
-
// (1000) to gather enough candidates; final pagination happens later.
|
|
104
|
-
const groups = documentIndex.search(query, { limit: 1000 }) as {
|
|
105
|
-
field?: string;
|
|
106
|
-
tag?: string;
|
|
107
|
-
result: (string | number)[];
|
|
108
|
-
}[];
|
|
109
|
-
|
|
110
|
-
// 3. Use a Set to enforce uniqueness while preserving first-seen order.
|
|
111
|
-
const seen = new Set<string | number>();
|
|
112
|
-
|
|
113
|
-
// 4. Accumulate ranked entries immediately (single pass):
|
|
114
|
-
// - id: document identifier
|
|
115
|
-
// - priority: derived from document metadata (categoryPriority) or 0
|
|
116
|
-
// - pos: stable position (the order we first encountered the id)
|
|
117
|
-
const ranked: { id: string | number; priority: number; pos: number }[] = [];
|
|
118
|
-
let pos = 0;
|
|
119
|
-
|
|
120
|
-
for (const group of groups) {
|
|
121
|
-
const results = group.result;
|
|
122
|
-
for (let i = 0, len = results.length; i < len; i++) {
|
|
123
|
-
const id = results[i]!;
|
|
124
|
-
if (!seen.has(id)) {
|
|
125
|
-
seen.add(id);
|
|
126
|
-
const doc: any = documentIndex.get(id);
|
|
127
|
-
if (!doc) continue;
|
|
128
|
-
ranked.push({
|
|
129
|
-
id,
|
|
130
|
-
priority: categoryPriorityById[doc?.category] ?? 0, // replaced doc.categoryPriority
|
|
131
|
-
pos: pos++, // capture discovery order for stable secondary sorting
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// 5. Sort primarily by descending priority, secondarily by original discovery order
|
|
138
|
-
// to preserve stable ordering among equally prioritized documents.
|
|
139
|
-
ranked.sort((a, b) => b.priority - a.priority || a.pos - b.pos);
|
|
140
|
-
|
|
141
|
-
// 6. Return only the ordered ids (actual documents fetched lazily during pagination).
|
|
142
|
-
return ranked.map((r) => r.id);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function sendResults(searchId: number, pageSize: number) {
|
|
146
|
-
if (searchId !== latestSearchId) {
|
|
147
|
-
// Drop results for any stale (outdated) search id.
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const start = currentOffset;
|
|
152
|
-
const end = start + pageSize;
|
|
153
|
-
const slice = currentOrdered.slice(start, end);
|
|
154
|
-
currentOffset = end;
|
|
155
|
-
const entries = slice.map((id) => documentIndex.get(id));
|
|
156
|
-
const hasMore = currentOffset < currentOrdered.length;
|
|
157
|
-
const resultsResponse: SearchResponseResults = {
|
|
158
|
-
type: 'results',
|
|
159
|
-
entries: entries as any,
|
|
160
|
-
hasMore,
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
postMessage(resultsResponse);
|
|
164
|
-
}
|
|
1
|
+
import { Document, Encoder } from 'flexsearch';
|
|
2
|
+
|
|
3
|
+
import { unzip } from '#layers/erudit/shared/utils/zip';
|
|
4
|
+
import { encoderAugments } from '#layers/erudit/shared/search/encoders';
|
|
5
|
+
|
|
6
|
+
const batchSize = 50;
|
|
7
|
+
|
|
8
|
+
let baseUrl: string;
|
|
9
|
+
let initPromise: Promise<void>;
|
|
10
|
+
let initError: string | undefined;
|
|
11
|
+
let latestSearchId: number = -1;
|
|
12
|
+
let documentIndex: Document;
|
|
13
|
+
let categoryPriorityById: Record<string, number>;
|
|
14
|
+
|
|
15
|
+
let currentOrdered: (string | number)[] = [];
|
|
16
|
+
let currentOffset = 0;
|
|
17
|
+
|
|
18
|
+
onmessage = async (e) => {
|
|
19
|
+
const command = e.data as SearchCommand;
|
|
20
|
+
switch (command.type) {
|
|
21
|
+
case 'init':
|
|
22
|
+
baseUrl = command.baseUrl;
|
|
23
|
+
initPromise = init(command);
|
|
24
|
+
break;
|
|
25
|
+
case 'search': {
|
|
26
|
+
await initPromise;
|
|
27
|
+
trySendInitError();
|
|
28
|
+
latestSearchId = command.id;
|
|
29
|
+
currentOrdered = buildOrderedResults(command.query);
|
|
30
|
+
currentOffset = 0;
|
|
31
|
+
sendResults(command.id, batchSize);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'more': {
|
|
35
|
+
await initPromise;
|
|
36
|
+
trySendInitError();
|
|
37
|
+
sendResults(command.id, batchSize);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
async function init(initCommand: SearchCommandInit) {
|
|
44
|
+
try {
|
|
45
|
+
const fetchedSearch = await fetch(
|
|
46
|
+
baseUrl + 'search.json.gz?' + initCommand.cacheId,
|
|
47
|
+
);
|
|
48
|
+
const gzipSearch = await fetchedSearch.text();
|
|
49
|
+
const textSearch = await unzip(gzipSearch);
|
|
50
|
+
const jsonSearch = JSON.parse(textSearch);
|
|
51
|
+
|
|
52
|
+
const encoder = new Encoder();
|
|
53
|
+
encoderAugments[initCommand.language as LanguageCode]?.(encoder);
|
|
54
|
+
|
|
55
|
+
documentIndex = new Document({
|
|
56
|
+
document: {
|
|
57
|
+
...jsonSearch.documentDescriptor,
|
|
58
|
+
encoder,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
categoryPriorityById = Object.create(null);
|
|
63
|
+
for (const cat of jsonSearch.categories as {
|
|
64
|
+
id: string;
|
|
65
|
+
priority: number;
|
|
66
|
+
}[]) {
|
|
67
|
+
categoryPriorityById[cat.id] = cat.priority;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
for (const key in jsonSearch.export) {
|
|
71
|
+
documentIndex.import(key, jsonSearch.export[key]);
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
initError =
|
|
75
|
+
'Search init error: ' +
|
|
76
|
+
(error instanceof Error ? error.message : String(error));
|
|
77
|
+
|
|
78
|
+
const errorResponse: SearchResponseError = {
|
|
79
|
+
type: 'error',
|
|
80
|
+
message: initError,
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
postMessage(errorResponse);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function trySendInitError() {
|
|
88
|
+
if (initError) {
|
|
89
|
+
const errorResponse: SearchResponseError = {
|
|
90
|
+
type: 'error',
|
|
91
|
+
message: initError,
|
|
92
|
+
};
|
|
93
|
+
postMessage(errorResponse);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function buildOrderedResults(query: string): (string | number)[] {
|
|
98
|
+
// 1. Fast-path: ignore empty or whitespace-only queries.
|
|
99
|
+
if (!query || !query.trim()) return [];
|
|
100
|
+
|
|
101
|
+
// 2. Perform search. FlexSearch Document#search returns groups (by field/tag).
|
|
102
|
+
// Each group contains a .result array of ids. We set a reasonably high limit
|
|
103
|
+
// (1000) to gather enough candidates; final pagination happens later.
|
|
104
|
+
const groups = documentIndex.search(query, { limit: 1000 }) as {
|
|
105
|
+
field?: string;
|
|
106
|
+
tag?: string;
|
|
107
|
+
result: (string | number)[];
|
|
108
|
+
}[];
|
|
109
|
+
|
|
110
|
+
// 3. Use a Set to enforce uniqueness while preserving first-seen order.
|
|
111
|
+
const seen = new Set<string | number>();
|
|
112
|
+
|
|
113
|
+
// 4. Accumulate ranked entries immediately (single pass):
|
|
114
|
+
// - id: document identifier
|
|
115
|
+
// - priority: derived from document metadata (categoryPriority) or 0
|
|
116
|
+
// - pos: stable position (the order we first encountered the id)
|
|
117
|
+
const ranked: { id: string | number; priority: number; pos: number }[] = [];
|
|
118
|
+
let pos = 0;
|
|
119
|
+
|
|
120
|
+
for (const group of groups) {
|
|
121
|
+
const results = group.result;
|
|
122
|
+
for (let i = 0, len = results.length; i < len; i++) {
|
|
123
|
+
const id = results[i]!;
|
|
124
|
+
if (!seen.has(id)) {
|
|
125
|
+
seen.add(id);
|
|
126
|
+
const doc: any = documentIndex.get(id);
|
|
127
|
+
if (!doc) continue;
|
|
128
|
+
ranked.push({
|
|
129
|
+
id,
|
|
130
|
+
priority: categoryPriorityById[doc?.category] ?? 0, // replaced doc.categoryPriority
|
|
131
|
+
pos: pos++, // capture discovery order for stable secondary sorting
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 5. Sort primarily by descending priority, secondarily by original discovery order
|
|
138
|
+
// to preserve stable ordering among equally prioritized documents.
|
|
139
|
+
ranked.sort((a, b) => b.priority - a.priority || a.pos - b.pos);
|
|
140
|
+
|
|
141
|
+
// 6. Return only the ordered ids (actual documents fetched lazily during pagination).
|
|
142
|
+
return ranked.map((r) => r.id);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function sendResults(searchId: number, pageSize: number) {
|
|
146
|
+
if (searchId !== latestSearchId) {
|
|
147
|
+
// Drop results for any stale (outdated) search id.
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const start = currentOffset;
|
|
152
|
+
const end = start + pageSize;
|
|
153
|
+
const slice = currentOrdered.slice(start, end);
|
|
154
|
+
currentOffset = end;
|
|
155
|
+
const entries = slice.map((id) => documentIndex.get(id));
|
|
156
|
+
const hasMore = currentOffset < currentOrdered.length;
|
|
157
|
+
const resultsResponse: SearchResponseResults = {
|
|
158
|
+
type: 'results',
|
|
159
|
+
entries: entries as any,
|
|
160
|
+
hasMore,
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
postMessage(resultsResponse);
|
|
164
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
const runtimeConfig = useRuntimeConfig();
|
|
3
|
-
const language = ERUDIT.config.language.current;
|
|
4
|
-
const buildTime = runtimeConfig.public.buildTime;
|
|
5
|
-
|
|
6
|
-
const formattedBuildDate = computed(() => {
|
|
7
|
-
let date = new Date(buildTime);
|
|
8
|
-
return new Intl.DateTimeFormat(language, {
|
|
9
|
-
day: '2-digit',
|
|
10
|
-
month: 'short',
|
|
11
|
-
year: 'numeric',
|
|
12
|
-
}).format(date);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
const phrase = await usePhrases('built');
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<template>
|
|
19
|
-
<AsideListItem
|
|
20
|
-
:hoverable="false"
|
|
21
|
-
icon="box"
|
|
22
|
-
:main="phrase.built"
|
|
23
|
-
:secondary="formattedBuildDate"
|
|
24
|
-
/>
|
|
25
|
-
</template>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
const runtimeConfig = useRuntimeConfig();
|
|
3
|
+
const language = ERUDIT.config.language.current;
|
|
4
|
+
const buildTime = runtimeConfig.public.buildTime;
|
|
5
|
+
|
|
6
|
+
const formattedBuildDate = computed(() => {
|
|
7
|
+
let date = new Date(buildTime);
|
|
8
|
+
return new Intl.DateTimeFormat(language, {
|
|
9
|
+
day: '2-digit',
|
|
10
|
+
month: 'short',
|
|
11
|
+
year: 'numeric',
|
|
12
|
+
}).format(date);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const phrase = await usePhrases('built');
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<template>
|
|
19
|
+
<AsideListItem
|
|
20
|
+
:hoverable="false"
|
|
21
|
+
icon="box"
|
|
22
|
+
:main="phrase.built"
|
|
23
|
+
:secondary="formattedBuildDate"
|
|
24
|
+
/>
|
|
25
|
+
</template>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
const runtimeConfig = useRuntimeConfig();
|
|
3
|
-
const phrase = await usePhrases('erudit');
|
|
4
|
-
</script>
|
|
5
|
-
|
|
6
|
-
<template>
|
|
7
|
-
<AsideListItem
|
|
8
|
-
icon="erudit"
|
|
9
|
-
to="https://github.com/erudit-js/erudit"
|
|
10
|
-
target="_blank"
|
|
11
|
-
:main="phrase.erudit"
|
|
12
|
-
:secondary="runtimeConfig.public.eruditVersion"
|
|
13
|
-
/>
|
|
14
|
-
</template>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
const runtimeConfig = useRuntimeConfig();
|
|
3
|
+
const phrase = await usePhrases('erudit');
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<AsideListItem
|
|
8
|
+
icon="erudit"
|
|
9
|
+
to="https://github.com/erudit-js/erudit"
|
|
10
|
+
target="_blank"
|
|
11
|
+
:main="phrase.erudit"
|
|
12
|
+
:secondary="runtimeConfig.public.eruditVersion"
|
|
13
|
+
/>
|
|
14
|
+
</template>
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import ThemeSwitcher from './ThemeSwitcher.vue';
|
|
3
|
-
import BuildTime from './BuildTime.vue';
|
|
4
|
-
import Repository from './repository/Repository.vue';
|
|
5
|
-
import EngineVersion from './EngineVersion.vue';
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<template>
|
|
9
|
-
<AsideMajorPaneTemplate>
|
|
10
|
-
<ScrollHolder direction="rtl">
|
|
11
|
-
<ThemeSwitcher />
|
|
12
|
-
<BuildTime />
|
|
13
|
-
<Repository />
|
|
14
|
-
<EngineVersion />
|
|
15
|
-
</ScrollHolder>
|
|
16
|
-
</AsideMajorPaneTemplate>
|
|
17
|
-
</template>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import ThemeSwitcher from './ThemeSwitcher.vue';
|
|
3
|
+
import BuildTime from './BuildTime.vue';
|
|
4
|
+
import Repository from './repository/Repository.vue';
|
|
5
|
+
import EngineVersion from './EngineVersion.vue';
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<AsideMajorPaneTemplate>
|
|
10
|
+
<ScrollHolder direction="rtl">
|
|
11
|
+
<ThemeSwitcher />
|
|
12
|
+
<BuildTime />
|
|
13
|
+
<Repository />
|
|
14
|
+
<EngineVersion />
|
|
15
|
+
</ScrollHolder>
|
|
16
|
+
</AsideMajorPaneTemplate>
|
|
17
|
+
</template>
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import type { MaybeMyIconName } from '#my-icons';
|
|
3
|
-
|
|
4
|
-
const loadingSvg = useLoadingSvg();
|
|
5
|
-
|
|
6
|
-
const icon = ref<MaybeMyIconName>(loadingSvg);
|
|
7
|
-
const themeName = ref<string>();
|
|
8
|
-
|
|
9
|
-
let cycleThemeClick = () => {};
|
|
10
|
-
|
|
11
|
-
const phrase = await usePhrases(
|
|
12
|
-
'theme',
|
|
13
|
-
'theme_light',
|
|
14
|
-
'theme_dark',
|
|
15
|
-
'theme_system',
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
onMounted(() => {
|
|
19
|
-
const { themePref, cycleTheme } = useTheme();
|
|
20
|
-
|
|
21
|
-
watch(
|
|
22
|
-
themePref,
|
|
23
|
-
(newThemePref) => {
|
|
24
|
-
switch (newThemePref) {
|
|
25
|
-
case 'system':
|
|
26
|
-
icon.value = 'sun-moon';
|
|
27
|
-
themeName.value = phrase.theme_system;
|
|
28
|
-
break;
|
|
29
|
-
case 'light':
|
|
30
|
-
icon.value = 'sun';
|
|
31
|
-
themeName.value = phrase.theme_light;
|
|
32
|
-
break;
|
|
33
|
-
case 'dark':
|
|
34
|
-
icon.value = 'moon';
|
|
35
|
-
themeName.value = phrase.theme_dark;
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
{ immediate: true },
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
cycleThemeClick = () => {
|
|
43
|
-
cycleTheme();
|
|
44
|
-
};
|
|
45
|
-
});
|
|
46
|
-
</script>
|
|
47
|
-
|
|
48
|
-
<template>
|
|
49
|
-
<AsideListItem
|
|
50
|
-
:icon
|
|
51
|
-
:main="phrase.theme"
|
|
52
|
-
:secondary="themeName"
|
|
53
|
-
@click="cycleThemeClick"
|
|
54
|
-
/>
|
|
55
|
-
</template>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { MaybeMyIconName } from '#my-icons';
|
|
3
|
+
|
|
4
|
+
const loadingSvg = useLoadingSvg();
|
|
5
|
+
|
|
6
|
+
const icon = ref<MaybeMyIconName>(loadingSvg);
|
|
7
|
+
const themeName = ref<string>();
|
|
8
|
+
|
|
9
|
+
let cycleThemeClick = () => {};
|
|
10
|
+
|
|
11
|
+
const phrase = await usePhrases(
|
|
12
|
+
'theme',
|
|
13
|
+
'theme_light',
|
|
14
|
+
'theme_dark',
|
|
15
|
+
'theme_system',
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
onMounted(() => {
|
|
19
|
+
const { themePref, cycleTheme } = useTheme();
|
|
20
|
+
|
|
21
|
+
watch(
|
|
22
|
+
themePref,
|
|
23
|
+
(newThemePref) => {
|
|
24
|
+
switch (newThemePref) {
|
|
25
|
+
case 'system':
|
|
26
|
+
icon.value = 'sun-moon';
|
|
27
|
+
themeName.value = phrase.theme_system;
|
|
28
|
+
break;
|
|
29
|
+
case 'light':
|
|
30
|
+
icon.value = 'sun';
|
|
31
|
+
themeName.value = phrase.theme_light;
|
|
32
|
+
break;
|
|
33
|
+
case 'dark':
|
|
34
|
+
icon.value = 'moon';
|
|
35
|
+
themeName.value = phrase.theme_dark;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{ immediate: true },
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
cycleThemeClick = () => {
|
|
43
|
+
cycleTheme();
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<AsideListItem
|
|
50
|
+
:icon
|
|
51
|
+
:main="phrase.theme"
|
|
52
|
+
:secondary="themeName"
|
|
53
|
+
@click="cycleThemeClick"
|
|
54
|
+
/>
|
|
55
|
+
</template>
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import type { EruditRepositoryType } from '@erudit-js/core/eruditConfig/repository';
|
|
3
|
-
|
|
4
|
-
const repository = ERUDIT.config.repository;
|
|
5
|
-
const phrase = await usePhrases('content');
|
|
6
|
-
|
|
7
|
-
type SecondaryComponents = Record<EruditRepositoryType, any>;
|
|
8
|
-
|
|
9
|
-
const secondaryComponents = {
|
|
10
|
-
custom: undefined,
|
|
11
|
-
github: defineAsyncComponent(() => import('./SecondaryGitHub.vue')),
|
|
12
|
-
} as const satisfies SecondaryComponents;
|
|
13
|
-
|
|
14
|
-
const SecondaryComponent = repository
|
|
15
|
-
? secondaryComponents[repository.type]
|
|
16
|
-
: undefined;
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<template>
|
|
20
|
-
<AsideListItem
|
|
21
|
-
v-if="repository"
|
|
22
|
-
icon="draw"
|
|
23
|
-
target="_blank"
|
|
24
|
-
:to="repository._link"
|
|
25
|
-
:main="phrase.content"
|
|
26
|
-
>
|
|
27
|
-
<template v-slot:secondary>
|
|
28
|
-
<div class="text-text-dimmed ps-[8px] text-xs font-[500]">
|
|
29
|
-
<SecondaryComponent v-if="SecondaryComponent" />
|
|
30
|
-
</div>
|
|
31
|
-
</template>
|
|
32
|
-
</AsideListItem>
|
|
33
|
-
</template>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import type { EruditRepositoryType } from '@erudit-js/core/eruditConfig/repository';
|
|
3
|
+
|
|
4
|
+
const repository = ERUDIT.config.repository;
|
|
5
|
+
const phrase = await usePhrases('content');
|
|
6
|
+
|
|
7
|
+
type SecondaryComponents = Record<EruditRepositoryType, any>;
|
|
8
|
+
|
|
9
|
+
const secondaryComponents = {
|
|
10
|
+
custom: undefined,
|
|
11
|
+
github: defineAsyncComponent(() => import('./SecondaryGitHub.vue')),
|
|
12
|
+
} as const satisfies SecondaryComponents;
|
|
13
|
+
|
|
14
|
+
const SecondaryComponent = repository
|
|
15
|
+
? secondaryComponents[repository.type]
|
|
16
|
+
: undefined;
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<AsideListItem
|
|
21
|
+
v-if="repository"
|
|
22
|
+
icon="draw"
|
|
23
|
+
target="_blank"
|
|
24
|
+
:to="repository._link"
|
|
25
|
+
:main="phrase.content"
|
|
26
|
+
>
|
|
27
|
+
<template v-slot:secondary>
|
|
28
|
+
<div class="text-text-dimmed ps-[8px] text-xs font-[500]">
|
|
29
|
+
<SecondaryComponent v-if="SecondaryComponent" />
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
</AsideListItem>
|
|
33
|
+
</template>
|