40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
import type { CodeReaderRegistry } from '../registry'
|
|
import type { TreeSitterRuntime } from '../runtime'
|
|
import type { DocumentMessage } from './messages'
|
|
import { readBlockViews } from '../blockView'
|
|
|
|
/** 生成预览数据要读的那点文档信息(TextDocument 的子集)。 */
|
|
export interface DocumentSnapshot {
|
|
languageId: string
|
|
version: number
|
|
getText: () => string
|
|
}
|
|
|
|
/** 当前文档 → 发给预览的 document 消息;语言不支持或解析失败时带 error,blocks 为空。 */
|
|
export async function documentMessage(
|
|
document: DocumentSnapshot,
|
|
registry: Pick<CodeReaderRegistry, 'languageFor' | 'translatorsFor' | 'selectedTranslator'>,
|
|
runtime: Pick<TreeSitterRuntime, 'parse'>,
|
|
): Promise<DocumentMessage> {
|
|
const { languageId, version } = document
|
|
const source = document.getText()
|
|
const translator = registry.selectedTranslator(languageId)
|
|
const message: DocumentMessage = {
|
|
type: 'document',
|
|
version,
|
|
languageId,
|
|
blocks: [],
|
|
translators: registry.translatorsFor(languageId).map(({ id, label }) => ({ id, label })),
|
|
translatorId: translator?.id ?? '',
|
|
}
|
|
const adapter = registry.languageFor(languageId)
|
|
if (!adapter)
|
|
return { ...message, error: `代码阅读还不支持「${languageId}」这种语言` }
|
|
try {
|
|
return { ...message, blocks: await readBlockViews(runtime, adapter, translator, languageId, source) }
|
|
}
|
|
catch (err) {
|
|
return { ...message, error: err instanceof Error ? err.message : String(err) }
|
|
}
|
|
}
|