Files
superwork/vscode/webview-ui/src/codeReader/displayNames.ts
T

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
}