bobe 0.0.6 → 0.0.8

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 CHANGED
@@ -62,18 +62,7 @@ class Interpreter {
62
62
  return [isHook, value];
63
63
  };
64
64
  }
65
- /**
66
- * 根节点:
67
- * 是 一个节点列表
68
- * <program> ::= <nodeList>
69
- */
70
65
  program() {
71
- this.tokenizer.consume();
72
- const _program = this.createRoot();
73
- this.nodeList(_program);
74
- return _program;
75
- }
76
- experimentalProgram() {
77
66
  this.tokenizer.consume();
78
67
  let current;
79
68
  let prevSibling;
@@ -92,29 +81,30 @@ class Interpreter {
92
81
  });
93
82
  prevSibling = null;
94
83
  current = this.declaration();
95
- } else {
96
- if (current) {
97
- if (this.stack.length) {
98
- const parent = this.stack[this.stack.length - 1].node;
99
- this.insert(parent, current, prevSibling);
100
- } else {
101
- rootList.push(current);
102
- }
103
- }
104
- if (this.tokenizer.token.type & TokenType.Dedent) {
105
- this.tokenizer.consume();
106
- const { node: parent, prevSibling: prevParent } = this.stack.pop();
107
- prevSibling = prevParent;
108
- current = parent;
84
+ continue;
85
+ }
86
+ if (current) {
87
+ if (this.stack.length) {
88
+ const parent = this.stack[this.stack.length - 1].node;
89
+ this.insert(parent, current, prevSibling);
109
90
  } else {
110
- prevSibling = current;
111
- current = this.declaration();
91
+ rootList.push(current);
112
92
  }
113
93
  }
94
+ if (this.tokenizer.token.type & TokenType.Dedent) {
95
+ this.tokenizer.consume();
96
+ const { node: parent, prevSibling: prevParent } = this.stack.pop();
97
+ prevSibling = prevParent;
98
+ current = parent;
99
+ } else {
100
+ prevSibling = current;
101
+ current = this.declaration();
102
+ }
114
103
  }
115
104
  return rootList;
116
105
  }
117
106
  /**
107
+ * @deprecated
118
108
  * 节点列表:
119
109
  * 可以是一个节点,也可以跟随更多节点
120
110
  * <nodeList> ::= <node> <nodeList> <EOF|Dedent>
@@ -147,19 +137,17 @@ class Interpreter {
147
137
  } else if (parent.__logicType) {
148
138
  _node.anchor = parent;
149
139
  } else ;
150
- this.effect(() => {
151
- if (_node.child && _node.condition()) {
152
- let item = _node.child;
153
- while (item != null) {
154
- const { value: child } = item;
155
- const realPrev = this.getPrevRealSibling(prevSibling);
156
- const currItem = insert(parent, child, realPrev, prevItem);
157
- item = item.next;
158
- prevItem = currItem;
159
- prevSibling = child;
160
- }
140
+ if (_node.child && _node.condition()) {
141
+ let item = _node.child;
142
+ while (item != null) {
143
+ const { value: child } = item;
144
+ const realPrev = this.getPrevRealSibling(prevSibling);
145
+ const currItem = insert(parent, child, realPrev, prevItem);
146
+ item = item.next;
147
+ prevItem = currItem;
148
+ prevSibling = child;
161
149
  }
162
- });
150
+ }
163
151
  }
164
152
  }
165
153
  /** 考虑到同级 逻辑模块 */
