2026-07-23 15:10:13 +08:00
|
|
|
|
import type { SourceLine } from './types'
|
2026-07-10 16:45:55 +08:00
|
|
|
|
|
2026-07-23 15:10:13 +08:00
|
|
|
|
/** 仅用于“使用示例”上传;正式预览和切片全部由后端生成。 */
|
2026-07-10 16:45:55 +08:00
|
|
|
|
export const DEFAULT_SOURCE_TEXT = [
|
|
|
|
|
|
'问:如何看待当前的通货膨胀风险?',
|
|
|
|
|
|
'答:当前通胀水平总体可控,但仍需关注能源价格与供给扰动。',
|
|
|
|
|
|
'问:美联储下一次议息会议何时召开?',
|
|
|
|
|
|
'答:会议时间以美联储官方日历为准,市场会重点关注利率路径指引。',
|
|
|
|
|
|
'问:人民币汇率未来走势如何?',
|
|
|
|
|
|
'答:人民币汇率取决于中美利差、经济基本面与政策预期。',
|
|
|
|
|
|
'问:什么是复利?',
|
2026-07-23 15:10:13 +08:00
|
|
|
|
'答:复利是将上一期利息加入本金,再计算下一期利息。',
|
2026-07-10 16:45:55 +08:00
|
|
|
|
].join('\n')
|
|
|
|
|
|
|
2026-07-23 15:10:13 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 把后端返回的字符偏移映射为源文件行,仅负责界面高亮,不参与切片。
|
|
|
|
|
|
*/
|
2026-07-10 16:45:55 +08:00
|
|
|
|
export function sourceLines(sourceText: string): SourceLine[] {
|
|
|
|
|
|
const rawLines = sourceText.split('\n')
|
|
|
|
|
|
let cursor = 0
|
|
|
|
|
|
|
|
|
|
|
|
return rawLines.map((content, index) => {
|
|
|
|
|
|
const start = cursor
|
|
|
|
|
|
const end = start + content.length
|
|
|
|
|
|
cursor = end + (index < rawLines.length - 1 ? 1 : 0)
|
|
|
|
|
|
return { number: index + 1, content, start, end }
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-23 15:10:13 +08:00
|
|
|
|
/** 与后端预览 token 估算规则一致,仅用于编辑中的即时计数。 */
|
|
|
|
|
|
export function estimateTokenCount(text: string): number {
|
|
|
|
|
|
return text.match(/[\u3400-\u4dbf\u4e00-\u9fff]|[A-Za-z0-9_]+|[^\s]/gu)?.length ?? 0
|
2026-07-10 16:45:55 +08:00
|
|
|
|
}
|