feat: 阶段1-3 桌面编辑器(Tauri 骨架/编辑核心深化/复杂内容)

This commit is contained in:
Muse
2026-11-13 21:19:23 +08:00
parent cbd7ce4b44
commit cbe641e21a
36 changed files with 10059 additions and 0 deletions

39
tests/text.test.ts Normal file
View File

@@ -0,0 +1,39 @@
import { describe, it, expect } from 'vitest'
import { countWords, countChars, extractOutline, baseName, isMarkdownPath } from '../src/utils/text'
describe('字数统计', () => {
it('中文按字、英文按词、标点不计', () => {
expect(countWords('你好,世界!')).toBe(4)
expect(countWords('hello world, again')).toBe(3)
expect(countWords('中文 mixed 文本 test')).toBe(2 + 1 + 2 + 1)
})
it('代码块可排除', () => {
const md = '正文一二\n\n```\ncode code code\n```\n'
expect(countWords(md, true)).toBe(4 + 3)
expect(countWords(md, false)).toBe(4)
})
it('字符数按 Unicode 码点计', () => {
expect(countChars('a你好b')).toBe(4)
})
})
describe('大纲提取', () => {
it('提取层级与行号,跳过代码块内的 # 行', () => {
const md = '# 一级\n\n```\n# 不是标题\n```\n\n## 二级\n正文\n### 三级\n'
const outline = extractOutline(md)
expect(outline.map((o) => o.text)).toEqual(['一级', '二级', '三级'])
expect(outline.map((o) => o.level)).toEqual([1, 2, 3])
expect(outline[1].line).toBe(6)
})
})
describe('路径工具', () => {
it('Windows 路径取文件名', () => {
expect(baseName('C:\\docs\\笔记\\a.md')).toBe('a.md')
expect(baseName('/home/x/b.md')).toBe('b.md')
})
it('Markdown 路径判定', () => {
expect(isMarkdownPath('a.MD')).toBe(true)
expect(isMarkdownPath('a.txt')).toBe(false)
})
})