@@ -215,22 +203,24 @@ class Interpreter {
215
203
  const ifNode = {
216
204
  __logicType: LogicType.If,
217
205
  condition: value,
218
- child: null,
219
- lastChild: null,
220
- anchor: null,
221
- skip: null
206
+ directList: [],
207
+ realList: [],
208
+ snapshot: this.tokenizer.snapshot(),
209
+ isFirstRender: true,
210
+ watcher: null,
211
+ anchor: null
222
212
  };
223
- this.effect(() => {
224
- const needMount = value();
225
- if (needMount) {
226
- this.tokenizer.consume();
227
- this.tokenizer.consume();
228
- } else {
229
- ifNode.skip = this.tokenizer.skip();
230
- console.log("skip");
231
- console.log(ifNode.skip);
232
- }
233
- });
213
+ ifNode.watcher = this.effect(
214
+ ({ val }) => {
215
+ if (val) {
216
+ this.tokenizer.consume();
217
+ this.tokenizer.consume();
218
+ } else {
219
+ this.tokenizer.skip();
220
+ }
221
+ },
222
+ [value]
223
+ );
234
224
  return ifNode;
235
225
  }
236
226
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bobe.cjs.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["\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\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n}","import { Tokenizer } from './tokenizer';\nimport { Hook, HookProps, 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 constructor(private tokenizer: Tokenizer) {}\n /**\n * 根节点:\n * 是 一个节点列表\n * <program> ::= <nodeList>\n */\n program() {\n // 初始化第一个 token\n this.tokenizer.consume();\n const _program = this.createRoot();\n this.nodeList(_program);\n return _program;\n }\n\n stack: StackItem[] = [];\n\n experimentalProgram() {\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 }\n // 下一个可能是 同级节点 或 Dedent\n else {\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\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 }\n return rootList;\n }\n\n /**\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 this.effect(() => {\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 /** 考虑到同级 逻辑模块 */\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 = {\n __logicType: LogicType.If,\n condition: value,\n child: null,\n lastChild: null,\n anchor: null,\n skip: null\n };\n this.effect(() => {\n const needMount = value();\n if (needMount) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n ifNode.skip = this.tokenizer.skip();\n console.log('skip');\n console.log(ifNode.skip);\n }\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: (fn: () => any) => any;\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 CHANGED
@@ -60,18 +60,7 @@ class Interpreter {
60
60
  return [isHook, value];
61
61
  };
62
62
  }
63
- /**
64
- * 根节点:
65
- * 是 一个节点列表
66
- * <program> ::= <nodeList>
67
- */
68
63
  program() {
69
- this.tokenizer.consume();
70
- const _program = this.createRoot();
71
- this.nodeList(_program);
72
- return _program;
73
- }
74
- experimentalProgram() {
75
64
  this.tokenizer.consume();
76
65
  let current;
77
66
  let prevSibling;
@@ -90,29 +79,30 @@ class Interpreter {
90
79
  });
91
80
  prevSibling = null;
92
81
  current = this.declaration();
93
- } else {
94
- if (current) {
95
- if (this.stack.length) {
96
- const parent = this.stack[this.stack.length - 1].node;
97
- this.insert(parent, current, prevSibling);
98
- } else {
99
- rootList.push(current);
100
- }
101
- }
102
- if (this.tokenizer.token.type & TokenType.Dedent) {
103
- this.tokenizer.consume();
104
- const { node: parent, prevSibling: prevParent } = this.stack.pop();
105
- prevSibling = prevParent;
106
- current = parent;
82
+ continue;
83
+ }
84
+ if (current) {
85
+ if (this.stack.length) {
86
+ const parent = this.stack[this.stack.length - 1].node;
87
+ this.insert(parent, current, prevSibling);
107
88
  } else {
108
- prevSibling = current;
109
- current = this.declaration();
89
+ rootList.push(current);
110
90
  }
111
91
  }
92
+ if (this.tokenizer.token.type & TokenType.Dedent) {
93
+ this.tokenizer.consume();
94
+ const { node: parent, prevSibling: prevParent } = this.stack.pop();
95
+ prevSibling = prevParent;
96
+ current = parent;
97
+ } else {
98
+ prevSibling = current;
99
+ current = this.declaration();
100
+ }
112
101
  }
113
102
  return rootList;
114
103
  }
