UNPKG

@alauda/doom

Version:

Doctor Doom making docs.

73 lines (72 loc) 2.69 kB
import { isProduction, withBase } from '@rspress/core/runtime'; import virtual from 'doom-@global-virtual'; import { merge } from 'es-toolkit/compat'; import { useEffect, useMemo, useState } from 'react'; import { xfetch } from 'x-fetch'; import { parse } from 'yaml'; import { isUnversioned } from '../../shared/index.js'; import { namedTerms } from '../../terms.js'; import { useLang } from './useTranslation.js'; const normalizeOverrides = (origin) => Object.keys(origin).reduce((acc, key_) => { const key = key_; const term = origin[key]; if (!term) { return acc; } const en = (acc.en[key] = term.en); acc.zh[key] = term.zh || en; acc.ru[key] = term.ru || en; return acc; }, { en: {}, zh: {}, ru: {} }); let normalizedSiteOverrides; let promise; const fetchSiteOverrides = async (version, acpSite) => { if (promise) { return promise; } const acpSiteOverridesUrl = acpSite && isProduction() ? `${(virtual.prefix || '') + acpSite.base}${isUnversioned(version) ? '' : acpSite.version + '/'}overrides.yaml` : null; const siteOverridesUrl = withBase('overrides.yaml'); const urls = [acpSiteOverridesUrl]; if (acpSiteOverridesUrl !== siteOverridesUrl) { urls.push(siteOverridesUrl); } return (promise = Promise.all(urls.map(async (url) => { if (!url) { return; } try { return parse(await xfetch(url, { type: 'text' })); } catch { // } })) .then(([acpSiteOverrides, siteOverrides]) => ({ ...(urls.length === 1 ? acpSiteOverrides : siteOverrides), terms: merge({}, namedTerms, acpSiteOverrides?.terms, siteOverrides?.terms), })) .catch(() => ({ terms: namedTerms })) .then(({ terms, ...siteOverrides }) => { const overrides = normalizeOverrides(siteOverrides); const normalizedTerms = normalizeOverrides(terms); return (normalizedSiteOverrides = { en: { ...overrides.en, terms: normalizedTerms.en }, zh: { ...overrides.zh, terms: normalizedTerms.zh }, ru: { ...overrides.ru, terms: normalizedTerms.ru }, }); })); }; export const useSiteOverrides = () => { const [siteOverrides, setSiteOverrides] = useState(normalizedSiteOverrides); const lang = useLang(); const acpSite = useMemo(() => virtual.sites?.find((s) => s.name === 'acp'), []); useEffect(() => { if (normalizedSiteOverrides) { return; } void fetchSiteOverrides(virtual.version, acpSite).then(setSiteOverrides); }, [acpSite]); return siteOverrides?.[lang] || {}; };