bobe 0.0.10 → 0.0.12

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/index.ts"],"sourcesContent":["import { Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Terp } from './index';\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 ElseIf = 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\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');\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<Terp, 'data' | 'createNode' | 'setProp' | 'hook' | 'HookId' | 'insert'>\n>;\nexport type CustomRenderConf = Omit<TerpConf, 'data'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf) => ComponentNode;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: () => any;\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n\nexport type LogicNode = {\n __logicType: LogicType;\n directList?: any[];\n realList: any[];\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};","import { Tokenizer } from './tokenizer';\nimport { $, effect, Keys, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n LogicNode,\n LogicType,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nconst tap = new BaseEvent();\n\nexport class Terp {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n stack: StackItem[] = [];\n constructor(private tokenizer: Tokenizer) {}\n // /** program 要挂载的父节点位置 */\n // root: any;\n // /** program 挂载的前置节点 */\n // anchor: any;\n program() {\n const root: ComponentNode = {\n __logicType: LogicType.Component,\n store: this.data as any,\n realList: [],\n directList: []\n };\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n this.stack = [{ node: root, prevSibling }];\n while (1) {\n if (this.tokenizer.isEof()) {\n this.handleInsert(root, current, root.realList[root.realList.length - 1]);\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 this.stack.push({\n prevSibling,\n node: current\n });\n // 第 0 个节点没有前置节点\n prevSibling = null;\n current = this.declaration();\n continue;\n }\n // token 不是 Indent ,就是 同级节点 或 Dedent\n // 将之前产生的 current 添加到父节点\n if (current) {\n if (this.stack.length > 1) {\n const parent = this.stack[this.stack.length - 1].node;\n this.handleInsert(parent, current, prevSibling);\n } else {\n this.handleInsert(root, current, prevSibling);\n }\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prevSibling: prevParent } = this.stack.pop();\n prevSibling = prevParent;\n current = parent;\n }\n // 下一个是 同级节点\n else {\n prevSibling = current;\n current = this.declaration();\n }\n }\n return root;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点们插入到 realList 调用 insert 方法挨个插入子节点\n * 子节点 将其下 realList 插入到父节点 将本节点插入父节点\n */\n handleInsert(parent: any, child: any, prevSibling: any) {\n let insertFn = this.insert.bind(this);\n if (parent.__logicType) {\n insertFn = (parent: any, child: any, prevSibling: any) => {\n parent.realList.splice(parent.realList.indexOf(prevSibling) + 1, 0, child);\n };\n }\n if (child.__logicType) {\n const realList = child.realList as any[];\n for (let i = realList.length; i--; ) {\n const item = realList[i];\n insertFn(parent, item, prevSibling);\n }\n } else {\n insertFn(parent, child, prevSibling);\n }\n }\n\n /**\n * @deprecated\n * 节点列表:\n * 可以是一个节点,也可以跟随更多节点\n * <nodeList> ::= <node> <nodeList> <EOF|Dedent>\n * |\n */\n nodeList(parent: any) {\n let _node: any;\n let prevSibling: any;\n let prevItem: any;\n let anchor: any;\n while (1) {\n // 对于 Program EOF 表示 list 遍历完成\n if (this.tokenizer.isEof()) {\n return;\n }\n\n // 对于 childList Dedent 表示 childList 遍历完成\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.consume();\n return;\n }\n _node = this.node();\n\n // 父节点是 if 采用 if.children.push 的方式采集\n // 父节点不是 if 采用 insert 进行采集\n const insert = parent.__logicType ? this.defaultInsert : this.insert.bind(this);\n const remove = parent.__logicType ? this.defaultRemove : this.remove.bind(this);\n\n // 子节点不是 if,直接插入单个子节点\n if (!_node.__logicType) {\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, _node, realPrev, prevItem);\n prevItem = currItem;\n prevSibling = _node;\n continue;\n }\n\n if (prevSibling) {\n _node.anchor = prevSibling;\n }\n // 没有 prevSibling 且父是 logic\n else if (parent.__logicType) {\n _node.anchor = parent;\n }\n // 父节点是普通节点,确实前面没有东西,anchor => null\n else {\n }\n // 子节点是 if,将 child 插入到\n if (_node.child && _node.condition()) {\n let item = _node.child;\n while (item != null) {\n const { value: child } = item;\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, child, realPrev, prevItem);\n item = item.next;\n prevItem = currItem;\n prevSibling = child;\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 * <node> ::= <declaration> <childrenBlockOpt>\n * */\n node() {\n const _declaration: any = this.declaration();\n // 条件为假时执行 skip 逻辑\n if (_declaration.__logicType & LogicType.If && !_declaration.condition()) {\n return _declaration;\n }\n this.childrenBlockOpt(_declaration);\n return _declaration;\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration() {\n const [hookType, value] = this._hook({});\n let _node: any;\n\n if (value === 'if') {\n return this.ifDeclaration();\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);\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 directList: [],\n realList: []\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) {\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\n tap.once(TerpEvt.AllAttrGot, () => {\n this.onePropParsed = prevOnePropParsed;\n const root = (child['ui'] as BobeUI)(this.opt, { data: child });\n tap.emit(TerpEvt.HandledComponentNode, root);\n });\n return { __logicType: LogicType.Component };\n }\n\n ifDeclaration() {\n const ifIdentifier = this.tokenizer.consume();\n const [isHook, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n condition: value,\n directList: [],\n realList: [],\n snapshot: this.tokenizer.snapshot(),\n isFirstRender: true,\n watcher: null,\n anchor: null\n };\n ifNode.watcher = effect(\n ({ val }) => {\n if (val) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n const skipStr = this.tokenizer.skip();\n }\n },\n [value]\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\n /** 子节点块:\n * 必须被缩进包裹\n * <childrenBlockOpt> ::= INDENT <nodeList>\n * | ε /* 空(表示叶子节点,没有孩子)\n * */\n childrenBlockOpt(parent: any) {\n // 无 children\n if (!(this.tokenizer.token.type & TokenType.Indent)) {\n return [];\n }\n const INDENT = this.tokenizer.consume();\n const list = this.nodeList(parent);\n return list;\n }\n\n opt: TerpConf;\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 };\n }\n\n insert(parent: any, node: any, prevSibling: any, prevItem?: any) {\n return this.defaultInsert(parent, node, prevSibling, prevItem);\n }\n defaultInsert(parent: any, node: any, prevSibling: any, prevItem: any) {\n if (prevSibling) {\n const children: any[] = parent.children;\n const insertI = children.findIndex(item => item === prevSibling);\n children.splice(insertI + 1, 0, node);\n } else {\n parent.children = [node];\n }\n }\n\n remove(parent: any, node: any, prevSibling: any, prevItem: any) {\n return this.defaultRemove(parent, node, prevSibling, prevItem);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(parent: any, node: any, prevSibling: any, prevItem: any) {\n if (parent.children) {\n parent.children.splice(parent.children.indexOf(node), 1);\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"],"names":["TokenType","LogicType","TerpEvt","parent","child","prevSibling"],"mappings":"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"}
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 ElseIf = 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.ElseIf | LogicType.Else | LogicType.For;\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};\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 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 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 ctx.realParent = ctx.current;\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;\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') {\n return this.ifDeclaration(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 tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = ctx.realParent;\n const prev = ctx.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\n ifDeclaration(ctx: ProgramCtx) {\n const ifIdentifier = this.tokenizer.consume();\n const [hookType, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n snapshot: this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n isFirstRender: true,\n effect: null\n };\n\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n let signal: Signal;\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => this.data[value], null);\n // 拿到 signal\n const { cells } = this.data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\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 const condition = this.tokenizer.consume();\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 const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = this.nextSib(realBefore);\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 _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 parent.firstChild = node;\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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"}
package/dist/index.d.ts CHANGED
@@ -1,68 +1,6 @@
1
+ import { Store, Signal, Dispose } from 'aoye';
2
+ export * from 'aoye';
1
3
  import { Queue } from 'bobe-shared';