115
104
  /**
105
+ * @deprecated
116
106
  * 节点列表:
117
107
  * 可以是一个节点,也可以跟随更多节点
118
108
  * <nodeList> ::= <node> <nodeList> <EOF|Dedent>
@@ -145,19 +135,17 @@ class Interpreter {
145
135
  } else if (parent.__logicType) {
146
136
  _node.anchor = parent;
147
137
  } else ;
148
- this.effect(() => {
149
- if (_node.child && _node.condition()) {
150
- let item = _node.child;
151
- while (item != null) {
152
- const { value: child } = item;
153
- const realPrev = this.getPrevRealSibling(prevSibling);
154
- const currItem = insert(parent, child, realPrev, prevItem);
155
- item = item.next;
156
- prevItem = currItem;
157
- prevSibling = child;
158
- }
138
+ if (_node.child && _node.condition()) {
139
+ let item = _node.child;
140
+ while (item != null) {
141
+ const { value: child } = item;
142
+ const realPrev = this.getPrevRealSibling(prevSibling);
143
+ const currItem = insert(parent, child, realPrev, prevItem);
144
+ item = item.next;
145
+ prevItem = currItem;
146
+ prevSibling = child;
159
147
  }
160
- });
148
+ }
161
149
  }
162
150
  }
163
151
  /** 考虑到同级 逻辑模块 */
@@ -213,22 +201,24 @@ class Interpreter {
213
201
  const ifNode = {
214
202
  __logicType: LogicType.If,
215
203
  condition: value,
216
- child: null,
217
- lastChild: null,
218
- anchor: null,
219
- skip: null
204
+ directList: [],
205
+ realList: [],
206
+ snapshot: this.tokenizer.snapshot(),
207
+ isFirstRender: true,
208
+ watcher: null,
209
+ anchor: null
220
210
  };
221
- this.effect(() => {
222
- const needMount = value();
223
- if (needMount) {
224
- this.tokenizer.consume();
225
- this.tokenizer.consume();
226
- } else {
227
- ifNode.skip = this.tokenizer.skip();
228
- console.log("skip");
229
- console.log(ifNode.skip);
230
- }
231
- });
211
+ ifNode.watcher = this.effect(
212
+ ({ val }) => {
213
+ if (val) {
214
+ this.tokenizer.consume();
215
+ this.tokenizer.consume();
216
+ } else {
217
+ this.tokenizer.skip();
218
+ }
219
+ },
220
+ [value]
221
+ );
232
222
  return ifNode;
233
223
  }
