@famibee/skynovel 1.64.9 → 1.64.11
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/README.md +10 -7
- package/dist/Button.js +162 -0
- package/dist/Button.js.map +1 -0
- package/dist/CallStack.js.map +1 -1
- package/dist/CmnTween.js +201 -0
- package/dist/CmnTween.js.map +1 -0
- package/dist/DebugMng.js +105 -0
- package/dist/DebugMng.js.map +1 -0
- package/dist/EventMng.js +40 -39
- package/dist/EventMng.js.map +1 -1
- package/dist/GrpLayer.js +192 -0
- package/dist/GrpLayer.js.map +1 -0
- package/dist/LayerMng.js +475 -2415
- package/dist/LayerMng.js.map +1 -1
- package/dist/Main.js +394 -0
- package/dist/Main.js.map +1 -0
- package/dist/PropParser.js +1 -1
- package/dist/PropParser.js.map +1 -1
- package/dist/Reading.js +11 -11
- package/dist/Reading.js.map +1 -1
- package/dist/RubySpliter.js +90 -0
- package/dist/RubySpliter.js.map +1 -0
- package/dist/ScriptIterator.js +263 -353
- package/dist/ScriptIterator.js.map +1 -1
- package/dist/SndBuf.js +746 -949
- package/dist/SndBuf.js.map +1 -1
- package/dist/SoundMng.js +1 -1
- package/dist/SoundMng.js.map +1 -1
- package/dist/SpritesMng.js +229 -0
- package/dist/SpritesMng.js.map +1 -0
- package/dist/TxtLayer.js +1402 -0
- package/dist/TxtLayer.js.map +1 -0
- package/dist/Variable.js +157 -164
- package/dist/Variable.js.map +1 -1
- package/dist/app.d.ts +4 -4
- package/dist/app.d.ts.map +1 -1
- package/dist/appMain.d.ts.map +1 -1
- package/dist/appMain_cmn.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform.js +369 -0
- package/dist/platform.js.map +1 -0
- package/dist/sn/Button.d.ts +2 -2
- package/dist/sn/CallStack.d.ts +2 -2
- package/dist/sn/CmnInterface.d.ts +39 -41
- package/dist/sn/CmnInterface.d.ts.map +1 -1
- package/dist/sn/CmnLib.d.ts +11 -7
- package/dist/sn/CmnLib.d.ts.map +1 -1
- package/dist/sn/CmnTween.d.ts +9 -9
- package/dist/sn/Config.d.ts.map +1 -1
- package/dist/sn/ConfigBase.d.ts +16 -17
- package/dist/sn/ConfigBase.d.ts.map +1 -1
- package/dist/sn/DebugMng.d.ts +2 -2
- package/dist/sn/DebugMng.d.ts.map +1 -1
- package/dist/sn/DesignCast.d.ts +9 -9
- package/dist/sn/DesignCast.d.ts.map +1 -1
- package/dist/sn/EventMng.d.ts +4 -4
- package/dist/sn/EventMng.d.ts.map +1 -1
- package/dist/sn/FrameMng.d.ts +5 -5
- package/dist/sn/FrameMng.d.ts.map +1 -1
- package/dist/sn/Grammar.d.ts +124 -124
- package/dist/sn/Grammar.d.ts.map +1 -1
- package/dist/sn/GrpLayer.d.ts +7 -7
- package/dist/sn/GrpLayer.d.ts.map +1 -1
- package/dist/sn/Hyphenation.d.ts +2 -2
- package/dist/sn/Layer.d.ts +10 -10
- package/dist/sn/LayerMng.d.ts +7 -8
- package/dist/sn/LayerMng.d.ts.map +1 -1
- package/dist/sn/Log.d.ts +3 -3
- package/dist/sn/Log.d.ts.map +1 -1
- package/dist/sn/Main.d.ts +6 -5
- package/dist/sn/Main.d.ts.map +1 -1
- package/dist/sn/Pages.d.ts +8 -8
- package/dist/sn/Pages.d.ts.map +1 -1
- package/dist/sn/PropParser.d.ts +3 -3
- package/dist/sn/PropParser.d.ts.map +1 -1
- package/dist/sn/Reading.d.ts +12 -12
- package/dist/sn/Reading.d.ts.map +1 -1
- package/dist/sn/RubySpliter.d.ts +4 -4
- package/dist/sn/RubySpliter.d.ts.map +1 -1
- package/dist/sn/ScriptIterator.d.ts +5 -6
- package/dist/sn/ScriptIterator.d.ts.map +1 -1
- package/dist/sn/SndBuf.d.ts +12 -12
- package/dist/sn/SndBuf.d.ts.map +1 -1
- package/dist/sn/SoundMng.d.ts +4 -4
- package/dist/sn/SoundMng.d.ts.map +1 -1
- package/dist/sn/SpritesMng.d.ts +5 -5
- package/dist/sn/SpritesMng.d.ts.map +1 -1
- package/dist/sn/SysApp.d.ts +20 -17
- package/dist/sn/SysApp.d.ts.map +1 -1
- package/dist/sn/SysBase.d.ts +33 -32
- package/dist/sn/SysBase.d.ts.map +1 -1
- package/dist/sn/SysWeb.d.ts +7 -11
- package/dist/sn/SysWeb.d.ts.map +1 -1
- package/dist/sn/TxtLayer.d.ts +10 -8
- package/dist/sn/TxtLayer.d.ts.map +1 -1
- package/dist/sn/TxtStage.d.ts +5 -5
- package/dist/sn/TxtStage.d.ts.map +1 -1
- package/dist/sn/Variable.d.ts +9 -8
- package/dist/sn/Variable.d.ts.map +1 -1
- package/dist/test/SysTest.d.ts +3 -3
- package/dist/test/SysTest.d.ts.map +1 -1
- package/dist/test/ValTest.d.ts +4 -4
- package/dist/test/ValTest.d.ts.map +1 -1
- package/dist/web.d.ts +4 -4
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +3 -3
- package/dist/web2.js +6959 -8339
- package/dist/web2.js.map +1 -1
- package/dist_app/Button.js +162 -0
- package/dist_app/Button.js.map +1 -0
- package/dist_app/CallStack.js.map +1 -1
- package/dist_app/CmnTween.js +201 -0
- package/dist_app/CmnTween.js.map +1 -0
- package/dist_app/EventMng.js +40 -39
- package/dist_app/EventMng.js.map +1 -1
- package/dist_app/GrpLayer.js +192 -0
- package/dist_app/GrpLayer.js.map +1 -0
- package/dist_app/LayerMng.js +475 -2415
- package/dist_app/LayerMng.js.map +1 -1
- package/dist_app/Main.js +393 -0
- package/dist_app/Main.js.map +1 -0
- package/dist_app/PropParser.js.map +1 -1
- package/dist_app/Reading.js +19 -19
- package/dist_app/Reading.js.map +1 -1
- package/dist_app/RubySpliter.js +90 -0
- package/dist_app/RubySpliter.js.map +1 -0
- package/dist_app/ScriptIterator.js +216 -307
- package/dist_app/ScriptIterator.js.map +1 -1
- package/dist_app/SndBuf.js +746 -949
- package/dist_app/SndBuf.js.map +1 -1
- package/dist_app/SoundMng.js +1 -1
- package/dist_app/SoundMng.js.map +1 -1
- package/dist_app/SpritesMng.js +228 -0
- package/dist_app/SpritesMng.js.map +1 -0
- package/dist_app/TxtLayer.js +1401 -0
- package/dist_app/TxtLayer.js.map +1 -0
- package/dist_app/Variable.js +157 -164
- package/dist_app/Variable.js.map +1 -1
- package/dist_app/app.d.ts +4 -4
- package/dist_app/app.d.ts.map +1 -1
- package/dist_app/app.js +2 -2
- package/dist_app/app2.js +3075 -4351
- package/dist_app/app2.js.map +1 -1
- package/dist_app/appMain.d.ts.map +1 -1
- package/dist_app/appMain.js +18 -18
- package/dist_app/appMain.js.map +1 -1
- package/dist_app/appMain_cmn.d.ts.map +1 -1
- package/dist_app/index.d.ts +0 -1
- package/dist_app/index.d.ts.map +1 -1
- package/dist_app/platform.js +369 -0
- package/dist_app/platform.js.map +1 -0
- package/dist_app/sn/Button.d.ts +2 -2
- package/dist_app/sn/CallStack.d.ts +2 -2
- package/dist_app/sn/CmnInterface.d.ts +39 -41
- package/dist_app/sn/CmnInterface.d.ts.map +1 -1
- package/dist_app/sn/CmnLib.d.ts +11 -7
- package/dist_app/sn/CmnLib.d.ts.map +1 -1
- package/dist_app/sn/CmnTween.d.ts +9 -9
- package/dist_app/sn/Config.d.ts.map +1 -1
- package/dist_app/sn/ConfigBase.d.ts +16 -17
- package/dist_app/sn/ConfigBase.d.ts.map +1 -1
- package/dist_app/sn/DebugMng.d.ts +2 -2
- package/dist_app/sn/DebugMng.d.ts.map +1 -1
- package/dist_app/sn/DesignCast.d.ts +9 -9
- package/dist_app/sn/DesignCast.d.ts.map +1 -1
- package/dist_app/sn/EventMng.d.ts +4 -4
- package/dist_app/sn/EventMng.d.ts.map +1 -1
- package/dist_app/sn/FrameMng.d.ts +5 -5
- package/dist_app/sn/FrameMng.d.ts.map +1 -1
- package/dist_app/sn/Grammar.d.ts +124 -124
- package/dist_app/sn/Grammar.d.ts.map +1 -1
- package/dist_app/sn/GrpLayer.d.ts +7 -7
- package/dist_app/sn/GrpLayer.d.ts.map +1 -1
- package/dist_app/sn/Hyphenation.d.ts +2 -2
- package/dist_app/sn/Layer.d.ts +10 -10
- package/dist_app/sn/LayerMng.d.ts +7 -8
- package/dist_app/sn/LayerMng.d.ts.map +1 -1
- package/dist_app/sn/Log.d.ts +3 -3
- package/dist_app/sn/Log.d.ts.map +1 -1
- package/dist_app/sn/Main.d.ts +6 -5
- package/dist_app/sn/Main.d.ts.map +1 -1
- package/dist_app/sn/Pages.d.ts +8 -8
- package/dist_app/sn/Pages.d.ts.map +1 -1
- package/dist_app/sn/PropParser.d.ts +3 -3
- package/dist_app/sn/PropParser.d.ts.map +1 -1
- package/dist_app/sn/Reading.d.ts +12 -12
- package/dist_app/sn/Reading.d.ts.map +1 -1
- package/dist_app/sn/RubySpliter.d.ts +4 -4
- package/dist_app/sn/RubySpliter.d.ts.map +1 -1
- package/dist_app/sn/ScriptIterator.d.ts +5 -6
- package/dist_app/sn/ScriptIterator.d.ts.map +1 -1
- package/dist_app/sn/SndBuf.d.ts +12 -12
- package/dist_app/sn/SndBuf.d.ts.map +1 -1
- package/dist_app/sn/SoundMng.d.ts +4 -4
- package/dist_app/sn/SoundMng.d.ts.map +1 -1
- package/dist_app/sn/SpritesMng.d.ts +5 -5
- package/dist_app/sn/SpritesMng.d.ts.map +1 -1
- package/dist_app/sn/SysApp.d.ts +20 -17
- package/dist_app/sn/SysApp.d.ts.map +1 -1
- package/dist_app/sn/SysBase.d.ts +33 -32
- package/dist_app/sn/SysBase.d.ts.map +1 -1
- package/dist_app/sn/SysWeb.d.ts +7 -11
- package/dist_app/sn/SysWeb.d.ts.map +1 -1
- package/dist_app/sn/TxtLayer.d.ts +10 -8
- package/dist_app/sn/TxtLayer.d.ts.map +1 -1
- package/dist_app/sn/TxtStage.d.ts +5 -5
- package/dist_app/sn/TxtStage.d.ts.map +1 -1
- package/dist_app/sn/Variable.d.ts +9 -8
- package/dist_app/sn/Variable.d.ts.map +1 -1
- package/dist_app/test/SysTest.d.ts +3 -3
- package/dist_app/test/SysTest.d.ts.map +1 -1
- package/dist_app/test/ValTest.d.ts +4 -4
- package/dist_app/test/ValTest.d.ts.map +1 -1
- package/dist_app/web.d.ts +4 -4
- package/dist_app/web.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/sn/SysNode.d.ts +0 -15
- package/dist/sn/SysNode.d.ts.map +0 -1
- package/dist_app/sn/SysNode.d.ts +0 -15
- package/dist_app/sn/SysNode.d.ts.map +0 -1
package/dist_app/Main.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { C as S, a as w, S as C, b as L, p as M, A as R, d as P, D as $, e as O, s as G } from "./app2.js";
|
|
2
|
+
const B = "userdata:/", D = "downloads:/";
|
|
3
|
+
class b extends S {
|
|
4
|
+
constructor(t) {
|
|
5
|
+
super(t), this.sys = t;
|
|
6
|
+
}
|
|
7
|
+
static async generate(t) {
|
|
8
|
+
const e = new b(t), s = t.arg.cur + "prj.json", n = await t.fetch(s);
|
|
9
|
+
if (!n.ok) throw Error(n.statusText);
|
|
10
|
+
const i = await t.dec(s, await n.text());
|
|
11
|
+
return await e.load(JSON.parse(i)), e;
|
|
12
|
+
}
|
|
13
|
+
async load(t) {
|
|
14
|
+
return t.window ??= { width: 300, height: 300 }, w.stageW = t.window.width, w.stageH = t.window.height, w.debugLog = t.debug.debugLog, await w.init(), super.load(t);
|
|
15
|
+
}
|
|
16
|
+
searchPath(t, e = C.DEFAULT) {
|
|
17
|
+
return t.startsWith(D) ? this.sys.path_downloads + t.slice(11) : t.startsWith(B) ? this.sys.path_userdata + "storage/" + t.slice(10) : super.searchPath(t, e);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function T(c, t, e = 0, s = 0, n = 0) {
|
|
21
|
+
const a = c.slice(0, t).split(`
|
|
22
|
+
`), r = a.length;
|
|
23
|
+
return {
|
|
24
|
+
ln: s + r - 1,
|
|
25
|
+
ch: r < 2 ? n + 1 + e + t : a.at(-1)?.length ?? 0
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
class W {
|
|
29
|
+
// 87 match 2725 step(0.5ms) PCRE2 https://regex101.com/r/aeN57J/1
|
|
30
|
+
/*
|
|
31
|
+
;[^\n]*
|
|
32
|
+
| (?<key>[^\s="'#|;]+)
|
|
33
|
+
(?: \s | ;[^\n]*\n)*
|
|
34
|
+
=
|
|
35
|
+
(?: \s | ;[^\n]*\n)*
|
|
36
|
+
(?: (?<val> [^\s"'#|;]+)
|
|
37
|
+
| (["'#]) (?<val2>.*?) \3 )
|
|
38
|
+
(?: \|
|
|
39
|
+
(?: (?<def> [^\s"'#;]+)
|
|
40
|
+
| (["'#]) (?<def2>.*?) \6 ) )?
|
|
41
|
+
| (?<literal>[^\s;]+)
|
|
42
|
+
*/
|
|
43
|
+
#e = /;[^\n]*|(?<key>[^\s="'#|;]+)(?:\s|;[^\n]*\n)*=(?:\s|;[^\n]*\n)*(?:(?<val>[^\s"'#|;]+)|(["'#])(?<val2>.*?)\3)(?:\|(?:(?<def>[^\s"'#;]+)|(["'#])(?<def2>.*?)\6))?|(?<literal>[^\s;]+)/g;
|
|
44
|
+
// 【属性 = 値 | 省略値】の分析
|
|
45
|
+
parse(t) {
|
|
46
|
+
this.#t = {}, this.#n = !1;
|
|
47
|
+
for (const { groups: e } of t.matchAll(this.#e)) {
|
|
48
|
+
const { key: s, val: n, val2: i, def: a, def2: r, literal: o } = e;
|
|
49
|
+
s ? this.#t[s] = {
|
|
50
|
+
val: n ?? i ?? "",
|
|
51
|
+
def: a ?? r
|
|
52
|
+
} : o && (o === "*" ? this.#n = !0 : this.#t[o] = { val: "1" });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 属性と値の位置をまとめて返す
|
|
56
|
+
parseinDetail(t, e, s, n) {
|
|
57
|
+
const i = {}, a = t.slice(1 + e, -1);
|
|
58
|
+
for (const { groups: r, index: o, 0: u } of a.matchAll(this.#e)) {
|
|
59
|
+
if (!o) continue;
|
|
60
|
+
const { key: f, val: d, val2: _ = "", literal: l } = r;
|
|
61
|
+
if (l) {
|
|
62
|
+
if (l.endsWith("=")) {
|
|
63
|
+
const m = l.length - 1, { ch: v } = T(a, o + m, e, s, n);
|
|
64
|
+
i[l.slice(0, -1)] = {
|
|
65
|
+
k_ln: s,
|
|
66
|
+
k_ch: v - m,
|
|
67
|
+
v_ln: s,
|
|
68
|
+
v_ch: v + 1,
|
|
69
|
+
// v_ch: ch +1+lenNm +literal.length +1,
|
|
70
|
+
v_len: 0
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!f) continue;
|
|
76
|
+
const { ln: p, ch: g } = T(a, o, e, s, n), { ln: k, ch: h } = T(a, o + u.lastIndexOf(d ?? _) - (d ? 0 : 1), e, s, n);
|
|
77
|
+
i[f] = { k_ln: p, k_ch: g, v_ln: k, v_ch: h, v_len: d ? d.length : _.length + 2 };
|
|
78
|
+
}
|
|
79
|
+
return i;
|
|
80
|
+
}
|
|
81
|
+
#t = {};
|
|
82
|
+
get hPrm() {
|
|
83
|
+
return this.#t;
|
|
84
|
+
}
|
|
85
|
+
#n = !1;
|
|
86
|
+
get isKomeParam() {
|
|
87
|
+
return this.#n;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const E = /(?<name>[^\s;\]]+)/;
|
|
91
|
+
function A(c) {
|
|
92
|
+
const e = E.exec(c.slice(1, -1))?.groups;
|
|
93
|
+
if (!e) throw `タグ記述【${c}】異常です(タグ解析)`;
|
|
94
|
+
const s = e.name;
|
|
95
|
+
return [s, c.slice(1 + s.length, -1)];
|
|
96
|
+
}
|
|
97
|
+
function H(c) {
|
|
98
|
+
const e = E.exec(c.slice(1))?.groups;
|
|
99
|
+
if (!e) throw `タグ記述【${c}】異常です(タグ解析)`;
|
|
100
|
+
return e.name;
|
|
101
|
+
}
|
|
102
|
+
function I(c) {
|
|
103
|
+
const t = c.replaceAll("==", "=").replaceAll("!=", "≠").split("="), e = t.length;
|
|
104
|
+
if (e < 2 || e > 3) throw "「&計算」書式では「=」指定が一つか二つ必要です";
|
|
105
|
+
const [s, n, i] = t;
|
|
106
|
+
if (n.startsWith("&")) throw "「&計算」書式では「&」指定が不要です";
|
|
107
|
+
return {
|
|
108
|
+
name: s.replaceAll("=", "==").replaceAll("≠", "!="),
|
|
109
|
+
text: n.replaceAll("=", "==").replaceAll("≠", "!="),
|
|
110
|
+
cast: e === 3 ? i.trim() : void 0
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
class V {
|
|
114
|
+
constructor(t) {
|
|
115
|
+
this.cfg = t, this.setEscape("");
|
|
116
|
+
}
|
|
117
|
+
#e;
|
|
118
|
+
setEscape(t) {
|
|
119
|
+
if (this.#s && t in this.#s) throw "[エスケープ文字] char【" + t + "】が登録済みの括弧マクロまたは一文字マクロです";
|
|
120
|
+
this.#e = new RegExp(
|
|
121
|
+
(t ? `\\${t}\\S|` : "") + // エスケープシーケンス
|
|
122
|
+
`\\n+|\\t+|\\[let_ml\\s+[^\\]]+\\].+?(?=\\[endlet_ml[\\]\\s])|\\[(?:[^"'#;\\]]+|(["'#]).*?\\1|;[^\\n]*)*?]|;[^\\n]*|&[^&\\n]+&|&&?(?:[^"'#;\\n&]+|(["'#]).*?\\2)+|^\\*[^\\s\\[&;\\\\]+|[^\\n\\t\\[;${t ? `\\${t}` : ""}]+`,
|
|
123
|
+
// 本文
|
|
124
|
+
"gs"
|
|
125
|
+
), this.#t = new RegExp(`[\\w\\s;[\\]*=&|《》${t ? `\\${t}` : ""}]`), this.#r = new RegExp(`[\\n\\t;\\[*&${t ? `\\${t}` : ""}]`);
|
|
126
|
+
}
|
|
127
|
+
// 括弧マクロの定義
|
|
128
|
+
bracket2macro(t, e, s, n) {
|
|
129
|
+
const { name: i, text: a } = t;
|
|
130
|
+
if (!i) throw "[bracket2macro] nameは必須です";
|
|
131
|
+
if (!a) throw "[bracket2macro] textは必須です";
|
|
132
|
+
const r = a.at(0);
|
|
133
|
+
if (!r) throw "[bracket2macro] textは必須です";
|
|
134
|
+
if (a.length !== 2) throw "[bracket2macro] textは括弧の前後を示す二文字を指定してください";
|
|
135
|
+
if (!(i in e)) throw `[bracket2macro] 未定義のタグ又はマクロ[${i}]です`;
|
|
136
|
+
this.#s ??= {};
|
|
137
|
+
const o = a.charAt(1);
|
|
138
|
+
if (r in this.#s) throw "[bracket2macro] text【" + r + "】が登録済みの括弧マクロまたは一文字マクロです";
|
|
139
|
+
if (o in this.#s) throw "[bracket2macro] text【" + o + "】が登録済みの括弧マクロまたは一文字マクロです";
|
|
140
|
+
if (this.#t.test(r)) throw "[bracket2macro] text【" + r + "】は括弧マクロに使用できない文字です";
|
|
141
|
+
if (this.#t.test(o)) throw "[bracket2macro] text【" + o + "】は括弧マクロに使用できない文字です";
|
|
142
|
+
this.#s[o] = "0", this.#s[r] = `[${i} text=`, this.addC2M(`\\${r}[^\\${o}]*\\${o}`, `\\${r}\\${o}`), this.#u(s, n);
|
|
143
|
+
}
|
|
144
|
+
// 一文字マクロの定義
|
|
145
|
+
char2macro(t, e, s, n) {
|
|
146
|
+
const { char: i, name: a } = t;
|
|
147
|
+
if (!i) throw "[char2macro] charは必須です";
|
|
148
|
+
if (this.#s ??= {}, i in this.#s) throw "[char2macro] char【" + i + "】が登録済みの括弧マクロまたは一文字マクロです";
|
|
149
|
+
if (this.#t.test(i)) throw "[char2macro] char【" + i + "】は一文字マクロに使用できない文字です";
|
|
150
|
+
if (!a) throw "[char2macro] nameは必須です";
|
|
151
|
+
if (!(a in e)) throw `[char2macro] 未定義のタグ又はマクロ[${a}]です`;
|
|
152
|
+
this.#s[i] = `[${a}]`, this.addC2M(`\\${i}`, `\\${i}`), this.#u(s, n);
|
|
153
|
+
}
|
|
154
|
+
#t;
|
|
155
|
+
#n = new RegExp("");
|
|
156
|
+
#a = "";
|
|
157
|
+
#i = "";
|
|
158
|
+
addC2M(t, e) {
|
|
159
|
+
this.#a += `${t}|`, this.#i += e, this.#n = new RegExp(
|
|
160
|
+
`(${this.#a}[^${this.#i}]+)`,
|
|
161
|
+
"g"
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
resolveScript(t) {
|
|
165
|
+
const e = t.replaceAll(/\r\n?/g, `
|
|
166
|
+
`).match(this.#e)?.flatMap((n) => {
|
|
167
|
+
if (!this.testTagLetml(n)) return n;
|
|
168
|
+
const i = /^([^\]]+?])(.*)$/s.exec(n);
|
|
169
|
+
if (!i) return n;
|
|
170
|
+
const [, a, r] = i;
|
|
171
|
+
return [a, r];
|
|
172
|
+
}) ?? [], s = { aToken: e, len: e.length, aLNum: [] };
|
|
173
|
+
return this.#u(s), this.#h(s), s;
|
|
174
|
+
}
|
|
175
|
+
#l = /^\[(call|loadplugin)\s/;
|
|
176
|
+
#o = /\bfn\s*=\s*[^\s\]]+/;
|
|
177
|
+
#h(t) {
|
|
178
|
+
for (let e = t.len - 1; e >= 0; --e) {
|
|
179
|
+
const s = t.aToken[e];
|
|
180
|
+
if (!this.#l.test(s)) continue;
|
|
181
|
+
const [n, i] = A(s);
|
|
182
|
+
this.#c.parse(i);
|
|
183
|
+
const a = this.#c.hPrm.fn;
|
|
184
|
+
if (!a) continue;
|
|
185
|
+
const { val: r } = a;
|
|
186
|
+
if (!r.endsWith("*")) continue;
|
|
187
|
+
t.aToken.splice(e, 1, " ", "; " + s), t.aLNum.splice(e, 1, NaN, NaN);
|
|
188
|
+
const o = n === "loadplugin" ? C.CSS : C.SN, u = this.cfg.matchPath("^" + r.slice(0, -1) + ".*", o);
|
|
189
|
+
for (const f of u) {
|
|
190
|
+
const d = s.replace(
|
|
191
|
+
this.#o,
|
|
192
|
+
"fn=" + decodeURIComponent(L(f[o]))
|
|
193
|
+
);
|
|
194
|
+
t.aToken.splice(e, 0, d), t.aLNum.splice(e, 0, NaN);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
t.len = t.aToken.length;
|
|
198
|
+
}
|
|
199
|
+
#c = new W();
|
|
200
|
+
testTagLetml(t) {
|
|
201
|
+
return /^\[let_ml\s/.test(t);
|
|
202
|
+
}
|
|
203
|
+
testTagEndLetml(t) {
|
|
204
|
+
return /^\[endlet_ml\s*]/.test(t);
|
|
205
|
+
}
|
|
206
|
+
#s = void 0;
|
|
207
|
+
#r;
|
|
208
|
+
#u(t, e = 0) {
|
|
209
|
+
if (this.#s) {
|
|
210
|
+
for (let s = t.len - 1; s >= e; --s) {
|
|
211
|
+
const n = t.aToken[s];
|
|
212
|
+
if (this.testNoTxt(n.at(0) ?? `
|
|
213
|
+
`)) continue;
|
|
214
|
+
const i = t.aLNum[s], a = n.match(this.#n);
|
|
215
|
+
if (!a) continue;
|
|
216
|
+
let r = 1;
|
|
217
|
+
for (let o = a.length - 1; o >= 0; --o) {
|
|
218
|
+
let u = a[o];
|
|
219
|
+
const f = this.#s[u.at(0) ?? " "];
|
|
220
|
+
f && (u = f + (f.endsWith("]") ? "" : `'${u.slice(1, -1)}']`)), t.aToken.splice(s, r, u), t.aLNum.splice(s, r, i), r = 0;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
t.len = t.aToken.length;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
testNoTxt(t) {
|
|
227
|
+
return this.#r.test(t);
|
|
228
|
+
}
|
|
229
|
+
//4tst
|
|
230
|
+
}
|
|
231
|
+
const y = "skynovel";
|
|
232
|
+
class x {
|
|
233
|
+
constructor(t) {
|
|
234
|
+
this.sys = t;
|
|
235
|
+
}
|
|
236
|
+
static async generate(t) {
|
|
237
|
+
G();
|
|
238
|
+
const e = new x(t);
|
|
239
|
+
return await e.#l().catch((s) => console.error("Main.generate err e:%o", s)), e;
|
|
240
|
+
}
|
|
241
|
+
cvs;
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
243
|
+
#e = /* @__PURE__ */ Object.create(null);
|
|
244
|
+
// タグ処理辞書
|
|
245
|
+
#t;
|
|
246
|
+
#n;
|
|
247
|
+
#a;
|
|
248
|
+
#i = [];
|
|
249
|
+
async #l() {
|
|
250
|
+
const t = await b.generate(this.sys);
|
|
251
|
+
this.sys.setMain(this, t);
|
|
252
|
+
const e = {
|
|
253
|
+
width: t.oCfg.window.width,
|
|
254
|
+
height: t.oCfg.window.height,
|
|
255
|
+
backgroundColor: M(String(t.oCfg.init.bg_color)),
|
|
256
|
+
// このString()は後方互換性のため必須
|
|
257
|
+
resolution: globalThis.devicePixelRatio
|
|
258
|
+
}, s = document.getElementById(y);
|
|
259
|
+
if (s) {
|
|
260
|
+
const h = s.cloneNode(!0);
|
|
261
|
+
h.id = y, e.view = s;
|
|
262
|
+
const m = s.parentNode;
|
|
263
|
+
this.#i.unshift(() => m.appendChild(h));
|
|
264
|
+
} else {
|
|
265
|
+
const h = document.createElement("canvas");
|
|
266
|
+
h.id = y, e.view = h, document.body.appendChild(h), this.#i.unshift(() => document.body.removeChild(h));
|
|
267
|
+
}
|
|
268
|
+
const n = new R(e);
|
|
269
|
+
this.#i.unshift(() => {
|
|
270
|
+
P(), this.sys.destroy(), n.destroy(!1);
|
|
271
|
+
}), this.cvs = n.view, this.cvs.id = y + "_act", s || document.body.appendChild(this.cvs);
|
|
272
|
+
const i = document.createElement("canvas").getContext("2d");
|
|
273
|
+
if (!i) throw "#init cc err";
|
|
274
|
+
w.cc4ColorName = i;
|
|
275
|
+
const [{ Variable: a }, { PropParser: r }, { SoundMng: o }, { ScriptIterator: u }, { LayerMng: f }, { EventMng: d }, { Button: _ }] = await Promise.all([
|
|
276
|
+
import("./Variable.js"),
|
|
277
|
+
import("./PropParser.js"),
|
|
278
|
+
import("./SoundMng.js"),
|
|
279
|
+
import("./ScriptIterator.js"),
|
|
280
|
+
import("./LayerMng.js"),
|
|
281
|
+
import("./EventMng.js"),
|
|
282
|
+
import("./Button.js")
|
|
283
|
+
]);
|
|
284
|
+
_.init(t);
|
|
285
|
+
const l = new a(this.sys, t, this.#e), p = new r(l, t.oCfg.init.escape);
|
|
286
|
+
this.#o = (h, m, v, N) => l.setVal_Nochk(h, m, v, N), this.#s = (h) => p.getValAmpersand(h), this.#r = (h) => p.parse(h), await Promise.allSettled(this.sys.init(this.#e, n, l));
|
|
287
|
+
const g = new o(t, this.#e, l, this, this.sys);
|
|
288
|
+
this.#i.unshift(() => g.destroy()), this.#t = new u(t, this.#e, this, l, p, g, this.sys), this.#i.unshift(() => this.#t.destroy());
|
|
289
|
+
const k = new $(this.sys, this.#e, this.#t);
|
|
290
|
+
this.#i.unshift(() => k.destroy()), this.errScript = (h, m = !0) => {
|
|
291
|
+
if (this.stop(), $.myTrace(h), w.debugLog && console.log("🍜 SKYNovel err!"), m) throw h;
|
|
292
|
+
}, this.#n = new f(t, this.#e, n, l, this, this.#t, this.sys, g, p), this.#i.unshift(() => this.#n.destroy()), this.#a = new d(t, this.#e, n, this, this.#n, l, g, this.#t, this.sys), this.#i.unshift(() => this.#a.destroy()), this.#i.unshift(() => {
|
|
293
|
+
this.stop(), this.#h = !1;
|
|
294
|
+
const h = () => !0;
|
|
295
|
+
for (const m in this.#e) this.#e[m] = h;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
destroy() {
|
|
299
|
+
this.resume = this.destroy = () => {
|
|
300
|
+
}, this.cvs.parentElement?.removeChild(this.cvs);
|
|
301
|
+
for (const t of this.#i) t();
|
|
302
|
+
this.#i = [];
|
|
303
|
+
}
|
|
304
|
+
errScript = (t, e = !0) => {
|
|
305
|
+
};
|
|
306
|
+
resumeByJumpOrCall(t) {
|
|
307
|
+
if (t.url) {
|
|
308
|
+
this.#e.navigate_to(t), this.#t.jumpJustBefore();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (this.#o("tmp", "sn.eventArg", String(t.arg ?? "")), this.#o("tmp", "sn.eventLabel", t.label ?? ""), O(t, "call", !1)) {
|
|
312
|
+
if (this.#t.subIdxToken(), this.#e.call(t)) return;
|
|
313
|
+
} else if (this.#e.clear_event({}), this.#e.jump(t)) return;
|
|
314
|
+
this.resume();
|
|
315
|
+
}
|
|
316
|
+
#o = (t, e, s, n = !1) => {
|
|
317
|
+
};
|
|
318
|
+
resume() {
|
|
319
|
+
this.#n.clearBreak(), this.#t.noticeBreak(!1), this.#a.hideHint(), queueMicrotask(() => {
|
|
320
|
+
this.#c();
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
stop = () => {
|
|
324
|
+
this.#t.noticeBreak(!0);
|
|
325
|
+
};
|
|
326
|
+
setLoop(t, e = "") {
|
|
327
|
+
(this.#h = t) ? this.resume() : this.stop(), this.sys.setTitleInfo(e ? ` -- ${e}中` : "");
|
|
328
|
+
}
|
|
329
|
+
// oxlint-disable-next-line no-unused-private-class-members
|
|
330
|
+
#h = !0;
|
|
331
|
+
//MARK: メイン処理(シナリオ解析)
|
|
332
|
+
async #c() {
|
|
333
|
+
let t = "";
|
|
334
|
+
try {
|
|
335
|
+
for (; this.#h; ) {
|
|
336
|
+
let e = this.#t.nextToken();
|
|
337
|
+
if (!e) return;
|
|
338
|
+
const s = e.charCodeAt(0);
|
|
339
|
+
if (s === 9) continue;
|
|
340
|
+
if (s === 10) {
|
|
341
|
+
this.#t.addLineNum(e.length);
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
if (s === 91) {
|
|
345
|
+
if (t = "タグ開始", this.#t.isBreak(e)) return;
|
|
346
|
+
const [i, a] = A(e);
|
|
347
|
+
t = `[${i}]例外`;
|
|
348
|
+
const r = (e.match(/\n/g) ?? []).length;
|
|
349
|
+
if (r > 0 && this.#t.addLineNum(r), await this.#t.タグ解析(
|
|
350
|
+
i,
|
|
351
|
+
a
|
|
352
|
+
)) {
|
|
353
|
+
this.stop();
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (s === 38) {
|
|
359
|
+
if (!e.endsWith("&")) {
|
|
360
|
+
if (t = "変数計算", this.#t.isBreak(e)) return;
|
|
361
|
+
const i = I(e.slice(1));
|
|
362
|
+
i.name = this.#s(i.name), i.text = String(this.#r(i.text)), this.#e.let(i);
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
if (t = "変数操作", e.charAt(1) === "&") throw new Error("「&表示&」書式では「&」指定が不要です");
|
|
366
|
+
e = String(this.#r(e.slice(1, -1)));
|
|
367
|
+
} else {
|
|
368
|
+
if (s === 59) continue;
|
|
369
|
+
if (s === 42 && e.length > 1) continue;
|
|
370
|
+
}
|
|
371
|
+
t = "文字表示", this.#n.setNormalChWait(), this.#n.currentTxtlayForeNeedErr.tagCh(e);
|
|
372
|
+
}
|
|
373
|
+
} catch (e) {
|
|
374
|
+
this.errScript(`${t} ${e instanceof Error ? `mes=${e.message}(${e.name})` : String(e)}`, !1);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
#s = (t) => "";
|
|
378
|
+
#r;
|
|
379
|
+
}
|
|
380
|
+
const K = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
381
|
+
__proto__: null,
|
|
382
|
+
Main: x
|
|
383
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
384
|
+
export {
|
|
385
|
+
W as A,
|
|
386
|
+
V as G,
|
|
387
|
+
K as M,
|
|
388
|
+
B as P,
|
|
389
|
+
A as a,
|
|
390
|
+
D as b,
|
|
391
|
+
H as t
|
|
392
|
+
};
|
|
393
|
+
//# sourceMappingURL=Main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.js","sources":["../src/sn/Config.ts","../src/sn/AnalyzeTagArg.ts","../src/sn/Grammar.ts","../src/sn/Main.ts"],"sourcesContent":["/* ***** BEGIN LICENSE BLOCK *****\n\tCopyright (c) 2018-2025 Famibee (famibee.blog38.fc2.com)\n\n\tThis software is released under the MIT License.\n\thttp://opensource.org/licenses/mit-license.php\n** ***** END LICENSE BLOCK ***** */\n\nimport {CmnLib} from './CmnLib';\nimport type {SysBase} from './SysBase';\nimport {ConfigBase, SEARCH_PATH_ARG_EXT, type T_CFG_RAW} from './ConfigBase';\n\nexport const PROTOCOL_USERDATA\t= 'userdata:/';\nexport const PROTOCOL_DL\t\t= 'downloads:/';\n\n\nexport class Config extends ConfigBase {\n\tstatic\tasync\tgenerate(sys: SysBase) {\n\t\tconst c = new Config(sys);\n\t\tconst fn = sys.arg.cur +'prj.json';\n\t\tconst res = await sys.fetch(fn);\n\t\tif (! res.ok) throw Error(res.statusText);\n\n\t\tconst dec = await sys.dec(fn, await res.text());\n\t\tawait c.load(<T_CFG_RAW>JSON.parse(dec));\n\t\treturn c;\n\t}\n\n\tprotected\tconstructor(override readonly sys: SysBase) {super(sys)}\n\n\tprotected\toverride\tasync load(oCfg: T_CFG_RAW) {\n\t\toCfg.window ??= {width: 300, height: 300};\n\t\tCmnLib.stageW = oCfg.window.width;\n\t\tCmnLib.stageH = oCfg.window.height;\n\t\tCmnLib.debugLog = oCfg.debug.debugLog;\n\t\tawait CmnLib.init();\n\n\t\treturn super.load(oCfg);\n\t}\n\n\toverride\tsearchPath(fn: string, extptn: SEARCH_PATH_ARG_EXT = SEARCH_PATH_ARG_EXT.DEFAULT): string {\n\t\tif (fn.startsWith(PROTOCOL_DL)) {\n\t\t\treturn this.sys.path_downloads + fn.slice(11);\n\t\t}\n\t\tif (fn.startsWith(PROTOCOL_USERDATA)) {\n\t\t\treturn this.sys.path_userdata + 'storage/'+ fn.slice(10);\n\t\t}\n\n\t\treturn super.searchPath(fn, extptn);\n\t}\n\n}\n","/* ***** BEGIN LICENSE BLOCK *****\n\tCopyright (c) 2018-2025 Famibee (famibee.blog38.fc2.com)\n\n\tThis software is released under the MIT License.\n\thttp://opensource.org/licenses/mit-license.php\n** ***** END LICENSE BLOCK ***** */\n\nexport type PRM = {\n\tval\t\t: string;\n\tdef?\t: string;\n}\nexport type HPRM = {\n\t[key: string]: PRM,\n}\n\nexport type PRM_RANGE = {\n\tk_ln\t: number;\n\tk_ch\t: number;\n\tv_ln\t: number;\n\tv_ch\t: number;\n\tv_len\t: number;\n}\n\nexport function idx2LnCol(sSn: string, idx: number, lenNm = 0, ln = 0, ch = 0): {ln: number; ch: number;} {\n\tconst sBefore = sSn.slice(0, idx);\n\tconst a = sBefore.split('\\n');\n\tconst len = a.length;\n\treturn {\n\t\tln\t: ln +len -1,\n\t\tch\t: len < 2 ?ch +1+lenNm +idx :a.at(-1)?.length ?? 0,\n\t};\n}\n\n\nexport class AnalyzeTagArg {\n\t// 87 match 2725 step(0.5ms) PCRE2 https://regex101.com/r/aeN57J/1\n\t/*\n;[^\\n]*\n|\t(?<key>[^\\s=\"'#|;]+)\n\t(?: \\s | ;[^\\n]*\\n)*\n\t=\n\t(?: \\s | ;[^\\n]*\\n)*\n\t(?:\t(?<val> [^\\s\"'#|;]+)\n\t|\t([\"'#]) (?<val2>.*?) \\3 )\n\t(?: \\|\n\t\t(?: (?<def> [^\\s\"'#;]+)\n\t|\t([\"'#]) (?<def2>.*?) \\6 ) )?\n|\t(?<literal>[^\\s;]+)\n\t*/\n\treadonly\t#REG_TAGARG\t= /;[^\\n]*|(?<key>[^\\s=\"'#|;]+)(?:\\s|;[^\\n]*\\n)*=(?:\\s|;[^\\n]*\\n)*(?:(?<val>[^\\s\"'#|;]+)|([\"'#])(?<val2>.*?)\\3)(?:\\|(?:(?<def>[^\\s\"'#;]+)|([\"'#])(?<def2>.*?)\\6))?|(?<literal>[^\\s;]+)/g;\n\n\t// 【属性 = 値 | 省略値】の分析\n\tparse(args: string): void {\n\t\tthis.#hPrm = {};\n\t\tthis.#isKomeParam = false;\n\t\tfor (const {groups} of args.matchAll(this.#REG_TAGARG)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst {key, val, val2, def, def2, literal} = groups!;\n\t\t\tif (key) this.#hPrm[key] = {\n\t\t\t\tval: val ?? val2 ?? '',\n\t\t\t\tdef: def ?? def2\n\t\t\t};\n\t\t\telse if (literal) {\n\t\t\t\tif (literal === '*') this.#isKomeParam = true;\n\t\t\t\telse this.#hPrm[literal] = {val: '1'};\n\t\t\t}\n\t\t}\n\t}\n\n\t// 属性と値の位置をまとめて返す\n\tparseinDetail(token: string, lenNm: number, ln: number, ch: number): {[key: string]: PRM_RANGE} {\n\t\tconst hRng: {[key: string]: PRM_RANGE} = {};\n\n\t\tconst sSn = token.slice(1+lenNm, -1);\n\t\tfor (const {groups, index, 0: z} of sSn.matchAll(this.#REG_TAGARG)) {\n\t\t\tif (! index) continue;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst {key, val, val2='', literal} = groups!;\n\t\t\tif (literal) {\n\t\t\t\tif (literal.endsWith('=')) {\n\t\t\t\t\tconst lenVnm = literal.length -1;\n\t\t\t\t\tconst {ch: k_ch} = idx2LnCol(sSn, index +lenVnm, lenNm, ln, ch);\n\t\t\t\t\thRng[literal.slice(0, -1)] = {\n\t\t\t\t\t\tk_ln: ln,\n\t\t\t\t\t\tk_ch: k_ch -lenVnm,\n\t\t\t\t\t\tv_ln: ln,\n\t\t\t\t\t\tv_ch: k_ch +1,\n\t\t\t\t\t//\tv_ch: ch +1+lenNm +literal.length +1,\n\t\t\t\t\t\tv_len: 0,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (! key) continue;\n\n\t\t\tconst {ln: k_ln, ch: k_ch} = idx2LnCol(sSn, index, lenNm, ln, ch);\n\t\t\tconst {ln: v_ln, ch: v_ch} = idx2LnCol(sSn, index +z.lastIndexOf(val ?? val2) -(val ?0 :1), lenNm, ln, ch);\n\t\t\thRng[key] = {k_ln, k_ch, v_ln, v_ch, v_len: val ?val.length :val2.length +2};\n\t\t}\n\n\t\treturn hRng;\n\t}\n\n\t#hPrm: HPRM\t= {};\n\tget hPrm() {return this.#hPrm}\n\n\t#isKomeParam\t= false;\n\tget isKomeParam() {return this.#isKomeParam}\n\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* ***** BEGIN LICENSE BLOCK *****\n\tCopyright (c) 2019-2025 Famibee (famibee.blog38.fc2.com)\n\n\tThis software is released under the MIT License.\n\thttp://opensource.org/licenses/mit-license.php\n** ***** END LICENSE BLOCK ***** */\n\nimport {AnalyzeTagArg} from './AnalyzeTagArg';\nimport {getFn} from './CmnLib';\nimport {type T_Config, SEARCH_PATH_ARG_EXT} from './ConfigBase';\n\n\nexport type TArg = {\n\t':タグ名'?\t: string;\n\tcanskip?\t: boolean;\n\n\tlayer?\t: string;\t// レイヤ系\n\tclass?\t: string;\n\tindex?\t: number;\n\tdive?\t: string;\n\tpage?\t: string;\n\talpha?\t: number;\n\tpivot_x?: number;\n\tpivot_y?: number;\n\trotation?\t: number;\n\tscale_x?: number;\n\tscale_y?: number;\n\tvisible?: boolean;\n\tblendmode?\t: string;\n\n\tleft?\t: number;\n\ttop?\t: number;\n\twidth?\t: number;\n\theight?\t: number;\n\tpl?\t\t: number;\n\tpr?\t\t: number;\n\tpt?\t\t: number;\n\tpb?\t\t: number;\n\n\trotate?\t: number;\n\tin_style?\t: string;\n\tout_style?\t: string;\n\tffs?\t: string;\n\tnoffs?\t: string;\n\tkinsoku_sol?\t: string;\n\tkinsoku_eol?\t: string;\n\tkinsoku_dns?\t: string;\n\tkinsoku_bura?\t: string;\n\tbura?\t: boolean;\n\tbreak_fixed?\t\t: boolean;\n\tbreak_fixed_left?\t: number;\n\tbreak_fixed_top?\t: number;\n\n\ttime?\t: number;\n\trule?\t: string;\n\tglsl?\t: string;\n\trender?\t: boolean;\n\n\tpos?\t: string;\n\ttext?\t: string;\n\twait?\t: number;\n\trecord?\t: boolean;\n\tpic?\t: string;\n\tenabled?: boolean;\n\thint?\t\t: string;\n\thint_style?\t: string;\n\thint_opt?\t: string;\n\tclickse?\t: string;\n\tenterse?\t: string;\n\tleavese?\t: string;\n\tclicksebuf?\t: string;\n\tentersebuf?\t: string;\n\tleavesebuf?\t: string;\n\tonenter?\t: string;\n\tonleave?\t: string;\n\n\tt?\t: string;\n\tr?\t: string;\n\texp?\t: string;\n\tchar?\t: string;\n\tsesame?\t: string;\n\tcast?\t: string;\n\tval?\t: string;\n\tflags?\t: string;\n\treg?\t: string;\n\tlen?\t: string;\n\turl?\t: string;\n\tformat?\t: string;\n\tchain?\t: string;\n\tpath?\t: string;\n\n\tfn?\t\t: string;\n\tface?\t: string;\n\tlabel?\t: string;\n\tcall?\t: boolean;\n\tglobal?\t: boolean;\n\tname?\t: string;\n\tclear_local_event?\t: boolean;\n\n\tstyle?\t\t\t: string;\n\tstyle_hover?\t: string;\n\tstyle_clicked?\t: string;\n\tr_style?\t\t: string;\n\tr_style_hover?\t: string;\n\tr_style_clicked?: string;\n\tr_align?\t: string;\n\n\tb_width?\t: string;\n\tb_height?\t: string;\n\tb_color?\t: string;\n\tb_alpha?\t: number;\n\tb_alpha_isfixed?\t: boolean;\n\tb_pic?\t\t: string;\n\tback_clear?\t: string;\n\n\tmax_col?\t: string;\n\tmax_row?\t: string;\n\tbura_col?\t: string;\n\tchk_overrow?\t: string;\n\n\tdx?\t: number;\n\tdy?\t: number;\n\n\tkey?\t: string;\n\ttype?\t: string;\t// 3Dレイヤで使用\n\tcamera_target?\t: string;\n\n\targ?\t: TArg;\n\tfnc?\t: ()=> void;\n\n\tfilter?\t: string;\n\tmatrix?\t: string;\n\tclear_filter?\t: boolean;\n\tenable_filter?\t: boolean;\n\n\tease?\t: string;\n\n\tcentering?\t:boolean;\n\tx?\t\t: number | string;\n\ty?\t\t: number | string;\n\n\tid?\t\t\t: string;\n\tsrc?\t\t: string;\n\tvar_name?\t: string;\n\tset_fnc?\t: string;\n\tbreak_fnc?\t: string;\n\n\tfrom?\t: number;\n\tto?\t\t: number | string;\n\tplace?\t: number;\n\tadd?\t: string;\n\tdel?\t: string;\n\n\tbuf?\t: string;\t// 音系\n\tbuf2?\t: string;\n\tloop?\t: boolean;\n\tvolume?\t: number;\n\tret_ms?\t: number;\n\tend_ms?\t: number;\n\tjoin?\t: boolean;\n\tdo_rec?\t: boolean;\n\tpan?\t: number;\n\tstop?\t: boolean;\n\n\tclear?\t: boolean;\n\n\t// デザインモード\n\t':id_dc'?\t: string;\n\t':id_tag'?\t: string;\n\t':path'?\t: string;\n\t':ln'?\t\t: number;\n\t':col_s'?\t: number;\n\t':col_e'?\t: number;\n\t':idx_tkn'?\t: number;\n\t':token'?\t: string;\n\t':redraw'?\t: boolean;\n\tdesign_unit?: boolean;\t// デザインモードでこのマクロへの引数変更とするか(内部をサーチさせない)\n\n//\tstepin?\t\t: boolean;\t\t// 拡張機能のみ使用:false指定でステップインしない\n//\tnowarn_unused?\t: boolean;\t// 拡張機能のみ使用:未使用警告を出さない\n}\nexport type TTag = (hArg: TArg) => boolean;\nexport type T_HTag = {\n// 変数操作\n\tclearsysvar\t\t\t: TTag;\t// システム変数の全消去\n\tclearvar\t\t\t: TTag;\t// ゲーム変数の全消去\n\tlet_abs\t\t\t\t: TTag;\t// 絶対値\n\tlet_char_at\t\t\t: TTag;\t// 文字列から一字取りだし\n\tlet_index_of\t\t: TTag;\t// 文字列で検索\n\tlet_length\t\t\t: TTag;\t// 文字列の長さ\n\tlet_ml\t\t\t\t: TTag;\t// インラインテキスト代入\n\tlet_replace\t\t\t: TTag;\t// 正規表現で置換\n\tlet_round\t\t\t: TTag;\t// 四捨五入\n\tlet_search\t\t\t: TTag;\t// 正規表現で検索\n\tlet_substr\t\t\t: TTag;\t// 文字列から抜きだし\n\tlet\t\t\t\t\t: TTag;\t// 変数代入・演算\n\n// レイヤ共通\n\tadd_lay\t\t\t\t: TTag;\t// レイヤを追加する\n\tclear_lay\t\t\t: TTag;\t// レイヤ設定の消去\n\tfinish_trans\t\t: TTag;\t// トランス強制終了\n\tlay\t\t\t\t\t: TTag;\t// レイヤ設定\n\ttrans\t\t\t\t: TTag;\t// ページ裏表を交換\n\twt\t\t\t\t\t: TTag;\t// トランス終了待ち\n\tadd_filter\t\t\t: TTag;\t// フィルター追加\n\tclear_filter\t\t: TTag;\t// フィルター全削除\n\tenable_filter\t\t: TTag;\t// フィルター個別切替\n\n// トゥイーンアニメ\n\tpause_tsy\t\t\t: TTag;\t// 一時停止\n\tresume_tsy\t\t\t: TTag;\t// 一時停止再開\n\tstop_tsy\t\t\t: TTag;\t// トゥイーン中断\n\ttsy\t\t\t\t\t: TTag;\t// トゥイーン開始\n\twait_tsy\t\t\t: TTag;\t// トゥイーン終了待ち\n\n// 文字・文字レイヤ\n\tautowc\t\t\t\t: TTag;\t// 文字ごとのウェイト\n\tch\t\t\t\t\t: TTag;\t// 文字を追加する\n\tch_in_style\t\t\t: TTag;\t// 文字出現演出定義\n\tch_out_style\t\t: TTag;\t// 文字消去演出定義\n\tclear_text\t\t\t: TTag;\t// 文字消去\n\tcurrent\t\t\t\t: TTag;\t// デフォルト文字レイヤ設定\n\tendlet_ml\t\t\t: TTag;\t// インラインテキスト代入の終端\n\tendlink\t\t\t\t: TTag;\t// ハイパーリンクの終了\n\ter\t\t\t\t\t: TTag;\t// ページ両面の文字消去\n\tgraph\t\t\t\t: TTag;\t// インライン画像表示\n\tlink\t\t\t\t: TTag;\t// ハイパーリンク\n\tr\t\t\t\t\t: TTag;\t// 改行\n\trec_ch\t\t\t\t: TTag;\t// 履歴書き込み\n\trec_r\t\t\t\t: TTag;\t// 履歴改行\n\treset_rec\t\t\t: TTag;\t// 履歴リセット\n\truby2\t\t\t\t: TTag;\t// 文字列と複数ルビの追加\n\tset_focus\t\t\t: TTag;\t// フォーカス移動\n\tspan\t\t\t\t: TTag;\t// インラインスタイル設定\n\ttcy\t\t\t\t\t: TTag;\t// 縦中横を表示する\n\n// 画像・画像レイヤ\n\tadd_face\t\t\t: TTag;\t// 差分名称の定義\n\twv\t\t\t\t\t: TTag;\t// 動画再生終了待ち\n\n// HTMLフレーム\n\tadd_frame\t\t\t: TTag;\t// フレーム追加\n\tframe\t\t\t\t: TTag;\t// フレームに設定\n\tlet_frame\t\t\t: TTag;\t// フレーム変数を取得\n\tset_frame\t\t\t: TTag;\t// フレーム変数に設定\n\ttsy_frame\t\t\t: TTag;\t// フレームをトゥイーン開始\n\n// イベント\n\tclear_event\t\t\t: TTag;\t// イベントを全消去\n\tenable_event\t\t: TTag;\t// イベント有無の切替\n\tevent\t\t\t\t: TTag;\t// イベントを予約\n\tl\t\t\t\t\t: TTag;\t// 行末クリック待ち\n\tp\t\t\t\t\t: TTag;\t// 改ページクリック待ち\n\ts\t\t\t\t\t: TTag;\t// 停止する\n\tset_cancel_skip\t\t: TTag;\t// スキップ中断予約\n\twait\t\t\t\t: TTag;\t// ウェイトを入れる\n\twaitclick\t\t\t: TTag;\t// クリックを待つ\n\n// BGM・効果音\n\tfadebgm\t\t\t\t: TTag;\t// BGMのフェード\n\tfadeoutbgm\t\t\t: TTag;\t// BGMのフェードアウト\n\tfadeoutse\t\t\t: TTag;\t// 効果音のフェードアウト\n\tfadese\t\t\t\t: TTag;\t// 効果音のフェード\n\tplaybgm\t\t\t\t: TTag;\t// BGM の演奏\n\tplayse\t\t\t\t: TTag;\t// 効果音の再生\n\tstop_allse\t\t\t: TTag;\t// 全効果音再生の停止\n\tstopbgm\t\t\t\t: TTag;\t// BGM 演奏の停止\n\tstopfadese\t\t\t: TTag;\t// 音声フェードの停止\n\tstopse\t\t\t\t: TTag;\t// 効果音再生の停止\n\tvolume\t\t\t\t: TTag;\t// BGMや効果音の音量を指定\n\twb\t\t\t\t\t: TTag;\t// BGM フェードの終了待ち\n\twf\t\t\t\t\t: TTag;\t// 効果音フェードの終了待ち\n\twl\t\t\t\t\t: TTag;\t// BGM 再生の終了待ち\n\tws\t\t\t\t\t: TTag;\t// 効果音再生の終了待ち\n\txchgbuf\t\t\t\t: TTag;\t\t// サウンドバッファの交換\n\n// 条件分岐\n\telse\t\t\t\t: TTag;\t// その他ifブロック開始\n\telsif\t\t\t\t: TTag;\t// 別条件のifブロック開始\n\tendif\t\t\t\t: TTag;\t// ifブロックの終端\n\tif\t\t\t\t\t: TTag;\t// ifブロックの開始\n\n// ラベル・ジャンプ\n\tbutton\t\t\t\t: TTag;\t// ボタンを表示\n\tcall\t\t\t\t: TTag;\t// サブルーチンコール\n\tjump\t\t\t\t: TTag;\t// シナリオジャンプ\n\tpage\t\t\t\t: TTag;\t// ページ移動\n\tpop_stack\t\t\t: TTag;\t// コールスタック破棄\n\treturn\t\t\t\t: TTag;\t// サブルーチンから戻る\n\n// マクロ\n\tbracket2macro\t\t: TTag;\t// 括弧マクロの定義\n\tchar2macro\t\t\t: TTag;\t// 一文字マクロの定義\n\tendmacro\t\t\t: TTag;\t// マクロ定義の終了\n\tmacro\t\t\t\t: TTag;\t// マクロ定義の開始\n\n// しおり\n\tcopybookmark\t\t: TTag;\t// しおりの複写\n\terasebookmark\t\t: TTag;\t// しおりの消去\n\tload\t\t\t\t: TTag;\t// しおりの読込\n\trecord_place\t\t: TTag;\t// セーブポイント指定\n\treload_script\t\t: TTag;\t// スクリプト再読込\n\tsave\t\t\t\t: TTag;\t// しおりの保存\n\n// 画面揺らし\n\tquake\t\t\t\t: TTag;\t// 画面を揺らす\n\tstop_quake\t\t\t: TTag;\t// 画面揺らし中断\n\twq\t\t\t\t\t: TTag;\t// 画面揺らし終了待ち\n\n// システム\n\tclose\t\t\t\t: TTag;\t// アプリの終了\n\texport\t\t\t\t: TTag;\t// プレイデータをエクスポート\n\timport\t\t\t\t: TTag;\t// プレイデータをインポート\n\tloadplugin\t\t\t: TTag;\t// プラグインの読み込み\n\tnavigate_to\t\t\t: TTag;\t// URLを開く\n\tsnapshot\t\t\t: TTag;\t// スナップショット\n\ttitle\t\t\t\t: TTag;\t// タイトル指定\n\ttoggle_full_screen\t: TTag;\t// 全画面状態切替\n\tupdate_check\t\t: TTag;\t// 更新チェック機能\n\twindow\t\t\t\t: TTag;\t// アプリウインドウ設定\n\n// デバッグ・その他\n\tdump_lay\t\t\t: TTag;\t// レイヤのダンプ\n\tdump_script\t\t\t: TTag;\t// 外部へスクリプトを表示\n\tdump_stack\t\t\t: TTag;\t// スタックのダンプ\n\tdump_val\t\t\t: TTag;\t// 変数のダンプ\n\tlog\t\t\t\t\t: TTag;\t// ログ出力\n\ttrace\t\t\t\t: TTag;\t// デバッグ表示へ出力\n}\n\n\nexport type Script = {\n\taToken\t: string[];\t\t// トークン群\n\tlen\t\t: number;\t\t// トークン数\n\taLNum\t: number[];\t\t// トークンの行番号\n};\n\n\nexport const\tREG_TAG\t= /(?<name>[^\\s;\\]]+)/;\t// test用にexport\nexport function\ttagToken2Name_Args(token: string): [name: string, args: string] {\n\tconst e = REG_TAG.exec(token.slice(1, -1));\n\tconst g = e?.groups;\n\tif (! g) throw `タグ記述【${token}】異常です(タグ解析)`;\n\n\tconst nm = g.name!;\n\treturn [nm, token.slice(1 +nm.length, -1)];\n}\nexport function\ttagToken2Name(token: string): string {\n\tconst e = REG_TAG.exec(token.slice(1));\n\tconst g = e?.groups;\n\tif (! g) throw `タグ記述【${token}】異常です(タグ解析)`;\n\n\treturn g.name!;\n}\n\nexport function\tsplitAmpersand(token: string): {\n\t\tname: string;\n\t\ttext: string;\n\t\tcast: string | undefined;\n} {\t// テスト用にpublic\n\tconst equa = token.replaceAll('==', '=').replaceAll('!=', '≠').split('=');\n\t\t// != を弾けないので中途半端ではある\n\tconst cnt_equa = equa.length;\n\tif (cnt_equa < 2 || cnt_equa > 3) throw '「&計算」書式では「=」指定が一つか二つ必要です';\n\n\tconst [e0, e1, e2] = equa;\n\tif (e1!.startsWith('&')) throw '「&計算」書式では「&」指定が不要です';\n\treturn {\n\t\tname: e0!.replaceAll('=', '==').replaceAll('≠', '!='),\n\t\ttext: e1!.replaceAll('=', '==').replaceAll('≠', '!='),\n\t\tcast: cnt_equa === 3 ?e2!.trim() :undefined\n\t};\n}\n\n\nexport class Grammar {\n\tconstructor(private readonly cfg: T_Config) {this.setEscape('')}\n\n\t#REG_TOKEN\t: RegExp;\n\tsetEscape(ce: string) {\n\t\tif (this.#hC2M && ce in this.#hC2M) throw '[エスケープ文字] char【'+ ce +'】が登録済みの括弧マクロまたは一文字マクロです';\n\n\t\t// 1083 matches (14577 step, 9.9ms) https://regex101.com/r/dP0tAY/1\n\t\t/*\n\\\\\\S |\n \\n+\n| \\t+\n|\t\\[let_ml \\s+ [^\\]]+ ]\n\t.+? (?=\\[endlet_ml [\\]\\s])\n| \\[ (?: [^\"'#;\\]]+\n\t| ([\"'#]).*?\\1\n\t| ;[^\\n]* ) *? ]\n| ;[^\\n]*\n| &[^&\\n]+&\n| &&?(?: [^\"'#;\\n&]+ | ([\"'#]).*?\\2 )+\n| ^\\*[^\\s\\[&;\\\\]+\n| [^\\n\\t\\[;\\\\]+\n\t\t*/\n/*\n\t[^\"'#;\\]]++\n\t| ([\"'\\#]).*?\\1\n\t\t\t++ にしたいところだが、jsは未サポートらしい(2022/10/16)\n*/\n\t\t// (new RegExp(\"~\")) の場合は、バックスラッシュは2つ必要\n\t\t\t// https://qiita.com/ue5963/items/bd8e32ac9e6b12aa7fab\n\t\tthis.#REG_TOKEN = new RegExp(\n\t\t(ce\t?`\\\\${ce}\\\\S|` :'')+\t// エスケープシーケンス\n\t\t'\\\\n+'+\t\t\t\t// 改行\n\t\t'|\\\\t+'+\t\t\t// タブ文字\n\t\t'|\\\\[let_ml\\\\s+[^\\\\]]+\\\\]'+\n\t\t\t'.+?'+\t\t\t// [let_ml]〜[endlet_ml]間のテキスト\n\t\t'(?=\\\\[endlet_ml[\\\\]\\\\s])'+\n\t\t'|\\\\[(?:'+\n\t\t\t'[^\"\\'#;\\\\]]+|'+\t// タグ\n\t\t\t'([\"\\'#]).*?\\\\1' +\n\t\t\t\t// . は (?:\\\\${ ce??'\\\\' }.|[^\\\\1]) でなくてよさげ\n\t\t'|;[^\\\\n]*)*?]'+\n\t\t'|;[^\\\\n]*'+\t\t// コメント\n\t\t'|&[^&\\\\n]+&'+\t\t// &表示&\n\t\t'|&&?(?:[^\"\\'#;\\\\n&]+|([\"\\'#]).*?\\\\2)+'+\t// &代入\n\t\t'|^\\\\*[^\\\\s\\\\[&;\\\\\\\\]+'+\t// ラベル\n\t\t`|[^\\\\n\\\\t\\\\[;${ce ?`\\\\${ce}` :''}]+`,\t\t// 本文\n\t\t'gs');\n\t\tthis.#REG_CANTC2M = new RegExp(`[\\\\w\\\\s;[\\\\]*=&|《》${ce ?`\\\\${ce}` :''}]`);\n\t\tthis.#REG_TOKEN_NOTXT = new RegExp(`[\\\\n\\\\t;\\\\[*&${ce ?`\\\\${ce}` :''}]`);\n\t}\n\n\n\t// 括弧マクロの定義\n\tbracket2macro(hArg: TArg, hTag: T_HTag, scr: Script, start_idx: number) {\n\t\tconst {name, text} = hArg;\n\t\tif (! name) throw '[bracket2macro] nameは必須です';\n\t\tif (! text) throw '[bracket2macro] textは必須です';\n\t\tconst op = text.at(0);\n\t\tif (! op) throw '[bracket2macro] textは必須です';\n\t\tif (text.length !== 2) throw '[bracket2macro] textは括弧の前後を示す二文字を指定してください';\n\t\tif (! (name in hTag)) throw `[bracket2macro] 未定義のタグ又はマクロ[${name}]です`;\n\n\t\tthis.#hC2M ??= {};\n\t\tconst cl = text.charAt(1);\n\t\tif (op in this.#hC2M) throw '[bracket2macro] text【'+ op +'】が登録済みの括弧マクロまたは一文字マクロです';\n\t\tif (cl in this.#hC2M) throw '[bracket2macro] text【'+ cl +'】が登録済みの括弧マクロまたは一文字マクロです';\n\t\tif (this.#REG_CANTC2M.test(op)) throw '[bracket2macro] text【'+ op +'】は括弧マクロに使用できない文字です';\n\t\tif (this.#REG_CANTC2M.test(cl)) throw '[bracket2macro] text【'+ cl +'】は括弧マクロに使用できない文字です';\n\n\t\tthis.#hC2M[cl] = '0';\t// チェック用ダミー\n\t\tthis.#hC2M[op] = `[${name} text=`;\n\n\t\tthis.addC2M(`\\\\${op}[^\\\\${cl}]*\\\\${cl}`, `\\\\${op}\\\\${cl}`);\n\n\t\tthis.#replaceScr_C2M(scr, start_idx);\n\t}\n\t// 一文字マクロの定義\n\tchar2macro(hArg: TArg, hTag: T_HTag, scr: Script, start_idx: number) {\n\t\tconst {char, name} = hArg;\n\t\tif (! char) throw '[char2macro] charは必須です';\n\t\tthis.#hC2M ??= {};\n\t\tif (char in this.#hC2M) throw '[char2macro] char【'+ char +'】が登録済みの括弧マクロまたは一文字マクロです';\n\t\tif (this.#REG_CANTC2M.test(char)) throw '[char2macro] char【'+ char +'】は一文字マクロに使用できない文字です';\n\n\t\tif (! name) throw '[char2macro] nameは必須です';\n\t\tif (! (name in hTag)) throw `[char2macro] 未定義のタグ又はマクロ[${name}]です`;\n\n\t\tthis.#hC2M[char] = `[${name}]`;\n\n\t\tthis.addC2M(`\\\\${char}`, `\\\\${char}`);\n\n\t\tthis.#replaceScr_C2M(scr, start_idx);\n\t}\n\t#REG_CANTC2M\t: RegExp;\n\t#REGC2M\t\t\t= new RegExp('');\n\t#regStrC2M\t\t= '';\n\t#regStrC2M4not\t= '';\n\taddC2M(a: string, b: string) {\n\t\tthis.#regStrC2M += `${a}|`;\n\t\tthis.#regStrC2M4not += b;\n\t\tthis.#REGC2M = new RegExp(\n\t\t\t`(${this.#regStrC2M}[^${this.#regStrC2M4not}]+)`, 'g');\n\t}\n\n\n\tresolveScript(txt: string): Script {\n\t\tconst a: string[] = txt\n\t\t.replaceAll(/\\r\\n?/g, '\\n')\n\t\t.match(this.#REG_TOKEN)\n\t\t?.flatMap(tkn=> {\n\t\t\tif (! this.testTagLetml(tkn)) return tkn;\n\n\t\t\tconst r = /^([^\\]]+?])(.*)$/s.exec(tkn);\n\t\t\tif (! r) return tkn;\n\t\t\tconst [, a, b] = r;\n\t\t\treturn [a!, b!];\n\t\t}) ?? [];\n\n\t\tconst scr = {aToken: a, len: a.length, aLNum: []};\n\t\tthis.#replaceScr_C2M(scr);\n\n\t\tthis.#replaceScript_Wildcard(scr);\n\n\t\treturn scr;\n\t}\n\n\n\treadonly #REG_WILDCARD\t= /^\\[(call|loadplugin)\\s/;\n\treadonly #REG_WILDCARD2\t= /\\bfn\\s*=\\s*[^\\s\\]]+/;\n\t#replaceScript_Wildcard(scr: Script) {\n\t\tfor (let i=scr.len -1; i>=0; --i) {\n\t\t\tconst token = scr.aToken[i]!;\n\t\t\tif (! this.#REG_WILDCARD.test(token)) continue;\n\n\t\t\tconst [tag_name, args] = tagToken2Name_Args(token);\n\t\t\tthis.#alzTagArg.parse(args);\n\n\t\t\tconst p_fn = this.#alzTagArg.hPrm.fn;\n\t\t\tif (! p_fn) continue;\n\t\t\tconst {val: fn} = p_fn;\n\t\t\tif (! fn.endsWith('*')) continue;\n\n\t\t\tscr.aToken.splice(i, 1, '\\t', '; '+ token);\n\t\t\tscr.aLNum.splice(i, 1, NaN, NaN);\n\n\t\t\tconst ext = tag_name === 'loadplugin'\n\t\t\t\t? SEARCH_PATH_ARG_EXT.CSS\n\t\t\t\t: SEARCH_PATH_ARG_EXT.SN;\n\t\t\tconst a = this.cfg.matchPath('^'+ fn.slice(0, -1) +'.*', ext);\n\t\t\tfor (const v of a) {\n\t\t\t\tconst nt = token.replace(\n\t\t\t\t\tthis.#REG_WILDCARD2,\n\t\t\t\t\t'fn='+ decodeURIComponent(getFn(v[ext]!))\n\t\t\t\t);\n\t\t\t\t//console.log('\\t='+ nt +'=');\n\t\t\t\tscr.aToken.splice(i, 0, nt);\n\t\t\t\tscr.aLNum.splice(i, 0, NaN);\n\t\t\t}\n\t\t}\n\t\tscr.len = scr.aToken.length;\n\t}\n\t\treadonly\t#alzTagArg\t= new AnalyzeTagArg;\n\n\n\ttestTagLetml(tkn: string): boolean {return /^\\[let_ml\\s/.test(tkn)}\n\ttestTagEndLetml(tkn: string): boolean {return /^\\[endlet_ml\\s*]/.test(tkn)}\n\n\n\t#hC2M\t: {[char: string]: string} | undefined = undefined;\n\t#REG_TOKEN_NOTXT\t: RegExp;\n\t#replaceScr_C2M(scr: Script, start_idx = 0): void {\n\t\tif (! this.#hC2M) return;\n\n\t\tfor (let i=scr.len- 1; i >= start_idx; --i) {\n\t\t\tconst token = scr.aToken[i]!;\n\t\t\tif (this.testNoTxt(token.at(0) ?? '\\n')) continue;\n\t\t\t\t// 省略時は #REG_TOKEN_NOTXT に引っかかる \\n に\n\n\t\t\tconst lnum = scr.aLNum[i]!;\n\t\t\tconst a = token.match(this.#REGC2M);\n\t\t\tif (! a) continue;\n\t\t\tlet del = 1;\n\t\t\tfor (let j=a.length -1; j>=0; --j) {\n\t\t\t\tlet ch = a[j]!;\n\t\t\t\tconst macro = this.#hC2M[ch.at(0) ?? ' '];\n\t\t\t\t\t// 省略時は #REG_CANTC2M に引っかかる ' ' に\n\t\t\t\tif (macro) {\n\t\t\t\t\tch = macro +(macro.endsWith(']')\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: `'${ch.slice(1, -1)}']`);\n\t\t\t\t\t// 文字列は半角空白を意識して''で囲むが、いずれ変えたい場合がある?\n\t\t\t\t}\n\t\t\t\tscr.aToken.splice(i, del, ch);\n\n\t\t\t\tscr.aLNum.splice(i, del, lnum);\n\t\t\t\tdel = 0;\n\t\t\t}\n\t\t}\n\t\tscr.len = scr.aToken.length;\n\t}\n\ttestNoTxt(ch: string): boolean {return this.#REG_TOKEN_NOTXT.test(ch)}\t//4tst\n\n}\n","/* ***** BEGIN LICENSE BLOCK *****\n\tCopyright (c) 2018-2025 Famibee (famibee.blog38.fc2.com)\n\n\tThis software is released under the MIT License.\n\thttp://opensource.org/licenses/mit-license.php\n** ***** END LICENSE BLOCK ***** */\n\nimport {CmnLib, argChk_Boolean, parseColor} from './CmnLib';\nimport type {T_HTag, TArg} from './Grammar';\nimport type {T_Main, Scope, T_VAL_BSNU, T_VAL_DATA} from './CmnInterface';\nimport type {SysBase} from './SysBase';\nimport {DebugMng} from './DebugMng';\nimport {Config} from './Config';\nimport {splitAmpersand, tagToken2Name_Args} from './Grammar';\nimport type {ScriptIterator} from './ScriptIterator';\nimport type {LayerMng} from './LayerMng';\nimport type {EventMng} from './EventMng';\n\nimport {type IApplicationOptions, Application, utils} from 'pixi.js';\n\n\nconst\tSN_ID\t= 'skynovel';\n\nexport class Main implements T_Main {\n\tstatic\tasync generate(sys: SysBase): Promise<Main> {\n\t\tutils.skipHello();\n\n\t\tconst m = new Main(sys);\n\t\tawait m.#init()\n\t\t.catch((e: unknown)=> console.error('Main.generate err e:%o', e));\n\n\t\treturn m;\n\t}\n\n\n\tcvs\t\t\t: HTMLCanvasElement;\n\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t#hTag\t\t: T_HTag\t\t= Object.create(null);\t// タグ処理辞書\n\n\t#scrItr\t\t: ScriptIterator;\n\t#layMng\t\t: LayerMng;\n\t#evtMng\t\t: EventMng;\n\n\t#aDest\t\t: (()=> void)[]\t\t= [];\n\n\n\tprivate constructor(private readonly sys: SysBase) {}\n\n\tasync #init() {\n\t\tconst cfg = await Config.generate(this.sys);\n\t\tthis.sys.setMain(this, cfg);\n\n\t\tconst hApp: IApplicationOptions = {\n\t\t\twidth\t\t\t: cfg.oCfg.window.width,\n\t\t\theight\t\t\t: cfg.oCfg.window.height,\n\t\t\tbackgroundColor\t: parseColor(String(cfg.oCfg.init.bg_color)),\n\t\t\t\t// このString()は後方互換性のため必須\n\t\t\tresolution\t\t: globalThis.devicePixelRatio,\n\t\t};\n\n\t\tconst cvs = <HTMLCanvasElement | null>document.getElementById(SN_ID);\n\t\tif (cvs) {\n\t\t\tconst clone_cvs = <HTMLCanvasElement>cvs.cloneNode(true);\n\t\t\tclone_cvs.id = SN_ID;\n\t\t\thApp.view = cvs;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst p = cvs.parentNode!;\n\t\t\tthis.#aDest.unshift(()=> p.appendChild(clone_cvs));\n\t\t}\n\t\telse {\t// 自動的に作ってくれるが、どうも appendChild に遅延があるので\n\t\t\tconst c = document.createElement('canvas');\n\t\t\tc.id = SN_ID;\n\t\t\thApp.view = c;\n\t\t\tdocument.body.appendChild(c);\n\t\t\tthis.#aDest.unshift(()=> document.body.removeChild(c));\n\t\t}\n\n\t\tconst app = new Application(hApp);\n\t\tthis.#aDest.unshift(()=> {\n\t\t\tutils.clearTextureCache();\n\t\t\tthis.sys.destroy();\n\t\t\tapp.destroy(false);\t// remove canvas from DOM が非同期なのでウチがやる\n\t\t});\n\n\t\tthis.cvs = app.view;\n\t\tthis.cvs.id = SN_ID +'_act';\n\t\tif (! cvs) document.body.appendChild(this.cvs);\n\n\n\t\tconst cc = document.createElement('canvas').getContext('2d');\n\t\tif (! cc) throw '#init cc err';\n\t\tCmnLib.cc4ColorName = cc;\n\n\t\tconst [{Variable}, {PropParser}, {SoundMng}, {ScriptIterator}, {LayerMng}, {EventMng}, {Button}] = await Promise.all([\n\t\t\timport('./Variable'),\n\t\t\timport('./PropParser'),\n\t\t\timport('./SoundMng'),\n\t\t\timport('./ScriptIterator'),\n\t\t\timport('./LayerMng'),\n\t\t\timport('./EventMng'),\n\t\t\timport('./Button'),\n\t\t]);\n\n\t\tButton.init(cfg);\n\n\t\t// 変数\n\t\tconst val = new Variable(this.sys, cfg, this.#hTag);\n\t\tconst prpPrs = new PropParser(val, cfg.oCfg.init.escape);\n\t\tthis.#setVal_Nochk = (scope, nm, v, autocast)=> val.setVal_Nochk(scope, nm, v, autocast);\n\t\tthis.#getValAmpersand = v=> prpPrs.getValAmpersand(v);\n\t\tthis.#parse = s=> prpPrs.parse(s);\n\n\t\t// システム\n\t\tawait Promise.allSettled(this.sys.init(this.#hTag, app, val));\t// 変数準備完了\n\n\t\t// BGM・効果音\n\t\tconst sndMng = new SoundMng(cfg, this.#hTag, val, this, this.sys);\n\t\tthis.#aDest.unshift(()=> sndMng.destroy());\n\n\t\t// 条件分岐、ラベル・ジャンプ、マクロ、しおり\n\t\tthis.#scrItr = new ScriptIterator(cfg, this.#hTag, this, val, prpPrs, sndMng, this.sys);\n\t\tthis.#aDest.unshift(()=> this.#scrItr.destroy());\n\n\t\t// デバッグ・その他\n\t\tconst dbgMng = new DebugMng(this.sys, this.#hTag, this.#scrItr);\n\t\tthis.#aDest.unshift(()=> dbgMng.destroy());\n\t\tthis.errScript = (mes: string, isThrow = true)=> {\n\t\t\tthis.stop();\n\t\t\tDebugMng.myTrace(mes);\n\t\t\tif (CmnLib.debugLog) console.log('🍜 SKYNovel err!');\n\t\t\tif (isThrow) throw mes;\n\t\t}\n\n\t\t// レイヤ共通、文字レイヤ、画像レイヤ\n\t\tthis.#layMng = new LayerMng(cfg, this.#hTag, app, val, this, this.#scrItr, this.sys, sndMng, prpPrs);\n\t\tthis.#aDest.unshift(()=> this.#layMng.destroy());\n\n\t\t// イベント\n\t\tthis.#evtMng = new EventMng(cfg, this.#hTag, app, this, this.#layMng, val, sndMng, this.#scrItr, this.sys);\n\t\tthis.#aDest.unshift(()=> this.#evtMng.destroy());\n\n\t\tthis.#aDest.unshift(()=> {\n\t\t\tthis.stop();\n\t\t\tthis.#isLoop = false;\n\n\t\t\tconst fncDummy = ()=> true;\n\t\t\tfor (const key in this.#hTag) this.#hTag[<keyof T_HTag>key] = fncDummy;\n\t\t});\n\t}\n\n\n\tdestroy() {\n\t\tthis.resume = this.destroy = ()=> { /* empty */ };\t// destroy()連打対策\n\n\t\tthis.cvs.parentElement?.removeChild(this.cvs);\n\t\t\t// (ギャラリーで)document.body はエラーになる\n\t\tfor (const f of this.#aDest) f();\n\t\tthis.#aDest = [];\n\t}\n\n\n\terrScript = (_mes: string, _isThrow = true)=> { /* empty */ }\n\n\n\tresumeByJumpOrCall(hArg: TArg) {\n\t\tif (hArg.url) {\n\t\t\tthis.#hTag.navigate_to(hArg);\n\t\t\tthis.#scrItr.jumpJustBefore();\n\t\t\treturn;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tthis.#setVal_Nochk('tmp', 'sn.eventArg', String(hArg.arg ?? ''));\n\t\tthis.#setVal_Nochk('tmp', 'sn.eventLabel', hArg.label ?? '');\n// console.log(`📜 %cresumeByJumpOrCall:%o`, 'color:#3B0;', hArg);\n\t\tif (argChk_Boolean(hArg, 'call', false)) {\n\t\t\tthis.#scrItr.subIdxToken();\t// 「コール元の次」に進めず、「コール元」に戻す\n\t\t\tif (this.#hTag.call(hArg)) return;\n\t\t}\n\t\telse {\n\t\t\tthis.#hTag.clear_event({});\n\t\t\tif (this.#hTag.jump(hArg)) return;\n\t\t}\n\t\tthis.resume();\n\t}\n\t\t#setVal_Nochk = (_scope: Scope, _nm: string, _val: T_VAL_BSNU, _autocast = false)=> { /* empty */ }\n\n\tresume() {\n// console.log(`📜🟢 resume!`);\n\t\t// スクリプトが動くとき、ブレイクマークなど消去\n\t\tthis.#layMng.clearBreak();\n\t\tthis.#scrItr.noticeBreak(false);\n\t\tthis.#evtMng.hideHint();\n\n\t\tqueueMicrotask(()=> {void this.#main()});\n\t}\n\treadonly stop = ()=> {\n// console.log(`📜🔴 stop!`);\n\t\tthis.#scrItr.noticeBreak(true);\n\t};\n\n\tsetLoop(isLoop: boolean, mes = '') {\n\t\t///console.log('setLoop:'+ (isLoop ?'resume!' :'stop!') +' mes:'+ mes);\n\t\t// eslint-disable-next-line no-cond-assign\n\t\tif (this.#isLoop = isLoop) this.resume(); else this.stop();\n\t\tthis.sys.setTitleInfo(mes ?` -- ${mes}中` :'');\n\t}\n\t// oxlint-disable-next-line no-unused-private-class-members\n\t#isLoop = true;\n\n\t//MARK: メイン処理(シナリオ解析)\n\tasync #main() {\n\t\tlet errHd = '';\n\t\ttry {\n\t\t\twhile (this.#isLoop) {\n\t\t\t\tlet token = this.#scrItr.nextToken();\n\t\t\t\tif (! token) return;\t// 初期化前に終了した場合向け\n\n\t\t\t\tconst uc = token.charCodeAt(0);\t// TokenTopUnicode\n\t\t\t\t// \\t タブ\n\t\t\t\tif (uc === 9) continue;\n\t\t\t\t// \\n 改行\n\t\t\t\tif (uc === 10) {this.#scrItr.addLineNum(token.length); continue}\n\t\t\t\t// [ タグ開始\n\t\t\t\tif (uc === 91) {\n\t\t\t\t\terrHd = 'タグ開始';\n\t\t\t\t\tif (this.#scrItr.isBreak(token)) return;\n\n\t\t\t\t\tconst [tag_name, args] = tagToken2Name_Args(token);\n\t\t\t\t\terrHd = `[${tag_name}]例外`;\n\n\t\t\t\t\tconst cl = (token.match(/\\n/g) ?? []).length;\n\t\t\t\t\tif (cl > 0) this.#scrItr.addLineNum(cl);\n\t\t\t\t\tif (await this.#scrItr.タグ解析(\n\t\t\t\t\t\t<keyof T_HTag>tag_name, args\n\t\t\t\t\t)) {this.stop(); return}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// & 変数操作・変数表示\n\t\t\t\tif (uc === 38) {\n\t\t\t\t\tif (! token.endsWith('&')) {\n\t\t\t\t\t\terrHd = '変数計算';\n\t\t\t\t\t\tif (this.#scrItr.isBreak(token)) return;\n\t\t\t\t\t\tconst o = splitAmpersand(token.slice(1));\n\t\t\t\t\t\to.name = this.#getValAmpersand(o.name);\n\t\t\t\t\t\to.text = String(this.#parse(o.text));\n\t\t\t\t\t\tthis.#hTag.let(o);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\terrHd = '変数操作';\n\t\t\t\t\tif (token.charAt(1) === '&') throw new Error('「&表示&」書式では「&」指定が不要です');\n\t\t\t\t\ttoken = String(this.#parse( token.slice(1, -1) ));\n\t\t\t\t\t\t// -> 文字表示 へ\n\t\t\t\t}\n\t\t\t\t// ; コメント\n\t\t\t\telse if (uc === 59) continue;\n\t\t\t\t// * ラベル\n\t\t\t\telse if (uc === 42 && token.length > 1) continue;\n\n\t\t\t\t// 文字表示\n\t\t\t\terrHd = '文字表示';\n\t\t\t\tthis.#layMng.setNormalChWait();\n\t\t\t\tconst tl = this.#layMng.currentTxtlayForeNeedErr;\n\t\t\t\ttl.tagCh(token);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.errScript(`${errHd} ${\n\t\t\t\te instanceof Error ?`mes=${e.message}(${e.name})` :String(e)\n\t\t\t}`, false);\n\t\t}\n\t}\n\t\t#getValAmpersand\t= (_v: string)=> '';\n\t\t#parse\t\t\t\t: (_s: string)=> T_VAL_DATA;\n\n}\n"],"names":["PROTOCOL_USERDATA","PROTOCOL_DL","Config","ConfigBase","sys","c","fn","res","dec","oCfg","CmnLib","extptn","SEARCH_PATH_ARG_EXT","idx2LnCol","sSn","idx","lenNm","ln","ch","len","AnalyzeTagArg","#REG_TAGARG","args","#hPrm","#isKomeParam","groups","key","val","val2","def","def2","literal","token","hRng","index","z","lenVnm","k_ch","k_ln","v_ln","v_ch","REG_TAG","tagToken2Name_Args","g","nm","tagToken2Name","splitAmpersand","equa","cnt_equa","e0","e1","e2","Grammar","cfg","#REG_TOKEN","ce","#hC2M","#REG_CANTC2M","#REG_TOKEN_NOTXT","hArg","hTag","scr","start_idx","name","text","op","cl","#replaceScr_C2M","char","#REGC2M","#regStrC2M","#regStrC2M4not","a","b","txt","tkn","r","#replaceScript_Wildcard","#REG_WILDCARD","#REG_WILDCARD2","i","tag_name","#alzTagArg","p_fn","ext","v","nt","getFn","lnum","del","j","macro","SN_ID","Main","utils.skipHello","m","#init","e","#hTag","#scrItr","#layMng","#evtMng","#aDest","hApp","parseColor","cvs","clone_cvs","p","app","Application","utils.clearTextureCache","cc","Variable","PropParser","SoundMng","ScriptIterator","LayerMng","EventMng","Button","prpPrs","#setVal_Nochk","scope","autocast","#getValAmpersand","#parse","s","sndMng","dbgMng","DebugMng","mes","isThrow","#isLoop","fncDummy","f","_mes","_isThrow","argChk_Boolean","_scope","_nm","_val","_autocast","#main","isLoop","errHd","uc","o","_v"],"mappings":"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"}
|