实现解析 text 功能
- 测试
js
describe("text", ()=>{
it("simple text",()=>{
const ast = baseParse("some text")
expect(ast.children[0]).toStrictEqual({
type: NodeTypes.TEXT,
content: "some text"
})
})
})
- 思路:
* 如果没有命中插值和元素的话,默认就走 Text 类型
* 如果是 Text 类型,我们取出 content 值,然后推进 some text,也就是删除 some text - 功能实现
js
// compiler-core/parse.ts
function parseChildren(context) {
const nodes: any[] = []
let node: any
const s = context.source
if (s.startsWith('{{')) {
node = parseInterpolation(context)
} else if (s[0] === '<') {
if (/[a-z]/i.test(context.source[1])) {
node = parseElement(context)
}
}
if (!node) { // ✅ text类型
node = parseText(context)
}
nodes.push(node)
return nodes
}
function parseText(context: any) { // ✅ 解析过程
// 1. 获取 content
const content = parseTextData(context, context.source.length)
// 2. 推进
advanceBy(context, content.length)
return {
type: NodeTypes.TEXT,
content: "some text"
}
}
// ✅ 函数抽离
function parseTextData(context:any, length: number) {
return context.source.slice(0, length)
}
// src/ast.ts
export const enum NodeTypes {
INTERPOLATION,
SIMPLE_EXPRESSION,
ELEMENT,
TEXT // ✅
}