234
224
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["\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\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n}","import { Tokenizer } from './tokenizer';\nimport { Hook, HookProps, 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 constructor(private tokenizer: Tokenizer) {}\n /**\n * 根节点:\n * 是 一个节点列表\n * <program> ::= <nodeList>\n */\n program() {\n // 初始化第一个 token\n this.tokenizer.consume();\n const _program = this.createRoot();\n this.nodeList(_program);\n return _program;\n }\n\n stack: StackItem[] = [];\n\n experimentalProgram() {\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 }\n // 下一个可能是 同级节点 或 Dedent\n else {\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\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 }\n return rootList;\n }\n\n /**\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 this.effect(() => {\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 /** 考虑到同级 逻辑模块 */\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 = {\n __logicType: LogicType.If,\n condition: value,\n child: null,\n lastChild: null,\n anchor: null,\n skip: null\n };\n this.effect(() => {\n const needMount = value();\n if (needMount) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n ifNode.skip = this.tokenizer.skip();\n console.log('skip');\n console.log(ifNode.skip);\n }\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: (fn: () => any) => any;\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.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Queue } from 'bobe-shared';
2
+ import { effect, $ } from 'aoye';
2
3
 
3
4
  declare enum TokenType {
4
5
  NewLine = 1,
@@ -36,6 +37,18 @@ type StackItem = {
36
37
  /** 当前节点*/
37
38
  node: any;
38
39
  };
40
+ type IfNode = {
41
+ __logicType: LogicType;
42
+ condition: () => any;
43
+ directList: any[];
44
+ realList: any[];
45
+ anchor: any;
46
+ isFirstRender: boolean;
47
+ snapshot: ReturnType<Tokenizer['snapshot']>;
48
+ watcher: {
49
+ stop: () => void;
50
+ };
51
+ };
39
52
 
40
53
  declare class Tokenizer {
41
54
  /** 缩进大小 默认 2 */
@@ -106,19 +119,11 @@ declare class Interpreter {
106
119
  data: Record<any, any>;
107
120
  /** 模板字符串动态节点索引 */
108
121
  hookI: number;
109
- constructor(tokenizer: Tokenizer);
110
- /**
111
- * 根节点:
112
- * 是 一个节点列表
113
- * <program> ::= <nodeList>
114
- */
115
- program(): {
116
- name: string;
117
- props: {};
118
- };
119
122
  stack: StackItem[];
120
- experimentalProgram(): any[];
123
+ constructor(tokenizer: Tokenizer);
124
+ program(): any[];
121
125
  /**
126
+ * @deprecated
122
127
  * 节点列表:
123
128
  * 可以是一个节点,也可以跟随更多节点
124
129
  * <nodeList> ::= <node> <nodeList> <EOF|Dedent>
@@ -139,14 +144,7 @@ declare class Interpreter {
139
144
  * <declaration> ::= <tagName=token> <headerLine> <extensionLines>
140
145
  * */
141
146
  declaration(): any;
142
- ifDeclaration(): {
143
- __logicType: LogicType;
144
- condition: any;
145
- child: any;
146
- lastChild: any;
147
- anchor: any;
148
- skip: any;
149
- };
147
+ ifDeclaration(): IfNode;
150
148
  /**
151
149
  * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>
152
150
  * | ε
@@ -197,7 +195,8 @@ declare class Interpreter {
197
195
  remove(parent: any, node: any, prevSibling: any, prevItem: any): void;
198
196
  defaultRemove(parent: any, node: any, prevSibling: any, prevItem: any): void;
199
197
  setProp(node: any, key: string, value: any, hookI?: number): void;
200
- effect: (fn: () => any) => any;
198
+ effect: typeof effect;
199
+ signal: typeof $;
201
200
  init(fragments: string | string[]): void;
202
201
  hook: Hook;
203
202
  _hook: (props: Partial<HookProps>) => [boolean, any];
package/dist/index.umd.js CHANGED
@@ -66,18 +66,7 @@
66
66
  return [isHook, value];
67
67
  };
68
68
  }
69
- /**
70
- * 根节点:
71
- * 是 一个节点列表
72
- * <program> ::= <nodeList>
73
- */
74
69
  program() {
75
- this.tokenizer.consume();
76
- const _program = this.createRoot();
77
- this.nodeList(_program);
78
- return _program;
79
- }
80
- experimentalProgram() {
81
70
  this.tokenizer.consume();
82
71
  let current;
83
72
  let prevSibling;
@@ -96,29 +85,30 @@
96
85
  });
97
86
  prevSibling = null;
98
87
  current = this.declaration();
99
- } else {
100
- if (current) {
101
- if (this.stack.length) {
102
- const parent = this.stack[this.stack.length - 1].node;
103
- this.insert(parent, current, prevSibling);
104
- } else {
105
- rootList.push(current);
106
- }
107
- }
108
- if (this.tokenizer.token.type & TokenType.Dedent) {
109
- this.tokenizer.consume();
110
- const { node: parent, prevSibling: prevParent } = this.stack.pop();
111
- prevSibling = prevParent;
112
- current = parent;
88
+ continue;
89
+ }
90
+ if (current) {
91
+ if (this.stack.length) {
92
+ const parent = this.stack[this.stack.length - 1].node;
93
+ this.insert(parent, current, prevSibling);
113
94
  } else {
114
- prevSibling = current;
115
- current = this.declaration();
95
+ rootList.push(current);
116
96
  }
117
97
  }
98
+ if (this.tokenizer.token.type & TokenType.Dedent) {
99
+ this.tokenizer.consume();
100
+ const { node: parent, prevSibling: prevParent } = this.stack.pop();
101
+ prevSibling = prevParent;
102
+ current = parent;
103
+ } else {
104
+ prevSibling = current;
105
+ current = this.declaration();
106
+ }
118
107
  }
119
108
  return rootList;
120
109
  }
121
110
  /**
111
+ * @deprecated
122
112
  * 节点列表:
123
113
  * 可以是一个节点,也可以跟随更多节点
124
114
  * <nodeList> ::= <node> <nodeList> <EOF|Dedent>
@@ -151,19 +141,17 @@
151
141
  } else if (parent.__logicType) {
152
142
  _node.anchor = parent;
153
143
  } else ;
154
- this.effect(() => {
155
- if (_node.child && _node.condition()) {
156
- let item = _node.child;
157
- while (item != null) {
158
- const { value: child } = item;
159
- const realPrev = this.getPrevRealSibling(prevSibling);
160
- const currItem = insert(parent, child, realPrev, prevItem);
161
- item = item.next;
162
- prevItem = currItem;
163
- prevSibling = child;
164
- }
144
+ if (_node.child && _node.condition()) {
145
+ let item = _node.child;
146
+ while (item != null) {
147
+ const { value: child } = item;
148
+ const realPrev = this.getPrevRealSibling(prevSibling);
149
+ const currItem = insert(parent, child, realPrev, prevItem);
150
+ item = item.next;
151
+ prevItem = currItem;
152
+ prevSibling = child;
165
153
  }
166
- });
154
+ }
167
155
  }
168
156
  }
169
157
  /** 考虑到同级 逻辑模块 */
@@ -219,22 +207,24 @@
219
207
  const ifNode = {
220
208
  __logicType: LogicType.If,
221
209
  condition: value,
222
- child: null,
223
- lastChild: null,
224
- anchor: null,
225
- skip: null
210
+ directList: [],
211
+ realList: [],
212
+ snapshot: this.tokenizer.snapshot(),
213
+ isFirstRender: true,
214
+ watcher: null,
215
+ anchor: null
226
216
  };
227
- this.effect(() => {
228
- const needMount = value();
229
- if (needMount) {
230
- this.tokenizer.consume();
231
- this.tokenizer.consume();
232
- } else {
233
- ifNode.skip = this.tokenizer.skip();
234
- console.log("skip");
235
- console.log(ifNode.skip);
236
- }
237
- });
217
+ ifNode.watcher = this.effect(
218
+ ({ val }) => {
219
+ if (val) {
220
+ this.tokenizer.consume();
221
+ this.tokenizer.consume();
222
+ } else {
223
+ this.tokenizer.skip();
224
+ }
225
+ },
226
+ [value]
227
+ );
238
228
  return ifNode;
239
229
  }
