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/index.umd.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
})(TokenType || {});
|
|
18
18
|
var LogicType = /* @__PURE__ */ ((LogicType2) => {
|
|
19
19
|
LogicType2[LogicType2["If"] = 1] = "If";
|
|
20
|
-
LogicType2[LogicType2["
|
|
20
|
+
LogicType2[LogicType2["Fail"] = 2] = "Fail";
|
|
21
21
|
LogicType2[LogicType2["Else"] = 4] = "Else";
|
|
22
22
|
LogicType2[LogicType2["For"] = 8] = "For";
|
|
23
23
|
LogicType2[LogicType2["Component"] = 16] = "Component";
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
LogicType2[LogicType2["Real"] = 128] = "Real";
|
|
27
27
|
return LogicType2;
|
|
28
28
|
})(LogicType || {});
|
|
29
|
-
const Logical = 1 /* If */ | 2 /*
|
|
29
|
+
const Logical = 1 /* If */ | 2 /* Fail */ | 4 /* Else */ | 8 /* For */;
|
|
30
|
+
const CondType = 1 /* If */ | 2 /* Fail */ | 4 /* Else */;
|
|
30
31
|
var NodeType = /* @__PURE__ */ ((NodeType2) => {
|
|
31
32
|
NodeType2[NodeType2["Logic"] = Logical] = "Logic";
|
|
32
33
|
NodeType2[NodeType2["Real"] = 128 /* Real */] = "Real";
|
|
@@ -203,7 +204,9 @@
|
|
|
203
204
|
aoye.setPulling(ctx.current.effect.ins);
|
|
204
205
|
}
|
|
205
206
|
} else {
|
|
206
|
-
|
|
207
|
+
if (ctx.current) {
|
|
208
|
+
ctx.realParent = ctx.current;
|
|
209
|
+
}
|
|
207
210
|
ctx.prevSibling = null;
|
|
208
211
|
}
|
|
209
212
|
ctx.current = this.declaration(ctx);
|
|
@@ -220,7 +223,7 @@
|
|
|
220
223
|
const { node: parent, prev } = stack.peek();
|
|
221
224
|
if (!parent.__logicType) {
|
|
222
225
|
const prevSameType = stack.getPrevSameType();
|
|
223
|
-
ctx.realParent = prevSameType == null ? void 0 : prevSameType.node;
|
|
226
|
+
ctx.realParent = (prevSameType == null ? void 0 : prevSameType.node) || root;
|
|
224
227
|
} else {
|
|
225
228
|
if (this.isLogicNode(parent)) {
|
|
226
229
|
const parentLogic = (_a = stack.getPrevSameType()) == null ? void 0 : _a.node;
|
|
@@ -265,7 +268,7 @@
|
|
|
265
268
|
} else {
|
|
266
269
|
const childCmp = child;
|
|
267
270
|
childCmp.realParent = parent;
|
|
268
|
-
if (prev.__logicType) {
|
|
271
|
+
if (prev == null ? void 0 : prev.__logicType) {
|
|
269
272
|
childCmp.realBefore = prev.realAfter;
|
|
270
273
|
} else {
|
|
271
274
|
childCmp.realBefore = prev;
|
|
@@ -293,8 +296,8 @@
|
|
|
293
296
|
declaration(ctx) {
|
|
294
297
|
const [hookType, value] = this._hook({});
|
|
295
298
|
let _node;
|
|
296
|
-
if (value === "if") {
|
|
297
|
-
return this.
|
|
299
|
+
if (value === "if" || value === "else" || value === "fail") {
|
|
300
|
+
return this.condDeclaration(ctx);
|
|
298
301
|
} else if (hookType) {
|
|
299
302
|
if (hookType === "static") {
|
|
300
303
|
if (typeof value === "function" && value.prototype instanceof aoye.Store) {
|
|
@@ -369,9 +372,10 @@
|
|
|
369
372
|
}
|
|
370
373
|
};
|
|
371
374
|
const afterAnchor = this.insertAfterAnchor(ctx);
|
|
375
|
+
const { realParent, prevSibling } = ctx;
|
|
372
376
|
tap.once(TerpEvt.AllAttrGot, () => {
|
|
373
|
-
const parent =
|
|
374
|
-
const prev =
|
|
377
|
+
const parent = realParent;
|
|
378
|
+
const prev = prevSibling;
|
|
375
379
|
this.onePropParsed = prevOnePropParsed;
|
|
376
380
|
const componentNode = child["ui"](this.opt, { data: child }, parent, prev);
|
|
377
381
|
componentNode.realAfter = afterAnchor;
|
|
@@ -379,26 +383,80 @@
|
|
|
379
383
|
});
|
|
380
384
|
return { __logicType: LogicType.Component };
|
|
381
385
|
}
|
|
382
|
-
|
|
383
|
-
|
|
386
|
+
// TODO: 优化代码逻辑,拆分 if elseif else
|
|
387
|
+
condDeclaration(ctx) {
|
|
388
|
+
const { prevSibling } = ctx;
|
|
389
|
+
const snapbackUp = this.tokenizer.snapshot();
|
|
390
|
+
const keyWord = this.tokenizer.consume();
|
|
391
|
+
const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;
|
|
384
392
|
const [hookType, value] = this._hook({});
|
|
393
|
+
const isElse = keyWord.value === "else";
|
|
394
|
+
const isIf = keyWord.value === "if";
|
|
395
|
+
const preIsCond = (prevSibling == null ? void 0 : prevSibling.__logicType) & CondType;
|
|
396
|
+
const needCalcWithPrevIf = isElse && preIsCond;
|
|
385
397
|
const ifNode = {
|
|
386
|
-
__logicType: LogicType.If,
|
|
387
|
-
snapshot: this.tokenizer.snapshot(),
|
|
398
|
+
__logicType: isElse ? LogicType.Else : isIf ? LogicType.If : LogicType.Fail,
|
|
399
|
+
snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),
|
|
388
400
|
condition: null,
|
|
389
401
|
realParent: null,
|
|
402
|
+
preCond: preIsCond ? prevSibling : null,
|
|
390
403
|
isFirstRender: true,
|
|
391
404
|
effect: null
|
|
392
405
|
};
|
|
393
|
-
const valueIsMapKey = Reflect.has(this.data[aoye.Keys.Raw], value);
|
|
394
406
|
let signal;
|
|
395
|
-
if (
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
407
|
+
if (noSelfCond) {
|
|
408
|
+
if (isElse) {
|
|
409
|
+
signal = aoye.$(() => {
|
|
410
|
+
let point = ifNode.preCond;
|
|
411
|
+
while (point) {
|
|
412
|
+
if (point.condition.v) {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
if (point.__logicType === LogicType.If) {
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
point = point.preCond;
|
|
419
|
+
}
|
|
420
|
+
return true;
|
|
421
|
+
});
|
|
422
|
+
} else {
|
|
423
|
+
signal = aoye.$(() => {
|
|
424
|
+
let point = ifNode.preCond;
|
|
425
|
+
while (point) {
|
|
426
|
+
if (point.condition.v) {
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
point = point.preCond;
|
|
430
|
+
}
|
|
431
|
+
return true;
|
|
432
|
+
});
|
|
433
|
+
}
|
|
399
434
|
} else {
|
|
400
|
-
const
|
|
401
|
-
|
|
435
|
+
const valueIsMapKey = Reflect.has(this.data[aoye.Keys.Raw], value);
|
|
436
|
+
if (valueIsMapKey && !needCalcWithPrevIf) {
|
|
437
|
+
aoye.runWithPulling(() => this.data[value], null);
|
|
438
|
+
const { cells } = this.data[aoye.Keys.Meta];
|
|
439
|
+
signal = cells.get(value);
|
|
440
|
+
} else {
|
|
441
|
+
const fn = new Function("data", `let v;with(data){v=${value}};return v;`).bind(void 0, this.data);
|
|
442
|
+
if (needCalcWithPrevIf) {
|
|
443
|
+
signal = aoye.$(() => {
|
|
444
|
+
let point = ifNode.preCond;
|
|
445
|
+
while (point) {
|
|
446
|
+
if (point.condition.v) {
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
449
|
+
if (point.__logicType === LogicType.If) {
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
point = point.preCond;
|
|
453
|
+
}
|
|
454
|
+
return fn();
|
|
455
|
+
});
|
|
456
|
+
} else {
|
|
457
|
+
signal = aoye.$(fn);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
402
460
|
}
|
|
403
461
|
ifNode.condition = signal;
|
|
404
462
|
ifNode.realAfter = this.insertAfterAnchor(ctx);
|
|
@@ -406,7 +464,9 @@
|
|
|
406
464
|
({ val }) => {
|
|
407
465
|
if (val) {
|
|
408
466
|
if (ifNode.isFirstRender) {
|
|
409
|
-
|
|
467
|
+
if (!noSelfCond) {
|
|
468
|
+
this.tokenizer.consume();
|
|
469
|
+
}
|
|
410
470
|
this.tokenizer.consume();
|
|
411
471
|
} else {
|
|
412
472
|
this.tokenizer.resume(ifNode.snapshot);
|
|
@@ -414,10 +474,14 @@
|
|
|
414
474
|
}
|
|
415
475
|
} else {
|
|
416
476
|
if (ifNode.isFirstRender) {
|
|
477
|
+
if (noSelfCond) {
|
|
478
|
+
this.tokenizer.i = this.tokenizer.i - 1;
|
|
479
|
+
this.tokenizer.needIndent = false;
|
|
480
|
+
}
|
|
417
481
|
this.tokenizer.skip();
|
|
418
482
|
} else {
|
|
419
483
|
const { realBefore, realAfter, realParent } = ifNode;
|
|
420
|
-
let point = this.nextSib(realBefore);
|
|
484
|
+
let point = realBefore ? this.nextSib(realBefore) : this.kid(realParent);
|
|
421
485
|
while (point !== realAfter) {
|
|
422
486
|
const next = this.nextSib(point);
|
|
423
487
|
this.remove(point, realParent, realBefore);
|
|
@@ -505,6 +569,9 @@
|
|
|
505
569
|
nextSib(node) {
|
|
506
570
|
return node.nextSibling;
|
|
507
571
|
}
|
|
572
|
+
kid(node) {
|
|
573
|
+
return node.firstChild;
|
|
574
|
+
}
|
|
508
575
|
_createAnchor() {
|
|
509
576
|
const anchor = this.createAnchor();
|
|
510
577
|
anchor[IsAnchor] = true;
|
|
@@ -525,7 +592,9 @@
|
|
|
525
592
|
prev.nextSibling = node;
|
|
526
593
|
node.nextSibling = next;
|
|
527
594
|
} else {
|
|
595
|
+
const next = parent.firstChild;
|
|
528
596
|
parent.firstChild = node;
|
|
597
|
+
node.nextSibling = next;
|
|
529
598
|
}
|
|
530
599
|
}
|
|
531
600
|
remove(node, parent, prev) {
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.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","BaseEvent","__spreadProps","__spreadValues","Store","getPulling","setPulling","Keys","effect","shareSignal","$","runWithPulling","Queue","isNum","ui"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.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","BaseEvent","__spreadProps","__spreadValues","Store","getPulling","setPulling","Keys","effect","shareSignal","$","runWithPulling","Queue","isNum","ui"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bobe",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
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.
|
|
11
|
-
"bobe-shared": "0.0.
|
|
10
|
+
"aoye": "0.0.13",
|
|
11
|
+
"bobe-shared": "0.0.13"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {},
|
|
14
14
|
"files": [
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "rm -rf ./dist && rollup -c",
|
|
35
35
|
"dev": "rollup -c -w",
|
|
36
|
-
"
|
|
37
|
-
"tw": "jest --coverage --watch"
|
|
36
|
+
"tw": "vitest"
|
|
38
37
|
}
|
|
39
38
|
}
|