bobe 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bobe.cjs.js.map +1 -1
- package/dist/bobe.esm.js.map +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -3
package/dist/bobe.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bobe.cjs.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from \"./tokenizer\";\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void }\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bobe.cjs.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from './tokenizer';\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
package/dist/bobe.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from \"./tokenizer\";\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void }\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from './tokenizer';\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from \"./tokenizer\";\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void }\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from './tokenizer';\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}\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}\n\nexport type BaseType = string | number | boolean | undefined | null;\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};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\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\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\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 // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\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 rootList;\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 [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\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 = this.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 or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = 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 config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\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 (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\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 const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\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>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\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 [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bobe",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"main": "dist/bobe.cjs.js",
|
|
5
5
|
"module": "dist/bobe.esm.js",
|
|
6
6
|
"browser": "dist/bobe.umd.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"private": false,
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"
|
|
11
|
-
"
|
|
10
|
+
"bobe-shared": "0.0.9",
|
|
11
|
+
"aoye": "0.0.9"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {},
|
|
14
14
|
"files": [
|