2
- import { Store } from 'aoye';
3
-
4
- declare enum TokenType {
5
- NewLine = 1,
6
- Indent = 2,
7
- Dedent = 4,
8
- Identifier = 8,
9
- Assign = 16,
10
- Pipe = 32,
11
- Eof = 64,
12
- InsertionExp = 128
13
- }
14
- declare enum LogicType {
15
- If = 1,
16
- ElseIf = 2,
17
- Else = 4,
18
- For = 8,
19
- Component = 16,
20
- Fragment = 32,
21
- Root = 64
22
- }
23
- type BaseType = string | number | boolean | undefined | null;
24
- type Token = {
25
- type: TokenType;
26
- typeName: string;
27
- value: BaseType;
28
- };
29
- type HookProps = {
30
- /** 通过哪个 HookId 进入的 */
31
- HookId: string;
32
- /** 第几个 hook */
33
- i: number;
34
- /** 父节点 */
35
- parentNode?: any;
36
- };
37
- type TerpConf = Partial<Pick<Terp, 'data' | 'createNode' | 'setProp' | 'hook' | 'HookId' | 'insert'>>;
38
- type CustomRenderConf = Omit<TerpConf, 'data'>;
39
- type Hook = (props: HookProps) => any;
40
- type HookType = 'dynamic' | 'static';
41
- /** 返回值是用户自定义的节点 */
42
- type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf) => ComponentNode;
43
- type StackItem = {
44
- /** 表示当前节点子节点已处理完毕 */
45
- prevSibling: any;
46
- /** 当前节点*/
47
- node: any;
48
- };
49
- type IfNode = LogicNode & {
50
- condition: () => any;
51
- anchor: any;
52
- isFirstRender: boolean;
53
- snapshot: ReturnType<Tokenizer['snapshot']>;
54
- watcher: {
55
- stop: () => void;
56
- };
57
- };
58
- type LogicNode = {
59
- __logicType: LogicType;
60
- directList?: any[];
61
- realList: any[];
62
- };
63
- type ComponentNode = LogicNode & {
64
- store: Store;
65
- };
66
4
 
