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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noshift.js",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Joke language.",
5
5
  "bin": {
6
6
  "nsc": "./bin/cli.js"
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) continue;
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: "Underscore '_' found in code.",
597
+ message: `Symbol '${ch}' found. Use ${symbolToNoshift[ch]} instead.`,
577
598
  });
578
- } else if (ch === "$") {
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: "Dollar sign '$' found. Use ^4 instead.",
606
+ message: "Underscore '_' found in code.",
584
607
  });
585
608
  } else if (ch === "#") {
586
609
  warnings.push({