bobe 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bobe.cjs.js +213 -144
- package/dist/bobe.cjs.js.map +1 -1
- package/dist/bobe.esm.js +213 -144
- package/dist/bobe.esm.js.map +1 -1
- package/dist/index.umd.js +213 -144
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -3
package/dist/bobe.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport { MultiTypeStack } from './typed';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000,\n Semicolon = 0b0000_0000_0000_0000_0000_0001_0000_0000\n}\n\nexport enum FakeType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Fail = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Component = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Fragment = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n ForItem = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport const CondBit = FakeType.If | FakeType.Fail | FakeType.Else;\nexport const LogicalBit = FakeType.If | FakeType.Fail | FakeType.Else | FakeType.For | FakeType.ForItem;\nexport const CtxProviderBit =\n FakeType.If |\n FakeType.Fail |\n FakeType.Else |\n FakeType.For |\n FakeType.ForItem |\n FakeType.Component |\n FakeType.Fragment;\n\nexport const TokenizerSwitcherBit = FakeType.Component | FakeType.Fragment;\nexport type NodeSortBit = number;\n/**\n * 按不同维度分类,分类不互斥\n */\nexport enum NodeSort {\n /** 逻辑类型 1.if 2.else 3.fail 4.for 5. for item */\n Logic = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n /** 真实节点 */\n Real = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n /** 组件 */\n Component = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n /** FakeType 所有枚举都能提供 ctx,否则重新渲染时获取不到上下文 */\n CtxProvider = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n /** 节点可导致 token 切换 1. component 2. fragment */\n TokenizerSwitcher = 0b0000_0000_0000_0000_0000_0000_0001_0000\n}\n\nexport enum TerpEvt {\n AllAttrGot = 'all-attr-got',\n HandledComponentNode = 'handled-component-node'\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport const InsComputed = Symbol('insertion-computed-map-key');\nexport const IsAnchor = Symbol('is-anchor');\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\n\nexport type TerpConf = Partial<\n Pick<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>\n>;\nexport type CustomRenderConf = Pick<\n TerpConf,\n 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'\n>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: MultiTypeStack<any>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = {\n /** 在哪个 Store 声明的 */\n boundStore: Store;\n (isSub: boolean): Tokenizer;\n};\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type LogicNode = {\n __logicType: FakeType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n};\n\nexport type ForNode = LogicNode & {\n children: ForItemNode[];\n snapshot: ReturnType<Tokenizer['snapshot']>;\n itemExp: string | ((value: any) => any);\n indexName?: string;\n getKey?: (data: any) => any;\n arr: any[];\n effect: Dispose;\n i: number;\n owner: ComponentNode | FragmentNode;\n prevSibling: any;\n};\n\nexport type ForItemNode = LogicNode & {\n id: number;\n forNode: ForNode;\n data: any;\n effect: Dispose;\n key?: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n preCond: IfNode | null;\n owner: ComponentNode | FragmentNode;\n};\n\nexport type FragmentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type ComponentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};","import { NodeSort, NodeSortBit, StackItem } from './type';\n\n// 1. 定义类别枚举\ntype Type = 'A' | 'B' | 'C';\n\n// 2. 定义节点结构\ninterface StackNode<T> {\n value: T;\n types: NodeSortBit;\n // prevGlobal: StackNode<T> | null;\n // 核心:记录在该节点加入时,各个类别的上一个节点是谁\n prevByType: Partial<Record<number, StackNode<T>>>;\n}\n\nexport class MultiTypeStack<T> {\n // 记录全局栈顶\n // private top: StackNode<T> | null = null;\n\n // 记录每个类别的当前最新节点(各分类的“栈顶”)\n private typeTops: Partial<Record<number, StackNode<T>>> = {};\n\n length = 0;\n stack: StackNode<T>[] = [];\n /**\n * 入栈操作\n * @param value 数据\n * @param bits 该节点所属的类别数组\n */\n push(value: T, bits: NodeSortBit): void {\n const newNode: StackNode<T> = {\n value,\n types: bits,\n prevByType: {}\n };\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 按类型链接前置节点\n newNode.prevByType[bit] = this.typeTops[bit] || undefined;\n this.typeTops[bit] = newNode;\n }\n this.stack[this.length++] = newNode;\n }\n\n /**\n * 出栈操作\n */\n pop() {\n const poppedNode = this.stack[this.length - 1];\n this.stack[--this.length] = null;\n if (!poppedNode) return undefined;\n\n let { types: bits } = poppedNode;\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 弹出对应类别的“顶端”元素\n this.typeTops[bit] = poppedNode.prevByType[bit];\n }\n\n // 更新全局栈顶\n return [poppedNode.value, poppedNode.types] as const;\n }\n\n /**\n * 获取某个类别的当前“顶部”元素\n */\n peekByType(cat: number): T | undefined {\n return this.typeTops[cat]?.value;\n }\n\n peekType(): number | undefined {\n return this.stack.at(-1).types;\n }\n\n /**\n * 获取全局栈顶\n */\n peek(): T | undefined {\n return this.stack.at(-1).value;\n }\n\n // /**\n // * 1. 全局向前遍历 (不分类)\n // * 从栈顶开始,沿着全局链条向栈底遍历\n // */\n // forEach(callback: (value: T, types: number) => any): void {\n // let current = this.top;\n\n // while (current !== null) {\n // // 执行回调,如果返回 false 则立即停止\n // const shouldBreak = callback(current.value, current.types);\n // if (shouldBreak) break;\n\n // current = current.prevGlobal;\n // }\n // }\n\n // /**\n // * 2. 按类别向前遍历\n // * 仅遍历属于指定类别 cat 的节点\n // */\n // forEachByType(cat: number, callback: (value: T) => any): void {\n // // 从该类别的当前“顶端”节点开始\n // let current = this.typeTops[cat];\n\n // while (current) {\n // const shouldBreak = callback(current.value);\n // if (shouldBreak) break;\n\n // // 关键点:直接跳向该节点记录的“上一个同类节点”\n // // 这比遍历全局栈再筛选类别要快得多 (O(m) vs O(n))\n // current = current.prevByType[cat];\n // }\n // }\n}\n","import { Tokenizer } from './tokenizer';\nimport {\n $,\n deepSignal,\n effect,\n getPulling,\n Keys,\n runWithPulling,\n scope,\n setPulling,\n shareSignal,\n Signal,\n Store,\n toRaw\n} from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondBit,\n FragmentNode,\n IfNode,\n IsAnchor,\n LogicalBit,\n LogicNode,\n FakeType,\n NodeSort,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType,\n TokenizerSwitcherBit,\n ForNode,\n ForItemNode,\n Token\n} from './type';\nimport { BaseEvent, jsVarRegexp } from 'bobe-shared';\nimport { MultiTypeStack } from './typed';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & LogicalBit;\n }\n\n ctx: ProgramCtx;\n rootComponent: ComponentNode | null = null;\n\n program(root: any, componentNode?: ComponentNode, before?: any, ctxProvider?: any) {\n // 首屏渲 app 组件需要创建对象\n this.rootComponent = componentNode;\n\n this.tokenizer.nextToken();\n const stack = new MultiTypeStack<StackItem>();\n stack.push({ node: root, prev: null }, NodeSort.Real);\n stack.push(\n { node: componentNode, prev: null },\n NodeSort.Component | NodeSort.CtxProvider | NodeSort.TokenizerSwitcher\n );\n if (ctxProvider) {\n stack.push(\n { node: ctxProvider, prev: null },\n (ctxProvider.__logicType & LogicalBit ? NodeSort.Logic : 0) | NodeSort.CtxProvider\n );\n }\n\n const ctx = (this.ctx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n });\n\n const rootPulling = getPulling();\n while (1) {\n // 子 tokenizer 退出,代表子组件逻辑结束\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n this.tokenizer.nextToken(); // token = ID\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n !ctx.current.__logicType\n ? NodeSort.Real\n : (ctx.current.__logicType & LogicalBit ? NodeSort.Logic : 0) |\n (ctx.current.__logicType & TokenizerSwitcherBit ? NodeSort.TokenizerSwitcher : 0) |\n (ctx.current.__logicType === FakeType.Component ? NodeSort.Component : 0) |\n NodeSort.CtxProvider\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n if (ctx.current) {\n ctx.realParent = ctx.current;\n }\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 2 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.nextToken(); // token = ID | DEDENT\n const [{ node: parent, prev }, sort] = stack.pop();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.peekByType(NodeSort.Real);\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出非原生节点\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (sort & NodeSort.Logic) {\n // 找最近的 if for\n const parentLogic = stack.peekByType(NodeSort.Logic)?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tokenizer\n if (sort & NodeSort.TokenizerSwitcher) {\n const switcher = stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n this.tokenizer = switcher.tokenizer;\n }\n\n // 弹出 forItem\n if (parent.__logicType === FakeType.ForItem) {\n const { forNode } = parent as ForItemNode;\n const { i, arr, snapshot } = forNode;\n if (i + 1 < arr.length) {\n // 恢复后 token null, 下一个是 \\n, Indent\n this.tokenizer.resume(snapshot);\n this.tokenizer.nextToken(); // token = \\n\n this.tokenizer.nextToken(); // token = Indent\n ctx.prevSibling = parent;\n ctx.current = forNode.children[++forNode.i];\n continue;\n }\n // 正常弹出 current = for node\n ctx.prevSibling = forNode.prevSibling;\n ctx.current = forNode;\n continue;\n }\n }\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n insertAfterAnchor(name = 'anchor') {\n const { realParent, prevSibling, stack, before } = this.ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor(name);\n this.ctx.prevSibling = stack.length === 2 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev?.__logicType) {\n // forItem 应该使用 forNode 的 after\n childCmp.realBefore = prev.forNode ? prev.forNode.realAfter : prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\n }\n }\n }\n\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this.tokenizer._hook({});\n let _node: any;\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (value === 'for') {\n return this.forDeclaration();\n } else if (hookType) {\n const data = this.getData();\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class 或 片段\n if (typeof value === 'function') {\n _node = this.componentOrFragmentDeclaration(value, ctx);\n }\n // 其余类型不允许静态插值\n else {\n throw new SyntaxError(`declaration 不支持 ${value} 类型的静态插值`);\n }\n }\n // 动态插值\n // 一定是 js 表达式\n // 1. 返回基础值,创建文本节点 createNode('text', String(value))\n // 2. 返回 组件,创建组件节点\n // 3. 返回 片段\n // TODO: 后续考虑动态组件\n else {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const val = data[Keys.Raw][value];\n if (typeof val === 'function') {\n _node = this.componentOrFragmentDeclaration(val, ctx);\n }\n // 字符\n else {\n const str = valueIsMapKey ? value : this.getFn(data, value);\n _node = this.createNode('text');\n this.onePropParsed(data, _node, 'text', str, valueIsMapKey, false);\n }\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.nextToken(); // 跳过 node 本身,token -> id\n this.headerLine(_node);\n this.extensionLines(_node);\n // 组件用完,切换回 真实node 的方法\n if (_node.__logicType & TokenizerSwitcherBit) {\n this.onePropParsed = this.oneRealPropParsed;\n this.tokenizer = _node.tokenizer;\n }\n return _node;\n }\n\n forDeclaration() {\n const arrExp = this.tokenizer.nextToken().value as string;\n this.tokenizer.nextToken(); // 分号\n const itemToken = this.tokenizer.nextToken(); // item 表达式\n const isDestruct = itemToken.type === TokenType.InsertionExp;\n let itemExp: string | ((value: any) => any) = itemToken.value as string;\n if (isDestruct) {\n itemExp = '{' + itemExp + '}';\n const vars = itemExp.match(jsVarRegexp).join(',');\n itemExp = new Function('item', `let ${vars}; (${itemExp}=item); return {${vars}};`) as any;\n }\n let indexName: string, keyExp: string;\n while (this.tokenizer.code[this.tokenizer.i] !== '\\n') {\n const next = this.tokenizer.nextToken();\n if (next.type !== TokenType.Semicolon) {\n if (!indexName) {\n indexName = next.value as string;\n } else {\n keyExp = next.value as string;\n }\n }\n }\n const owner = this.ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const prevSibling = this.ctx.prevSibling;\n const forNode: ForNode = {\n __logicType: FakeType.For,\n snapshot: this.tokenizer.snapshot(['dentStack', 'isFirstToken']),\n realParent: this.ctx.realParent,\n prevSibling,\n realBefore: prevSibling?.realAfter || prevSibling,\n realAfter: null,\n arr: null,\n itemExp,\n indexName,\n getKey: null,\n children: [],\n effect: null,\n owner,\n i: 0\n };\n if (keyExp) {\n forNode.getKey = new Function('data', `let v;with(data){v=${keyExp}};return v;`) as any;\n }\n window['for1'] = forNode;\n\n const data = this.getData();\n\n const cells = data[Keys.Meta].cells;\n const hasArrExpKey = Reflect.has(data[Keys.Raw], arrExp);\n const arrSignal = hasArrExpKey\n ? // 有 key 直接拿\n (data[arrExp], cells.get(arrExp))\n : // 无key\n $(this.getFn(data, arrExp));\n\n // 由于此处 snapshot 多配置了2个属性,更新渲染时 应该忽略这个两个属性\n forNode.realAfter = this.insertAfterAnchor('for-after');\n\n // 去除 dentStack 和 isFirstToken\n const { dentStack, isFirstToken, ...snapshotForUpdate } = forNode.snapshot;\n\n // TODO: 更新逻辑\n let isFirstRender = true;\n // TODO: effect 重新执行时,内部的 effect 自动销毁,包括 dom setProps 无法生效了\n forNode.effect = effect(() => {\n let arr: any[] = (forNode.arr = arrSignal.v);\n // 订阅 iter\n arr[Keys.Iterator];\n // 使用原始数组避免 index 依赖\n arr = toRaw(arr);\n const children = forNode.children;\n // 首屏渲染\n if (isFirstRender) {\n const len = arr.length;\n for (let i = len; i--; ) {\n const nextItem = children[i + 1];\n const item = this.createForItem(forNode, i, data);\n const anchor = this.insertAfterAnchor('for-item-after');\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n children[i] = item;\n }\n const firstInsert = children[0];\n // 有子项进行计算\n if (firstInsert) {\n firstInsert.realBefore = forNode.realBefore;\n this.tokenizer.nextToken(); // 是 NewLine\n this.tokenizer.nextToken(); // 是 Indent\n }\n // 没有子项,跳过\n else {\n this.tokenizer.skip();\n }\n }\n // 更新渲染\n else {\n const oldLen = children.length;\n const newLen = arr.length;\n const minLen = Math.min(oldLen, newLen);\n const newChildren: ForItemNode[] = [];\n if (!forNode.getKey) {\n // 删除\n if (newLen < oldLen) {\n for (let i = oldLen - 1; i >= newLen; i--) {\n const child = children[i];\n this.removeLogicNode(child);\n this.remove(child.realAfter);\n // 释放删除项 effect\n child.effect();\n }\n }\n // 新增\n if (oldLen < newLen) {\n const lastAfter = children.at(-1)?.realAfter || forNode.realBefore;\n for (let i = newLen - 1; i >= oldLen; i--) {\n const item = this.createForItem(forNode, i, data);\n newChildren[i] = item;\n const nextItem = newChildren[i + 1];\n const anchor = this.createAnchor('for-item-after');\n this.insertAfter(forNode.realParent, anchor, lastAfter);\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n this.tokenizer = owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(snapshotForUpdate);\n // 解析到缩进小于 base 时自动 eof\n this.tokenizer.useDedentAsEof = false;\n runWithPulling(() => {\n this.program(forNode.realParent, forNode.owner, lastAfter, item);\n }, item.effect.ins);\n }\n const firstInsert = newChildren[oldLen];\n if (firstInsert) {\n firstInsert.realBefore = lastAfter;\n }\n }\n for (let i = minLen; i--; ) {\n const child = children[i];\n newChildren[i] = child;\n if (typeof itemExp === 'string') {\n child.data[itemExp] = arr[i];\n } else {\n Object.assign(child.data, itemExp(arr[i]));\n }\n }\n forNode.children = newChildren;\n }\n }\n isFirstRender = false;\n });\n return forNode.children[0] || forNode;\n }\n\n forItemId = 0;\n createForItem(forNode: ForNode, i: number, parentData: any) {\n let forItemNode: ForItemNode;\n /**\n * 考虑到 effect 是嵌套的,这种情况每次 forNodeEffect 更新会导致上次产生的内部 setPropsEffect 被自动释放\n * 这是响应式 effect 嵌套的默认特性\n * forNodeEffect(() => {\n * 这里通过 setPulling 模拟嵌套 effect\n * setPropsEffect(() => {\n * })\n * })\n * 因此我们需要让情况变成这样,内部的 effect 交由 forItemNode.effect 接管\n * 这个 scope 是全局的,即指定了参数 parentScope = null\n * 这样外部的 effect 不再自动释放 setPropsEffect\n * 这么的目的是我们能在 diff 过程中手动控制释放 forItemNode.effect\n * globalScope(() => {\n * setPropsEffect(() => {\n * })\n * })\n *\n * 1. runWithPulling 避免 scope 被 effect 收集\n * 2. scope 保证 signal 被 scope 管理\n */\n const effect = scope(() => {}, null);\n\n // 考虑到生成每项数据需要依赖原始数组,因此无法放在 scope 里\n const { arr, itemExp, indexName, getKey } = forNode;\n let data: Record<any, any>;\n if (typeof itemExp === 'string') {\n data = $<Record<any, any>>(\n indexName\n ? {\n [itemExp]: arr[i],\n [indexName]: i\n }\n : {\n [itemExp]: arr[i]\n }\n );\n } else {\n const rawData = itemExp(arr[i]);\n if (indexName) {\n rawData[indexName] = i;\n }\n data = $<Record<any, any>>(rawData);\n }\n\n Object.setPrototypeOf(data, parentData);\n\n forItemNode = {\n id: this.forItemId++,\n __logicType: FakeType.ForItem,\n realParent: null,\n realBefore: null,\n realAfter: null,\n forNode,\n key: getKey?.(data),\n effect: null,\n data\n };\n forItemNode.effect = effect;\n return forItemNode;\n }\n\n getData() {\n const { node } = this.ctx.stack.peekByType(NodeSort.CtxProvider);\n return node.data || node.owner.data;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(\n data: Store,\n node: any,\n key: string,\n value: any,\n valueIsMapKey: boolean,\n isFn: boolean,\n hookI?: number\n ) {\n if (isFn) {\n this.setProp(node, key, value, hookI);\n } else if (typeof value === 'function') {\n effect(() => {\n const res = value();\n this.setProp(node, key, res, hookI);\n });\n } else if (valueIsMapKey) {\n effect(() => {\n const res = data[value];\n this.setProp(node, key, res, hookI);\n });\n }\n // 静态数据\n else {\n this.setProp(node, key, value, hookI);\n }\n }\n\n oneRealPropParsed: Interpreter['onePropParsed'] = this.onePropParsed.bind(this);\n\n componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n let Component: typeof Store, render: BobeUI, child: any;\n\n const isCC = (ComponentOrRender as any).prototype instanceof Store;\n if (isCC) {\n Component = ComponentOrRender as any;\n child = Component.new();\n } else {\n render = ComponentOrRender as BobeUI;\n const boundStore = render.boundStore;\n // 使用原型链来继承 store 的数据\n child = deepSignal({}, getPulling(), true);\n Object.setPrototypeOf(child, boundStore);\n }\n\n const node: ComponentNode = {\n __logicType: isCC ? FakeType.Component : FakeType.Fragment,\n realParent: ctx.realParent,\n realBefore: null,\n realAfter: null,\n data: child,\n tokenizer: render ? render(true) : (child['ui'] as BobeUI)(true)\n };\n this.onePropParsed = (data, _, key, value, valueIsMapKey, isFn, hookI) => {\n if (isFn) {\n child[Keys.Raw][key] = value;\n }\n // key 映射\n else if (valueIsMapKey) {\n shareSignal(data, value, child, key);\n }\n // 动态值内置 computed 处理\n else {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n if (typeof value === 'function') {\n const computed = $(value);\n cells.set(key, computed);\n child[Keys.Raw][key] = undefined;\n }\n // 静态数据\n else {\n cells.set(key, { v: value } as Signal);\n child[Keys.Raw][key] = value;\n }\n }\n };\n node.realAfter = this.insertAfterAnchor('component-after');\n return node;\n }\n getFn(data: any, expression: string | number) {\n return new Function('data', `let v;with(data){v=${expression}};return v;`).bind(undefined, data);\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const keyWord = this.tokenizer.token;\n const expToken = this.tokenizer.condExp(); // keyWord => exp\n const value = expToken.value as string | number;\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondBit;\n const data = this.getData();\n // @ts-ignore\n const noCond = value === true;\n const valueIsMapKey = !noCond && Reflect.has(data[Keys.Raw], value);\n const owner = ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const ifNode: IfNode = {\n __logicType: isElse ? FakeType.Else : isIf ? FakeType.If : FakeType.Fail,\n // 此时 token 是 exp, 下次解析 从 \\n 开始\n snapshot: this.tokenizer.snapshot(),\n realParent: null,\n realBefore: null,\n realAfter: null,\n condition: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null,\n owner\n };\n let signal: Signal;\n\n switch (keyWord.value) {\n case 'if':\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => data[value], null);\n // 拿到 signal\n const { cells } = data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = this.getFn(data, value);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n break;\n case 'else':\n // 纯 else\n if (noCond) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // else if xxx\n else {\n const fn = valueIsMapKey ? null : this.getFn(data, value);\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return valueIsMapKey ? data[value] : fn();\n });\n }\n break;\n case 'fail':\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n point = point.preCond;\n }\n return true;\n });\n break;\n default:\n break;\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(`${keyWord.value}-after`);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n this.tokenizer.nextToken(); // token = NEWLINE\n this.tokenizer.nextToken(); // token = ID\n }\n // 更新渲染\n else {\n // 切换到对应 Switcher 的 tokenizer\n this.tokenizer = ifNode.owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(ifNode.snapshot);\n this.tokenizer.useDedentAsEof = false;\n\n // 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.owner, ifNode.realBefore, ifNode);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n // 此时 token 是 condition, i => \\n\n this.tokenizer.skip(); // skipStr\n }\n // 更新渲染,删除所有节点\n else {\n this.removeLogicNode(ifNode);\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\n }\n\n removeLogicNode(node: LogicNode) {\n const { realBefore, realAfter, realParent } = node;\n let point = realBefore ? this.nextSib(realBefore) : this.firstChild(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if ((this.tokenizer.token.type & TokenType.Pipe) === 0) {\n return;\n }\n // 开始解析 attributeList\n this.tokenizer.nextToken(); // PIPE\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n return;\n }\n // 换行\n this.tokenizer.nextToken(); // NEWLINE\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n this.tokenizer.nextToken(); // NEWLINE\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或 产生 computed\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n const data = this.getData();\n while ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n // 取 key\n if (key == null) {\n key = this.tokenizer.token.value as any;\n }\n // 取 =\n else if (eq == null) {\n eq = '=';\n }\n // 取 value\n else {\n const [hookType, value, hookI] = this.tokenizer._hook({});\n const rawVal = data[Keys.Raw][value];\n const isFn = typeof rawVal === 'function';\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const fn = isFn ? rawVal : valueIsMapKey ? value : this.getFn(data, value);\n this.onePropParsed(data, _node, key, fn, valueIsMapKey, isFn, hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.nextToken();\n }\n }\n config(opt: TerpConf) {\n Object.assign(this, opt);\n this.opt = opt;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {},\n nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n firstChild(node: any) {\n return node.firstChild;\n }\n\n createAnchor(name: string) {\n return {\n name,\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n const next = parent.firstChild;\n parent.firstChild = node;\n node.nextSibling = next;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n}\n","import { isNum, matchIdStart, matchIdStart2, Queue } from 'bobe-shared';\nimport { BaseType, Hook, HookProps, HookType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n static DedentId = `__DEDENT__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n // TODO: 生产环境不需要这个,导致不必要的内存占用\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor(\n private hook: Hook,\n public useDedentAsEof: boolean\n ) {\n if (useDedentAsEof) {\n this.setToken(TokenType.Indent, '');\n this.isFirstToken = true;\n // this.waitingTokens.push({\n // type: TokenType.Indent,\n // typeName: TokenType[TokenType.Indent],\n // value: ''\n // })\n }\n }\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot(keys?: (keyof Tokenizer)[]): Partial<Tokenizer> {\n const snap = {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n if (keys) {\n for (const k of keys) {\n snap[k] = this[k];\n if (k === 'dentStack') {\n snap[k] = this[k].slice();\n }\n }\n }\n return snap;\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.code[this.i];\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.i++;\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.i++;\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.code[this.i] === undefined;\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n public nextToken(): Token {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n const char = this.code[this.i];\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n const braceToken = this.brace();\n this.setToken(TokenType.InsertionExp, braceToken);\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n case ';':\n this.setToken(TokenType.Semicolon, ';');\n break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n if (typeof char === 'string' && matchIdStart2(char, 0)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.i++;\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n return this.token;\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n condExp() {\n let value = '';\n this.token = null;\n while (1) {\n const char = this.code[this.i];\n if (char === '\\n') {\n break;\n }\n value += char;\n this.i++;\n }\n value = value.trim();\n this.setToken(TokenType.Identifier, value || true);\n return this.token;\n }\n\n /**\n * 解析到 for 时使用这个方法获取 for 后方的子表达式\n * 表达式通过 “;” 分割\n * // 最多可有三个表达式\n * for arr ; item index; item.key\n * @returns {boolean} 是否含有 key\n */\n public forLoopSubExp() {\n this.token = null;\n let value = '';\n let count = 0;\n while (1) {\n const char = this.code[this.i];\n const isSemicolon = char === ';';\n if (isSemicolon || char === '\\n') {\n value = value.trim();\n if (!this.token) {\n this.setToken(TokenType.Identifier, value);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value\n });\n }\n value = '';\n count++;\n if (count > 3) {\n throw SyntaxError(`for 循环最多可包含三个表达式, 分别为 arr ; item index [; key]`);\n }\n // 匹配到回车退出\n if (!isSemicolon) return count === 3;\n } else {\n value += char;\n }\n this.i++;\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.code[this.i + 1];\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.i++;\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.code[this.i];\n const nextChar = this.code[this.i + 1];\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.code[this.i];\n this.i++;\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n return value.slice(1);\n }\n value += this.code[this.i];\n this.i++;\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.code[this.i];\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.i++;\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, currLen);\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tkr\n if (this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n } else {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n }\n } else {\n if (this.useDedentAsEof) {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: ''\n });\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (typeof nextC !== 'string' || !matchIdStart2(nextC, 0)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n if (value === Tokenizer.EofId && this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n return;\n }\n\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.i++;\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n value += nextC;\n }\n this.setToken(TokenType.Identifier, value);\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 模板字符串动态节点索引 */\n hookI = 0;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any, hookI?: any] => {\n const value = this.token.value;\n const isDynamicHook = this.token.type & TokenType.InsertionExp;\n const isStaticHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n const hookType: HookType = isDynamicHook ? 'dynamic' : isStaticHook ? 'static' : undefined;\n // 静态插值 `${xxx}`\n if (this.hook && isStaticHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n // TODO: 去除 this.hookI, hookI 由本函数返回\n return [hookType, res, hookI];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.setCode(code + fragments[fragments.length - 1]);\n }\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, ComponentNode, CustomRenderConf, FakeType } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(isSub: boolean) {\n const tokenizer = new Tokenizer(({ i }) => {\n return values[i];\n }, isSub);\n tokenizer.init(Array.from(fragments));\n return tokenizer;\n };\n ui.boundStore = Store.Current;\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n const tokenizer: Tokenizer = store['ui'](false);\n const terp = new Interpreter(tokenizer);\n terp.config(option);\n\n const componentNode: ComponentNode = {\n __logicType: FakeType.Component,\n realParent: root,\n data: store,\n tokenizer\n };\n\n terp.program(root, componentNode);\n // ui => bobe`` 返回的函数\n return [componentNode, store];\n };\n}\n"],"names":["TokenType","FakeType","NodeSort","_a","effect","ui"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport { MultiTypeStack } from './typed';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000,\n Semicolon = 0b0000_0000_0000_0000_0000_0001_0000_0000\n}\n\nexport enum FakeType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Fail = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Component = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Fragment = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n ForItem = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport const CondBit = FakeType.If | FakeType.Fail | FakeType.Else;\nexport const LogicalBit = FakeType.If | FakeType.Fail | FakeType.Else | FakeType.For | FakeType.ForItem;\nexport const CtxProviderBit =\n FakeType.If |\n FakeType.Fail |\n FakeType.Else |\n FakeType.For |\n FakeType.ForItem |\n FakeType.Component |\n FakeType.Fragment;\n\nexport const TokenizerSwitcherBit = FakeType.Component | FakeType.Fragment;\nexport type NodeSortBit = number;\n/**\n * 按不同维度分类,分类不互斥\n */\nexport enum NodeSort {\n /** 逻辑类型 1.if 2.else 3.fail 4.for 5. for item */\n Logic = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n /** 真实节点 */\n Real = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n /** 组件 */\n Component = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n /** FakeType 所有枚举都能提供 ctx,否则重新渲染时获取不到上下文 */\n CtxProvider = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n /** 节点可导致 token 切换 1. component 2. fragment */\n TokenizerSwitcher = 0b0000_0000_0000_0000_0000_0000_0001_0000\n}\n\nexport enum TerpEvt {\n AllAttrGot = 'all-attr-got',\n HandledComponentNode = 'handled-component-node'\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport const InsComputed = Symbol('insertion-computed-map-key');\nexport const IsAnchor = Symbol('is-anchor');\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\n\nexport type TerpConf = Partial<\n Pick<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>\n>;\nexport type CustomRenderConf = Pick<\n TerpConf,\n 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'\n>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: MultiTypeStack<any>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = {\n /** 在哪个 Store 声明的 */\n boundStore: Store;\n (isSub: boolean): Tokenizer;\n};\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type LogicNode = {\n __logicType: FakeType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n};\n\nexport type ForNode = LogicNode & {\n children: ForItemNode[];\n snapshot: ReturnType<Tokenizer['snapshot']>;\n itemExp: string | ((value: any) => any);\n indexName?: string;\n getKey?: (data: any) => any;\n arr: any[];\n effect: Dispose;\n i: number;\n owner: ComponentNode | FragmentNode;\n prevSibling: any;\n};\n\nexport type ForItemNode = LogicNode & {\n id: number;\n forNode: ForNode;\n data: any;\n effect: Dispose;\n key?: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n preCond: IfNode | null;\n owner: ComponentNode | FragmentNode;\n};\n\nexport type FragmentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type ComponentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};","import { NodeSort, NodeSortBit, StackItem } from './type';\n\n// 1. 定义类别枚举\ntype Type = 'A' | 'B' | 'C';\n\n// 2. 定义节点结构\ninterface StackNode<T> {\n value: T;\n types: NodeSortBit;\n // prevGlobal: StackNode<T> | null;\n // 核心:记录在该节点加入时,各个类别的上一个节点是谁\n prevByType: Partial<Record<number, StackNode<T>>>;\n}\n\nexport class MultiTypeStack<T> {\n // 记录全局栈顶\n // private top: StackNode<T> | null = null;\n\n // 记录每个类别的当前最新节点(各分类的“栈顶”)\n private typeTops: Partial<Record<number, StackNode<T>>> = {};\n\n length = 0;\n stack: StackNode<T>[] = [];\n /**\n * 入栈操作\n * @param value 数据\n * @param bits 该节点所属的类别数组\n */\n push(value: T, bits: NodeSortBit): void {\n const newNode: StackNode<T> = {\n value,\n types: bits,\n prevByType: {}\n };\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 按类型链接前置节点\n newNode.prevByType[bit] = this.typeTops[bit] || undefined;\n this.typeTops[bit] = newNode;\n }\n this.stack[this.length++] = newNode;\n }\n\n /**\n * 出栈操作\n */\n pop() {\n const poppedNode = this.stack[this.length - 1];\n this.stack[--this.length] = null;\n if (!poppedNode) return undefined;\n\n let { types: bits } = poppedNode;\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 弹出对应类别的“顶端”元素\n this.typeTops[bit] = poppedNode.prevByType[bit];\n }\n\n // 更新全局栈顶\n return [poppedNode.value, poppedNode.types] as const;\n }\n\n /**\n * 获取某个类别的当前“顶部”元素\n */\n peekByType(cat: number): T | undefined {\n return this.typeTops[cat]?.value;\n }\n\n peekType(): number | undefined {\n return this.stack.at(-1).types;\n }\n\n /**\n * 获取全局栈顶\n */\n peek(): T | undefined {\n return this.stack.at(-1).value;\n }\n\n // /**\n // * 1. 全局向前遍历 (不分类)\n // * 从栈顶开始,沿着全局链条向栈底遍历\n // */\n // forEach(callback: (value: T, types: number) => any): void {\n // let current = this.top;\n\n // while (current !== null) {\n // // 执行回调,如果返回 false 则立即停止\n // const shouldBreak = callback(current.value, current.types);\n // if (shouldBreak) break;\n\n // current = current.prevGlobal;\n // }\n // }\n\n // /**\n // * 2. 按类别向前遍历\n // * 仅遍历属于指定类别 cat 的节点\n // */\n // forEachByType(cat: number, callback: (value: T) => any): void {\n // // 从该类别的当前“顶端”节点开始\n // let current = this.typeTops[cat];\n\n // while (current) {\n // const shouldBreak = callback(current.value);\n // if (shouldBreak) break;\n\n // // 关键点:直接跳向该节点记录的“上一个同类节点”\n // // 这比遍历全局栈再筛选类别要快得多 (O(m) vs O(n))\n // current = current.prevByType[cat];\n // }\n // }\n}\n","import { Tokenizer } from './tokenizer';\nimport {\n $,\n deepSignal,\n effect,\n getPulling,\n Keys,\n runWithPulling,\n scope,\n setPulling,\n shareSignal,\n Signal,\n Store,\n toRaw\n} from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondBit,\n FragmentNode,\n IfNode,\n IsAnchor,\n LogicalBit,\n LogicNode,\n FakeType,\n NodeSort,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType,\n TokenizerSwitcherBit,\n ForNode,\n ForItemNode,\n Token\n} from './type';\nimport { BaseEvent, jsVarRegexp } from 'bobe-shared';\nimport { MultiTypeStack } from './typed';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & LogicalBit;\n }\n\n ctx: ProgramCtx;\n rootComponent: ComponentNode | null = null;\n\n program(root: any, componentNode?: ComponentNode, before?: any, ctxProvider?: any) {\n // 首屏渲 app 组件需要创建对象\n this.rootComponent = componentNode;\n\n this.tokenizer.nextToken();\n const stack = new MultiTypeStack<StackItem>();\n stack.push({ node: root, prev: null }, NodeSort.Real);\n stack.push(\n { node: componentNode, prev: null },\n NodeSort.Component | NodeSort.CtxProvider | NodeSort.TokenizerSwitcher\n );\n if (ctxProvider) {\n stack.push(\n { node: ctxProvider, prev: null },\n (ctxProvider.__logicType & LogicalBit ? NodeSort.Logic : 0) | NodeSort.CtxProvider\n );\n }\n\n const ctx = (this.ctx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n });\n\n const rootPulling = getPulling();\n while (1) {\n // 子 tokenizer 退出,代表子组件逻辑结束\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n this.tokenizer.nextToken(); // token = ID\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n !ctx.current.__logicType\n ? NodeSort.Real\n : (ctx.current.__logicType & LogicalBit ? NodeSort.Logic : 0) |\n (ctx.current.__logicType & TokenizerSwitcherBit ? NodeSort.TokenizerSwitcher : 0) |\n (ctx.current.__logicType === FakeType.Component ? NodeSort.Component : 0) |\n NodeSort.CtxProvider\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n if (ctx.current) {\n ctx.realParent = ctx.current;\n }\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 2 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.nextToken(); // token = ID | DEDENT\n const [{ node: parent, prev }, sort] = stack.pop();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.peekByType(NodeSort.Real);\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出非原生节点\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (sort & NodeSort.Logic) {\n // 找最近的 if for\n const parentLogic = stack.peekByType(NodeSort.Logic)?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tokenizer\n if (sort & NodeSort.TokenizerSwitcher) {\n const switcher = stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n this.tokenizer = switcher.tokenizer;\n }\n\n // 弹出 forItem\n if (parent.__logicType === FakeType.ForItem) {\n const { forNode } = parent as ForItemNode;\n const { i, arr, snapshot } = forNode;\n if (i + 1 < arr.length) {\n // 恢复后 token null, 下一个是 \\n, Indent\n this.tokenizer.resume(snapshot);\n this.tokenizer.nextToken(); // token = \\n\n this.tokenizer.nextToken(); // token = Indent\n ctx.prevSibling = parent;\n ctx.current = forNode.children[++forNode.i];\n continue;\n }\n // 正常弹出 current = for node\n ctx.prevSibling = forNode.prevSibling;\n ctx.current = forNode;\n continue;\n }\n }\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n insertAfterAnchor(name = 'anchor') {\n const { realParent, prevSibling, stack, before } = this.ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor(name);\n this.ctx.prevSibling = stack.length === 2 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev?.__logicType) {\n // forItem 应该使用 forNode 的 after\n childCmp.realBefore = prev.forNode ? prev.forNode.realAfter : prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\n }\n }\n }\n\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this.tokenizer._hook({});\n let _node: any;\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (value === 'for') {\n return this.forDeclaration();\n } else if (hookType) {\n const data = this.getData();\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class 或 片段\n if (typeof value === 'function') {\n _node = this.componentOrFragmentDeclaration(value, ctx);\n }\n // 其余类型不允许静态插值\n else {\n throw new SyntaxError(`declaration 不支持 ${value} 类型的静态插值`);\n }\n }\n // 动态插值\n // 一定是 js 表达式\n // 1. 返回基础值,创建文本节点 createNode('text', String(value))\n // 2. 返回 组件,创建组件节点\n // 3. 返回 片段\n // TODO: 后续考虑动态组件\n else {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const val = data[Keys.Raw][value];\n if (typeof val === 'function') {\n _node = this.componentOrFragmentDeclaration(val, ctx);\n }\n // 字符\n else {\n const str = valueIsMapKey ? value : this.getFn(data, value);\n _node = this.createNode('text');\n this.onePropParsed(data, _node, 'text', str, valueIsMapKey, false);\n }\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.nextToken(); // 跳过 node 本身,token -> id\n this.headerLine(_node);\n this.extensionLines(_node);\n // 组件用完,切换回 真实node 的方法\n if (_node.__logicType & TokenizerSwitcherBit) {\n this.onePropParsed = this.oneRealPropParsed;\n this.tokenizer = _node.tokenizer;\n }\n return _node;\n }\n\n forDeclaration() {\n const arrExp = this.tokenizer.nextToken().value as string;\n this.tokenizer.nextToken(); // 分号\n const itemToken = this.tokenizer.nextToken(); // item 表达式\n const isDestruct = itemToken.type === TokenType.InsertionExp;\n let itemExp: string | ((value: any) => any) = itemToken.value as string;\n if (isDestruct) {\n itemExp = '{' + itemExp + '}';\n const vars = itemExp.match(jsVarRegexp).join(',');\n itemExp = new Function('item', `let ${vars}; (${itemExp}=item); return {${vars}};`) as any;\n }\n let indexName: string, keyExp: string;\n while (this.tokenizer.code[this.tokenizer.i] !== '\\n') {\n const next = this.tokenizer.nextToken();\n if (next.type !== TokenType.Semicolon) {\n if (!indexName) {\n indexName = next.value as string;\n } else {\n keyExp = next.value as string;\n }\n }\n }\n const owner = this.ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const prevSibling = this.ctx.prevSibling;\n const forNode: ForNode = {\n __logicType: FakeType.For,\n snapshot: this.tokenizer.snapshot(['dentStack', 'isFirstToken']),\n realParent: this.ctx.realParent,\n prevSibling,\n realBefore: prevSibling?.realAfter || prevSibling,\n realAfter: null,\n arr: null,\n itemExp,\n indexName,\n getKey: null,\n children: [],\n effect: null,\n owner,\n i: 0\n };\n if (keyExp) {\n forNode.getKey = new Function('data', `let v;with(data){v=${keyExp}};return v;`) as any;\n }\n window['for1'] = forNode;\n\n const data = this.getData();\n\n const cells = data[Keys.Meta].cells;\n const hasArrExpKey = Reflect.has(data[Keys.Raw], arrExp);\n const arrSignal = hasArrExpKey\n ? // 有 key 直接拿\n (data[arrExp], cells.get(arrExp))\n : // 无key\n $(this.getFn(data, arrExp));\n\n // 由于此处 snapshot 多配置了2个属性,更新渲染时 应该忽略这个两个属性\n forNode.realAfter = this.insertAfterAnchor('for-after');\n\n // 去除 dentStack 和 isFirstToken\n const { dentStack, isFirstToken, ...snapshotForUpdate } = forNode.snapshot;\n\n // TODO: 更新逻辑\n let isFirstRender = true;\n // TODO: effect 重新执行时,内部的 effect 自动销毁,包括 dom setProps 无法生效了\n forNode.effect = effect(() => {\n let arr: any[] = (forNode.arr = arrSignal.v);\n // 订阅 iter\n arr[Keys.Iterator];\n // 使用原始数组避免 index 依赖\n arr = toRaw(arr);\n const children = forNode.children;\n // 首屏渲染\n if (isFirstRender) {\n const len = arr.length;\n for (let i = len; i--; ) {\n const nextItem = children[i + 1];\n const item = this.createForItem(forNode, i, data);\n const anchor = this.insertAfterAnchor('for-item-after');\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n children[i] = item;\n }\n const firstInsert = children[0];\n // 有子项进行计算\n if (firstInsert) {\n firstInsert.realBefore = forNode.realBefore;\n this.tokenizer.nextToken(); // 是 NewLine\n this.tokenizer.nextToken(); // 是 Indent\n }\n // 没有子项,跳过\n else {\n this.tokenizer.skip();\n }\n }\n // 更新渲染\n else {\n const oldLen = children.length;\n const newLen = arr.length;\n const minLen = Math.min(oldLen, newLen);\n const newChildren: ForItemNode[] = [];\n if (!forNode.getKey) {\n // 删除\n if (newLen < oldLen) {\n for (let i = oldLen - 1; i >= newLen; i--) {\n const child = children[i];\n this.removeLogicNode(child);\n this.remove(child.realAfter);\n // 释放删除项 effect\n child.effect();\n }\n }\n // 新增\n if (oldLen < newLen) {\n const lastAfter = children.at(-1)?.realAfter || forNode.realBefore;\n for (let i = newLen - 1; i >= oldLen; i--) {\n const item = this.createForItem(forNode, i, data);\n newChildren[i] = item;\n const nextItem = newChildren[i + 1];\n const anchor = this.createAnchor('for-item-after');\n this.insertAfter(forNode.realParent, anchor, lastAfter);\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n this.tokenizer = owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(snapshotForUpdate);\n // 解析到缩进小于 base 时自动 eof\n this.tokenizer.useDedentAsEof = false;\n runWithPulling(() => {\n this.program(forNode.realParent, forNode.owner, lastAfter, item);\n }, item.effect.ins);\n }\n const firstInsert = newChildren[oldLen];\n if (firstInsert) {\n firstInsert.realBefore = lastAfter;\n }\n }\n for (let i = minLen; i--; ) {\n const child = children[i];\n newChildren[i] = child;\n if (typeof itemExp === 'string') {\n child.data[itemExp] = arr[i];\n } else {\n Object.assign(child.data, itemExp(arr[i]));\n }\n }\n forNode.children = newChildren;\n }\n }\n isFirstRender = false;\n });\n return forNode.children[0] || forNode;\n }\n\n forItemId = 0;\n createForItem(forNode: ForNode, i: number, parentData: any) {\n let forItemNode: ForItemNode;\n /**\n * 考虑到 effect 是嵌套的,这种情况每次 forNodeEffect 更新会导致上次产生的内部 setPropsEffect 被自动释放\n * 这是响应式 effect 嵌套的默认特性\n * forNodeEffect(() => {\n * 这里通过 setPulling 模拟嵌套 effect\n * setPropsEffect(() => {\n * })\n * })\n * 因此我们需要让情况变成这样,内部的 effect 交由 forItemNode.effect 接管\n * 这个 scope 是全局的,即指定了参数 parentScope = null\n * 这样外部的 effect 不再自动释放 setPropsEffect\n * 这么的目的是我们能在 diff 过程中手动控制释放 forItemNode.effect\n * globalScope(() => {\n * setPropsEffect(() => {\n * })\n * })\n *\n * 1. runWithPulling 避免 scope 被 effect 收集\n * 2. scope 保证 signal 被 scope 管理\n */\n const effect = scope(() => {}, null);\n\n // 考虑到生成每项数据需要依赖原始数组,因此无法放在 scope 里\n const { arr, itemExp, indexName, getKey } = forNode;\n let data: Record<any, any>;\n if (typeof itemExp === 'string') {\n data = $<Record<any, any>>(\n indexName\n ? {\n [itemExp]: arr[i],\n [indexName]: i\n }\n : {\n [itemExp]: arr[i]\n }\n );\n } else {\n const rawData = itemExp(arr[i]);\n if (indexName) {\n rawData[indexName] = i;\n }\n data = $<Record<any, any>>(rawData);\n }\n\n Object.setPrototypeOf(data, parentData);\n\n forItemNode = {\n id: this.forItemId++,\n __logicType: FakeType.ForItem,\n realParent: null,\n realBefore: null,\n realAfter: null,\n forNode,\n key: getKey?.(data),\n effect: null,\n data\n };\n forItemNode.effect = effect;\n return forItemNode;\n }\n\n getData() {\n const { node } = this.ctx.stack.peekByType(NodeSort.CtxProvider);\n return node.data || node.owner.data;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(\n data: Store,\n node: any,\n key: string,\n value: any,\n valueIsMapKey: boolean,\n isFn: boolean,\n hookI?: number\n ) {\n if (isFn) {\n this.setProp(node, key, value, hookI);\n } else if (typeof value === 'function') {\n effect(() => {\n const res = value();\n this.setProp(node, key, res, hookI);\n });\n } else if (valueIsMapKey) {\n effect(() => {\n const res = data[value];\n this.setProp(node, key, res, hookI);\n });\n }\n // 静态数据\n else {\n this.setProp(node, key, value, hookI);\n }\n }\n\n oneRealPropParsed: Interpreter['onePropParsed'] = this.onePropParsed.bind(this);\n\n componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n let Component: typeof Store, render: BobeUI, child: any;\n\n const isCC = (ComponentOrRender as any).prototype instanceof Store;\n if (isCC) {\n Component = ComponentOrRender as any;\n child = Component.new();\n } else {\n render = ComponentOrRender as BobeUI;\n const boundStore = render.boundStore;\n // 使用原型链来继承 store 的数据\n child = deepSignal({}, getPulling(), true);\n Object.setPrototypeOf(child, boundStore);\n }\n\n const node: ComponentNode = {\n __logicType: isCC ? FakeType.Component : FakeType.Fragment,\n realParent: ctx.realParent,\n realBefore: null,\n realAfter: null,\n data: child,\n tokenizer: render ? render(true) : (child['ui'] as BobeUI)(true)\n };\n this.onePropParsed = (data, _, key, value, valueIsMapKey, isFn, hookI) => {\n if (isFn) {\n child[Keys.Raw][key] = value;\n }\n // key 映射\n else if (valueIsMapKey) {\n shareSignal(data, value, child, key);\n }\n // 动态值内置 computed 处理\n else {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n if (typeof value === 'function') {\n const computed = $(value);\n cells.set(key, computed);\n child[Keys.Raw][key] = undefined;\n }\n // 静态数据\n else {\n cells.set(key, { v: value } as Signal);\n child[Keys.Raw][key] = value;\n }\n }\n };\n node.realAfter = this.insertAfterAnchor('component-after');\n return node;\n }\n getFn(data: any, expression: string | number) {\n return new Function('data', `let v;with(data){v=${expression}};return v;`).bind(undefined, data);\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const keyWord = this.tokenizer.token;\n const expToken = this.tokenizer.condExp(); // keyWord => exp\n const value = expToken.value as string | number;\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondBit;\n const data = this.getData();\n // @ts-ignore\n const noCond = value === true;\n const valueIsMapKey = !noCond && Reflect.has(data[Keys.Raw], value);\n const owner = ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const ifNode: IfNode = {\n __logicType: isElse ? FakeType.Else : isIf ? FakeType.If : FakeType.Fail,\n // 此时 token 是 exp, 下次解析 从 \\n 开始\n snapshot: this.tokenizer.snapshot(),\n realParent: null,\n realBefore: null,\n realAfter: null,\n condition: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null,\n owner\n };\n let signal: Signal;\n\n switch (keyWord.value) {\n case 'if':\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => data[value], null);\n // 拿到 signal\n const { cells } = data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = this.getFn(data, value);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n break;\n case 'else':\n // 纯 else\n if (noCond) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // else if xxx\n else {\n const fn = valueIsMapKey ? null : this.getFn(data, value);\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return valueIsMapKey ? data[value] : fn();\n });\n }\n break;\n case 'fail':\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n point = point.preCond;\n }\n return true;\n });\n break;\n default:\n break;\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(`${keyWord.value}-after`);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n this.tokenizer.nextToken(); // token = NEWLINE\n this.tokenizer.nextToken(); // token = ID\n }\n // 更新渲染\n else {\n // 切换到对应 Switcher 的 tokenizer\n this.tokenizer = ifNode.owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(ifNode.snapshot);\n this.tokenizer.useDedentAsEof = false;\n\n // 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.owner, ifNode.realBefore, ifNode);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n // 此时 token 是 condition, i => \\n\n this.tokenizer.skip(); // skipStr\n }\n // 更新渲染,删除所有节点\n else {\n this.removeLogicNode(ifNode);\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\n }\n\n removeLogicNode(node: LogicNode) {\n const { realBefore, realAfter, realParent } = node;\n let point = realBefore ? this.nextSib(realBefore) : this.firstChild(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if ((this.tokenizer.token.type & TokenType.Pipe) === 0) {\n return;\n }\n // 开始解析 attributeList\n this.tokenizer.nextToken(); // PIPE\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n return;\n }\n // 换行\n this.tokenizer.nextToken(); // NEWLINE\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n this.tokenizer.nextToken(); // NEWLINE\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或 产生 computed\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n const data = this.getData();\n while ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n // 取 key\n if (key == null) {\n key = this.tokenizer.token.value as any;\n }\n // 取 =\n else if (eq == null) {\n eq = '=';\n }\n // 取 value\n else {\n const [hookType, value, hookI] = this.tokenizer._hook({});\n const rawVal = data[Keys.Raw][value];\n const isFn = typeof rawVal === 'function';\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const fn = isFn ? rawVal : valueIsMapKey ? value : this.getFn(data, value);\n this.onePropParsed(data, _node, key, fn, valueIsMapKey, isFn, hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.nextToken();\n }\n }\n config(opt: TerpConf) {\n Object.assign(this, opt);\n this.opt = opt;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {},\n nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n firstChild(node: any) {\n return node.firstChild;\n }\n\n createAnchor(name: string) {\n return {\n name,\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n const next = parent.firstChild;\n parent.firstChild = node;\n node.nextSibling = next;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n}\n","import { isNum, matchIdStart, matchIdStart2, Queue } from 'bobe-shared';\nimport { BaseType, Hook, HookProps, HookType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n static DedentId = `__DEDENT__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n // TODO: 生产环境不需要这个,导致不必要的内存占用\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor(\n private hook: Hook,\n public useDedentAsEof: boolean\n ) {\n if (useDedentAsEof) {\n this.setToken(TokenType.Indent, '');\n this.isFirstToken = true;\n // this.waitingTokens.push({\n // type: TokenType.Indent,\n // typeName: TokenType[TokenType.Indent],\n // value: ''\n // })\n }\n }\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot(keys?: (keyof Tokenizer)[]): Partial<Tokenizer> {\n const snap = {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n if (keys) {\n for (const k of keys) {\n snap[k] = this[k];\n if (k === 'dentStack') {\n snap[k] = this[k].slice();\n }\n }\n }\n return snap;\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.code[this.i];\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.i++;\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.i++;\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.code[this.i] === undefined;\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n public nextToken(): Token {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n const char = this.code[this.i];\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n const braceToken = this.brace();\n this.setToken(TokenType.InsertionExp, braceToken);\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n case ';':\n this.setToken(TokenType.Semicolon, ';');\n break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n if (typeof char === 'string' && matchIdStart2(char, 0)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.i++;\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n return this.token;\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n condExp() {\n let value = '';\n this.token = null;\n while (1) {\n const char = this.code[this.i];\n if (char === '\\n') {\n break;\n }\n value += char;\n this.i++;\n }\n value = value.trim();\n this.setToken(TokenType.Identifier, value || true);\n return this.token;\n }\n\n /**\n * 解析到 for 时使用这个方法获取 for 后方的子表达式\n * 表达式通过 “;” 分割\n * // 最多可有三个表达式\n * for arr ; item index; item.key\n * @returns {boolean} 是否含有 key\n */\n public forLoopSubExp() {\n this.token = null;\n let value = '';\n let count = 0;\n while (1) {\n const char = this.code[this.i];\n const isSemicolon = char === ';';\n if (isSemicolon || char === '\\n') {\n value = value.trim();\n if (!this.token) {\n this.setToken(TokenType.Identifier, value);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value\n });\n }\n value = '';\n count++;\n if (count > 3) {\n throw SyntaxError(`for 循环最多可包含三个表达式, 分别为 arr ; item index [; key]`);\n }\n // 匹配到回车退出\n if (!isSemicolon) return count === 3;\n } else {\n value += char;\n }\n this.i++;\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.code[this.i + 1];\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.i++;\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.code[this.i];\n const nextChar = this.code[this.i + 1];\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.code[this.i];\n this.i++;\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n return value.slice(1);\n }\n value += this.code[this.i];\n this.i++;\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.code[this.i];\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.i++;\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, currLen);\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tkr\n if (this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n } else {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n }\n } else {\n if (this.useDedentAsEof) {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: ''\n });\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (typeof nextC !== 'string' || !matchIdStart2(nextC, 0)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n if (value === Tokenizer.EofId && this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n return;\n }\n\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.i++;\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n value += nextC;\n }\n this.setToken(TokenType.Identifier, value);\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 模板字符串动态节点索引 */\n hookI = 0;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any, hookI?: any] => {\n const value = this.token.value;\n const isDynamicHook = this.token.type & TokenType.InsertionExp;\n const isStaticHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n const hookType: HookType = isDynamicHook ? 'dynamic' : isStaticHook ? 'static' : undefined;\n // 静态插值 `${xxx}`\n if (this.hook && isStaticHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n // TODO: 去除 this.hookI, hookI 由本函数返回\n return [hookType, res, hookI];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.setCode(code + fragments[fragments.length - 1]);\n }\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, ComponentNode, CustomRenderConf, FakeType } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(isSub: boolean) {\n const tokenizer = new Tokenizer(({ i }) => {\n return values[i];\n }, isSub);\n tokenizer.init(Array.from(fragments));\n return tokenizer;\n };\n ui.boundStore = Store.Current;\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n const tokenizer: Tokenizer = store['ui'](false);\n const terp = new Interpreter(tokenizer);\n terp.config(option);\n\n const componentNode: ComponentNode = {\n __logicType: FakeType.Component,\n realParent: root,\n data: store,\n tokenizer\n };\n\n terp.program(root, componentNode);\n // ui => bobe`` 返回的函数\n return [componentNode, store];\n };\n}\n"],"names":["TokenType","FakeType","CondBit","LogicalBit","TokenizerSwitcherBit","NodeSort","MultiTypeStack","constructor","typeTops","length","stack","push","value","bits","newNode","types","prevByType","bit","pop","poppedNode","peekByType","cat","peekType","at","peek","BaseEvent","Interpreter","tokenizer","rootComponent","forItemId","oneRealPropParsed","onePropParsed","bind","isLogicNode","node","__logicType","program","root","componentNode","before","ctxProvider","nextToken","prev","Real","Component","CtxProvider","TokenizerSwitcher","Logic","ctx","realParent","prevSibling","current","rootPulling","getPulling","isEof","handleInsert","token","type","Indent","setPulling","effect","ins","declaration","Dedent","_stack$pop","_stack$pop2","_slicedToArray","_stack$pop2$","parent","sort","prevSameType","parentLogic","switcher","ForItem","forNode","i","arr","snapshot","resume","children","insertAfterAnchor","name","_this$ctx","afterAnchor","createAnchor","child","parentComponent","insertAfter","realAfter","childCmp","realBefore","getPrevRealSibling","point","lastChild","anchor","_this$tokenizer$_hook","_hook","_this$tokenizer$_hook2","hookType","_node","condDeclaration","forDeclaration","data","getData","componentOrFragmentDeclaration","SyntaxError","valueIsMapKey","Reflect","has","Keys","Raw","val","str","getFn","createNode","headerLine","extensionLines","arrExp","itemToken","isDestruct","InsertionExp","itemExp","vars","match","jsVarRegexp","join","Function","indexName","keyExp","code","next","Semicolon","owner","For","getKey","window","cells","Meta","hasArrExpKey","arrSignal","get","$","_forNode$snapshot","dentStack","isFirstToken","snapshotForUpdate","_objectWithoutProperties","_excluded","isFirstRender","v","Iterator","toRaw","len","nextItem","item","createForItem","firstInsert","skip","oldLen","newLen","minLen","Math","min","newChildren","removeLogicNode","remove","lastAfter","useDedentAsEof","runWithPulling","Object","assign","parentData","forItemNode","scope","rawData","setPrototypeOf","id","key","_this$ctx$stack$peekB","isFn","hookI","setProp","res","ComponentOrRender","render","isCC","prototype","Store","new","boundStore","deepSignal","Fragment","_","shareSignal","meta","computed","set","expression","keyWord","expToken","condExp","isElse","isIf","preIsCond","noCond","ifNode","Else","If","Fail","condition","preCond","signal","fn","nextSib","firstChild","Pipe","attributeList","NewLine","eq","_this$tokenizer$_hook3","_this$tokenizer$_hook4","rawVal","config","opt","props","nextSibling","defaultInsert","defaultRemove","Tokenizer","hook","TabSize","Tab","Array","from","needIndent","handledTokens","waitingTokens","Queue","HookId","isDynamicHook","isStaticHook","indexOf","Number","slice","setToken","EofId","Date","now","DedentId","consume","_snapshot","keys","snap","clone","k","logicDentLen","skipFragment","char","_this$getDentValue","getDentValue","isEmptyLine","currLen","expLen","shorterThanBaseDentEof","String","typeName","setCode","trimEnd","tokenize","console","log","JSON","stringify","Identifier","shift","outer","dent","newLine","assignment","pipe","braceToken","brace","handled","dynamic","isNum","number","matchIdStart2","identifier","error","trim","forLoopSubExp","count","isSemicolon","Assign","nextC","innerBrace","inComment","inString","backslashCount","nextChar","_this$getDentValue2","indentHasLen","prevLen","yes","realValue","continuousBackslashCount","memoCount","eof","Eof","init","fragments","fragment","bobe","values","ui","isSub","Current","customRender","option","Ctor","store","terp"],"mappings":"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"}
|