noshift.js 0.4.0 → 0.4.1
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/commands/compile.js +1 -1
- package/package.json +1 -1
- package/src/convert.js +59 -36
package/commands/compile.js
CHANGED
|
@@ -76,7 +76,7 @@ export default async function compile() {
|
|
|
76
76
|
|
|
77
77
|
// 大文字警告チェック
|
|
78
78
|
if (warnUppercase) {
|
|
79
|
-
const warnings = checkUppercaseWarnings(code);
|
|
79
|
+
const warnings = checkUppercaseWarnings(code, convertOptions);
|
|
80
80
|
for (const w of warnings) {
|
|
81
81
|
logger.warn(
|
|
82
82
|
`${relative.replace(/\\/g, "/")}:${w.line}:${w.column} - ${w.message}`,
|
package/package.json
CHANGED
package/src/convert.js
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
// ======
|
|
2
|
+
// NoShift.js → JavaScript 置換用マップ
|
|
3
|
+
// ======
|
|
4
|
+
const noShiftMap = {
|
|
5
|
+
// "^@^@^@": "```", // マルチバックチック
|
|
6
|
+
"^4^[": "${", // テンプレート式展開開始
|
|
7
|
+
"^1": "!",
|
|
8
|
+
"^2": '"',
|
|
9
|
+
"^4": "$",
|
|
10
|
+
"^5": "%",
|
|
11
|
+
"^6": "&",
|
|
12
|
+
"^7": "'",
|
|
13
|
+
"^8": "(",
|
|
14
|
+
"^9": ")",
|
|
15
|
+
"^-": "=",
|
|
16
|
+
"^^": "~",
|
|
17
|
+
"^\\": "|",
|
|
18
|
+
"^@": "`",
|
|
19
|
+
"^[": "{",
|
|
20
|
+
"^]": "}",
|
|
21
|
+
"^;": "+",
|
|
22
|
+
"^:": "*",
|
|
23
|
+
"^,": "<",
|
|
24
|
+
"^.": ">",
|
|
25
|
+
"^/": "?",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// 逆引きマップ: JavaScript 記号 → NoShift 表記(単一記号のみ)
|
|
29
|
+
const symbolToNoshift = Object.fromEntries(
|
|
30
|
+
Object.entries(noShiftMap)
|
|
31
|
+
.filter(([key, value]) => key.length === 2 && value.length === 1)
|
|
32
|
+
.map(([key, value]) => [value, key]),
|
|
33
|
+
);
|
|
34
|
+
|
|
1
35
|
function convertNsjsToJs(nsjsCode, options = {}) {
|
|
2
36
|
const capitalizeInStrings = options.capitalizeInStrings !== false;
|
|
3
37
|
let jsCode = "";
|
|
@@ -23,33 +57,6 @@ function convertNsjsToJs(nsjsCode, options = {}) {
|
|
|
23
57
|
let currentState = STATE.NORMAL;
|
|
24
58
|
const stateStack = [];
|
|
25
59
|
|
|
26
|
-
// ======
|
|
27
|
-
// NoShift.js → JavaScript 置換用マップ
|
|
28
|
-
// ======
|
|
29
|
-
const noShiftMap = {
|
|
30
|
-
// "^@^@^@": "```", // マルチバックチック
|
|
31
|
-
"^4^[": "${", // テンプレート式展開開始
|
|
32
|
-
"^1": "!",
|
|
33
|
-
"^2": '"',
|
|
34
|
-
"^4": "$",
|
|
35
|
-
"^5": "%",
|
|
36
|
-
"^6": "&",
|
|
37
|
-
"^7": "'",
|
|
38
|
-
"^8": "(",
|
|
39
|
-
"^9": ")",
|
|
40
|
-
"^-": "=",
|
|
41
|
-
"^^": "~",
|
|
42
|
-
"^\\": "|",
|
|
43
|
-
"^@": "`",
|
|
44
|
-
"^[": "{",
|
|
45
|
-
"^]": "}",
|
|
46
|
-
"^;": "+",
|
|
47
|
-
"^:": "*",
|
|
48
|
-
"^,": "<",
|
|
49
|
-
"^.": ">",
|
|
50
|
-
"^/": "?",
|
|
51
|
-
};
|
|
52
|
-
|
|
53
60
|
// マッピングキーは長いものからマッチさせる
|
|
54
61
|
const sortedNsKeys = Object.keys(noShiftMap).sort(
|
|
55
62
|
(a, b) => b.length - a.length,
|
|
@@ -463,11 +470,14 @@ function convertNsjsToJs(nsjsCode, options = {}) {
|
|
|
463
470
|
|
|
464
471
|
/**
|
|
465
472
|
* ソースコード内の大文字、_, $, # の使用を警告する。
|
|
466
|
-
*
|
|
473
|
+
* コメント内は無視する。
|
|
474
|
+
* capitalizeInStrings が true の場合、文字列内の大文字も警告する。
|
|
467
475
|
* @param {string} nsjsCode
|
|
476
|
+
* @param {{ capitalizeInStrings?: boolean }} [options={}]
|
|
468
477
|
* @returns {{ line: number, column: number, char: string, message: string }[]}
|
|
469
478
|
*/
|
|
470
|
-
export function checkUppercaseWarnings(nsjsCode) {
|
|
479
|
+
export function checkUppercaseWarnings(nsjsCode, options = {}) {
|
|
480
|
+
const capitalizeInStrings = options.capitalizeInStrings !== false;
|
|
471
481
|
const warnings = [];
|
|
472
482
|
const lines = nsjsCode.split("\n");
|
|
473
483
|
|
|
@@ -549,8 +559,19 @@ export function checkUppercaseWarnings(nsjsCode) {
|
|
|
549
559
|
continue;
|
|
550
560
|
}
|
|
551
561
|
|
|
552
|
-
//
|
|
553
|
-
if (inDQ || inSQ || inBT)
|
|
562
|
+
// 文字列内の処理
|
|
563
|
+
if (inDQ || inSQ || inBT) {
|
|
564
|
+
// capitalizeInStrings が有効なら、文字列内の大文字も警告
|
|
565
|
+
if (capitalizeInStrings && /[A-Z]/.test(ch)) {
|
|
566
|
+
warnings.push({
|
|
567
|
+
line: lineNum + 1,
|
|
568
|
+
column: col + 1,
|
|
569
|
+
char: ch,
|
|
570
|
+
message: `Uppercase letter '${ch}' found in string. Use ^3${ch.toLowerCase()} instead.`,
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
continue;
|
|
574
|
+
}
|
|
554
575
|
|
|
555
576
|
// 他の ^X シーケンスをスキップ
|
|
556
577
|
if (ch === "^" && next && /[0-9\-^\\@\[\];:,./]/.test(next)) {
|
|
@@ -567,20 +588,22 @@ export function checkUppercaseWarnings(nsjsCode) {
|
|
|
567
588
|
message: `Uppercase letter '${ch}' found. Use ^3${ch.toLowerCase()} instead.`,
|
|
568
589
|
});
|
|
569
590
|
}
|
|
570
|
-
//
|
|
571
|
-
else if (ch
|
|
591
|
+
// Shift キーが必要な記号の警告
|
|
592
|
+
else if (symbolToNoshift[ch]) {
|
|
572
593
|
warnings.push({
|
|
573
594
|
line: lineNum + 1,
|
|
574
595
|
column: col + 1,
|
|
575
596
|
char: ch,
|
|
576
|
-
message:
|
|
597
|
+
message: `Symbol '${ch}' found. Use ${symbolToNoshift[ch]} instead.`,
|
|
577
598
|
});
|
|
578
|
-
}
|
|
599
|
+
}
|
|
600
|
+
// _, # の警告
|
|
601
|
+
else if (ch === "_") {
|
|
579
602
|
warnings.push({
|
|
580
603
|
line: lineNum + 1,
|
|
581
604
|
column: col + 1,
|
|
582
605
|
char: ch,
|
|
583
|
-
message: "
|
|
606
|
+
message: "Underscore '_' found in code.",
|
|
584
607
|
});
|
|
585
608
|
} else if (ch === "#") {
|
|
586
609
|
warnings.push({
|