prettier-plugin-noshift.js 0.0.0 → 0.0.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/LICENSE +21 -21
- package/README-ja.md +114 -0
- package/README.md +114 -0
- package/package.json +2 -5
- package/src/convert.js +373 -373
- package/src/index.js +99 -99
- package/src/reverse.js +278 -278
package/src/reverse.js
CHANGED
|
@@ -1,278 +1,278 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JavaScript → NoShift.js 逆変換器
|
|
3
|
-
* Prettierでフォーマット済みのJSコードをNoShift.js構文に変換する。
|
|
4
|
-
*
|
|
5
|
-
* 変換ルール:
|
|
6
|
-
* - コード内のShift記号 → ^X 表記
|
|
7
|
-
* - 大文字 → ^3 + 小文字
|
|
8
|
-
* - 文字列の区切り: " → ^2, ' → ^7, ` → ^@
|
|
9
|
-
* - 文字列内容はそのまま(^3 による大文字化は保持)
|
|
10
|
-
* - ブロックコメント: /* → /^:, */ → ^:/
|
|
11
|
-
* - テンプレート式展開: ${ → ^4^[, } → ^]
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
// JavaScript 記号 → NoShift.js 表記
|
|
15
|
-
const jsToNsMap = {
|
|
16
|
-
"!": "^1",
|
|
17
|
-
'"': "^2",
|
|
18
|
-
$: "^4",
|
|
19
|
-
"%": "^5",
|
|
20
|
-
"&": "^6",
|
|
21
|
-
"'": "^7",
|
|
22
|
-
"(": "^8",
|
|
23
|
-
")": "^9",
|
|
24
|
-
"=": "^-",
|
|
25
|
-
"~": "^^",
|
|
26
|
-
"|": "^\\",
|
|
27
|
-
"`": "^@",
|
|
28
|
-
"{": "^[",
|
|
29
|
-
"}": "^]",
|
|
30
|
-
"+": "^;",
|
|
31
|
-
"*": "^:",
|
|
32
|
-
"<": "^,",
|
|
33
|
-
">": "^.",
|
|
34
|
-
"?": "^/",
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const STATE = {
|
|
38
|
-
NORMAL: "NORMAL",
|
|
39
|
-
IN_DQ_STRING: "IN_DQ_STRING",
|
|
40
|
-
IN_SQ_STRING: "IN_SQ_STRING",
|
|
41
|
-
IN_TEMPLATE: "IN_TEMPLATE",
|
|
42
|
-
IN_TEMPLATE_EXPR: "IN_TEMPLATE_EXPR",
|
|
43
|
-
IN_LINE_COMMENT: "IN_LINE_COMMENT",
|
|
44
|
-
IN_BLOCK_COMMENT: "IN_BLOCK_COMMENT",
|
|
45
|
-
IN_REGEX: "IN_REGEX",
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* フォーマット済みJSをNoShift.js構文に変換する。
|
|
50
|
-
* @param {string} jsCode - Prettierでフォーマット済みのJSコード
|
|
51
|
-
* @param {{ capitalizeInStrings?: boolean }} [options={}]
|
|
52
|
-
* @returns {string} NoShift.jsコード
|
|
53
|
-
*/
|
|
54
|
-
export function convertJsToNsjs(jsCode, options = {}) {
|
|
55
|
-
const capitalizeInStrings = options.capitalizeInStrings !== false;
|
|
56
|
-
let nsCode = "";
|
|
57
|
-
let i = 0;
|
|
58
|
-
const len = jsCode.length;
|
|
59
|
-
|
|
60
|
-
let currentState = STATE.NORMAL;
|
|
61
|
-
const stateStack = [];
|
|
62
|
-
let templateDepth = 0;
|
|
63
|
-
// テンプレートリテラルのネスト深度を追跡するスタック
|
|
64
|
-
const templateBraceDepth = [];
|
|
65
|
-
|
|
66
|
-
while (i < len) {
|
|
67
|
-
const ch = jsCode[i];
|
|
68
|
-
const next = jsCode[i + 1];
|
|
69
|
-
|
|
70
|
-
// ======
|
|
71
|
-
// 行コメント
|
|
72
|
-
// ======
|
|
73
|
-
if (currentState === STATE.IN_LINE_COMMENT) {
|
|
74
|
-
if (ch === "\n") {
|
|
75
|
-
nsCode += "\n";
|
|
76
|
-
currentState = stateStack.pop();
|
|
77
|
-
} else {
|
|
78
|
-
nsCode += ch;
|
|
79
|
-
}
|
|
80
|
-
i++;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// ======
|
|
85
|
-
// ブロックコメント
|
|
86
|
-
// ======
|
|
87
|
-
if (currentState === STATE.IN_BLOCK_COMMENT) {
|
|
88
|
-
if (ch === "*" && next === "/") {
|
|
89
|
-
nsCode += "^:/";
|
|
90
|
-
i += 2;
|
|
91
|
-
currentState = stateStack.pop();
|
|
92
|
-
} else {
|
|
93
|
-
nsCode += ch;
|
|
94
|
-
i++;
|
|
95
|
-
}
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ======
|
|
100
|
-
// ダブルクォート文字列
|
|
101
|
-
// ======
|
|
102
|
-
if (currentState === STATE.IN_DQ_STRING) {
|
|
103
|
-
if (ch === "\\" && i + 1 < len) {
|
|
104
|
-
// エスケープシーケンスはそのまま
|
|
105
|
-
nsCode += ch + next;
|
|
106
|
-
i += 2;
|
|
107
|
-
} else if (ch === '"') {
|
|
108
|
-
nsCode += "^2";
|
|
109
|
-
currentState = stateStack.pop();
|
|
110
|
-
i++;
|
|
111
|
-
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
112
|
-
nsCode += "^3" + ch.toLowerCase();
|
|
113
|
-
i++;
|
|
114
|
-
} else {
|
|
115
|
-
nsCode += ch;
|
|
116
|
-
i++;
|
|
117
|
-
}
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ======
|
|
122
|
-
// シングルクォート文字列
|
|
123
|
-
// ======
|
|
124
|
-
if (currentState === STATE.IN_SQ_STRING) {
|
|
125
|
-
if (ch === "\\" && i + 1 < len) {
|
|
126
|
-
nsCode += ch + next;
|
|
127
|
-
i += 2;
|
|
128
|
-
} else if (ch === "'") {
|
|
129
|
-
nsCode += "^7";
|
|
130
|
-
currentState = stateStack.pop();
|
|
131
|
-
i++;
|
|
132
|
-
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
133
|
-
nsCode += "^3" + ch.toLowerCase();
|
|
134
|
-
i++;
|
|
135
|
-
} else {
|
|
136
|
-
nsCode += ch;
|
|
137
|
-
i++;
|
|
138
|
-
}
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ======
|
|
143
|
-
// テンプレートリテラル
|
|
144
|
-
// ======
|
|
145
|
-
if (currentState === STATE.IN_TEMPLATE) {
|
|
146
|
-
if (ch === "\\" && i + 1 < len) {
|
|
147
|
-
nsCode += ch + next;
|
|
148
|
-
i += 2;
|
|
149
|
-
} else if (ch === "$" && next === "{") {
|
|
150
|
-
nsCode += "^4^[";
|
|
151
|
-
i += 2;
|
|
152
|
-
stateStack.push(currentState);
|
|
153
|
-
currentState = STATE.IN_TEMPLATE_EXPR;
|
|
154
|
-
templateBraceDepth.push(0);
|
|
155
|
-
} else if (ch === "`") {
|
|
156
|
-
nsCode += "^@";
|
|
157
|
-
currentState = stateStack.pop();
|
|
158
|
-
i++;
|
|
159
|
-
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
160
|
-
nsCode += "^3" + ch.toLowerCase();
|
|
161
|
-
i++;
|
|
162
|
-
} else {
|
|
163
|
-
nsCode += ch;
|
|
164
|
-
i++;
|
|
165
|
-
}
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ======
|
|
170
|
-
// テンプレート式内 (${ ... })
|
|
171
|
-
// ======
|
|
172
|
-
if (currentState === STATE.IN_TEMPLATE_EXPR) {
|
|
173
|
-
// テンプレート式内の { } のネスト追跡
|
|
174
|
-
if (ch === "{") {
|
|
175
|
-
templateBraceDepth[templateBraceDepth.length - 1]++;
|
|
176
|
-
nsCode += "^[";
|
|
177
|
-
i++;
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
if (ch === "}") {
|
|
181
|
-
const depth = templateBraceDepth[templateBraceDepth.length - 1];
|
|
182
|
-
if (depth === 0) {
|
|
183
|
-
// テンプレート式の終了
|
|
184
|
-
templateBraceDepth.pop();
|
|
185
|
-
nsCode += "^]";
|
|
186
|
-
currentState = stateStack.pop();
|
|
187
|
-
i++;
|
|
188
|
-
continue;
|
|
189
|
-
} else {
|
|
190
|
-
templateBraceDepth[templateBraceDepth.length - 1]--;
|
|
191
|
-
nsCode += "^]";
|
|
192
|
-
i++;
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// テンプレート式内は通常コードと同じ変換を適用
|
|
197
|
-
// (以下のNORMAL処理にフォールスルー)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// ======
|
|
201
|
-
// NORMAL + IN_TEMPLATE_EXPR 共通処理
|
|
202
|
-
// ======
|
|
203
|
-
if (
|
|
204
|
-
currentState === STATE.NORMAL ||
|
|
205
|
-
currentState === STATE.IN_TEMPLATE_EXPR
|
|
206
|
-
) {
|
|
207
|
-
// 行コメント
|
|
208
|
-
if (ch === "/" && next === "/") {
|
|
209
|
-
nsCode += "//";
|
|
210
|
-
i += 2;
|
|
211
|
-
stateStack.push(currentState);
|
|
212
|
-
currentState = STATE.IN_LINE_COMMENT;
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// ブロックコメント
|
|
217
|
-
if (ch === "/" && next === "*") {
|
|
218
|
-
nsCode += "/^:";
|
|
219
|
-
i += 2;
|
|
220
|
-
stateStack.push(currentState);
|
|
221
|
-
currentState = STATE.IN_BLOCK_COMMENT;
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// ダブルクォート文字列開始
|
|
226
|
-
if (ch === '"') {
|
|
227
|
-
nsCode += "^2";
|
|
228
|
-
i++;
|
|
229
|
-
stateStack.push(currentState);
|
|
230
|
-
currentState = STATE.IN_DQ_STRING;
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// シングルクォート文字列開始
|
|
235
|
-
if (ch === "'") {
|
|
236
|
-
nsCode += "^7";
|
|
237
|
-
i++;
|
|
238
|
-
stateStack.push(currentState);
|
|
239
|
-
currentState = STATE.IN_SQ_STRING;
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// テンプレートリテラル開始
|
|
244
|
-
if (ch === "`") {
|
|
245
|
-
nsCode += "^@";
|
|
246
|
-
i++;
|
|
247
|
-
stateStack.push(currentState);
|
|
248
|
-
currentState = STATE.IN_TEMPLATE;
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// 大文字
|
|
253
|
-
if (/[A-Z]/.test(ch)) {
|
|
254
|
-
nsCode += "^3" + ch.toLowerCase();
|
|
255
|
-
i++;
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Shift 記号
|
|
260
|
-
if (jsToNsMap[ch]) {
|
|
261
|
-
nsCode += jsToNsMap[ch];
|
|
262
|
-
i++;
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// その他(小文字、数字、スペース、改行など)
|
|
267
|
-
nsCode += ch;
|
|
268
|
-
i++;
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// フォールバック
|
|
273
|
-
nsCode += ch;
|
|
274
|
-
i++;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return nsCode;
|
|
278
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript → NoShift.js 逆変換器
|
|
3
|
+
* Prettierでフォーマット済みのJSコードをNoShift.js構文に変換する。
|
|
4
|
+
*
|
|
5
|
+
* 変換ルール:
|
|
6
|
+
* - コード内のShift記号 → ^X 表記
|
|
7
|
+
* - 大文字 → ^3 + 小文字
|
|
8
|
+
* - 文字列の区切り: " → ^2, ' → ^7, ` → ^@
|
|
9
|
+
* - 文字列内容はそのまま(^3 による大文字化は保持)
|
|
10
|
+
* - ブロックコメント: /* → /^:, */ → ^:/
|
|
11
|
+
* - テンプレート式展開: ${ → ^4^[, } → ^]
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// JavaScript 記号 → NoShift.js 表記
|
|
15
|
+
const jsToNsMap = {
|
|
16
|
+
"!": "^1",
|
|
17
|
+
'"': "^2",
|
|
18
|
+
$: "^4",
|
|
19
|
+
"%": "^5",
|
|
20
|
+
"&": "^6",
|
|
21
|
+
"'": "^7",
|
|
22
|
+
"(": "^8",
|
|
23
|
+
")": "^9",
|
|
24
|
+
"=": "^-",
|
|
25
|
+
"~": "^^",
|
|
26
|
+
"|": "^\\",
|
|
27
|
+
"`": "^@",
|
|
28
|
+
"{": "^[",
|
|
29
|
+
"}": "^]",
|
|
30
|
+
"+": "^;",
|
|
31
|
+
"*": "^:",
|
|
32
|
+
"<": "^,",
|
|
33
|
+
">": "^.",
|
|
34
|
+
"?": "^/",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const STATE = {
|
|
38
|
+
NORMAL: "NORMAL",
|
|
39
|
+
IN_DQ_STRING: "IN_DQ_STRING",
|
|
40
|
+
IN_SQ_STRING: "IN_SQ_STRING",
|
|
41
|
+
IN_TEMPLATE: "IN_TEMPLATE",
|
|
42
|
+
IN_TEMPLATE_EXPR: "IN_TEMPLATE_EXPR",
|
|
43
|
+
IN_LINE_COMMENT: "IN_LINE_COMMENT",
|
|
44
|
+
IN_BLOCK_COMMENT: "IN_BLOCK_COMMENT",
|
|
45
|
+
IN_REGEX: "IN_REGEX",
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* フォーマット済みJSをNoShift.js構文に変換する。
|
|
50
|
+
* @param {string} jsCode - Prettierでフォーマット済みのJSコード
|
|
51
|
+
* @param {{ capitalizeInStrings?: boolean }} [options={}]
|
|
52
|
+
* @returns {string} NoShift.jsコード
|
|
53
|
+
*/
|
|
54
|
+
export function convertJsToNsjs(jsCode, options = {}) {
|
|
55
|
+
const capitalizeInStrings = options.capitalizeInStrings !== false;
|
|
56
|
+
let nsCode = "";
|
|
57
|
+
let i = 0;
|
|
58
|
+
const len = jsCode.length;
|
|
59
|
+
|
|
60
|
+
let currentState = STATE.NORMAL;
|
|
61
|
+
const stateStack = [];
|
|
62
|
+
let templateDepth = 0;
|
|
63
|
+
// テンプレートリテラルのネスト深度を追跡するスタック
|
|
64
|
+
const templateBraceDepth = [];
|
|
65
|
+
|
|
66
|
+
while (i < len) {
|
|
67
|
+
const ch = jsCode[i];
|
|
68
|
+
const next = jsCode[i + 1];
|
|
69
|
+
|
|
70
|
+
// ======
|
|
71
|
+
// 行コメント
|
|
72
|
+
// ======
|
|
73
|
+
if (currentState === STATE.IN_LINE_COMMENT) {
|
|
74
|
+
if (ch === "\n") {
|
|
75
|
+
nsCode += "\n";
|
|
76
|
+
currentState = stateStack.pop();
|
|
77
|
+
} else {
|
|
78
|
+
nsCode += ch;
|
|
79
|
+
}
|
|
80
|
+
i++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ======
|
|
85
|
+
// ブロックコメント
|
|
86
|
+
// ======
|
|
87
|
+
if (currentState === STATE.IN_BLOCK_COMMENT) {
|
|
88
|
+
if (ch === "*" && next === "/") {
|
|
89
|
+
nsCode += "^:/";
|
|
90
|
+
i += 2;
|
|
91
|
+
currentState = stateStack.pop();
|
|
92
|
+
} else {
|
|
93
|
+
nsCode += ch;
|
|
94
|
+
i++;
|
|
95
|
+
}
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ======
|
|
100
|
+
// ダブルクォート文字列
|
|
101
|
+
// ======
|
|
102
|
+
if (currentState === STATE.IN_DQ_STRING) {
|
|
103
|
+
if (ch === "\\" && i + 1 < len) {
|
|
104
|
+
// エスケープシーケンスはそのまま
|
|
105
|
+
nsCode += ch + next;
|
|
106
|
+
i += 2;
|
|
107
|
+
} else if (ch === '"') {
|
|
108
|
+
nsCode += "^2";
|
|
109
|
+
currentState = stateStack.pop();
|
|
110
|
+
i++;
|
|
111
|
+
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
112
|
+
nsCode += "^3" + ch.toLowerCase();
|
|
113
|
+
i++;
|
|
114
|
+
} else {
|
|
115
|
+
nsCode += ch;
|
|
116
|
+
i++;
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ======
|
|
122
|
+
// シングルクォート文字列
|
|
123
|
+
// ======
|
|
124
|
+
if (currentState === STATE.IN_SQ_STRING) {
|
|
125
|
+
if (ch === "\\" && i + 1 < len) {
|
|
126
|
+
nsCode += ch + next;
|
|
127
|
+
i += 2;
|
|
128
|
+
} else if (ch === "'") {
|
|
129
|
+
nsCode += "^7";
|
|
130
|
+
currentState = stateStack.pop();
|
|
131
|
+
i++;
|
|
132
|
+
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
133
|
+
nsCode += "^3" + ch.toLowerCase();
|
|
134
|
+
i++;
|
|
135
|
+
} else {
|
|
136
|
+
nsCode += ch;
|
|
137
|
+
i++;
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ======
|
|
143
|
+
// テンプレートリテラル
|
|
144
|
+
// ======
|
|
145
|
+
if (currentState === STATE.IN_TEMPLATE) {
|
|
146
|
+
if (ch === "\\" && i + 1 < len) {
|
|
147
|
+
nsCode += ch + next;
|
|
148
|
+
i += 2;
|
|
149
|
+
} else if (ch === "$" && next === "{") {
|
|
150
|
+
nsCode += "^4^[";
|
|
151
|
+
i += 2;
|
|
152
|
+
stateStack.push(currentState);
|
|
153
|
+
currentState = STATE.IN_TEMPLATE_EXPR;
|
|
154
|
+
templateBraceDepth.push(0);
|
|
155
|
+
} else if (ch === "`") {
|
|
156
|
+
nsCode += "^@";
|
|
157
|
+
currentState = stateStack.pop();
|
|
158
|
+
i++;
|
|
159
|
+
} else if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
160
|
+
nsCode += "^3" + ch.toLowerCase();
|
|
161
|
+
i++;
|
|
162
|
+
} else {
|
|
163
|
+
nsCode += ch;
|
|
164
|
+
i++;
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ======
|
|
170
|
+
// テンプレート式内 (${ ... })
|
|
171
|
+
// ======
|
|
172
|
+
if (currentState === STATE.IN_TEMPLATE_EXPR) {
|
|
173
|
+
// テンプレート式内の { } のネスト追跡
|
|
174
|
+
if (ch === "{") {
|
|
175
|
+
templateBraceDepth[templateBraceDepth.length - 1]++;
|
|
176
|
+
nsCode += "^[";
|
|
177
|
+
i++;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (ch === "}") {
|
|
181
|
+
const depth = templateBraceDepth[templateBraceDepth.length - 1];
|
|
182
|
+
if (depth === 0) {
|
|
183
|
+
// テンプレート式の終了
|
|
184
|
+
templateBraceDepth.pop();
|
|
185
|
+
nsCode += "^]";
|
|
186
|
+
currentState = stateStack.pop();
|
|
187
|
+
i++;
|
|
188
|
+
continue;
|
|
189
|
+
} else {
|
|
190
|
+
templateBraceDepth[templateBraceDepth.length - 1]--;
|
|
191
|
+
nsCode += "^]";
|
|
192
|
+
i++;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// テンプレート式内は通常コードと同じ変換を適用
|
|
197
|
+
// (以下のNORMAL処理にフォールスルー)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ======
|
|
201
|
+
// NORMAL + IN_TEMPLATE_EXPR 共通処理
|
|
202
|
+
// ======
|
|
203
|
+
if (
|
|
204
|
+
currentState === STATE.NORMAL ||
|
|
205
|
+
currentState === STATE.IN_TEMPLATE_EXPR
|
|
206
|
+
) {
|
|
207
|
+
// 行コメント
|
|
208
|
+
if (ch === "/" && next === "/") {
|
|
209
|
+
nsCode += "//";
|
|
210
|
+
i += 2;
|
|
211
|
+
stateStack.push(currentState);
|
|
212
|
+
currentState = STATE.IN_LINE_COMMENT;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ブロックコメント
|
|
217
|
+
if (ch === "/" && next === "*") {
|
|
218
|
+
nsCode += "/^:";
|
|
219
|
+
i += 2;
|
|
220
|
+
stateStack.push(currentState);
|
|
221
|
+
currentState = STATE.IN_BLOCK_COMMENT;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ダブルクォート文字列開始
|
|
226
|
+
if (ch === '"') {
|
|
227
|
+
nsCode += "^2";
|
|
228
|
+
i++;
|
|
229
|
+
stateStack.push(currentState);
|
|
230
|
+
currentState = STATE.IN_DQ_STRING;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// シングルクォート文字列開始
|
|
235
|
+
if (ch === "'") {
|
|
236
|
+
nsCode += "^7";
|
|
237
|
+
i++;
|
|
238
|
+
stateStack.push(currentState);
|
|
239
|
+
currentState = STATE.IN_SQ_STRING;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// テンプレートリテラル開始
|
|
244
|
+
if (ch === "`") {
|
|
245
|
+
nsCode += "^@";
|
|
246
|
+
i++;
|
|
247
|
+
stateStack.push(currentState);
|
|
248
|
+
currentState = STATE.IN_TEMPLATE;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// 大文字
|
|
253
|
+
if (/[A-Z]/.test(ch)) {
|
|
254
|
+
nsCode += "^3" + ch.toLowerCase();
|
|
255
|
+
i++;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Shift 記号
|
|
260
|
+
if (jsToNsMap[ch]) {
|
|
261
|
+
nsCode += jsToNsMap[ch];
|
|
262
|
+
i++;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// その他(小文字、数字、スペース、改行など)
|
|
267
|
+
nsCode += ch;
|
|
268
|
+
i++;
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// フォールバック
|
|
273
|
+
nsCode += ch;
|
|
274
|
+
i++;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return nsCode;
|
|
278
|
+
}
|