Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions apps/wiki/app/[language]/(documents)/[...slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { LanguageAlternate } from '@/components/LanguageAlternate';
import { LocalImage } from '@/components/LocalImage';
import { MarkdownCopyInterceptor } from '@/components/MarkdownCopyInterceptor';
import { Link } from '@/components/progress';
import SearchableTerminologyTable from '@/components/SearchableTerminologyTable';
import { ShortCodeComp } from '@/components/shortcode';
import { cache } from '@/lib/cache';
import { t } from '@/lib/i18n/client';
Expand All @@ -33,13 +34,27 @@ import SingleChildRedirect from '../components/SingleChildRedirect';
import remarkCsvToTable from './remarkCsvToTable';
import remarkHtmlContent from './remarkHtmlContent';
import remarkQrCode, { remarkHugoShortcode } from './remarkHugoShortcode';
import remarkTerminologyGlossary from './remarkTerminologyGlossary';
import type { Frontmatter } from './types';
import {
getAvailableLanguages,
getContentDir,
getContentGitRootDir,
} from './utils';

const loadTerminologyData = cache(async (): Promise<string> => {
try {
const tsvPath = path.join(
getContentGitRootDir(),
'data',
'terminology.tsv',
);
return await fs.readFile(tsvPath, 'utf-8');
} catch {
return '';
}
});

interface DocParams {
language: string;
slug: string[];
Expand Down Expand Up @@ -322,11 +337,18 @@ export default async function DocPage({
});
}

const terminologyData = await loadTerminologyData();

function remarkTerminologyGlossaryPlugin() {
return remarkTerminologyGlossary({ language, data: terminologyData });
}

const mdxRawContent: string = strippedSource;
const remarkPlugins = [
remarkHeadingIdPlugin,
remarkCsvToTablePlugin,
remarkHugoShortcodePlugin,
remarkTerminologyGlossaryPlugin,
remarkGfm,
remarkMath,
remarkHtmlContent,
Expand All @@ -352,6 +374,7 @@ export default async function DocPage({

// 定义组件映射
const components: MDXComponents = {
SearchableTerminologyTable,
ShortCodeComp: (props) => (
<ShortCodeComp
{...props}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import type { Node, Root } from 'mdast';
import { visit } from 'unist-util-visit';

interface MdxJsxAttribute {
type: 'mdxJsxAttribute';
name: string;
value: string | null;
}

interface MdxJsxFlowElement extends Node {
type: 'mdxJsxFlowElement';
name: string;
attributes: MdxJsxAttribute[];
children: Node[];
}

interface Options {
language: string;
data: string;
}

/**
* Remark plugin: replaces {{< terminology-glossary >}} shortcode nodes
* (already converted to ShortCodeComp by remarkHugoShortcode) with a
* SearchableTerminologyTable MDX element carrying pre-loaded TSV data.
*/
export default function remarkTerminologyGlossary({ language, data }: Options) {
return (tree: Root) => {
visit(tree, 'mdxJsxFlowElement', (node, index, parent) => {
const el = node as unknown as MdxJsxFlowElement;
if (el.name !== 'ShortCodeComp') return;

const compNameAttr = el.attributes?.find((a) => a.name === 'compName');
if (compNameAttr?.value !== 'terminology-glossary') return;

const replacement: MdxJsxFlowElement = {
type: 'mdxJsxFlowElement',
name: 'SearchableTerminologyTable',
attributes: [
{ type: 'mdxJsxAttribute', name: 'data', value: data },
{ type: 'mdxJsxAttribute', name: 'lang', value: language },
],
children: [],
};

if (parent && typeof index === 'number' && 'children' in parent) {
(parent.children as unknown[])[index] = replacement;
}
});
};
}
1 change: 1 addition & 0 deletions apps/wiki/app/[language]/(documents)/[...slug]/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,6 @@ export function getNonSelfClosingElements() {
'meme/onimai-ja',
'project-trans',
'github/contributors',
'terminology-glossary',
];
}
10 changes: 9 additions & 1 deletion apps/wiki/components/HomeRedirect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ export default function HomeRedirect({
}
}

// 韩语:将 ko-KR、kor 等映射到 'ko'
if (normalizedLang.startsWith('ko')) {
if (languageConfigs.some((config) => config.code === 'ko')) {
targetLanguage = 'ko';
break;
}
}

// 处理主要语言代码(取前两位)
const mainLang = normalizedLang.split('-')[0];
if (languageConfigs.some((config) => config.code === mainLang)) {
Expand Down Expand Up @@ -161,7 +169,7 @@ export default function HomeRedirect({
</footer>
</div>
<script
// biome-ignore lint/security/noDangerouslySetInnerHtml:
// biome-ignore lint/security/noDangerouslySetInnerHtml: inline noscript-style timeout fallback; no user-controlled content.
dangerouslySetInnerHTML={{
__html: `
window.HomeRedirectWikiRedirectTimeout = window.HomeRedirectWikiRedirectTimeout || window.setTimeout(() => {
Expand Down
Loading