このコミットが含まれているのは:
2026-10-19 12:30:59 +09:00
コミット 0622d5ba0b
10個のファイルの変更、311行の追加、72行の削除
+76 -51
ファイルの表示
@@ -4,65 +4,90 @@ import remarkWikiAutolink from '@/lib/remark-wiki-autolink'
import type { Root } from 'mdast'
describe ('remarkWikiAutolink', () => {
it ('links matching wiki page names and prefers longer matches', () => {
const tree: Root = {
type: 'root',
children: [{
type: 'paragraph',
children: [{ type: 'text', value: '虹夏 and 虹' }],
}],
}
import type { WikiAutolinkCandidate } from '@/types'
remarkWikiAutolink (['虹', '虹夏']) (tree)
const candidate = (
name: string,
resourceId: number,
overrides: Partial<WikiAutolinkCandidate> = {},
): WikiAutolinkCandidate => ({
name, resourceId, tagId: resourceId + 100, tagDescriptionId: resourceId,
resourceType: 'tag_description', languageCode: 'ja', localeCode: 'ain-Kana',
...overrides })
const paragraph = (value: string): Root => ({
type: 'root', children: [{
type: 'paragraph', children: [{ type: 'text', value }] }] })
describe ('remarkWikiAutolink', () => {
it ('prefers longer names and keeps the viewing locale for Japanese text', () => {
const tree = paragraph ('虹夏 and 虹')
remarkWikiAutolink ([candidate ('虹', 1), candidate ('虹夏', 2)],
'ja', 'ain-Kana') (tree)
expect (tree.children[0]).toMatchObject ({
type: 'paragraph',
children: [
{
type: 'link',
url: '/wiki/%E8%99%B9%E5%A4%8F',
children: [{ type: 'text', value: '虹夏' }],
},
{ type: 'text', value: ' and ' },
{
type: 'link',
url: '/wiki/%E8%99%B9',
children: [{ type: 'text', value: '虹' }],
},
],
})
children: [
{ type: 'link', url: '/ain-Kana/wiki/2',
children: [{ type: 'text', value: '虹夏' }] },
{ type: 'text', value: ' and ' },
{ type: 'link', url: '/ain-Kana/wiki/1',
children: [{ type: 'text', value: '虹' }] }] })
})
it ('does not link text inside existing links or code', () => {
it ('does not rewrite existing links, code or images', () => {
const tree: Root = {
type: 'root',
children: [
{
type: 'paragraph',
children: [{
type: 'link',
url: '/existing',
children: [{ type: 'text', value: '虹' }],
}],
},
{
type: 'code',
value: '虹',
},
],
}
type: 'root', children: [
{ type: 'paragraph', children: [
{ type: 'link', url: '/existing', children: [{ type: 'text', value: '虹' }] },
{ type: 'inlineCode', value: '虹' },
{ type: 'image', url: '/image', alt: '虹' }] },
{ type: 'code', value: '虹' }] }
const original = structuredClone (tree)
remarkWikiAutolink (['虹']) (tree)
remarkWikiAutolink ([candidate ('虹', 1)], 'ja', 'ain-Kana') (tree)
expect (tree).toEqual (original)
})
it ('links an alias to its description rather than its tag ID or matched name', () => {
const tree = paragraph ('別名')
remarkWikiAutolink ([candidate ('別名', 9, { tagId: 123 })],
'ja', 'ain-Kana') (tree)
expect (tree.children[0]).toMatchObject ({
type: 'paragraph',
children: [{
type: 'link',
url: '/existing',
children: [{ type: 'text', value: '虹' }],
}],
})
expect (tree.children[1]).toMatchObject ({ type: 'code', value: '虹' })
children: [{ type: 'link', url: '/ain-Kana/wiki/9' }] })
})
it ('leaves ambiguous names and other locales or languages unlinked', () => {
const tree = paragraph ('虹 名前 name')
const original = structuredClone (tree)
remarkWikiAutolink ([candidate ('虹', 1), candidate ('虹', 2),
candidate ('名前', 3, { localeCode: 'ja' }),
candidate ('name', 4, { languageCode: 'ain' })], 'ja', 'ain-Kana') (tree)
expect (tree).toEqual (original)
})
it ('links Ainu words only at word boundaries', () => {
const tree = paragraph ('チャペ チャペ。チャペア')
remarkWikiAutolink ([candidate ('チャペ', 5, { languageCode: 'ain' })],
'ain', 'ain-Kana') (tree)
expect (tree.children[0]).toMatchObject ({
children: [
{ type: 'link', url: '/ain-Kana/wiki/5' },
{ type: 'text', value: ' ' },
{ type: 'link', url: '/ain-Kana/wiki/5' },
{ type: 'text', value: '。チャペア' }] })
})
it ('preserves tag-group resource identity', () => {
const tree = paragraph ('group')
remarkWikiAutolink ([candidate ('group', 8, {
resourceType: 'tag_group', tagId: null, tagDescriptionId: null })],
'ja', 'ain-Kana') (tree)
expect (tree.children[0]).toMatchObject ({
children: [{ type: 'link', url: '/ain-Kana/wiki/8' }] })
})
})