67
5
  declare class Tokenizer {
68
6
  /** 缩进大小 默认 2 */
@@ -120,13 +58,14 @@ declare class Tokenizer {
120
58
  private newLine;
121
59
  private getDentValue;
122
60
  private dent;
61
+ private shorterThanBaseDentEof;
123
62
  private identifier;
124
63
  private str;
125
64
  private number;
126
65
  private eof;
127
66
  }
128
67
 
129
- declare class Terp {
68
+ declare class Interpreter {
130
69
  private tokenizer;
131
70
  /** 模板字符串动态节点的占位符 */
132
71
  HookId: string;
@@ -134,37 +73,30 @@ declare class Terp {
134
73
  data: Record<any, any>;
135
74
  /** 模板字符串动态节点索引 */
136
75
  hookI: number;
137
- stack: StackItem[];
76
+ lastInserted: any;
77
+ opt: TerpConf;
138
78
  constructor(tokenizer: Tokenizer);
139
- program(): ComponentNode;
79
+ isLogicNode(node: any): number;
80
+ program(root: any, before?: any): ComponentNode;
81
+ insertAfterAnchor(ctx: ProgramCtx): {
82
+ name: string;
83
+ nextSibling: any;
84
+ };
140
85
  /** 处理
141
- * 是逻辑 是普通
142
- * 父节点 将子节点们插入到 realList 调用 insert 方法挨个插入子节点
143
- * 子节点 将其下 realList 插入到父节点 将本节点插入父节点
144
- */
145
- handleInsert(parent: any, child: any, prevSibling: any): void;
146
- /**
147
- * @deprecated
148
- * 节点列表:
149
- * 可以是一个节点,也可以跟随更多节点
150
- * <nodeList> ::= <node> <nodeList> <EOF|Dedent>
151
- * |
86
+ * 是逻辑 是普通
87
+ * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点
88
+ * 子节点 仅插入到父逻辑节点 将本节点插入父节点
89
+ * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom
152
90
  */
153
- nodeList(parent: any): void;
91
+ handleInsert(parent: any, child: any, prev: any, parentComponent?: any): void;
154
92
  /** 考虑到同级 逻辑模块 */
155
93
  getPrevRealSibling(prevSibling: any): any;
156
- /**
157
- * 单个节点:
158
- * 由声明部分和(可选的)子节点块组成
159
- * <node> ::= <declaration> <childrenBlockOpt>
160
- * */
161
- node(): any;
162
94
  /**
163
95
  * 声明部分:
164
96
  * 包含首行定义和(可选的)多行属性扩展
165
97
  * <declaration> ::= <tagName=token> <headerLine> <extensionLines>
166
98
  * */
167
- declaration(): any;
99
+ declaration(ctx: ProgramCtx): any;
168
100
  fragmentDeclaration(renderFragment: BobeUI): LogicNode;
169
101
  /**
170
102
  * key 元素,组件的 key
@@ -175,10 +107,10 @@ declare class Terp {
175
107
  * mapKey 映射, 对应子组件的属性
176
108
  * */
177
109
  onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number): void;
178
- componentDeclaration(Component: typeof Store): {
110
+ componentDeclaration(Component: typeof Store, ctx: ProgramCtx): {
179
111
  __logicType: LogicType;
180
112
  };
181
- ifDeclaration(): IfNode;
113
+ ifDeclaration(ctx: ProgramCtx): IfNode;
182
114
  /**
183
115
  * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>
184
116
  * | ε
@@ -201,26 +133,130 @@ declare class Terp {
201
133
  * 2. 组件节点 收集映射关系,或通过 effect 直接设值
202
134
  */
203
135
  attributeList(_node: any): void;
204
- /** 子节点块:
205
- * 必须被缩进包裹
206
- * <childrenBlockOpt> ::= INDENT <nodeList>
207
- * | ε /* 空(表示叶子节点,没有孩子)
208
- * */
209
- childrenBlockOpt(parent: any): void | any[];
210
- opt: TerpConf;
211
136
  config(opt: TerpConf): void;
212
137
  createNode(name: string): {
213
138
  name: string;
214
139
  props: {};
140
+ nextSibling: any;
141
+ };
142
+ nextSib(node: any): any;
143
+ _createAnchor(): {
144
+ name: string;
145
+ nextSibling: any;
146
+ };
147
+ createAnchor(): {
148
+ name: string;
149
+ nextSibling: any;
215
150
  };
216
- insert(parent: any, node: any, prevSibling: any, prevItem?: any): void;
217
- defaultInsert(parent: any, node: any, prevSibling: any, prevItem: any): void;
218
- remove(parent: any, node: any, prevSibling: any, prevItem: any): void;
219
- defaultRemove(parent: any, node: any, prevSibling: any, prevItem: any): void;
151
+ insertAfter(parent: any, node: any, prev: any): void;
152
+ defaultInsert(parent: any, node: any, prev: any): void;
153
+ remove(node: any, parent?: any, prev?: any): void;
154
+ defaultRemove(node: any, parent: any, prevSibling: any): void;
220
155
  setProp(node: any, key: string, value: any, hookI?: number): void;
221
156
  init(fragments: string | string[]): void;
222
157
  hook: Hook;
223
158
  _hook: (props: Partial<HookProps>) => [HookType | undefined, any];
224
159
  }
225
160
 
226
- export { Terp };
161
+ declare class TypedStack<T, K extends string | number> {
162
+ private top;
163
+ private lastNodes;
164
+ length: number;
165
+ /**
166
+ * @param rawNode 原始节点数据
167
+ * @param type 节点类型
168
+ */
169
+ push(rawNode: T, type: K): void;
170
+ /**
171
+ * 出栈操作
172
+ * @returns 原始节点数据或 null
173
+ */
174
+ pop(): T | null;
175
+ /**
176
+ * O(1) 获取栈顶节点的前一个同类型节点
177
+ */
178
+ getPrevSameType(): T | null;
179
+ findPrevSameType(cb: (node: T) => boolean): T | null;
180
+ /**
181
+ * 获取当前栈顶的类型
182
+ */
183
+ get peekType(): K | null;
184
+ /**
185
+ * 获取栈顶元素
186
+ */
187
+ peek(): T;
188
+ }
189
+
190
+ declare enum TokenType {
191
+ NewLine = 1,
192
+ Indent = 2,
193
+ Dedent = 4,
194
+ Identifier = 8,
195
+ Assign = 16,
196
+ Pipe = 32,
197
+ Eof = 64,
198
+ InsertionExp = 128
199
+ }
200
+ declare enum LogicType {
201
+ If = 1,
202
+ ElseIf = 2,
203
+ Else = 4,
204
+ For = 8,
205
+ Component = 16,
206
+ Fragment = 32,
207
+ Root = 64,
208
+ Real = 128
209
+ }
210
+ declare enum NodeType {
211
+ Logic = 15,
212
+ Real = 128,
213
+ Component = 16
214
+ }
215
+ type BaseType = string | number | boolean | undefined | null;
216
+ type Token = {
217
+ type: TokenType;
218
+ typeName: string;
219
+ value: BaseType;
220
+ };
221
+ type HookProps = {
222
+ /** 通过哪个 HookId 进入的 */
223
+ HookId: string;
224
+ /** 第几个 hook */
225
+ i: number;
226
+ /** 父节点 */
227
+ parentNode?: any;
228
+ };
229
+ type TerpConf = Partial<Pick<Interpreter, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>>;
230
+ type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;
231
+ type Hook = (props: HookProps) => any;
232
+ type HookType = 'dynamic' | 'static';
233
+ type ProgramCtx = {
234
+ stack: TypedStack<any, NodeType>;
235
+ prevSibling: any;
236
+ realParent: any;
237
+ current: any;
238
+ before: any;
239
+ };
240
+ /** 返回值是用户自定义的节点 */
241
+ type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf, root: any, after?: any) => ComponentNode;
242
+ type IfNode = LogicNode & {
243
+ condition: Signal;
244
+ isFirstRender: boolean;
245
+ snapshot: ReturnType<Tokenizer['snapshot']>;
246
+ effect: Dispose;
247
+ };
248
+ type LogicNode = {
249
+ __logicType: LogicType;
250
+ realParent: any;
251
+ realBefore?: any;
252
+ realAfter?: any;
253
+ lastInserted?: any;
254
+ };
255
+ type ComponentNode = LogicNode & {
256
+ store: Store;
257
+ };
258
+
259
+ declare function bobe(fragments: TemplateStringsArray, ...values: any[]): BobeUI;
260
+ declare function customRender(option: CustomRenderConf): <T>(Ctor: typeof Store, root: any) => any[];
261
+
262
+ export { bobe, customRender };