webgal-parser 4.6.3-beta.1 → 4.6.3-beta.2
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/CHANGELOG.md +5 -0
- package/build/cjs/index.cjs +15 -9
- package/build/es/index.js +15 -9
- package/build/umd/index.global.js +15 -9
- package/package.json +1 -1
- package/src/sceneTextPreProcessor.ts +16 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# WebGAL Parser Changelog
|
|
2
2
|
|
|
3
|
+
## [4.6.3-beta.2] - 2026-07-31
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- `sceneTextPreProcess`:折叠序列的首行是空行时(例如空行后面紧跟一条续行),整条序列会被静默丢弃,导致预处理后行数变少。这会击穿「解析后语句 index == 文件行号」,进而让存档进度错位。改用 `null` 哨兵区分「不在折叠序列中」与「首行内容为空串」
|
|
7
|
+
|
|
3
8
|
## [4.6.3-beta.1] - 2026-07-31
|
|
4
9
|
|
|
5
10
|
### Added
|
package/build/cjs/index.cjs
CHANGED
|
@@ -607,7 +607,10 @@ function isEmptyLine(line) {
|
|
|
607
607
|
*/
|
|
608
608
|
function sceneTextPreProcessPassTwo(lines) {
|
|
609
609
|
const processedLines = [];
|
|
610
|
-
|
|
610
|
+
// null 表示当前不在多行序列里。这里不能用空串来判断:
|
|
611
|
+
// 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
|
|
612
|
+
// 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
|
|
613
|
+
let currentMultilineContent = null;
|
|
611
614
|
let placeHolderLines = [];
|
|
612
615
|
function concat(line) {
|
|
613
616
|
let trimmed = line.trim();
|
|
@@ -617,10 +620,16 @@ function sceneTextPreProcessPassTwo(lines) {
|
|
|
617
620
|
currentMultilineContent = currentMultilineContent + trimmed;
|
|
618
621
|
placeHolderLines.push(placeholderLine(line));
|
|
619
622
|
}
|
|
623
|
+
/** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
|
|
624
|
+
function flushMultiline() {
|
|
625
|
+
processedLines.push(currentMultilineContent, ...placeHolderLines);
|
|
626
|
+
placeHolderLines = [];
|
|
627
|
+
currentMultilineContent = null;
|
|
628
|
+
}
|
|
620
629
|
for (const line of lines) {
|
|
621
630
|
if (line.endsWith('\\')) {
|
|
622
631
|
const trueLine = line.slice(0, -1);
|
|
623
|
-
if (currentMultilineContent ===
|
|
632
|
+
if (currentMultilineContent === null) {
|
|
624
633
|
// first line
|
|
625
634
|
currentMultilineContent = trueLine;
|
|
626
635
|
}
|
|
@@ -630,20 +639,17 @@ function sceneTextPreProcessPassTwo(lines) {
|
|
|
630
639
|
}
|
|
631
640
|
continue;
|
|
632
641
|
}
|
|
633
|
-
if (currentMultilineContent !==
|
|
642
|
+
if (currentMultilineContent !== null) {
|
|
634
643
|
// end line
|
|
635
644
|
concat(line);
|
|
636
|
-
|
|
637
|
-
processedLines.push(...placeHolderLines);
|
|
638
|
-
placeHolderLines = [];
|
|
639
|
-
currentMultilineContent = "";
|
|
645
|
+
flushMultiline();
|
|
640
646
|
continue;
|
|
641
647
|
}
|
|
642
648
|
processedLines.push(line);
|
|
643
649
|
}
|
|
644
650
|
// 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
|
|
645
|
-
if (currentMultilineContent !==
|
|
646
|
-
|
|
651
|
+
if (currentMultilineContent !== null) {
|
|
652
|
+
flushMultiline();
|
|
647
653
|
}
|
|
648
654
|
return processedLines;
|
|
649
655
|
}
|
package/build/es/index.js
CHANGED
|
@@ -603,7 +603,10 @@ function isEmptyLine(line) {
|
|
|
603
603
|
*/
|
|
604
604
|
function sceneTextPreProcessPassTwo(lines) {
|
|
605
605
|
const processedLines = [];
|
|
606
|
-
|
|
606
|
+
// null 表示当前不在多行序列里。这里不能用空串来判断:
|
|
607
|
+
// 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
|
|
608
|
+
// 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
|
|
609
|
+
let currentMultilineContent = null;
|
|
607
610
|
let placeHolderLines = [];
|
|
608
611
|
function concat(line) {
|
|
609
612
|
let trimmed = line.trim();
|
|
@@ -613,10 +616,16 @@ function sceneTextPreProcessPassTwo(lines) {
|
|
|
613
616
|
currentMultilineContent = currentMultilineContent + trimmed;
|
|
614
617
|
placeHolderLines.push(placeholderLine(line));
|
|
615
618
|
}
|
|
619
|
+
/** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
|
|
620
|
+
function flushMultiline() {
|
|
621
|
+
processedLines.push(currentMultilineContent, ...placeHolderLines);
|
|
622
|
+
placeHolderLines = [];
|
|
623
|
+
currentMultilineContent = null;
|
|
624
|
+
}
|
|
616
625
|
for (const line of lines) {
|
|
617
626
|
if (line.endsWith('\\')) {
|
|
618
627
|
const trueLine = line.slice(0, -1);
|
|
619
|
-
if (currentMultilineContent ===
|
|
628
|
+
if (currentMultilineContent === null) {
|
|
620
629
|
// first line
|
|
621
630
|
currentMultilineContent = trueLine;
|
|
622
631
|
}
|
|
@@ -626,20 +635,17 @@ function sceneTextPreProcessPassTwo(lines) {
|
|
|
626
635
|
}
|
|
627
636
|
continue;
|
|
628
637
|
}
|
|
629
|
-
if (currentMultilineContent !==
|
|
638
|
+
if (currentMultilineContent !== null) {
|
|
630
639
|
// end line
|
|
631
640
|
concat(line);
|
|
632
|
-
|
|
633
|
-
processedLines.push(...placeHolderLines);
|
|
634
|
-
placeHolderLines = [];
|
|
635
|
-
currentMultilineContent = "";
|
|
641
|
+
flushMultiline();
|
|
636
642
|
continue;
|
|
637
643
|
}
|
|
638
644
|
processedLines.push(line);
|
|
639
645
|
}
|
|
640
646
|
// 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
|
|
641
|
-
if (currentMultilineContent !==
|
|
642
|
-
|
|
647
|
+
if (currentMultilineContent !== null) {
|
|
648
|
+
flushMultiline();
|
|
643
649
|
}
|
|
644
650
|
return processedLines;
|
|
645
651
|
}
|
|
@@ -606,7 +606,10 @@ var webgalParser = (function (exports) {
|
|
|
606
606
|
*/
|
|
607
607
|
function sceneTextPreProcessPassTwo(lines) {
|
|
608
608
|
const processedLines = [];
|
|
609
|
-
|
|
609
|
+
// null 表示当前不在多行序列里。这里不能用空串来判断:
|
|
610
|
+
// 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
|
|
611
|
+
// 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
|
|
612
|
+
let currentMultilineContent = null;
|
|
610
613
|
let placeHolderLines = [];
|
|
611
614
|
function concat(line) {
|
|
612
615
|
let trimmed = line.trim();
|
|
@@ -616,10 +619,16 @@ var webgalParser = (function (exports) {
|
|
|
616
619
|
currentMultilineContent = currentMultilineContent + trimmed;
|
|
617
620
|
placeHolderLines.push(placeholderLine(line));
|
|
618
621
|
}
|
|
622
|
+
/** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
|
|
623
|
+
function flushMultiline() {
|
|
624
|
+
processedLines.push(currentMultilineContent, ...placeHolderLines);
|
|
625
|
+
placeHolderLines = [];
|
|
626
|
+
currentMultilineContent = null;
|
|
627
|
+
}
|
|
619
628
|
for (const line of lines) {
|
|
620
629
|
if (line.endsWith('\\')) {
|
|
621
630
|
const trueLine = line.slice(0, -1);
|
|
622
|
-
if (currentMultilineContent ===
|
|
631
|
+
if (currentMultilineContent === null) {
|
|
623
632
|
// first line
|
|
624
633
|
currentMultilineContent = trueLine;
|
|
625
634
|
}
|
|
@@ -629,20 +638,17 @@ var webgalParser = (function (exports) {
|
|
|
629
638
|
}
|
|
630
639
|
continue;
|
|
631
640
|
}
|
|
632
|
-
if (currentMultilineContent !==
|
|
641
|
+
if (currentMultilineContent !== null) {
|
|
633
642
|
// end line
|
|
634
643
|
concat(line);
|
|
635
|
-
|
|
636
|
-
processedLines.push(...placeHolderLines);
|
|
637
|
-
placeHolderLines = [];
|
|
638
|
-
currentMultilineContent = "";
|
|
644
|
+
flushMultiline();
|
|
639
645
|
continue;
|
|
640
646
|
}
|
|
641
647
|
processedLines.push(line);
|
|
642
648
|
}
|
|
643
649
|
// 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
|
|
644
|
-
if (currentMultilineContent !==
|
|
645
|
-
|
|
650
|
+
if (currentMultilineContent !== null) {
|
|
651
|
+
flushMultiline();
|
|
646
652
|
}
|
|
647
653
|
return processedLines;
|
|
648
654
|
}
|
package/package.json
CHANGED
|
@@ -94,7 +94,10 @@ function isEmptyLine(line: string): boolean {
|
|
|
94
94
|
*/
|
|
95
95
|
function sceneTextPreProcessPassTwo(lines: string[]): string[] {
|
|
96
96
|
const processedLines: string[] = [];
|
|
97
|
-
|
|
97
|
+
// null 表示当前不在多行序列里。这里不能用空串来判断:
|
|
98
|
+
// 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
|
|
99
|
+
// 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
|
|
100
|
+
let currentMultilineContent: string | null = null;
|
|
98
101
|
let placeHolderLines: string[] = [];
|
|
99
102
|
|
|
100
103
|
function concat(line: string) {
|
|
@@ -106,11 +109,18 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
|
|
|
106
109
|
placeHolderLines.push(placeholderLine(line));
|
|
107
110
|
}
|
|
108
111
|
|
|
112
|
+
/** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
|
|
113
|
+
function flushMultiline() {
|
|
114
|
+
processedLines.push(currentMultilineContent as string, ...placeHolderLines);
|
|
115
|
+
placeHolderLines = [];
|
|
116
|
+
currentMultilineContent = null;
|
|
117
|
+
}
|
|
118
|
+
|
|
109
119
|
for (const line of lines) {
|
|
110
120
|
if (line.endsWith('\\')) {
|
|
111
121
|
const trueLine = line.slice(0, -1);
|
|
112
122
|
|
|
113
|
-
if (currentMultilineContent ===
|
|
123
|
+
if (currentMultilineContent === null) {
|
|
114
124
|
// first line
|
|
115
125
|
currentMultilineContent = trueLine;
|
|
116
126
|
} else {
|
|
@@ -120,14 +130,10 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
|
|
|
120
130
|
continue;
|
|
121
131
|
}
|
|
122
132
|
|
|
123
|
-
if (currentMultilineContent !==
|
|
133
|
+
if (currentMultilineContent !== null) {
|
|
124
134
|
// end line
|
|
125
135
|
concat(line);
|
|
126
|
-
|
|
127
|
-
processedLines.push(...placeHolderLines);
|
|
128
|
-
|
|
129
|
-
placeHolderLines = [];
|
|
130
|
-
currentMultilineContent = "";
|
|
136
|
+
flushMultiline();
|
|
131
137
|
continue;
|
|
132
138
|
}
|
|
133
139
|
|
|
@@ -135,8 +141,8 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
|
|
|
135
141
|
}
|
|
136
142
|
|
|
137
143
|
// 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
|
|
138
|
-
if (currentMultilineContent !==
|
|
139
|
-
|
|
144
|
+
if (currentMultilineContent !== null) {
|
|
145
|
+
flushMultiline();
|
|
140
146
|
}
|
|
141
147
|
|
|
142
148
|
return processedLines;
|