bobe 0.0.21 → 0.0.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.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","BaseEvent","getPulling","setPulling","Keys","jsVarRegexp","$","effect","_a","toRaw","runWithPulling","scope","Store","deepSignal","shareSignal","Queue","isNum","matchIdStart2","ui"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.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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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "bobe",
3
- "version": "0.0.21",
3
+ "version": "0.0.22",
4
4
  "main": "dist/bobe.cjs.js",
5
5
  "module": "dist/bobe.esm.js",
6
6
  "browser": "dist/bobe.umd.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "private": false,
9
9
  "dependencies": {
10
- "bobe-shared": "0.0.21",
11
- "aoye": "0.0.21"
10
+ "aoye": "0.0.22",
11
+ "bobe-shared": "0.0.22"
12
12
  },
13
13
  "devDependencies": {},
14
14
  "files": [