bobe 0.0.15 → 0.0.16

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":"bobe.esm.js","sources":["../src/type.ts","../src/typed-stack.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 type { TypedStack } from './typed-stack';\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}\n\nexport enum LogicType {\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 Root = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n // 仅占位\n Real = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport const Logical = LogicType.If | LogicType.Fail | LogicType.Else | LogicType.For;\n\nexport const CondType = LogicType.If | LogicType.Fail | LogicType.Else;\n\nexport enum NodeType {\n Logic = Logical,\n Real = LogicType.Real,\n Component = LogicType.Component\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' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>\n>;\nexport type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: TypedStack<any, NodeType>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (\n this: Store,\n options: CustomRenderConf,\n valOpt: TerpConf,\n root: any,\n after?: any\n) => ComponentNode;\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: 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};\n\nexport type LogicNode = {\n __logicType: LogicType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\n","/**\n * 节点包装单元的内部结构\n */\ninterface StackNode<T, K extends string|number> {\n data: T;\n type: K;\n prev: StackNode<T, K> | null; // 基础栈指向\n prevSameType: StackNode<T, K> | null; // 指向同类型的前一个包装单元\n}\n\nexport class TypedStack<T, K extends string|number> {\n private top: StackNode<T, K> | null = null;\n\n // 存储每种类型最近一次出现的包装单元引用\n // 使用 Record 来动态支持不同的类型标签\n private lastNodes: Partial<Record<K, StackNode<T, K> | null>> = {};\n length = 0;\n\n /**\n * @param rawNode 原始节点数据\n * @param type 节点类型\n */\n push(rawNode: T, type: K): void {\n const newNode: StackNode<T, K> = {\n data: rawNode,\n type: type,\n prev: this.top,\n prevSameType: this.lastNodes[type] ?? null\n };\n\n this.top = newNode;\n this.length++;\n this.lastNodes[type] = newNode;\n }\n\n /**\n * 出栈操作\n * @returns 原始节点数据或 null\n */\n pop(): T | null {\n if (!this.top) return null;\n\n const popped = this.top;\n\n // 弹栈时,恢复该类型的上一个记录点\n this.lastNodes[popped.type] = popped.prevSameType;\n this.top = popped.prev;\n this.length--;\n return popped.data;\n }\n\n /**\n * O(1) 获取栈顶节点的前一个同类型节点\n */\n getPrevSameType(): T | null {\n if (!this.top || !this.top.prevSameType) {\n return null;\n }\n return this.top.prevSameType.data;\n }\n\n findPrevSameType(cb: (node: T) => boolean): T | null {\n if (!this.top) {\n return null;\n }\n let point = this.top.prevSameType;\n while (point) {\n if (cb(point.data)) {\n return point.data;\n }\n point = point.prevSameType;\n }\n return null;\n }\n\n /**\n * 获取当前栈顶的类型\n */\n get peekType(): K | null {\n return this.top ? this.top.type : null;\n }\n /**\n * 获取栈顶元素\n */\n peek() {\n return this.top.data;\n }\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondType,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n IsAnchor,\n Logical,\n LogicNode,\n LogicType,\n NodeType,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n Token,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nimport { TypedStack } from './typed-stack';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n lastInserted;\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & Logical;\n }\n\n program(root: any, before?: any) {\n const componentNode: ComponentNode = {\n __logicType: LogicType.Component,\n realParent: root,\n store: new Store()\n };\n this.tokenizer.consume();\n const stack = new TypedStack<StackItem, NodeType>();\n stack.push({ node: root, prev: null }, NodeType.Real);\n\n const ctx: ProgramCtx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n };\n\n const rootPulling = getPulling();\n while (1) {\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 const INDENT = this.tokenizer.consume();\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n ctx.current.__logicType ? (isLogicNode ? NodeType.Logic : NodeType.Component) : NodeType.Real\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 === 1 && !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 const DEDENT = this.tokenizer.consume();\n const { node: parent, prev } = stack.peek();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.getPrevSameType();\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出逻辑节点,\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (this.isLogicNode(parent)) {\n // 找最近的 if for\n const parentLogic = stack.getPrevSameType()?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n }\n stack.pop();\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(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n ctx.prevSibling = stack.length === 1 && !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 childCmp.realBefore = 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._hook({});\n let _node: any;\n\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class\n if (typeof value === 'function' && value.prototype instanceof Store) {\n _node = this.componentDeclaration(value, ctx);\n }\n // 传组件片段\n else if (typeof value === 'function') {\n _node = this.fragmentDeclaration(value);\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 isKeyInsertion = Boolean(this.data[Keys.Raw][value]);\n\n const fn = new Function('data', `let v;with(data){v=(${value})};return v`);\n\n _node = this.createNode(value);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n if (_node.__logicType === LogicType.Component) {\n tap.once(TerpEvt.HandledComponentNode, node => (_node = node));\n tap.emit(TerpEvt.AllAttrGot);\n }\n return _node;\n }\n\n // TODO: 指定挂载位置\n fragmentDeclaration(renderFragment: BobeUI) {\n const fragmentNode: FragmentNode = {\n __logicType: LogicType.Fragment,\n realParent: null\n };\n renderFragment.call(this.data, this.opt, { data: this.data, root: '', anchor: '' });\n return fragmentNode;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number) {\n 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 = this.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 componentDeclaration(Component: typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n const child = Component.new();\n const prevOnePropParsed = this.onePropParsed;\n this.onePropParsed = (node, key, value, valueIsMapKey, hookI) => {\n // key 映射\n if (valueIsMapKey) {\n shareSignal(this.data, value, child, key);\n }\n // 动态值内置 computed 处理\n else if (typeof value === 'function') {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n const computed = $(value);\n cells.set(key, computed);\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n const afterAnchor = this.insertAfterAnchor(ctx);\n const { realParent, prevSibling } = ctx;\n tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = realParent;\n const prev = prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const componentNode = (child['ui'] as BobeUI)(this.opt, { data: child }, parent, prev);\n componentNode.realAfter = afterAnchor;\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\n });\n return { __logicType: LogicType.Component };\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const snapbackUp = this.tokenizer.snapshot();\n const keyWord = this.tokenizer.consume();\n const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;\n\n const [hookType, value] = this._hook({});\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondType;\n // 需要和前一个节点的 condition 合并计算\n const needCalcWithPrevIf = isElse && preIsCond;\n const ifNode: IfNode = {\n __logicType: isElse ? LogicType.Else : isIf ? LogicType.If : LogicType.Fail,\n snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null\n };\n let signal: Signal;\n\n // 纯 else 节点,一定要前置节点的取反\n if (noSelfCond) {\n if (isElse) {\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 === LogicType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // default\n else {\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 }\n } else {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n // 为键映射\n if (valueIsMapKey && !needCalcWithPrevIf) {\n // 确保 signal 已生成\n runWithPulling(() => this.data[value], null);\n // 拿到 signal\n const { cells } = this.data[Keys.Meta];\n signal = cells.get(value);\n }\n // 通过前置条件 和 computed 计算出\n else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n if (needCalcWithPrevIf) {\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 === LogicType.If) {\n break;\n }\n point = point.preCond;\n }\n return fn();\n });\n } else {\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n }\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(ctx);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n if (!noSelfCond) {\n const condition = this.tokenizer.consume();\n }\n const newLine = this.tokenizer.consume();\n }\n // 更新渲染\n else {\n /**\n * condition 在首屏对应的是 当前 token, resume 时被设置为空\n * newLine 被用于判断起始缩进所消耗\n */\n this.tokenizer.resume(ifNode.snapshot);\n\n // TODO: 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.realBefore);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n if (noSelfCond) {\n // 让 '/n‘ 能被跳过\n this.tokenizer.i = this.tokenizer.i - 1;\n // else 时消费了一个 \\n 导致 needDent 被置为 true\n this.tokenizer.needIndent = false;\n }\n const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = realBefore ? this.nextSib(realBefore) : this.kid(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\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)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或通过 effect 直接设值\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n while (!(this.tokenizer.token.type & TokenType.NewLine)) {\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] = this._hook({});\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n const fn = valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n this.onePropParsed(_node, key, fn, valueIsMapKey, this.hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.consume();\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 kid(node: any) {\n return node.firstChild;\n }\n\n _createAnchor() {\n const anchor = this.createAnchor();\n anchor[IsAnchor] = true;\n return anchor;\n }\n createAnchor() {\n return {\n name: 'anchor',\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 init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.tokenizer.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.tokenizer.setCode(code + fragments[fragments.length - 1]);\n }\n }\n hook: Hook;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any] => {\n const value = this.tokenizer.token.value;\n const isDynamicHook = this.tokenizer.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 this.hookI++;\n return [hookType, res];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n}\n","import { isNum, Queue } from 'bobe-shared';\nimport { BaseType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** 匹配标识符 */\n IdExp = /[\\d\\w\\/]/;\n /** Eof 标识符的值 */\n static EofId = `__EOF__${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 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 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() {\n return {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\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.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\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.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\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 private testId(value: string) {\n if (typeof value !== 'string') return false;\n return this.IdExp.test(value);\n }\n\n private nextToken() {\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 let { char } = this;\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 this.brace();\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n } finally {\n this.handledTokens.push(this.token);\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.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\n const nextChar = this.after;\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.next()[0]; // 跳过 * 号\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.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\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 this.setToken(TokenType.InsertionExp, value.slice(1));\n return;\n }\n value += this.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\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.next();\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, String(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 this.setToken(TokenType.Identifier, Tokenizer.EofId);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\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.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\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.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, CustomRenderConf } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(options, valueOpt, root, before) {\n const tokenizer = new Tokenizer();\n const cmp = new Interpreter(tokenizer);\n Object.assign(cmp, valueOpt);\n // 初始化\n cmp.config({\n ...options,\n hook({ i }) {\n return values[i];\n },\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n });\n cmp.init(Array.from(fragments));\n return cmp.program(root, before);\n };\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 // ui => bobe`` 返回的函数\n return [store['ui'](option, { data: store }, root), store];\n };\n}\n\n"],"names":["TokenType","LogicType","NodeType","TerpEvt","__spreadProps","__spreadValues","ui"],"mappings":"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"}
1
+ {"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport { MultiTypeStack } from './typed';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\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 = (isSub: boolean) => Tokenizer;\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 lastInserted?: 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};\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 /**\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 prevGlobal: this.top,\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\n // 更新全局栈顶\n this.top = newNode;\n this.length++;\n }\n\n /**\n * 出栈操作\n */\n pop() {\n if (!this.top) return undefined;\n\n const poppedNode = this.top;\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 this.top = poppedNode.prevGlobal;\n this.length--;\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.top?.types;\n }\n\n /**\n * 获取全局栈顶\n */\n peek(): T | undefined {\n return this.top?.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\nexport function forkCxt(old: MultiTypeStack<StackItem>) {\n const stack = new MultiTypeStack<StackItem>();\n const temp: any[] = [];\n old.forEach((item, types) => {\n temp.push([item, types]);\n if (types & NodeSort.Component) return true;\n });\n temp.forEach(args => {\n stack.push.apply(stack, args);\n });\n return stack;\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } 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} from './type';\nimport { BaseEvent } 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) {\n // 首屏渲 app 组件需要创建对象\n this.rootComponent = componentNode;\n\n this.tokenizer.consume();\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\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 const INDENT = this.tokenizer.consume();\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 const DEDENT = this.tokenizer.consume();\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 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 switcherIsRootComponent() {\n const currentSwitcher = this.ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n return currentSwitcher === this.rootComponent;\n }\n\n insertAfterAnchor(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n 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 childCmp.realBefore = 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\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class\n if (typeof value === 'function' && value.prototype instanceof Store) {\n _node = this.componentDeclaration(value, ctx);\n }\n // 传组件片段\n else if (typeof value === 'function') {\n _node = this.fragmentDeclaration(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 data = this.getData();\n const isKeyInsertion = Boolean(data[Keys.Raw][value]);\n\n const fn = new Function('data', `let v;with(data){v=(${value})};return v`);\n\n _node = this.createNode(value);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n if (_node.__logicType === FakeType.Component) {\n // 执行到此,token 为 组件兄弟节点,想模拟进入组件,需要 Indent\n tap.once(TerpEvt.HandledComponentNode, node => (_node = node));\n tap.emit(TerpEvt.AllAttrGot);\n }\n return _node;\n }\n getData() {\n const {node} = this.ctx.stack.peekByType(NodeSort.CtxProvider)\n return node.data || node.owner.data;\n }\n\n // TODO: 指定挂载位置\n fragmentDeclaration(renderFragment: BobeUI, ctx: ProgramCtx) {\n const data = this.getData();\n const tokenizer = renderFragment.call(data, this.opt, { data: data, root: '', anchor: '' });\n const fragmentNode: FragmentNode = {\n __logicType: FakeType.Fragment,\n realParent: null,\n tokenizer,\n data: null\n };\n return fragmentNode;\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 componentDeclaration(Component: typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n const child = Component.new();\n const componentNode: ComponentNode = {\n __logicType: FakeType.Component,\n realParent: ctx.realParent,\n data: child,\n tokenizer: null\n };\n\n const prevOnePropParsed = this.onePropParsed;\n this.onePropParsed = (data, node, 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 if (typeof value === 'function') {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n const computed = $(value);\n cells.set(key, computed);\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n componentNode.realAfter = this.insertAfterAnchor(ctx);\n const { realParent, prevSibling } = ctx;\n tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = realParent;\n const prev = prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const subTkr = (child['ui'] as BobeUI)(true);\n componentNode.tokenizer = subTkr;\n this.tokenizer = subTkr;\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\n });\n return componentNode;\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const snapbackUp = this.tokenizer.snapshot();\n const keyWord = this.tokenizer.consume();\n const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;\n\n const [hookType, value] = this.tokenizer._hook({});\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondBit;\n // 需要和前一个节点的 condition 合并计算\n const needCalcWithPrevIf = isElse && preIsCond;\n const data = this.getData();\n const owner = ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const ifNode: IfNode = {\n __logicType: isElse ? FakeType.Else : isIf ? FakeType.If : FakeType.Fail,\n snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null,\n owner\n };\n let signal: Signal;\n\n // 纯 else 节点,一定要前置节点的取反\n if (noSelfCond) {\n if (isElse) {\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 // default\n else {\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 }\n } else {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n // 为键映射\n if (valueIsMapKey && !needCalcWithPrevIf) {\n // 确保 signal 已生成\n runWithPulling(() => data[value], null);\n // 拿到 signal\n const { cells } = data[Keys.Meta];\n signal = cells.get(value);\n }\n // 通过前置条件 和 computed 计算出\n else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, data);\n if (needCalcWithPrevIf) {\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 fn();\n });\n } else {\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n }\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(ctx);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n if (!noSelfCond) {\n const condition = this.tokenizer.consume();\n }\n const newLine = this.tokenizer.consume();\n }\n // 更新渲染\n else {\n // 切换到对应 Switcher 的 tokenizer\n this.tokenizer = ifNode.owner.tokenizer;\n /**\n * condition 在首屏对应的是 当前 token, resume 时被设置为空\n * newLine 被用于判断起始缩进所消耗\n */\n this.tokenizer.resume(ifNode.snapshot);\n\n // TODO: 由于首屏渲染直接放行,导致 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);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n if (noSelfCond) {\n // 让 '/n‘ 能被跳过\n this.tokenizer.i = this.tokenizer.i - 1;\n // else 时消费了一个 \\n 导致 needDent 被置为 true\n this.tokenizer.needIndent = false;\n }\n const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\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 ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\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)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或通过 effect 直接设值\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n const data = this.getData();\n while (!(this.tokenizer.token.type & TokenType.NewLine)) {\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 = Reflect.get(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\n ? rawVal\n : valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, data);\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.consume();\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() {\n const anchor = this.createAnchor();\n anchor[IsAnchor] = true;\n return anchor;\n }\n createAnchor() {\n return {\n name: 'anchor',\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, 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 /** 匹配标识符 */\n static IdExp = /[\\d\\w\\/]/;\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 isSubToken: boolean\n ) {\n if (isSubToken) {\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() {\n return {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\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.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\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.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\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 private testId(value: string) {\n if (typeof value !== 'string') return false;\n return Tokenizer.IdExp.test(value);\n }\n\n private nextToken() {\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 let { char } = this;\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 this.brace();\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n } finally {\n this.handledTokens.push(this.token);\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.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\n const nextChar = this.after;\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.next()[0]; // 跳过 * 号\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.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\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 this.setToken(TokenType.InsertionExp, value.slice(1));\n return;\n }\n value += this.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\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.next();\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, String(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.isSubToken) {\n this.setToken(TokenType.Dedent, '');\n } else {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n }\n } else {\n if (this.isSubToken) {\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.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n if (value === Tokenizer.EofId && this.isSubToken) {\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.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\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 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","TerpEvt","ui"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,14 +3,17 @@ export * from 'aoye';
3
3
  import { Queue } from 'bobe-shared';
4
4
 
5
5
  declare class Tokenizer {
6
+ private hook;
7
+ isSubToken: boolean;
6
8
  /** 缩进大小 默认 2 */
7
9
  TabSize: number;
8
10
  /** 缩进字符 */
9
11
  Tab: string;
10
12
  /** 匹配标识符 */
11
- IdExp: RegExp;
13
+ static IdExp: RegExp;
12
14
  /** Eof 标识符的值 */
13
15
  static EofId: string;
16
+ static DedentId: string;
14
17
  /** 当前 token */
15
18
  token: Token;
16
19
  /** 回车后需要判断缩进 */
@@ -33,7 +36,7 @@ declare class Tokenizer {
33
36
  * parent2 <- 产生两个 dedent
34
37
  */
35
38
  waitingTokens: Queue<Token>;
36
- constructor();
39
+ constructor(hook: Hook, isSubToken: boolean);
37
40
  consume(): Token;
38
41
  resume(_snapshot: ReturnType<Tokenizer['snapshot']>): void;
39
42
  snapshot(): {
@@ -63,21 +66,23 @@ declare class Tokenizer {
63
66
  private str;
64
67
  private number;
65
68
  private eof;
66
- }
67
-
68
- declare class Interpreter {
69
- private tokenizer;
70
69
  /** 模板字符串动态节点的占位符 */
71
70
  HookId: string;
72
- /** 用于渲染的数据 */
73
- data: Record<any, any>;
74
71
  /** 模板字符串动态节点索引 */
75
72
  hookI: number;
76
- lastInserted: any;
73
+ _hook: (props: Partial<HookProps>) => [HookType | undefined, any, hookI?: any];
74
+ init(fragments: string | string[]): void;
75
+ }
76
+
77
+ declare class Interpreter {
78
+ private tokenizer;
77
79
  opt: TerpConf;
78
80
  constructor(tokenizer: Tokenizer);
79
81
  isLogicNode(node: any): number;
80
- program(root: any, before?: any): ComponentNode;
82
+ ctx: ProgramCtx;
83
+ rootComponent: ComponentNode | null;
84
+ program(root: any, componentNode?: ComponentNode, before?: any): ComponentNode;
85
+ switcherIsRootComponent(): boolean;
81
86
  insertAfterAnchor(ctx: ProgramCtx): {
82
87
  name: string;
83
88
  nextSibling: any;
@@ -97,7 +102,8 @@ declare class Interpreter {
97
102
  * <declaration> ::= <tagName=token> <headerLine> <extensionLines>
98
103
  * */
99
104
  declaration(ctx: ProgramCtx): any;
100
- fragmentDeclaration(renderFragment: BobeUI): LogicNode;
105
+ getData(): any;
106
+ fragmentDeclaration(renderFragment: BobeUI, ctx: ProgramCtx): FragmentNode;
101
107
  /**
102
108
  * key 元素,组件的 key
103
109
  * value
@@ -106,10 +112,8 @@ declare class Interpreter {
106
112
  *
107
113
  * mapKey 映射, 对应子组件的属性
108
114
  * */
109
- onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number): void;
110
- componentDeclaration(Component: typeof Store, ctx: ProgramCtx): {
111
- __logicType: LogicType;
112
- };
115
+ onePropParsed(data: Store, node: any, key: string, value: any, valueIsMapKey: boolean, isFn: boolean, hookI?: number): void;
116
+ componentDeclaration(Component: typeof Store, ctx: ProgramCtx): ComponentNode;
113
117
  condDeclaration(ctx: ProgramCtx): IfNode;
114
118
  /**
115
119
  * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>
@@ -140,7 +144,7 @@ declare class Interpreter {
140
144
  nextSibling: any;
141
145
  };
142
146
  nextSib(node: any): any;
143
- kid(node: any): any;
147
+ firstChild(node: any): any;
144
148
  _createAnchor(): {
145
149
  name: string;
146
150
  nextSibling: any;
@@ -154,38 +158,41 @@ declare class Interpreter {
154
158
  remove(node: any, parent?: any, prev?: any): void;
155
159
  defaultRemove(node: any, parent: any, prevSibling: any): void;
156
160
  setProp(node: any, key: string, value: any, hookI?: number): void;
157
- init(fragments: string | string[]): void;
158
- hook: Hook;
159
- _hook: (props: Partial<HookProps>) => [HookType | undefined, any];
160
161
  }
161
162
 
162
- declare class TypedStack<T, K extends string | number> {
163
+ declare class MultiTypeStack<T> {
163
164
  private top;
164
- private lastNodes;
165
+ private typeTops;
165
166
  length: number;
166
167
  /**
167
- * @param rawNode 原始节点数据
168
- * @param type 节点类型
168
+ * 入栈操作
169
+ * @param value 数据
170
+ * @param bits 该节点所属的类别数组
169
171
  */
170
- push(rawNode: T, type: K): void;
172
+ push(value: T, bits: NodeSortBit): void;
171
173
  /**
172
174
  * 出栈操作
173
- * @returns 原始节点数据或 null
174
175
  */
175
- pop(): T | null;
176
+ pop(): readonly [T, number];
177
+ /**
178
+ * 获取某个类别的当前“顶部”元素
179
+ */
180
+ peekByType(cat: number): T | undefined;
181
+ peekType(): number | undefined;
176
182
  /**
177
- * O(1) 获取栈顶节点的前一个同类型节点
183
+ * 获取全局栈顶
178
184
  */
179
- getPrevSameType(): T | null;
180
- findPrevSameType(cb: (node: T) => boolean): T | null;
185
+ peek(): T | undefined;
181
186
  /**
182
- * 获取当前栈顶的类型
187
+ * 1. 全局向前遍历 (不分类)
188
+ * 从栈顶开始,沿着全局链条向栈底遍历
183
189
  */
184
- get peekType(): K | null;
190
+ forEach(callback: (value: T, types: number) => any): void;
185
191
  /**
186
- * 获取栈顶元素
192
+ * 2. 按类别向前遍历
193
+ * 仅遍历属于指定类别 cat 的节点
187
194
  */
188
- peek(): T;
195
+ forEachByType(cat: number, callback: (value: T) => any): void;
189
196
  }
190
197
 
191
198
  declare enum TokenType {
@@ -198,21 +205,16 @@ declare enum TokenType {
198
205
  Eof = 64,
199
206
  InsertionExp = 128
200
207
  }
201
- declare enum LogicType {
208
+ declare enum FakeType {
202
209
  If = 1,
203
210
  Fail = 2,
204
211
  Else = 4,
205
212
  For = 8,
206
213
  Component = 16,
207
214
  Fragment = 32,
208
- Root = 64,
209
- Real = 128
210
- }
211
- declare enum NodeType {
212
- Logic = 15,
213
- Real = 128,
214
- Component = 16
215
+ ForItem = 64
215
216
  }
217
+ type NodeSortBit = number;
216
218
  type BaseType = string | number | boolean | undefined | null;
217
219
  type Token = {
218
220
  type: TokenType;
@@ -227,38 +229,44 @@ type HookProps = {
227
229
  /** 父节点 */
228
230
  parentNode?: any;
229
231
  };
230
- type TerpConf = Partial<Pick<Interpreter, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>>;
231
- type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;
232
+ type TerpConf = Partial<Pick<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>>;
233
+ type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>;
232
234
  type Hook = (props: HookProps) => any;
233
235
  type HookType = 'dynamic' | 'static';
234
236
  type ProgramCtx = {
235
- stack: TypedStack<any, NodeType>;
237
+ stack: MultiTypeStack<any>;
236
238
  prevSibling: any;
237
239
  realParent: any;
238
240
  current: any;
239
241
  before: any;
240
242
  };
241
243
  /** 返回值是用户自定义的节点 */
242
- type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf, root: any, after?: any) => ComponentNode;
244
+ type BobeUI = (isSub: boolean) => Tokenizer;
245
+ type LogicNode = {
246
+ __logicType: FakeType;
247
+ realParent: any;
248
+ realBefore?: any;
249
+ realAfter?: any;
250
+ lastInserted?: any;
251
+ };
243
252
  type IfNode = LogicNode & {
244
253
  condition: Signal;
245
254
  isFirstRender: boolean;
246
255
  snapshot: ReturnType<Tokenizer['snapshot']>;
247
256
  effect: Dispose;
248
257
  preCond: IfNode | null;
258
+ owner: ComponentNode | FragmentNode;
249
259
  };
250
- type LogicNode = {
251
- __logicType: LogicType;
252
- realParent: any;
253
- realBefore?: any;
254
- realAfter?: any;
255
- lastInserted?: any;
260
+ type FragmentNode = LogicNode & {
261
+ data: Store;
262
+ tokenizer: Tokenizer;
256
263
  };
257
264
  type ComponentNode = LogicNode & {
258
- store: Store;
265
+ data: Store;
266
+ tokenizer: Tokenizer;
259
267
  };
260
268
 
261
269
  declare function bobe(fragments: TemplateStringsArray, ...values: any[]): BobeUI;
262
- declare function customRender(option: CustomRenderConf): <T>(Ctor: typeof Store, root: any) => any[];
270
+ declare function customRender(option: CustomRenderConf): <T>(Ctor: typeof Store, root: any) => (ComponentNode | Store)[];
263
271
 
264
272
  export { bobe, customRender };