ファイル
btrc-hub/frontend/src/lib/remark-wiki-autolink.test.ts
T
2026-10-19 12:30:59 +09:00

94 行
3.3 KiB
TypeScript
Raw Blame 履歴

このファイルには不可視のUnicode文字が含まれています
このファイルには人間が識別できない不可視のUnicode文字が含まれており、コンピューターによって特殊な処理が行われる可能性があります。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 不可視文字を表示するにはエスケープボタンを使用します。
import { describe, expect, it } from 'vitest'
import remarkWikiAutolink from '@/lib/remark-wiki-autolink'
import type { Root } from 'mdast'
import type { WikiAutolinkCandidate } from '@/types'
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 ({
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 rewrite existing links, code or images', () => {
const tree: Root = {
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 ([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 ({
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' }] })
})
})