bobe 0.0.12 → 0.0.13
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 +91 -22
- package/dist/bobe.cjs.js.map +1 -1
- package/dist/bobe.esm.js +91 -22
- package/dist/bobe.esm.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.umd.js +91 -22
- package/dist/index.umd.js.map +1 -1
- package/package.json +4 -5
package/dist/bobe.esm.js
CHANGED
|
@@ -15,7 +15,7 @@ var TokenType = /* @__PURE__ */ ((TokenType2) => {
|
|
|
15
15
|
})(TokenType || {});
|
|
16
16
|
var LogicType = /* @__PURE__ */ ((LogicType2) => {
|
|
17
17
|
LogicType2[LogicType2["If"] = 1] = "If";
|
|
18
|
-
LogicType2[LogicType2["
|
|
18
|
+
LogicType2[LogicType2["Fail"] = 2] = "Fail";
|
|
19
19
|
LogicType2[LogicType2["Else"] = 4] = "Else";
|
|
20
20
|
LogicType2[LogicType2["For"] = 8] = "For";
|
|
21
21
|
LogicType2[LogicType2["Component"] = 16] = "Component";
|
|
@@ -24,7 +24,8 @@ var LogicType = /* @__PURE__ */ ((LogicType2) => {
|
|
|
24
24
|
LogicType2[LogicType2["Real"] = 128] = "Real";
|
|
25
25
|
return LogicType2;
|
|
26
26
|
})(LogicType || {});
|
|
27
|
-
const Logical = 1 /* If */ | 2 /*
|
|
27
|
+
const Logical = 1 /* If */ | 2 /* Fail */ | 4 /* Else */ | 8 /* For */;
|
|
28
|
+
const CondType = 1 /* If */ | 2 /* Fail */ | 4 /* Else */;
|
|
28
29
|
var NodeType = /* @__PURE__ */ ((NodeType2) => {
|
|
29
30
|
NodeType2[NodeType2["Logic"] = Logical] = "Logic";
|
|
30
31
|
NodeType2[NodeType2["Real"] = 128 /* Real */] = "Real";
|
|
@@ -201,7 +202,9 @@ class Interpreter {
|
|
|
201
202
|
setPulling(ctx.current.effect.ins);
|
|
202
203
|
}
|
|
203
204
|
} else {
|
|
204
|
-
|
|
205
|
+
if (ctx.current) {
|
|
206
|
+
ctx.realParent = ctx.current;
|
|
207
|
+
}
|
|
205
208
|
ctx.prevSibling = null;
|
|
206
209
|
}
|
|
207
210
|
ctx.current = this.declaration(ctx);
|
|
@@ -218,7 +221,7 @@ class Interpreter {
|
|
|
218
221
|
const { node: parent, prev } = stack.peek();
|
|
219
222
|
if (!parent.__logicType) {
|
|
220
223
|
const prevSameType = stack.getPrevSameType();
|
|
221
|
-
ctx.realParent = prevSameType == null ? void 0 : prevSameType.node;
|
|
224
|
+
ctx.realParent = (prevSameType == null ? void 0 : prevSameType.node) || root;
|
|
222
225
|
} else {
|
|
223
226
|
if (this.isLogicNode(parent)) {
|
|
224
227
|
const parentLogic = (_a = stack.getPrevSameType()) == null ? void 0 : _a.node;
|
|
@@ -263,7 +266,7 @@ class Interpreter {
|
|
|
263
266
|
} else {
|
|
264
267
|
const childCmp = child;
|
|
265
268
|
childCmp.realParent = parent;
|
|
266
|
-
if (prev.__logicType) {
|
|
269
|
+
if (prev == null ? void 0 : prev.__logicType) {
|
|
267
270
|
childCmp.realBefore = prev.realAfter;
|
|
268
271
|
} else {
|
|
269
272
|
childCmp.realBefore = prev;
|
|
@@ -291,8 +294,8 @@ class Interpreter {
|
|
|
291
294
|
declaration(ctx) {
|
|
292
295
|
const [hookType, value] = this._hook({});
|
|
293
296
|
let _node;
|
|
294
|
-
if (value === "if") {
|
|
295
|
-
return this.
|
|
297
|
+
if (value === "if" || value === "else" || value === "fail") {
|
|
298
|
+
return this.condDeclaration(ctx);
|
|
296
299
|
} else if (hookType) {
|
|
297
300
|
if (hookType === "static") {
|
|
298
301
|
if (typeof value === "function" && value.prototype instanceof Store) {
|
|
@@ -367,9 +370,10 @@ class Interpreter {
|
|
|
367
370
|
}
|
|
368
371
|
};
|
|
369
372
|
const afterAnchor = this.insertAfterAnchor(ctx);
|
|
373
|
+
const { realParent, prevSibling } = ctx;
|
|
370
374
|
tap.once(TerpEvt.AllAttrGot, () => {
|
|
371
|
-
const parent =
|
|
372
|
-
const prev =
|
|
375
|
+
const parent = realParent;
|
|
376
|
+
const prev = prevSibling;
|
|
373
377
|
this.onePropParsed = prevOnePropParsed;
|
|
374
378
|
const componentNode = child["ui"](this.opt, { data: child }, parent, prev);
|
|
375
379
|
componentNode.realAfter = afterAnchor;
|
|
@@ -377,26 +381,80 @@ class Interpreter {
|
|
|
377
381
|
});
|
|
378
382
|
return { __logicType: LogicType.Component };
|
|
379
383
|
}
|
|
380
|
-
|
|
381
|
-
|
|
384
|
+
// TODO: 优化代码逻辑,拆分 if elseif else
|
|
385
|
+
condDeclaration(ctx) {
|
|
386
|
+
const { prevSibling } = ctx;
|
|
387
|
+
const snapbackUp = this.tokenizer.snapshot();
|
|
388
|
+
const keyWord = this.tokenizer.consume();
|
|
389
|
+
const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;
|
|
382
390
|
const [hookType, value] = this._hook({});
|
|
391
|
+
const isElse = keyWord.value === "else";
|
|
392
|
+
const isIf = keyWord.value === "if";
|
|
393
|
+
const preIsCond = (prevSibling == null ? void 0 : prevSibling.__logicType) & CondType;
|
|
394
|
+
const needCalcWithPrevIf = isElse && preIsCond;
|
|
383
395
|
const ifNode = {
|
|
384
|
-
__logicType: LogicType.If,
|
|
385
|
-
snapshot: this.tokenizer.snapshot(),
|
|
396
|
+
__logicType: isElse ? LogicType.Else : isIf ? LogicType.If : LogicType.Fail,
|
|
397
|
+
snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),
|
|
386
398
|
condition: null,
|
|
387
399
|
realParent: null,
|
|
400
|
+
preCond: preIsCond ? prevSibling : null,
|
|
388
401
|
isFirstRender: true,
|
|
389
402
|
effect: null
|
|
390
403
|
};
|
|
391
|
-
const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);
|
|
392
404
|
let signal;
|
|
393
|
-
if (
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
405
|
+
if (noSelfCond) {
|
|
406
|
+
if (isElse) {
|
|
407
|
+
signal = $(() => {
|
|
408
|
+
let point = ifNode.preCond;
|
|
409
|
+
while (point) {
|
|
410
|
+
if (point.condition.v) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (point.__logicType === LogicType.If) {
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
point = point.preCond;
|
|
417
|
+
}
|
|
418
|
+
return true;
|
|
419
|
+
});
|
|
420
|
+
} else {
|
|
421
|
+
signal = $(() => {
|
|
422
|
+
let point = ifNode.preCond;
|
|
423
|
+
while (point) {
|
|
424
|
+
if (point.condition.v) {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
point = point.preCond;
|
|
428
|
+
}
|
|
429
|
+
return true;
|
|
430
|
+
});
|
|
431
|
+
}
|
|
397
432
|
} else {
|
|
398
|
-
const
|
|
399
|
-
|
|
433
|
+
const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);
|
|
434
|
+
if (valueIsMapKey && !needCalcWithPrevIf) {
|
|
435
|
+
runWithPulling(() => this.data[value], null);
|
|
436
|
+
const { cells } = this.data[Keys.Meta];
|
|
437
|
+
signal = cells.get(value);
|
|
438
|
+
} else {
|
|
439
|
+
const fn = new Function("data", `let v;with(data){v=${value}};return v;`).bind(void 0, this.data);
|
|
440
|
+
if (needCalcWithPrevIf) {
|
|
441
|
+
signal = $(() => {
|
|
442
|
+
let point = ifNode.preCond;
|
|
443
|
+
while (point) {
|
|
444
|
+
if (point.condition.v) {
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
if (point.__logicType === LogicType.If) {
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
point = point.preCond;
|
|
451
|
+
}
|
|
452
|
+
return fn();
|
|
453
|
+
});
|
|
454
|
+
} else {
|
|
455
|
+
signal = $(fn);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
400
458
|
}
|
|
401
459
|
ifNode.condition = signal;
|
|
402
460
|
ifNode.realAfter = this.insertAfterAnchor(ctx);
|
|
@@ -404,7 +462,9 @@ class Interpreter {
|
|
|
404
462
|
({ val }) => {
|
|
405
463
|
if (val) {
|
|
406
464
|
if (ifNode.isFirstRender) {
|
|
407
|
-
|
|
465
|
+
if (!noSelfCond) {
|
|
466
|
+
this.tokenizer.consume();
|
|
467
|
+
}
|
|
408
468
|
this.tokenizer.consume();
|
|
409
469
|
} else {
|
|
410
470
|
this.tokenizer.resume(ifNode.snapshot);
|
|
@@ -412,10 +472,14 @@ class Interpreter {
|
|
|
412
472
|
}
|
|
413
473
|
} else {
|
|
414
474
|
if (ifNode.isFirstRender) {
|
|
475
|
+
if (noSelfCond) {
|
|
476
|
+
this.tokenizer.i = this.tokenizer.i - 1;
|
|
477
|
+
this.tokenizer.needIndent = false;
|
|
478
|
+
}
|
|
415
479
|
this.tokenizer.skip();
|
|
416
480
|
} else {
|
|
417
481
|
const { realBefore, realAfter, realParent } = ifNode;
|
|
418
|
-
let point = this.nextSib(realBefore);
|
|
482
|
+
let point = realBefore ? this.nextSib(realBefore) : this.kid(realParent);
|
|
419
483
|
while (point !== realAfter) {
|
|
420
484
|
const next = this.nextSib(point);
|
|
421
485
|
this.remove(point, realParent, realBefore);
|
|
@@ -503,6 +567,9 @@ class Interpreter {
|
|
|
503
567
|
nextSib(node) {
|
|
504
568
|
return node.nextSibling;
|
|
505
569
|
}
|
|
570
|
+
kid(node) {
|
|
571
|
+
return node.firstChild;
|
|
572
|
+
}
|
|
506
573
|
_createAnchor() {
|
|
507
574
|
const anchor = this.createAnchor();
|
|
508
575
|
anchor[IsAnchor] = true;
|
|
@@ -523,7 +590,9 @@ class Interpreter {
|
|
|
523
590
|
prev.nextSibling = node;
|
|
524
591
|
node.nextSibling = next;
|
|
525
592
|
} else {
|
|
593
|
+
const next = parent.firstChild;
|
|
526
594
|
parent.firstChild = node;
|
|
595
|
+
node.nextSibling = next;
|
|
527
596
|
}
|
|
528
597
|
}
|
|
529
598
|
remove(node, parent, prev) {
|
package/dist/bobe.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed-stack.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport type { TypedStack } from './typed-stack';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport enum LogicType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n ElseIf = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Component = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Fragment = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Root = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n // 仅占位\n Real = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport const Logical = LogicType.If | LogicType.ElseIf | LogicType.Else | LogicType.For;\n\nexport enum NodeType {\n Logic = Logical,\n Real = LogicType.Real,\n Component = LogicType.Component\n}\n\nexport enum TerpEvt {\n AllAttrGot = 'all-attr-got',\n HandledComponentNode = 'handled-component-node'\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport const InsComputed = Symbol('insertion-computed-map-key');\nexport const IsAnchor = Symbol('is-anchor');\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\n\nexport type TerpConf = Partial<\n Pick<Interpreter, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>\n>;\nexport type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: TypedStack<any, NodeType>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (\n this: Store,\n options: CustomRenderConf,\n valOpt: TerpConf,\n root: any,\n after?: any\n) => ComponentNode;\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n};\n\nexport type LogicNode = {\n __logicType: LogicType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\n","/**\n * 节点包装单元的内部结构\n */\ninterface StackNode<T, K extends string|number> {\n data: T;\n type: K;\n prev: StackNode<T, K> | null; // 基础栈指向\n prevSameType: StackNode<T, K> | null; // 指向同类型的前一个包装单元\n}\n\nexport class TypedStack<T, K extends string|number> {\n private top: StackNode<T, K> | null = null;\n\n // 存储每种类型最近一次出现的包装单元引用\n // 使用 Record 来动态支持不同的类型标签\n private lastNodes: Partial<Record<K, StackNode<T, K> | null>> = {};\n length = 0;\n\n /**\n * @param rawNode 原始节点数据\n * @param type 节点类型\n */\n push(rawNode: T, type: K): void {\n const newNode: StackNode<T, K> = {\n data: rawNode,\n type: type,\n prev: this.top,\n prevSameType: this.lastNodes[type] ?? null\n };\n\n this.top = newNode;\n this.length++;\n this.lastNodes[type] = newNode;\n }\n\n /**\n * 出栈操作\n * @returns 原始节点数据或 null\n */\n pop(): T | null {\n if (!this.top) return null;\n\n const popped = this.top;\n\n // 弹栈时,恢复该类型的上一个记录点\n this.lastNodes[popped.type] = popped.prevSameType;\n this.top = popped.prev;\n this.length--;\n return popped.data;\n }\n\n /**\n * O(1) 获取栈顶节点的前一个同类型节点\n */\n getPrevSameType(): T | null {\n if (!this.top || !this.top.prevSameType) {\n return null;\n }\n return this.top.prevSameType.data;\n }\n\n findPrevSameType(cb: (node: T) => boolean): T | null {\n if (!this.top) {\n return null;\n }\n let point = this.top.prevSameType;\n while (point) {\n if (cb(point.data)) {\n return point.data;\n }\n point = point.prevSameType;\n }\n return null;\n }\n\n /**\n * 获取当前栈顶的类型\n */\n get peekType(): K | null {\n return this.top ? this.top.type : null;\n }\n /**\n * 获取栈顶元素\n */\n peek() {\n return this.top.data;\n }\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n IsAnchor,\n Logical,\n LogicNode,\n LogicType,\n NodeType,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nimport { TypedStack } from './typed-stack';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n lastInserted;\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & Logical;\n }\n\n program(root: any, before?: any) {\n const componentNode: ComponentNode = {\n __logicType: LogicType.Component,\n realParent: root,\n store: new Store()\n };\n this.tokenizer.consume();\n const stack = new TypedStack<StackItem, NodeType>();\n stack.push({ node: root, prev: null }, NodeType.Real);\n\n const ctx: ProgramCtx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n };\n\n const rootPulling = getPulling();\n while (1) {\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n const INDENT = this.tokenizer.consume();\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n ctx.current.__logicType ? (isLogicNode ? NodeType.Logic : NodeType.Component) : NodeType.Real\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n ctx.realParent = ctx.current;\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 1 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prev } = stack.peek();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.getPrevSameType();\n ctx.realParent = prevSameType?.node;\n }\n // 弹出逻辑节点,\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (this.isLogicNode(parent)) {\n // 找最近的 if for\n const parentLogic = stack.getPrevSameType()?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n }\n stack.pop();\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n insertAfterAnchor(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n ctx.prevSibling = stack.length === 1 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev.__logicType) {\n childCmp.realBefore = prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\n }\n }\n }\n\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this._hook({});\n let _node: any;\n\n if (value === 'if') {\n return this.ifDeclaration(ctx);\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class\n if (typeof value === 'function' && value.prototype instanceof Store) {\n _node = this.componentDeclaration(value, ctx);\n }\n // 传组件片段\n else if (typeof value === 'function') {\n _node = this.fragmentDeclaration(value);\n }\n // 其余类型不允许静态插值\n else {\n throw new SyntaxError(`declaration 不支持 ${value} 类型的静态插值`);\n }\n }\n // 动态插值\n // 一定是 js 表达式\n // 1. 返回基础值,创建文本节点 createNode('text', String(value))\n // 2. 返回 组件,创建组件节点\n // 3. 返回 片段\n // TODO: 后续考虑动态组件\n else {\n const isKeyInsertion = Boolean(this.data[Keys.Raw][value]);\n\n const fn = new Function('data', `let v;with(data){v=(${value})};return v`);\n\n _node = this.createNode(value);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n if (_node.__logicType === LogicType.Component) {\n tap.once(TerpEvt.HandledComponentNode, node => (_node = node));\n tap.emit(TerpEvt.AllAttrGot);\n }\n return _node;\n }\n\n // TODO: 指定挂载位置\n fragmentDeclaration(renderFragment: BobeUI) {\n const fragmentNode: FragmentNode = {\n __logicType: LogicType.Fragment,\n realParent: null\n };\n renderFragment.call(this.data, this.opt, { data: this.data, root: '', anchor: '' });\n return fragmentNode;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number) {\n if (typeof value === 'function') {\n effect(() => {\n const res = value();\n this.setProp(node, key, res, hookI);\n });\n } else if (valueIsMapKey) {\n effect(() => {\n const res = this.data[value];\n this.setProp(node, key, res, hookI);\n });\n }\n // 静态数据\n else {\n this.setProp(node, key, value, hookI);\n }\n }\n\n componentDeclaration(Component: typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n const child = Component.new();\n const prevOnePropParsed = this.onePropParsed;\n this.onePropParsed = (node, key, value, valueIsMapKey, hookI) => {\n // key 映射\n if (valueIsMapKey) {\n shareSignal(this.data, value, child, key);\n }\n // 动态值内置 computed 处理\n else if (typeof value === 'function') {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n const computed = $(value);\n cells.set(key, computed);\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n const afterAnchor = this.insertAfterAnchor(ctx);\n tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = ctx.realParent;\n const prev = ctx.prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const componentNode = (child['ui'] as BobeUI)(this.opt, { data: child }, parent, prev);\n componentNode.realAfter = afterAnchor;\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\n });\n return { __logicType: LogicType.Component };\n }\n\n ifDeclaration(ctx: ProgramCtx) {\n const ifIdentifier = this.tokenizer.consume();\n const [hookType, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n snapshot: this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n isFirstRender: true,\n effect: null\n };\n\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n let signal: Signal;\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => this.data[value], null);\n // 拿到 signal\n const { cells } = this.data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(ctx);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n }\n // 更新渲染\n else {\n /**\n * condition 在首屏对应的是 当前 token, resume 时被设置为空\n * newLine 被用于判断起始缩进所消耗\n */\n this.tokenizer.resume(ifNode.snapshot);\n\n // TODO: 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.realBefore);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = this.nextSib(realBefore);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\n }\n\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if (!(this.tokenizer.token.type & TokenType.Pipe)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或通过 effect 直接设值\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n while (!(this.tokenizer.token.type & TokenType.NewLine)) {\n // 取 key\n if (key == null) {\n key = this.tokenizer.token.value as any;\n }\n // 取 =\n else if (eq == null) {\n eq = '=';\n }\n // 取 value\n else {\n const [hookType, value] = this._hook({});\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n const fn = valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n this.onePropParsed(_node, key, fn, valueIsMapKey, this.hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.consume();\n }\n }\n config(opt: TerpConf) {\n Object.assign(this, opt);\n this.opt = opt;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {},\n nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n _createAnchor() {\n const anchor = this.createAnchor();\n anchor[IsAnchor] = true;\n return anchor;\n }\n createAnchor() {\n return {\n name: 'anchor',\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n parent.firstChild = node;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.tokenizer.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.tokenizer.setCode(code + fragments[fragments.length - 1]);\n }\n }\n hook: Hook;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any] => {\n const value = this.tokenizer.token.value;\n const isDynamicHook = this.tokenizer.token.type & TokenType.InsertionExp;\n const isStaticHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n const hookType: HookType = isDynamicHook ? 'dynamic' : isStaticHook ? 'static' : undefined;\n // 静态插值 `${xxx}`\n if (this.hook && isStaticHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n this.hookI++;\n return [hookType, res];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n}\n","import { isNum, Queue } from 'bobe-shared';\nimport { BaseType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** 匹配标识符 */\n IdExp = /[\\d\\w\\/]/;\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor() {}\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot() {\n return {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n private testId(value: string) {\n if (typeof value !== 'string') return false;\n return this.IdExp.test(value);\n }\n\n private nextToken() {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n let { char } = this;\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n this.brace();\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.char;\n const nextChar = this.after;\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.next()[0]; // 跳过 * 号\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n this.setToken(TokenType.InsertionExp, value.slice(1));\n return;\n }\n value += this.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.char;\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.next();\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, String(currLen));\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '\"';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, CustomRenderConf } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(options, valueOpt, root, before) {\n const tokenizer = new Tokenizer();\n const cmp = new Interpreter(tokenizer);\n Object.assign(cmp, valueOpt);\n // 初始化\n cmp.config({\n ...options,\n hook({ i }) {\n return values[i];\n },\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n });\n cmp.init(Array.from(fragments));\n return cmp.program(root, before);\n };\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n // ui => bobe`` 返回的函数\n return [store['ui'](option, { data: store }, root), store];\n };\n}\n\n"],"names":["TokenType","LogicType","NodeType","TerpEvt","__spreadProps","__spreadValues","ui"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed-stack.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport type { TypedStack } from './typed-stack';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport enum LogicType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Fail = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Component = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Fragment = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Root = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n // 仅占位\n Real = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport const Logical = LogicType.If | LogicType.Fail | LogicType.Else | LogicType.For;\n\nexport const CondType = LogicType.If | LogicType.Fail | LogicType.Else;\n\nexport enum NodeType {\n Logic = Logical,\n Real = LogicType.Real,\n Component = LogicType.Component\n}\n\nexport enum TerpEvt {\n AllAttrGot = 'all-attr-got',\n HandledComponentNode = 'handled-component-node'\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport const InsComputed = Symbol('insertion-computed-map-key');\nexport const IsAnchor = Symbol('is-anchor');\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\n\nexport type TerpConf = Partial<\n Pick<Interpreter, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>\n>;\nexport type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: TypedStack<any, NodeType>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (\n this: Store,\n options: CustomRenderConf,\n valOpt: TerpConf,\n root: any,\n after?: any\n) => ComponentNode;\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n preCond: IfNode | null;\n};\n\nexport type LogicNode = {\n __logicType: LogicType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\n","/**\n * 节点包装单元的内部结构\n */\ninterface StackNode<T, K extends string|number> {\n data: T;\n type: K;\n prev: StackNode<T, K> | null; // 基础栈指向\n prevSameType: StackNode<T, K> | null; // 指向同类型的前一个包装单元\n}\n\nexport class TypedStack<T, K extends string|number> {\n private top: StackNode<T, K> | null = null;\n\n // 存储每种类型最近一次出现的包装单元引用\n // 使用 Record 来动态支持不同的类型标签\n private lastNodes: Partial<Record<K, StackNode<T, K> | null>> = {};\n length = 0;\n\n /**\n * @param rawNode 原始节点数据\n * @param type 节点类型\n */\n push(rawNode: T, type: K): void {\n const newNode: StackNode<T, K> = {\n data: rawNode,\n type: type,\n prev: this.top,\n prevSameType: this.lastNodes[type] ?? null\n };\n\n this.top = newNode;\n this.length++;\n this.lastNodes[type] = newNode;\n }\n\n /**\n * 出栈操作\n * @returns 原始节点数据或 null\n */\n pop(): T | null {\n if (!this.top) return null;\n\n const popped = this.top;\n\n // 弹栈时,恢复该类型的上一个记录点\n this.lastNodes[popped.type] = popped.prevSameType;\n this.top = popped.prev;\n this.length--;\n return popped.data;\n }\n\n /**\n * O(1) 获取栈顶节点的前一个同类型节点\n */\n getPrevSameType(): T | null {\n if (!this.top || !this.top.prevSameType) {\n return null;\n }\n return this.top.prevSameType.data;\n }\n\n findPrevSameType(cb: (node: T) => boolean): T | null {\n if (!this.top) {\n return null;\n }\n let point = this.top.prevSameType;\n while (point) {\n if (cb(point.data)) {\n return point.data;\n }\n point = point.prevSameType;\n }\n return null;\n }\n\n /**\n * 获取当前栈顶的类型\n */\n get peekType(): K | null {\n return this.top ? this.top.type : null;\n }\n /**\n * 获取栈顶元素\n */\n peek() {\n return this.top.data;\n }\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondType,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n IsAnchor,\n Logical,\n LogicNode,\n LogicType,\n NodeType,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n Token,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nimport { TypedStack } from './typed-stack';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n lastInserted;\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & Logical;\n }\n\n program(root: any, before?: any) {\n const componentNode: ComponentNode = {\n __logicType: LogicType.Component,\n realParent: root,\n store: new Store()\n };\n this.tokenizer.consume();\n const stack = new TypedStack<StackItem, NodeType>();\n stack.push({ node: root, prev: null }, NodeType.Real);\n\n const ctx: ProgramCtx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n };\n\n const rootPulling = getPulling();\n while (1) {\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n const INDENT = this.tokenizer.consume();\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n ctx.current.__logicType ? (isLogicNode ? NodeType.Logic : NodeType.Component) : NodeType.Real\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n if (ctx.current) {\n ctx.realParent = ctx.current;\n }\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 1 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prev } = stack.peek();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.getPrevSameType();\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出逻辑节点,\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (this.isLogicNode(parent)) {\n // 找最近的 if for\n const parentLogic = stack.getPrevSameType()?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n }\n stack.pop();\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n insertAfterAnchor(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n ctx.prevSibling = stack.length === 1 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev?.__logicType) {\n childCmp.realBefore = prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\n }\n }\n }\n\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this._hook({});\n let _node: any;\n\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class\n if (typeof value === 'function' && value.prototype instanceof Store) {\n _node = this.componentDeclaration(value, ctx);\n }\n // 传组件片段\n else if (typeof value === 'function') {\n _node = this.fragmentDeclaration(value);\n }\n // 其余类型不允许静态插值\n else {\n throw new SyntaxError(`declaration 不支持 ${value} 类型的静态插值`);\n }\n }\n // 动态插值\n // 一定是 js 表达式\n // 1. 返回基础值,创建文本节点 createNode('text', String(value))\n // 2. 返回 组件,创建组件节点\n // 3. 返回 片段\n // TODO: 后续考虑动态组件\n else {\n const isKeyInsertion = Boolean(this.data[Keys.Raw][value]);\n\n const fn = new Function('data', `let v;with(data){v=(${value})};return v`);\n\n _node = this.createNode(value);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n if (_node.__logicType === LogicType.Component) {\n tap.once(TerpEvt.HandledComponentNode, node => (_node = node));\n tap.emit(TerpEvt.AllAttrGot);\n }\n return _node;\n }\n\n // TODO: 指定挂载位置\n fragmentDeclaration(renderFragment: BobeUI) {\n const fragmentNode: FragmentNode = {\n __logicType: LogicType.Fragment,\n realParent: null\n };\n renderFragment.call(this.data, this.opt, { data: this.data, root: '', anchor: '' });\n return fragmentNode;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number) {\n if (typeof value === 'function') {\n effect(() => {\n const res = value();\n this.setProp(node, key, res, hookI);\n });\n } else if (valueIsMapKey) {\n effect(() => {\n const res = this.data[value];\n this.setProp(node, key, res, hookI);\n });\n }\n // 静态数据\n else {\n this.setProp(node, key, value, hookI);\n }\n }\n\n componentDeclaration(Component: typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n const child = Component.new();\n const prevOnePropParsed = this.onePropParsed;\n this.onePropParsed = (node, key, value, valueIsMapKey, hookI) => {\n // key 映射\n if (valueIsMapKey) {\n shareSignal(this.data, value, child, key);\n }\n // 动态值内置 computed 处理\n else if (typeof value === 'function') {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n const computed = $(value);\n cells.set(key, computed);\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n const afterAnchor = this.insertAfterAnchor(ctx);\n const { realParent, prevSibling } = ctx;\n tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = realParent;\n const prev = prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const componentNode = (child['ui'] as BobeUI)(this.opt, { data: child }, parent, prev);\n componentNode.realAfter = afterAnchor;\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\n });\n return { __logicType: LogicType.Component };\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const snapbackUp = this.tokenizer.snapshot();\n const keyWord = this.tokenizer.consume();\n const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;\n\n const [hookType, value] = this._hook({});\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondType;\n // 需要和前一个节点的 condition 合并计算\n const needCalcWithPrevIf = isElse && preIsCond;\n const ifNode: IfNode = {\n __logicType: isElse ? LogicType.Else : isIf ? LogicType.If : LogicType.Fail,\n snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null\n };\n let signal: Signal;\n\n // 纯 else 节点,一定要前置节点的取反\n if (noSelfCond) {\n if (isElse) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === LogicType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // default\n else {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n } else {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n // 为键映射\n if (valueIsMapKey && !needCalcWithPrevIf) {\n // 确保 signal 已生成\n runWithPulling(() => this.data[value], null);\n // 拿到 signal\n const { cells } = this.data[Keys.Meta];\n signal = cells.get(value);\n }\n // 通过前置条件 和 computed 计算出\n else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n if (needCalcWithPrevIf) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === LogicType.If) {\n break;\n }\n point = point.preCond;\n }\n return fn();\n });\n } else {\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n }\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(ctx);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n if (!noSelfCond) {\n const condition = this.tokenizer.consume();\n }\n const newLine = this.tokenizer.consume();\n }\n // 更新渲染\n else {\n /**\n * condition 在首屏对应的是 当前 token, resume 时被设置为空\n * newLine 被用于判断起始缩进所消耗\n */\n this.tokenizer.resume(ifNode.snapshot);\n\n // TODO: 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.realBefore);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n if (noSelfCond) {\n // 让 '/n‘ 能被跳过\n this.tokenizer.i = this.tokenizer.i - 1;\n // else 时消费了一个 \\n 导致 needDent 被置为 true\n this.tokenizer.needIndent = false;\n }\n const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = realBefore ? this.nextSib(realBefore) : this.kid(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\n }\n\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if (!(this.tokenizer.token.type & TokenType.Pipe)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或通过 effect 直接设值\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n while (!(this.tokenizer.token.type & TokenType.NewLine)) {\n // 取 key\n if (key == null) {\n key = this.tokenizer.token.value as any;\n }\n // 取 =\n else if (eq == null) {\n eq = '=';\n }\n // 取 value\n else {\n const [hookType, value] = this._hook({});\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n const fn = valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n this.onePropParsed(_node, key, fn, valueIsMapKey, this.hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.consume();\n }\n }\n config(opt: TerpConf) {\n Object.assign(this, opt);\n this.opt = opt;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {},\n nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n kid(node: any) {\n return node.firstChild;\n }\n\n _createAnchor() {\n const anchor = this.createAnchor();\n anchor[IsAnchor] = true;\n return anchor;\n }\n createAnchor() {\n return {\n name: 'anchor',\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n const next = parent.firstChild;\n parent.firstChild = node;\n node.nextSibling = next;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.tokenizer.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.tokenizer.setCode(code + fragments[fragments.length - 1]);\n }\n }\n hook: Hook;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any] => {\n const value = this.tokenizer.token.value;\n const isDynamicHook = this.tokenizer.token.type & TokenType.InsertionExp;\n const isStaticHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n const hookType: HookType = isDynamicHook ? 'dynamic' : isStaticHook ? 'static' : undefined;\n // 静态插值 `${xxx}`\n if (this.hook && isStaticHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n this.hookI++;\n return [hookType, res];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n}\n","import { isNum, Queue } from 'bobe-shared';\nimport { BaseType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** 匹配标识符 */\n IdExp = /[\\d\\w\\/]/;\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor() {}\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot() {\n return {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n private testId(value: string) {\n if (typeof value !== 'string') return false;\n return this.IdExp.test(value);\n }\n\n private nextToken() {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n let { char } = this;\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n this.brace();\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.char;\n const nextChar = this.after;\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.next()[0]; // 跳过 * 号\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n this.setToken(TokenType.InsertionExp, value.slice(1));\n return;\n }\n value += this.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.char;\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.next();\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, String(currLen));\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '\"';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, CustomRenderConf } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(options, valueOpt, root, before) {\n const tokenizer = new Tokenizer();\n const cmp = new Interpreter(tokenizer);\n Object.assign(cmp, valueOpt);\n // 初始化\n cmp.config({\n ...options,\n hook({ i }) {\n return values[i];\n },\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n });\n cmp.init(Array.from(fragments));\n return cmp.program(root, before);\n };\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n // ui => bobe`` 返回的函数\n return [store['ui'](option, { data: store }, root), store];\n };\n}\n\n"],"names":["TokenType","LogicType","NodeType","TerpEvt","__spreadProps","__spreadValues","ui"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -110,7 +110,7 @@ declare class Interpreter {
|
|
|
110
110
|
componentDeclaration(Component: typeof Store, ctx: ProgramCtx): {
|
|
111
111
|
__logicType: LogicType;
|
|
112
112
|
};
|
|
113
|
-
|
|
113
|
+
condDeclaration(ctx: ProgramCtx): IfNode;
|
|
114
114
|
/**
|
|
115
115
|
* <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>
|
|
116
116
|
* | ε
|
|
@@ -140,6 +140,7 @@ declare class Interpreter {
|
|
|
140
140
|
nextSibling: any;
|
|
141
141
|
};
|
|
142
142
|
nextSib(node: any): any;
|
|
143
|
+
kid(node: any): any;
|
|
143
144
|
_createAnchor(): {
|
|
144
145
|
name: string;
|
|
145
146
|
nextSibling: any;
|
|
@@ -199,7 +200,7 @@ declare enum TokenType {
|
|
|
199
200
|
}
|
|
200
201
|
declare enum LogicType {
|
|
201
202
|
If = 1,
|
|
202
|
-
|
|
203
|
+
Fail = 2,
|
|
203
204
|
Else = 4,
|
|
204
205
|
For = 8,
|
|
205
206
|
Component = 16,
|
|
@@ -244,6 +245,7 @@ type IfNode = LogicNode & {
|
|
|
244
245
|
isFirstRender: boolean;
|
|
245
246
|
snapshot: ReturnType<Tokenizer['snapshot']>;
|
|
246
247
|
effect: Dispose;
|
|
248
|
+
preCond: IfNode | null;
|
|
247
249
|
};
|
|
248
250
|
type LogicNode = {
|
|
249
251
|
__logicType: LogicType;
|