240
230
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["\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\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n}","import { Tokenizer } from './tokenizer';\nimport { Hook, HookProps, 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 constructor(private tokenizer: Tokenizer) {}\n /**\n * 根节点:\n * 是 一个节点列表\n * <program> ::= <nodeList>\n */\n program() {\n // 初始化第一个 token\n this.tokenizer.consume();\n const _program = this.createRoot();\n this.nodeList(_program);\n return _program;\n }\n\n stack: StackItem[] = [];\n\n experimentalProgram() {\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 }\n // 下一个可能是 同级节点 或 Dedent\n else {\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\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 }\n return rootList;\n }\n\n /**\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 this.effect(() => {\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 /** 考虑到同级 逻辑模块 */\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 = {\n __logicType: LogicType.If,\n condition: value,\n child: null,\n lastChild: null,\n anchor: null,\n skip: null\n };\n this.effect(() => {\n const needMount = value();\n if (needMount) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n ifNode.skip = this.tokenizer.skip();\n console.log('skip');\n console.log(ifNode.skip);\n }\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: (fn: () => any) => any;\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.6",
3
+ "version": "0.0.8",
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
- "aoye": "0.0.6",
11
- "bobe-shared": "0.0.6"
10
+ "aoye": "0.0.8",
11
+ "bobe-shared": "0.0.8"
12
12
  },
13
13
  "devDependencies": {},
14
14
  "files": [