35 lines
1.5 KiB
TypeScript
35 lines
1.5 KiB
TypeScript
import type { Segment, ShownName } from './types'
|
|
import { createContext } from 'react'
|
|
|
|
/** 页面上这个版本的中文名:下标 → 显示成什么。 */
|
|
export type NameMap = ReadonlyMap<number, ShownName>
|
|
|
|
/** 眼下页面上显示成中文名的名字,SegmentText 按它换字。 */
|
|
export const DisplayNameContext = createContext<NameMap>(new Map())
|
|
|
|
/** 某个文档版本的中文名。 */
|
|
export interface VersionNames {
|
|
version: number
|
|
names: NameMap
|
|
}
|
|
|
|
export function nameMap(names: readonly ShownName[]): NameMap {
|
|
return new Map(names.map(name => [name.offset, name]))
|
|
}
|
|
|
|
/** 收到新文档:换成它带来的中文名(上一版查到的跟着改动挪过位置的,或这一版查过的)。 */
|
|
export function documentNames(version: number, names: readonly ShownName[]): VersionNames {
|
|
return { version, names: nameMap(names) }
|
|
}
|
|
|
|
/** 收到查到的中文名:是页面上这个版本的才换上,迟到的旧版本的不理。 */
|
|
export function acceptNames(current: VersionNames | undefined, version: number, names: readonly ShownName[]): VersionNames | undefined {
|
|
return current?.version === version ? { version, names: nameMap(names) } : current
|
|
}
|
|
|
|
/** 这段名字显示成什么中文名:照抄自源码、下标和长度都对得上才算。 */
|
|
export function shownName(segment: Segment, names: NameMap): ShownName | undefined {
|
|
const shown = segment.offset === undefined ? undefined : names.get(segment.offset)
|
|
return shown?.length === segment.text.length ? shown : undefined
|
|
}
|