prh 6.0.5 → 6.1.0
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 +2 -1
- package/lib/changeset/index.js +1 -3
- package/lib/changeset/index.js.map +1 -1
- package/lib/cli.js +37 -4
- package/lib/cli.js.map +1 -1
- package/lib/engine.js +34 -1
- package/lib/engine.js.map +1 -1
- package/lib/index.js +36 -3
- package/lib/index.js.map +1 -1
- package/lib/raw.d.ts +107 -0
- package/lib/raw.js.map +1 -1
- package/lib/rule.js +1 -1
- package/lib/rule.js.map +1 -1
- package/lib/utils/regexp.d.ts +0 -1
- package/lib/utils/regexp.js +12 -25
- package/lib/utils/regexp.js.map +1 -1
- package/misc/prh.yml +2 -1
- package/package.json +6 -5
- package/prh.schema.json +414 -0
package/README.md
CHANGED
|
@@ -83,7 +83,8 @@ see prh/rules collection https://github.com/prh/rules
|
|
|
83
83
|
実用上は `git submodule add https://github.com/prh/rules.git prh-rules` して好きなルールを使います。
|
|
84
84
|
これを参照するprh.ymlは次のように書きます。
|
|
85
85
|
|
|
86
|
-
```
|
|
86
|
+
```yaml
|
|
87
|
+
# yaml-language-server: $schema=https://raw.githubusercontent.com/prh/prh/master/prh.schema.json
|
|
87
88
|
version: 1
|
|
88
89
|
|
|
89
90
|
imports:
|
package/lib/changeset/index.js
CHANGED
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Diff = exports.ChangeSet = void 0;
|
|
4
4
|
exports.makeChangeSet = makeChangeSet;
|
|
5
|
-
const regexp_1 = require("../utils/regexp");
|
|
6
5
|
const diff_1 = require("./diff");
|
|
7
6
|
Object.defineProperty(exports, "Diff", { enumerable: true, get: function () { return diff_1.Diff; } });
|
|
8
7
|
const changeset_1 = require("./changeset");
|
|
9
8
|
Object.defineProperty(exports, "ChangeSet", { enumerable: true, get: function () { return changeset_1.ChangeSet; } });
|
|
10
9
|
function makeChangeSet(filePath, content, pattern, expected) {
|
|
11
|
-
|
|
12
|
-
const resultList = (0, regexp_1.collectAll)(pattern, content);
|
|
10
|
+
const resultList = [...content.matchAll(pattern)];
|
|
13
11
|
const diffs = resultList.map((matches) => new diff_1.Diff({ pattern, expected, index: matches.index, matches }));
|
|
14
12
|
return new changeset_1.ChangeSet({ filePath, content, diffs });
|
|
15
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAKA,sCAIC;AATD,iCAA8B;AAGV,qFAHX,WAAI,OAGW;AAFxB,2CAAwC;AAE/B,0FAFA,qBAAS,OAEA;AAElB,SAAgB,aAAa,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAe,EAAE,QAAiB;IAC/F,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,WAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1G,OAAO,IAAI,qBAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { Diff } from \"./diff\";\nimport { ChangeSet } from \"./changeset\";\n\nexport { ChangeSet, Diff };\n\nexport function makeChangeSet(filePath: string, content: string, pattern: RegExp, expected?: string): ChangeSet {\n const resultList = [...content.matchAll(pattern)];\n const diffs = resultList.map((matches) => new Diff({ pattern, expected, index: matches.index, matches }));\n return new ChangeSet({ filePath, content, diffs });\n}\n"]}
|
package/lib/cli.js
CHANGED
|
@@ -1,9 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const path = require("path");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const yaml = require("js-yaml");
|
|
6
|
-
const diff = require("diff");
|
|
36
|
+
const path = __importStar(require("path"));
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const yaml = __importStar(require("js-yaml"));
|
|
39
|
+
const diff = __importStar(require("diff"));
|
|
7
40
|
const _1 = require("./");
|
|
8
41
|
const content_1 = require("./utils/content");
|
|
9
42
|
const commander_1 = require("commander");
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from \"path\";\nimport * as fs from \"fs\";\nimport * as yaml from \"js-yaml\";\nimport * as diff from \"diff\";\n\nimport { fromYAMLFilePaths, getRuleFilePath } from \"./\";\nimport { indexToLineColumn } from \"./utils/content\";\n\nimport { Command } from \"commander\";\nconst pkg = require(\"../package.json\");\n\ninterface Options {\n rulesJson: boolean;\n rulesYaml: boolean;\n replace: boolean;\n verify: boolean;\n stdout: boolean;\n diff: boolean;\n verbose: boolean;\n rules?: string[];\n}\n\nconst program = new Command();\n\nprogram\n .name(\"prh\")\n .version(pkg.version, \"-v, --version\")\n .argument(\"[files...]\")\n .option(\"--rules-json\", \"emit rule set in json format\")\n .option(\"--rules-yaml\", \"emit rule set in yaml format\")\n .option(\"--rules <path>\", \"path to rule yaml file\", (value: string, previous: string[]) => previous.concat([value]), [] as string[])\n .option(\"--verify\", \"checking file validity\")\n .option(\"--stdout\", \"print replaced content to stdout\")\n .option(\"--diff\", \"show unified diff\")\n .option(\"--verbose\", \"makes output more verbose\")\n .option(\"-r, --replace\", \"replace input files\")\n .action((files: string[], opts: Options) => {\n if (opts.rulesJson || opts.rulesYaml) {\n if (opts.verbose) {\n console.warn(`processing ${process.cwd()} dir...`);\n }\n const engine = getEngineByTargetDir(process.cwd(), opts);\n if (opts.rulesJson) {\n console.log(JSON.stringify(engine, null, 2));\n return;\n } else if (opts.rulesYaml) {\n console.log(yaml.dump(JSON.parse(JSON.stringify(engine, null, 2))));\n return;\n }\n }\n\n if (files.length === 0) {\n throw new Error(\"files is required more than 1 argument\");\n }\n\n const invalidFiles: string[] = [];\n files.forEach((filePath) => {\n if (opts.verbose) {\n console.warn(`processing ${filePath}...`);\n }\n const content = fs.readFileSync(filePath, { encoding: \"utf8\" });\n const engine = getEngineByTargetDir(path.dirname(filePath), opts);\n const changeSet = engine.makeChangeSet(filePath);\n if (changeSet.diffs.length !== 0) {\n invalidFiles.push(filePath);\n }\n\n if (opts.stdout) {\n const result = changeSet.applyChangeSets(content);\n process.stdout.write(result);\n } else if (opts.diff) {\n const result = changeSet.applyChangeSets(content);\n const patch = diff.createPatch(filePath, content, result, \"before\", \"replaced\");\n console.log(patch);\n } else if (opts.replace) {\n const result = changeSet.applyChangeSets(content);\n if (content !== result) {\n fs.writeFileSync(filePath, result);\n console.warn(`replaced ${filePath}`);\n }\n } else {\n changeSet.diffs.forEach((d) => {\n const before = changeSet.content.substr(d.index, d.tailIndex - d.index);\n const after = d.newText;\n if (after == null) {\n return;\n }\n const lineColumn = indexToLineColumn(d.index, changeSet.content);\n console.log(`${changeSet.filePath}(${lineColumn.line + 1},${lineColumn.column + 1}): ${before} → ${after}`);\n });\n }\n });\n if (opts.verify && invalidFiles.length !== 0) {\n throw new Error(`${invalidFiles.join(\" ,\")} failed proofreading`);\n }\n });\n\nprogram\n .command(\"init\")\n .description(\"generate prh.yml\")\n .action(() => {\n fs.createReadStream(path.resolve(__dirname, \"../misc/prh.yml\")).pipe(fs.createWriteStream(\"prh.yml\"));\n console.log(\"create prh.yml\");\n console.log(\"see prh/rules collection https://github.com/prh/rules\");\n });\n\nfunction getEngineByTargetDir(targetDir: string, opts: Options) {\n let rulePaths: string[];\n if (opts.rules && opts.rules[0]) {\n rulePaths = [...opts.rules];\n } else {\n const foundPath = getRuleFilePath(targetDir);\n if (!foundPath) {\n throw new Error(`can't find rule file from ${targetDir}`);\n }\n\n rulePaths = [foundPath];\n }\n\n if (opts.verbose) {\n rulePaths.forEach((p, i) => {\n console.warn(` apply ${i + 1}: ${p}`);\n });\n }\n\n return fromYAMLFilePaths(...rulePaths);\n}\n\nprogram.parseAsync(process.argv).catch(errorHandler);\n\nfunction errorHandler(err: any) {\n if (err instanceof Error) {\n console.error(err.stack);\n } else {\n console.error(err);\n }\n return Promise.resolve(null).then(() => {\n process.exit(1);\n });\n}\n"]}
|
package/lib/engine.js
CHANGED
|
@@ -1,7 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.Engine = void 0;
|
|
4
|
-
const fs = require("fs");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
5
38
|
const regexp_1 = require("./utils/regexp");
|
|
6
39
|
const paragraph_1 = require("./paragraph");
|
|
7
40
|
const target_1 = require("./target");
|
package/lib/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"fs\";\n\nimport { equals } from \"./utils/regexp\";\n\nimport * as raw from \"./raw\";\nimport { Paragraph } from \"./paragraph\";\nimport { Target } from \"./target\";\nimport { Rule } from \"./rule\";\nimport { makeChangeSet, ChangeSet } from \"./changeset\";\n\nexport class Engine {\n version: number;\n targets: Target[];\n rules: Rule[];\n sourcePaths: string[]; // NOTE ソースとなったファイルのパス\n\n constructor(src: raw.Config) {\n if (!src) {\n throw new Error(\"src is required\");\n }\n this.version = +src.version || 1;\n this.targets = (src.targets || []).map((target) => new Target(target));\n this.rules = (src.rules || []).map((rule) => new Rule(rule));\n this.sourcePaths = [];\n }\n\n merge(other: Engine) {\n if (!other) {\n throw new Error(\"other is required\");\n }\n if (this.version !== other.version) {\n throw new Error(\"version mismatch!\");\n }\n other.sourcePaths.forEach((sourcePath) => {\n const exists = this.sourcePaths.filter((otherSourcePath) => otherSourcePath === sourcePath).length !== 0;\n if (!exists) {\n this.sourcePaths.push(sourcePath);\n }\n });\n other.targets.forEach((otherTarget) => {\n const exists = this.targets.filter((target) => equals(target.file, otherTarget.file)).length !== 0;\n if (!exists) {\n this.targets.push(otherTarget);\n }\n });\n // NOTE https://github.com/vvakame/prh/issues/18#issuecomment-222524140\n const reqRules = other.rules.filter((otherRule) => {\n return this.rules.filter((rule) => rule.expected === otherRule.expected).length === 0;\n });\n this.rules = this.rules.concat(reqRules);\n }\n\n makeChangeSet(filePath: string, contentText?: string): ChangeSet {\n const content: string = contentText != null ? contentText : fs.readFileSync(filePath, { encoding: \"utf8\" });\n\n const re = /([^]*?)\\n{2,}/g;\n const paragraphs: Paragraph[] = [];\n {\n let lastIndex = 0;\n while (true) {\n const matches = re.exec(content);\n if (!matches) {\n paragraphs.push(new Paragraph(lastIndex, content.substr(lastIndex)));\n break;\n }\n paragraphs.push(new Paragraph(matches.index, matches[1]));\n lastIndex = re.lastIndex;\n }\n }\n\n const diffs = paragraphs.map((p) => p.makeDiffs(this.rules)).reduce((p, c) => p.concat(c), []);\n let changeSet = new ChangeSet({ filePath, content, diffs });\n\n let includes: ChangeSet | null = null;\n let excludes: ChangeSet | null = null;\n this.targets.forEach((target) => {\n target.reset();\n if (!target.file.test(filePath)) {\n return;\n }\n if (target.includes.length !== 0) {\n // .ts の // の後や /* */ の内部だけ対象にしたい場合のための機能\n target.includes.forEach((include) => {\n const intersect = makeChangeSet(filePath, content, include.pattern);\n if (includes) {\n includes = includes.concat(intersect);\n } else {\n includes = intersect;\n }\n });\n }\n if (target.excludes.length !== 0) {\n // .re の #@ の後を対象にしたくない場合のための機能\n target.excludes.forEach((exclude) => {\n const subsract = makeChangeSet(filePath, content, exclude.pattern);\n if (excludes) {\n excludes = excludes.concat(subsract);\n } else {\n excludes = subsract;\n }\n });\n }\n });\n\n if (includes) {\n changeSet = changeSet.intersect(includes);\n }\n if (excludes) {\n changeSet = changeSet.subtract(excludes);\n }\n\n return changeSet;\n }\n\n replaceByRule(filePath: string, content?: string) {\n if (content == null) {\n content = fs.readFileSync(filePath, { encoding: \"utf8\" });\n }\n const changeSet = this.makeChangeSet(filePath, content);\n return changeSet.applyChangeSets(content);\n }\n}\n"]}
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.Diff = exports.ChangeSet = exports.Engine = void 0;
|
|
4
37
|
exports.fromYAMLFilePaths = fromYAMLFilePaths;
|
|
@@ -10,9 +43,9 @@ exports.fromYAMLFilePathAsync = fromYAMLFilePathAsync;
|
|
|
10
43
|
exports.fromYAMLAsync = fromYAMLAsync;
|
|
11
44
|
exports.fromRowConfigAsync = fromRowConfigAsync;
|
|
12
45
|
exports.getRuleFilePath = getRuleFilePath;
|
|
13
|
-
const fs = require("fs");
|
|
14
|
-
const path = require("path");
|
|
15
|
-
const yaml = require("js-yaml");
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const yaml = __importStar(require("js-yaml"));
|
|
16
49
|
const engine_1 = require("./engine");
|
|
17
50
|
Object.defineProperty(exports, "Engine", { enumerable: true, get: function () { return engine_1.Engine; } });
|
|
18
51
|
const changeset_1 = require("./changeset/");
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"js-yaml\";\n\nimport * as raw from \"./raw\";\nimport { Engine } from \"./engine\";\nimport { ChangeSet, Diff } from \"./changeset/\";\n\nexport { Engine, ChangeSet, Diff };\n\nexport function fromYAMLFilePaths(...configPaths: string[]): Engine {\n const engine = fromYAMLFilePath(configPaths[0]);\n configPaths.splice(1).forEach((path) => {\n engine.merge(fromYAMLFilePath(path));\n });\n return engine;\n}\n\nexport interface Options {\n disableImports?: boolean;\n}\n\nexport function fromYAMLFilePath(configPath: string, opts: Options = {}): Engine {\n const content = fs.readFileSync(configPath, { encoding: \"utf8\" });\n return fromYAML(configPath, content, opts);\n}\n\nexport function fromYAML(configPath: string, yamlContent: string, opts: Options = {}): Engine {\n const rawConfig = yaml.load(yamlContent) as raw.Config;\n return fromRowConfig(configPath, rawConfig, opts);\n}\n\nexport function fromRowConfig(configPath: string, rawConfig: raw.Config, opts: Options = {}): Engine {\n const engine = new Engine(rawConfig);\n engine.sourcePaths.push(path.normalize(configPath));\n\n if (!opts.disableImports && rawConfig.imports) {\n // TODO この辺の処理をEngine側に移したい\n // なるべく破壊的変更を避ける\n // fsやyamlを使わずに同等のEngineを組み立てる余地を残す\n // async化したいけどprhの参照パッケージが壊れるのが辛い\n\n let importSpecs: raw.ImportSpec[];\n if (typeof rawConfig.imports === \"string\") {\n importSpecs = [\n {\n path: rawConfig.imports,\n },\n ];\n } else {\n importSpecs = rawConfig.imports.map((imp) => {\n if (typeof imp === \"string\") {\n return {\n path: imp,\n };\n }\n return imp;\n });\n }\n importSpecs.forEach((importSpec) => {\n const importedConfigPath = path.join(path.dirname(configPath), importSpec.path);\n const newEngine = fromYAMLFilePath(importedConfigPath, {\n disableImports: !!importSpec.disableImports,\n });\n\n const ignoreRules = (importSpec.ignoreRules || []).map((ignoreRule) => {\n return typeof ignoreRule === \"string\" ? { pattern: ignoreRule } : ignoreRule;\n });\n newEngine.rules = newEngine.rules.filter((rule) => {\n return ignoreRules.every((ignoreRule) => {\n return !rule._shouldIgnore(ignoreRule);\n });\n });\n\n engine.merge(newEngine);\n });\n }\n\n return engine;\n}\n\nexport function fromYAMLFilePathsAsync(...configPaths: string[]): Promise<Engine> {\n try {\n return Promise.resolve(fromYAMLFilePaths(...configPaths));\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport function fromYAMLFilePathAsync(configPath: string, opts: Options = {}): Promise<Engine> {\n try {\n return Promise.resolve(fromYAMLFilePath(configPath, opts));\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport function fromYAMLAsync(configPath: string, yamlContent: string, opts: Options = {}): Promise<Engine> {\n try {\n return Promise.resolve(fromYAML(configPath, yamlContent, opts));\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport function fromRowConfigAsync(configPath: string, rawConfig: raw.Config, opts: Options = {}): Promise<Engine> {\n try {\n return Promise.resolve(fromRowConfig(configPath, rawConfig, opts));\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport function getRuleFilePath(baseDir: string, configFileName = \"prh.yml\"): string | null {\n const configFilePath = path.resolve(baseDir, configFileName);\n if (fs.existsSync(configFilePath)) {\n return configFilePath;\n }\n\n if (baseDir.length === path.dirname(baseDir).length) {\n return null;\n }\n\n return getRuleFilePath(path.resolve(baseDir, \"../\"), configFileName);\n}\n"]}
|
package/lib/raw.d.ts
CHANGED
|
@@ -1,38 +1,145 @@
|
|
|
1
1
|
export interface Config {
|
|
2
|
+
/**
|
|
3
|
+
* 設定ファイル形式のバージョンを指定します。
|
|
4
|
+
* @example 1
|
|
5
|
+
*/
|
|
2
6
|
version: number;
|
|
7
|
+
/** ルールセットのメタデータを指定します。この値は校正処理には影響しません。 */
|
|
8
|
+
meta?: {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* 現在の設定へ統合する別の設定ファイルを指定します。パスは現在の設定ファイルを基準に解決されます。
|
|
13
|
+
* @example "./prh-rules/media/techbooster.yml"
|
|
14
|
+
* @example ["./prh-rules/media/techbooster.yml", "./prh-rules/files/markdown.yml"]
|
|
15
|
+
* @example [{ "path": "./prh-rules/media/techbooster.yml", "ignoreRules": ["/テストB/gmu"] }]
|
|
16
|
+
*/
|
|
3
17
|
imports?: string | (string | ImportSpec)[];
|
|
18
|
+
/**
|
|
19
|
+
* ファイルパスごとに、ファイル内で校正対象とする範囲と除外する範囲を指定します。
|
|
20
|
+
* @example [{ "file": "/\\.md$/", "excludes": ["/`.*?`/"] }]
|
|
21
|
+
*/
|
|
4
22
|
targets?: Target[];
|
|
23
|
+
/**
|
|
24
|
+
* 適用する校正ルールを指定します。文字列を指定すると、その文字列を`expected`に指定したルールとして扱われます。
|
|
25
|
+
* @example ["Cookie", { "expected": "デフォルト", "pattern": "ディフォルト" }]
|
|
26
|
+
*/
|
|
5
27
|
rules?: (string | Rule)[];
|
|
6
28
|
}
|
|
7
29
|
export interface ImportSpec {
|
|
30
|
+
/**
|
|
31
|
+
* 統合する設定ファイルのパスを指定します。パスは現在の設定ファイルを基準に解決されます。
|
|
32
|
+
* @example "./prh-rules/media/techbooster.yml"
|
|
33
|
+
*/
|
|
8
34
|
path: string;
|
|
35
|
+
/**
|
|
36
|
+
* `true`の場合、指定した設定ファイル内の`imports`を処理しません。
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
9
39
|
disableImports?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* 指定した設定ファイルから読み込まれたルールのうち、統合から除外するルールを指定します。要素に文字列を指定した場合は、同じ文字列を`pattern`に指定したものとして扱われます。
|
|
42
|
+
* @example ["/テストB/gmu"]
|
|
43
|
+
* @example [{ "expected": "テストA" }]
|
|
44
|
+
*/
|
|
10
45
|
ignoreRules?: (string | IgnoreRule)[];
|
|
11
46
|
}
|
|
12
47
|
export interface IgnoreRule {
|
|
48
|
+
/**
|
|
49
|
+
* 除外するルールを、照合用正規表現を表す文字列で指定します。たとえば、`pattern: テストB`のルールを除外する場合は`/テストB/gmu`を指定します。
|
|
50
|
+
* `pattern`を省略したルールでは`expected`から生成された正規表現になるため、`prh --rules-yaml`の出力で実際の値を確認してください。
|
|
51
|
+
* @example "/テストB/gmu"
|
|
52
|
+
*/
|
|
13
53
|
pattern?: string;
|
|
54
|
+
/**
|
|
55
|
+
* 除外するルールを、校正後に期待する文字列で指定します。
|
|
56
|
+
* @example "テストA"
|
|
57
|
+
*/
|
|
14
58
|
expected?: string;
|
|
15
59
|
}
|
|
16
60
|
export interface Target {
|
|
61
|
+
/**
|
|
62
|
+
* 校正範囲の設定を適用するファイルパスに一致する文字列または正規表現形式の文字列を指定します。
|
|
63
|
+
* @example "/\\.md$/"
|
|
64
|
+
* @example "/\\.re$/"
|
|
65
|
+
*/
|
|
17
66
|
file: string;
|
|
67
|
+
/**
|
|
68
|
+
* ファイル内で校正対象とする範囲を指定します。複数指定した場合は、いずれかに一致する範囲が対象になります。
|
|
69
|
+
* @example ["/\\/\\/.*$/"]
|
|
70
|
+
*/
|
|
18
71
|
includes?: (string | TargetPattern)[];
|
|
72
|
+
/**
|
|
73
|
+
* ファイル内で校正対象から除外する範囲を指定します。`includes`と`excludes`の両方に一致する範囲は除外されます。
|
|
74
|
+
* @example ["/`.*?`/", "/\\[[^\\]]*\\]\\([^)]+\\)/"]
|
|
75
|
+
* @example [{ "pattern": "/^#@.*$/" }]
|
|
76
|
+
*/
|
|
19
77
|
excludes?: (string | TargetPattern)[];
|
|
20
78
|
}
|
|
21
79
|
export interface TargetPattern {
|
|
80
|
+
/**
|
|
81
|
+
* ファイル内の範囲に一致する文字列または正規表現形式の文字列を指定します。
|
|
82
|
+
* @example "/^#@.*$/"
|
|
83
|
+
*/
|
|
22
84
|
pattern: string;
|
|
23
85
|
}
|
|
24
86
|
export interface Rule {
|
|
87
|
+
/**
|
|
88
|
+
* 校正後に期待する文字列を指定します。`pattern`のキャプチャグループを`$1`の形式で参照できます。
|
|
89
|
+
* @example "ソフトウェア"
|
|
90
|
+
* @example "($1)"
|
|
91
|
+
*/
|
|
25
92
|
expected: string;
|
|
93
|
+
/**
|
|
94
|
+
* 修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。
|
|
95
|
+
* `pattern`と`patterns`のどちらも省略した場合は`expected`からパターンを生成します。
|
|
96
|
+
* @example "ディフォルト"
|
|
97
|
+
* @example "/サーバ(?!ー)/"
|
|
98
|
+
* @example ["ハードウエアー", "ハードウェアー", "ハードウエア"]
|
|
99
|
+
*/
|
|
26
100
|
pattern?: string | string[] | null;
|
|
101
|
+
/**
|
|
102
|
+
* 修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。`pattern`の別名であり、両方を指定すると`pattern`が優先されます。両方を省略すると`expected`からパターンを生成します。
|
|
103
|
+
* @example ["ハードウエアー", "ハードウェアー", "ハードウエア"]
|
|
104
|
+
*/
|
|
27
105
|
patterns?: string | string[] | null;
|
|
106
|
+
/**
|
|
107
|
+
* `pattern`のキャプチャグループが空であることをルールの適用条件として指定します。対象のグループは`$1`の形式で指定します。
|
|
108
|
+
* @example "$1"
|
|
109
|
+
*/
|
|
28
110
|
regexpMustEmpty?: string;
|
|
111
|
+
/**
|
|
112
|
+
* ルールの照合に使用するオプションを指定します。
|
|
113
|
+
* @example { "wordBoundary": true }
|
|
114
|
+
*/
|
|
29
115
|
options?: Options;
|
|
116
|
+
/**
|
|
117
|
+
* ルールの変換結果を検証するテストケースを指定します。期待と異なる場合は設定ファイルの読み込みに失敗します。
|
|
118
|
+
* @example [{ "from": "jquery", "to": "jQuery" }, { "from": "JQUERY", "to": "jQuery" }]
|
|
119
|
+
*/
|
|
30
120
|
specs?: RuleSpec[];
|
|
121
|
+
/**
|
|
122
|
+
* 外部ツール向けの補足メッセージを指定します。この値はprh本体の校正処理には影響しません。
|
|
123
|
+
* @example "半角カッコの代わりに全角カッコを使うこと。文字のバランスが崩れるためです"
|
|
124
|
+
*/
|
|
125
|
+
prh?: string;
|
|
31
126
|
}
|
|
32
127
|
export interface Options {
|
|
128
|
+
/**
|
|
129
|
+
* `true`の場合、照合用の正規表現の前後に単語境界(`\b`)を追加します。
|
|
130
|
+
* @default false
|
|
131
|
+
*/
|
|
33
132
|
wordBoundary?: boolean;
|
|
34
133
|
}
|
|
35
134
|
export interface RuleSpec {
|
|
135
|
+
/**
|
|
136
|
+
* ルールのテストに使用する入力文字列を指定します。
|
|
137
|
+
* @example "JQUERY"
|
|
138
|
+
*/
|
|
36
139
|
from: string;
|
|
140
|
+
/**
|
|
141
|
+
* 入力文字列にルールを適用した結果として期待する文字列を指定します。
|
|
142
|
+
* @example "jQuery"
|
|
143
|
+
*/
|
|
37
144
|
to: string;
|
|
38
145
|
}
|
package/lib/raw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw.js","sourceRoot":"","sources":["raw.ts"],"names":[],"mappings":"","sourcesContent":["export interface Config {\n version: number;\n imports?: string | (string | ImportSpec)[];\n targets?: Target[];\n rules?: (string | Rule)[]; // string | regexp style string or array\n}\n\nexport interface ImportSpec {\n path: string;\n disableImports?: boolean;\n
|
|
1
|
+
{"version":3,"file":"raw.js","sourceRoot":"","sources":["raw.ts"],"names":[],"mappings":"","sourcesContent":["export interface Config {\n /**\n * 設定ファイル形式のバージョンを指定します。\n * @example 1\n */\n version: number;\n /** ルールセットのメタデータを指定します。この値は校正処理には影響しません。 */\n meta?: { [key: string]: unknown }; // NOTE prh本体は参照しない 設定ファイルの仕様として定義している\n /**\n * 現在の設定へ統合する別の設定ファイルを指定します。パスは現在の設定ファイルを基準に解決されます。\n * @example \"./prh-rules/media/techbooster.yml\"\n * @example [\"./prh-rules/media/techbooster.yml\", \"./prh-rules/files/markdown.yml\"]\n * @example [{ \"path\": \"./prh-rules/media/techbooster.yml\", \"ignoreRules\": [\"/テストB/gmu\"] }]\n */\n imports?: string | (string | ImportSpec)[];\n /**\n * ファイルパスごとに、ファイル内で校正対象とする範囲と除外する範囲を指定します。\n * @example [{ \"file\": \"/\\\\.md$/\", \"excludes\": [\"/`.*?`/\"] }]\n */\n targets?: Target[];\n /**\n * 適用する校正ルールを指定します。文字列を指定すると、その文字列を`expected`に指定したルールとして扱われます。\n * @example [\"Cookie\", { \"expected\": \"デフォルト\", \"pattern\": \"ディフォルト\" }]\n */\n rules?: (string | Rule)[]; // string | regexp style string or array\n}\n\nexport interface ImportSpec {\n /**\n * 統合する設定ファイルのパスを指定します。パスは現在の設定ファイルを基準に解決されます。\n * @example \"./prh-rules/media/techbooster.yml\"\n */\n path: string;\n /**\n * `true`の場合、指定した設定ファイル内の`imports`を処理しません。\n * @default false\n */\n disableImports?: boolean;\n /**\n * 指定した設定ファイルから読み込まれたルールのうち、統合から除外するルールを指定します。要素に文字列を指定した場合は、同じ文字列を`pattern`に指定したものとして扱われます。\n * @example [\"/テストB/gmu\"]\n * @example [{ \"expected\": \"テストA\" }]\n */\n ignoreRules?: (string | IgnoreRule)[]; // when string coming, evaluate to { pattern: string; }\n}\n\nexport interface IgnoreRule {\n /**\n * 除外するルールを、照合用正規表現を表す文字列で指定します。たとえば、`pattern: テストB`のルールを除外する場合は`/テストB/gmu`を指定します。\n * `pattern`を省略したルールでは`expected`から生成された正規表現になるため、`prh --rules-yaml`の出力で実際の値を確認してください。\n * @example \"/テストB/gmu\"\n */\n pattern?: string;\n /**\n * 除外するルールを、校正後に期待する文字列で指定します。\n * @example \"テストA\"\n */\n expected?: string;\n}\n\nexport interface Target {\n /**\n * 校正範囲の設定を適用するファイルパスに一致する文字列または正規表現形式の文字列を指定します。\n * @example \"/\\\\.md$/\"\n * @example \"/\\\\.re$/\"\n */\n file: string; // string | regexp style string\n /**\n * ファイル内で校正対象とする範囲を指定します。複数指定した場合は、いずれかに一致する範囲が対象になります。\n * @example [\"/\\\\/\\\\/.*$/\"]\n */\n includes?: (string | TargetPattern)[];\n /**\n * ファイル内で校正対象から除外する範囲を指定します。`includes`と`excludes`の両方に一致する範囲は除外されます。\n * @example [\"/`.*?`/\", \"/\\\\[[^\\\\]]*\\\\]\\\\([^)]+\\\\)/\"]\n * @example [{ \"pattern\": \"/^#@.*$/\" }]\n */\n excludes?: (string | TargetPattern)[];\n}\n\nexport interface TargetPattern {\n /**\n * ファイル内の範囲に一致する文字列または正規表現形式の文字列を指定します。\n * @example \"/^#@.*$/\"\n */\n pattern: string; // string | regexp style string\n}\n\nexport interface Rule {\n /**\n * 校正後に期待する文字列を指定します。`pattern`のキャプチャグループを`$1`の形式で参照できます。\n * @example \"ソフトウェア\"\n * @example \"($1)\"\n */\n expected: string;\n /**\n * 修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。\n * `pattern`と`patterns`のどちらも省略した場合は`expected`からパターンを生成します。\n * @example \"ディフォルト\"\n * @example \"/サーバ(?!ー)/\"\n * @example [\"ハードウエアー\", \"ハードウェアー\", \"ハードウエア\"]\n */\n pattern?: string | string[] | null; // string | regexp style string or array\n /**\n * 修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。`pattern`の別名であり、両方を指定すると`pattern`が優先されます。両方を省略すると`expected`からパターンを生成します。\n * @example [\"ハードウエアー\", \"ハードウェアー\", \"ハードウエア\"]\n */\n patterns?: string | string[] | null; // string | regexp style string or array\n /**\n * `pattern`のキャプチャグループが空であることをルールの適用条件として指定します。対象のグループは`$1`の形式で指定します。\n * @example \"$1\"\n */\n regexpMustEmpty?: string;\n /**\n * ルールの照合に使用するオプションを指定します。\n * @example { \"wordBoundary\": true }\n */\n options?: Options;\n /**\n * ルールの変換結果を検証するテストケースを指定します。期待と異なる場合は設定ファイルの読み込みに失敗します。\n * @example [{ \"from\": \"jquery\", \"to\": \"jQuery\" }, { \"from\": \"JQUERY\", \"to\": \"jQuery\" }]\n */\n specs?: RuleSpec[];\n /**\n * 外部ツール向けの補足メッセージを指定します。この値はprh本体の校正処理には影響しません。\n * @example \"半角カッコの代わりに全角カッコを使うこと。文字のバランスが崩れるためです\"\n */\n prh?: string; // NOTE prh本体は参照しない Rule#raw 経由で外部ツールが参照する\n}\n\nexport interface Options {\n /**\n * `true`の場合、照合用の正規表現の前後に単語境界(`\\b`)を追加します。\n * @default false\n */\n wordBoundary?: boolean;\n}\n\nexport interface RuleSpec {\n /**\n * ルールのテストに使用する入力文字列を指定します。\n * @example \"JQUERY\"\n */\n from: string;\n /**\n * 入力文字列にルールを適用した結果として期待する文字列を指定します。\n * @example \"jQuery\"\n */\n to: string;\n}\n"]}
|
package/lib/rule.js
CHANGED
|
@@ -110,7 +110,7 @@ class Rule {
|
|
|
110
110
|
}
|
|
111
111
|
applyRule(content) {
|
|
112
112
|
this.reset();
|
|
113
|
-
const resultList =
|
|
113
|
+
const resultList = [...content.matchAll(this.pattern)];
|
|
114
114
|
return resultList
|
|
115
115
|
.map((matches) => {
|
|
116
116
|
// JavaScriptでの正規表現では /(?<!記|大)事/ のような書き方ができない
|
package/lib/rule.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.js","sourceRoot":"","sources":["rule.ts"],"names":[],"mappings":"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","sourcesContent":["import { spreadAlphaNum, addBoundary, addDefaultFlags, parseRegExpString, escapeSpecialChars, combine, collectAll } from \"./utils/regexp\";\n\nimport { Options } from \"./options\";\nimport { RuleSpec } from \"./ruleSpec\";\n\nimport { Diff } from \"./changeset/diff\";\n\nimport * as raw from \"./raw\";\nimport { ChangeSet } from \"./changeset\";\n\nexport class Rule {\n expected: string;\n pattern: RegExp;\n regexpMustEmpty: string | undefined;\n options: Options;\n specs: RuleSpec[];\n raw: any /* raw.Rule */;\n\n constructor(src: string | raw.Rule) {\n if (!src) {\n throw new Error(\"src is required\");\n }\n let rawRule: raw.Rule;\n if (typeof src === \"string\") {\n rawRule = {\n expected: src,\n };\n } else {\n rawRule = src;\n }\n function checkEmptyPattern(patterns: string | string[] | null | undefined) {\n if (patterns === \"\") {\n throw new Error(\"pattern can't be empty\");\n }\n if (Array.isArray(patterns)) {\n patterns.forEach((pattern) => {\n if (pattern === \"\") {\n throw new Error(\"patterns can't be empty\");\n }\n });\n }\n }\n checkEmptyPattern(rawRule.pattern);\n checkEmptyPattern(rawRule.patterns);\n\n this.options = new Options(this, rawRule.options);\n\n this.expected = rawRule.expected;\n if (this.expected == null) {\n throw new Error(\"expected is required\");\n }\n\n this.pattern = this._patternToRegExp(rawRule.pattern || rawRule.patterns);\n if (this.pattern == null) {\n throw new Error(\"pattern is required\");\n }\n\n this.regexpMustEmpty = rawRule.regexpMustEmpty;\n\n // for JSON order\n const options = this.options;\n delete (this as any).options;\n this.options = options;\n\n this.specs = (rawRule.specs || []).map((spec) => new RuleSpec(spec));\n\n this.raw = rawRule;\n\n this.check();\n }\n\n /* @internal */\n _patternToRegExp(pattern?: string | string[] | null): RegExp {\n if (pattern === \"\") {\n throw new Error(\"pattern can't be empty\");\n } else if (pattern == null) {\n let result = spreadAlphaNum(this.expected);\n if (this.options.wordBoundary) {\n result = addBoundary(result);\n }\n return addDefaultFlags(result);\n } else if (typeof pattern === \"string\") {\n let result = parseRegExpString(pattern);\n if (!result) {\n result = new RegExp(escapeSpecialChars(pattern));\n }\n if (this.options.wordBoundary) {\n result = addBoundary(result);\n }\n return addDefaultFlags(result);\n } else if (pattern instanceof Array) {\n const result = combine(pattern.map((p) => this._patternToRegExp(p)));\n return addDefaultFlags(result!);\n } else {\n throw new Error(`unexpected pattern: ${pattern}`);\n }\n }\n\n /* @internal */\n _shouldIgnore(ignoreRule: raw.IgnoreRule) {\n // NOTE 考え方:--rules-yaml で表示されるpattern or expectedで指定する\n // patternは配列で指定できて、そのうちの1つのパターンが指定された時に\n // そのルール全体が無視されるのか該当の1パターンだけ無視されるのか予想できないため\n\n if (ignoreRule.pattern != null && this.pattern.toString() === ignoreRule.pattern) {\n return true;\n }\n if (ignoreRule.expected != null && ignoreRule.expected === this.expected) {\n return true;\n }\n\n return false;\n }\n\n reset() {\n this.pattern.lastIndex = 0;\n }\n\n check() {\n this.specs.forEach((spec) => {\n const diffs = this.applyRule(spec.from);\n const changeSet = new ChangeSet({ content: spec.from, diffs });\n const result = changeSet.applyChangeSets(spec.from);\n if (spec.to !== result) {\n throw new Error(\n `${this.expected} spec failed. \"${spec.from}\", expected \"${spec.to}\", but got \"${result}\", ${this.pattern}`,\n );\n }\n });\n }\n\n applyRule(content: string): Diff[] {\n this.reset();\n const resultList = collectAll(this.pattern, content);\n return resultList\n .map((matches) => {\n // JavaScriptでの正規表現では /(?<!記|大)事/ のような書き方ができない\n // /(記|大)事/ で regexpMustEmpty $1 の場合、第一グループが空じゃないとマッチしない、というルールにして回避\n if (this.regexpMustEmpty) {\n const match = /^\\$([0-9]+)$/.exec(this.regexpMustEmpty);\n if (match == null) {\n throw new Error(`${this.expected} target failed. please use $1 format.`);\n }\n const index = parseInt(match[1], 10);\n if (matches[index]) {\n return null;\n }\n }\n // 検出したものと期待するものが一致している場合無視させる\n if (this.expected === matches[0]) {\n return null;\n }\n return new Diff({\n pattern: this.pattern,\n expected: this.expected,\n index: matches.index,\n matches: matches,\n rule: this,\n });\n })\n .filter((v) => !!v) as any as Diff[]; // (Diff | null)[] を Diff[] に変換したい\n }\n\n toJSON() {\n const alt: any = {};\n for (const key in this) {\n if (key.indexOf(\"_\") === 0) {\n continue;\n }\n const value = (<any>this)[key];\n if (value instanceof RegExp) {\n alt[key] = value.toString();\n continue;\n }\n alt[key] = value;\n }\n return alt;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["rule.ts"],"names":[],"mappings":";;;AAAA,2CAA8H;AAE9H,uCAAoC;AACpC,yCAAsC;AAEtC,2CAAwC;AAGxC,2CAAwC;AAExC,MAAa,IAAI;IAQb,YAAY,GAAsB;QAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,OAAiB,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,GAAG;gBACN,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,SAAS,iBAAiB,CAAC,QAA8C;YACrE,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACzB,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC/C,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QACD,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAE/C,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAQ,IAAY,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;QAEnB,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,eAAe;IACf,gBAAgB,CAAC,OAAkC;QAC/C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,MAAM,GAAG,IAAA,uBAAc,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC5B,MAAM,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,IAAA,wBAAe,EAAC,MAAM,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,MAAM,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,GAAG,IAAI,MAAM,CAAC,IAAA,2BAAkB,EAAC,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC5B,MAAM,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,IAAA,wBAAe,EAAC,MAAM,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAA,gBAAO,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,OAAO,IAAA,wBAAe,EAAC,MAAO,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAED,eAAe;IACf,aAAa,CAAC,UAA0B;QACpC,uDAAuD;QACvD,wCAAwC;QACxC,2CAA2C;QAE3C,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,IAAI,IAAI,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACX,GAAG,IAAI,CAAC,QAAQ,kBAAkB,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,eAAe,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,CAC9G,CAAC;YACN,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,SAAS,CAAC,OAAe;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,UAAU;aACZ,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACb,8CAA8C;YAC9C,oEAAoE;YACpE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACxD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,uCAAuC,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjB,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YACD,8BAA8B;YAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,WAAI,CAAC;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,IAAI;aACb,CAAC,CAAC;QACP,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAkB,CAAC,CAAC,kCAAkC;IAChF,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS;YACb,CAAC;YACD,MAAM,KAAK,GAAS,IAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC5B,SAAS;YACb,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ;AAxKD,oBAwKC","sourcesContent":["import { spreadAlphaNum, addBoundary, addDefaultFlags, parseRegExpString, escapeSpecialChars, combine } from \"./utils/regexp\";\n\nimport { Options } from \"./options\";\nimport { RuleSpec } from \"./ruleSpec\";\n\nimport { Diff } from \"./changeset/diff\";\n\nimport * as raw from \"./raw\";\nimport { ChangeSet } from \"./changeset\";\n\nexport class Rule {\n expected: string;\n pattern: RegExp;\n regexpMustEmpty: string | undefined;\n options: Options;\n specs: RuleSpec[];\n raw: any /* raw.Rule */;\n\n constructor(src: string | raw.Rule) {\n if (!src) {\n throw new Error(\"src is required\");\n }\n let rawRule: raw.Rule;\n if (typeof src === \"string\") {\n rawRule = {\n expected: src,\n };\n } else {\n rawRule = src;\n }\n function checkEmptyPattern(patterns: string | string[] | null | undefined) {\n if (patterns === \"\") {\n throw new Error(\"pattern can't be empty\");\n }\n if (Array.isArray(patterns)) {\n patterns.forEach((pattern) => {\n if (pattern === \"\") {\n throw new Error(\"patterns can't be empty\");\n }\n });\n }\n }\n checkEmptyPattern(rawRule.pattern);\n checkEmptyPattern(rawRule.patterns);\n\n this.options = new Options(this, rawRule.options);\n\n this.expected = rawRule.expected;\n if (this.expected == null) {\n throw new Error(\"expected is required\");\n }\n\n this.pattern = this._patternToRegExp(rawRule.pattern || rawRule.patterns);\n if (this.pattern == null) {\n throw new Error(\"pattern is required\");\n }\n\n this.regexpMustEmpty = rawRule.regexpMustEmpty;\n\n // for JSON order\n const options = this.options;\n delete (this as any).options;\n this.options = options;\n\n this.specs = (rawRule.specs || []).map((spec) => new RuleSpec(spec));\n\n this.raw = rawRule;\n\n this.check();\n }\n\n /* @internal */\n _patternToRegExp(pattern?: string | string[] | null): RegExp {\n if (pattern === \"\") {\n throw new Error(\"pattern can't be empty\");\n } else if (pattern == null) {\n let result = spreadAlphaNum(this.expected);\n if (this.options.wordBoundary) {\n result = addBoundary(result);\n }\n return addDefaultFlags(result);\n } else if (typeof pattern === \"string\") {\n let result = parseRegExpString(pattern);\n if (!result) {\n result = new RegExp(escapeSpecialChars(pattern));\n }\n if (this.options.wordBoundary) {\n result = addBoundary(result);\n }\n return addDefaultFlags(result);\n } else if (pattern instanceof Array) {\n const result = combine(pattern.map((p) => this._patternToRegExp(p)));\n return addDefaultFlags(result!);\n } else {\n throw new Error(`unexpected pattern: ${pattern}`);\n }\n }\n\n /* @internal */\n _shouldIgnore(ignoreRule: raw.IgnoreRule) {\n // NOTE 考え方:--rules-yaml で表示されるpattern or expectedで指定する\n // patternは配列で指定できて、そのうちの1つのパターンが指定された時に\n // そのルール全体が無視されるのか該当の1パターンだけ無視されるのか予想できないため\n\n if (ignoreRule.pattern != null && this.pattern.toString() === ignoreRule.pattern) {\n return true;\n }\n if (ignoreRule.expected != null && ignoreRule.expected === this.expected) {\n return true;\n }\n\n return false;\n }\n\n reset() {\n this.pattern.lastIndex = 0;\n }\n\n check() {\n this.specs.forEach((spec) => {\n const diffs = this.applyRule(spec.from);\n const changeSet = new ChangeSet({ content: spec.from, diffs });\n const result = changeSet.applyChangeSets(spec.from);\n if (spec.to !== result) {\n throw new Error(\n `${this.expected} spec failed. \"${spec.from}\", expected \"${spec.to}\", but got \"${result}\", ${this.pattern}`,\n );\n }\n });\n }\n\n applyRule(content: string): Diff[] {\n this.reset();\n const resultList = [...content.matchAll(this.pattern)];\n return resultList\n .map((matches) => {\n // JavaScriptでの正規表現では /(?<!記|大)事/ のような書き方ができない\n // /(記|大)事/ で regexpMustEmpty $1 の場合、第一グループが空じゃないとマッチしない、というルールにして回避\n if (this.regexpMustEmpty) {\n const match = /^\\$([0-9]+)$/.exec(this.regexpMustEmpty);\n if (match == null) {\n throw new Error(`${this.expected} target failed. please use $1 format.`);\n }\n const index = parseInt(match[1], 10);\n if (matches[index]) {\n return null;\n }\n }\n // 検出したものと期待するものが一致している場合無視させる\n if (this.expected === matches[0]) {\n return null;\n }\n return new Diff({\n pattern: this.pattern,\n expected: this.expected,\n index: matches.index,\n matches: matches,\n rule: this,\n });\n })\n .filter((v) => !!v) as any as Diff[]; // (Diff | null)[] を Diff[] に変換したい\n }\n\n toJSON() {\n const alt: any = {};\n for (const key in this) {\n if (key.indexOf(\"_\") === 0) {\n continue;\n }\n const value = (<any>this)[key];\n if (value instanceof RegExp) {\n alt[key] = value.toString();\n continue;\n }\n alt[key] = value;\n }\n return alt;\n }\n}\n"]}
|
package/lib/utils/regexp.d.ts
CHANGED
|
@@ -9,5 +9,4 @@ export declare function parseRegExpString(str: string): RegExp | null;
|
|
|
9
9
|
export declare function spreadAlphaNum(str: string): RegExp;
|
|
10
10
|
export declare function addDefaultFlags(regexp: RegExp): RegExp;
|
|
11
11
|
export declare function escapeSpecialChars(str: string): string;
|
|
12
|
-
export declare function collectAll(regexp: RegExp, src: string): RegExpExecArray[];
|
|
13
12
|
export declare function equals(a: RegExp, b: RegExp): boolean;
|
package/lib/utils/regexp.js
CHANGED
|
@@ -8,7 +8,6 @@ exports.parseRegExpString = parseRegExpString;
|
|
|
8
8
|
exports.spreadAlphaNum = spreadAlphaNum;
|
|
9
9
|
exports.addDefaultFlags = addDefaultFlags;
|
|
10
10
|
exports.escapeSpecialChars = escapeSpecialChars;
|
|
11
|
-
exports.collectAll = collectAll;
|
|
12
11
|
exports.equals = equals;
|
|
13
12
|
const regexpRegexp = /^\/(.*)\/([gimy]*)$/;
|
|
14
13
|
const hankakuAlphaNum = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
@@ -19,7 +18,6 @@ exports.jpKana = /[ァ-ヺ]/;
|
|
|
19
18
|
// http://tama-san.com/?p=196
|
|
20
19
|
exports.jpKanji = /(?:[々〇〻\u3400-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF])/;
|
|
21
20
|
exports.jpChar = combine([exports.jpHira, exports.jpKana, exports.jpKanji]);
|
|
22
|
-
const regexpSpecialChars = "¥*+.?{}()[]^$-|/".split("");
|
|
23
21
|
function concat(args, flags) {
|
|
24
22
|
let prevFlags = flags || "";
|
|
25
23
|
let foundRegExp = false;
|
|
@@ -28,7 +26,6 @@ function concat(args, flags) {
|
|
|
28
26
|
return p + c;
|
|
29
27
|
}
|
|
30
28
|
else if (c instanceof RegExp) {
|
|
31
|
-
c.flags.split("").sort();
|
|
32
29
|
const currentFlags = c.flags.split("").sort().join("");
|
|
33
30
|
if (foundRegExp) {
|
|
34
31
|
if (prevFlags !== currentFlags) {
|
|
@@ -55,7 +52,6 @@ function combine(args, flags) {
|
|
|
55
52
|
return arg;
|
|
56
53
|
}
|
|
57
54
|
else if (arg instanceof RegExp) {
|
|
58
|
-
arg.flags.split("").sort();
|
|
59
55
|
const currentFlags = arg.flags.split("").sort().join("");
|
|
60
56
|
if (foundRegExp) {
|
|
61
57
|
if (prevFlags !== currentFlags) {
|
|
@@ -124,28 +120,10 @@ function addDefaultFlags(regexp) {
|
|
|
124
120
|
}
|
|
125
121
|
return new RegExp(regexp.source, flags);
|
|
126
122
|
}
|
|
123
|
+
// Note: Node.js v24がターゲット下限になったらRegExp.escape()に置き換えられる
|
|
124
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape
|
|
127
125
|
function escapeSpecialChars(str) {
|
|
128
|
-
|
|
129
|
-
str = str.replace(new RegExp(`\\${char}`, "g"), `\\${char}`);
|
|
130
|
-
});
|
|
131
|
-
return str;
|
|
132
|
-
}
|
|
133
|
-
function collectAll(regexp, src) {
|
|
134
|
-
if (!regexp.global) {
|
|
135
|
-
throw new Error("g flag is required");
|
|
136
|
-
}
|
|
137
|
-
if (!regexp.source) {
|
|
138
|
-
throw new Error("source is required");
|
|
139
|
-
}
|
|
140
|
-
const resultList = [];
|
|
141
|
-
let result;
|
|
142
|
-
do {
|
|
143
|
-
result = regexp.exec(src);
|
|
144
|
-
if (result) {
|
|
145
|
-
resultList.push(result);
|
|
146
|
-
}
|
|
147
|
-
} while (result);
|
|
148
|
-
return resultList;
|
|
126
|
+
return str.replace(/[\\*+.?{}()|^$[\]/]/g, "\\$&");
|
|
149
127
|
}
|
|
150
128
|
function equals(a, b) {
|
|
151
129
|
if (a.source !== b.source) {
|
|
@@ -160,6 +138,15 @@ function equals(a, b) {
|
|
|
160
138
|
if (a.multiline !== b.multiline) {
|
|
161
139
|
return false;
|
|
162
140
|
}
|
|
141
|
+
if (a.unicode !== b.unicode) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (a.sticky !== b.sticky) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (a.dotAll !== b.dotAll) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
163
150
|
return true;
|
|
164
151
|
}
|
|
165
152
|
//# sourceMappingURL=regexp.js.map
|
package/lib/utils/regexp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regexp.js","sourceRoot":"","sources":["regexp.ts"],"names":[],"mappings":"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","sourcesContent":["const regexpRegexp = /^\\/(.*)\\/([gimy]*)$/;\n\nconst hankakuAlphaNum = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nconst zenkakuAlphaNum =\n \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n// http://www.tamasoft.co.jp/ja/general-info/unicode.html\nexport const jpHira = /[ぁ-ゖ]/;\nexport const jpKana = /[ァ-ヺ]/;\n// http://tama-san.com/?p=196\nexport const jpKanji = /(?:[々〇〻\\u3400-\\u9FFF\\uF900-\\uFAFF]|[\\uD840-\\uD87F][\\uDC00-\\uDFFF])/;\nexport const jpChar = combine([jpHira, jpKana, jpKanji]);\n\nconst regexpSpecialChars = \"¥*+.?{}()[]^$-|/\".split(\"\");\n\nexport function concat(args: (string | RegExp)[], flags?: string): RegExp {\n let prevFlags = flags || \"\";\n let foundRegExp = false;\n const result = args.reduce<string>((p, c) => {\n if (typeof c === \"string\") {\n return p + c;\n } else if (c instanceof RegExp) {\n c.flags.split(\"\").sort();\n const currentFlags = c.flags.split(\"\").sort().join(\"\");\n if (foundRegExp) {\n if (prevFlags !== currentFlags) {\n throw new Error(`combining different flags ${prevFlags} and ${currentFlags}.\nThe pattern ${c} has different flag with other patterns.`);\n }\n }\n prevFlags = currentFlags;\n foundRegExp = true;\n return p + c.source;\n } else {\n throw new Error(`unknown type: ${c}`);\n }\n }, \"\");\n return new RegExp(result, prevFlags);\n}\n\nexport function combine(args: (string | RegExp)[], flags?: string): RegExp {\n let prevFlags = flags || \"\";\n let foundRegExp = false;\n const result = args\n .map((arg) => {\n if (typeof arg === \"string\") {\n return arg;\n } else if (arg instanceof RegExp) {\n arg.flags.split(\"\").sort();\n const currentFlags = arg.flags.split(\"\").sort().join(\"\");\n if (foundRegExp) {\n if (prevFlags !== currentFlags) {\n throw new Error(`combining different flags ${prevFlags} and ${currentFlags}.\nThe pattern ${arg} has different flag with other patterns.`);\n }\n }\n prevFlags = currentFlags;\n foundRegExp = true;\n return arg.source;\n } else {\n throw new Error(`unknown type: ${arg}`);\n }\n })\n .join(\"|\");\n return concat([\"(?:\", result, \")\"], foundRegExp ? prevFlags : void 0);\n}\n\nexport function addBoundary(arg: string | RegExp): RegExp {\n let result: string;\n let flags = \"\";\n if (typeof arg === \"string\") {\n result = arg;\n } else if (arg instanceof RegExp) {\n result = arg.source;\n flags = arg.flags;\n } else {\n throw new Error(`unknown type: ${arg}`);\n }\n return concat([\"\\\\b\", result, \"\\\\b\"], flags);\n}\n\nexport function parseRegExpString(str: string): RegExp | null {\n const result = str.match(regexpRegexp);\n if (!result) {\n return null;\n }\n return new RegExp(result[1], result[2]);\n}\n\nexport function spreadAlphaNum(str: string): RegExp {\n const result = str\n .split(\"\")\n .map((v) => {\n const tmpIdx1 = hankakuAlphaNum.indexOf(v.toUpperCase());\n const tmpIdx2 = hankakuAlphaNum.indexOf(v.toLowerCase());\n if (tmpIdx1 === -1 && tmpIdx2 === -1) {\n // not alpha num\n return v;\n } else if (tmpIdx1 === tmpIdx2) {\n // num\n return `[${v}${zenkakuAlphaNum.charAt(tmpIdx1)}]`;\n } else {\n return `[${v.toUpperCase()}${v.toLowerCase()}${zenkakuAlphaNum.charAt(tmpIdx1)}${zenkakuAlphaNum.charAt(tmpIdx2)}]`;\n }\n })\n .join(\"\");\n return new RegExp(result);\n}\n\nexport function addDefaultFlags(regexp: RegExp) {\n let flags = \"gmu\";\n if (regexp.ignoreCase) {\n flags += \"i\";\n }\n return new RegExp(regexp.source, flags);\n}\n\nexport function escapeSpecialChars(str: string): string {\n regexpSpecialChars.forEach((char) => {\n str = str.replace(new RegExp(`\\\\${char}`, \"g\"), `\\\\${char}`);\n });\n return str;\n}\n\nexport function collectAll(regexp: RegExp, src: string) {\n if (!regexp.global) {\n throw new Error(\"g flag is required\");\n }\n if (!regexp.source) {\n throw new Error(\"source is required\");\n }\n const resultList: RegExpExecArray[] = [];\n let result: RegExpExecArray | null;\n do {\n result = regexp.exec(src);\n if (result) {\n resultList.push(result);\n }\n } while (result);\n\n return resultList;\n}\n\nexport function equals(a: RegExp, b: RegExp) {\n if (a.source !== b.source) {\n return false;\n }\n if (a.global !== b.global) {\n return false;\n }\n if (a.ignoreCase !== b.ignoreCase) {\n return false;\n }\n if (a.multiline !== b.multiline) {\n return false;\n }\n\n return true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"regexp.js","sourceRoot":"","sources":["regexp.ts"],"names":[],"mappings":"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","sourcesContent":["const regexpRegexp = /^\\/(.*)\\/([gimy]*)$/;\n\nconst hankakuAlphaNum = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nconst zenkakuAlphaNum =\n \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n// http://www.tamasoft.co.jp/ja/general-info/unicode.html\nexport const jpHira = /[ぁ-ゖ]/;\nexport const jpKana = /[ァ-ヺ]/;\n// http://tama-san.com/?p=196\nexport const jpKanji = /(?:[々〇〻\\u3400-\\u9FFF\\uF900-\\uFAFF]|[\\uD840-\\uD87F][\\uDC00-\\uDFFF])/;\nexport const jpChar = combine([jpHira, jpKana, jpKanji]);\n\nexport function concat(args: (string | RegExp)[], flags?: string): RegExp {\n let prevFlags = flags || \"\";\n let foundRegExp = false;\n const result = args.reduce<string>((p, c) => {\n if (typeof c === \"string\") {\n return p + c;\n } else if (c instanceof RegExp) {\n const currentFlags = c.flags.split(\"\").sort().join(\"\");\n if (foundRegExp) {\n if (prevFlags !== currentFlags) {\n throw new Error(`combining different flags ${prevFlags} and ${currentFlags}.\nThe pattern ${c} has different flag with other patterns.`);\n }\n }\n prevFlags = currentFlags;\n foundRegExp = true;\n return p + c.source;\n } else {\n throw new Error(`unknown type: ${c}`);\n }\n }, \"\");\n return new RegExp(result, prevFlags);\n}\n\nexport function combine(args: (string | RegExp)[], flags?: string): RegExp {\n let prevFlags = flags || \"\";\n let foundRegExp = false;\n const result = args\n .map((arg) => {\n if (typeof arg === \"string\") {\n return arg;\n } else if (arg instanceof RegExp) {\n const currentFlags = arg.flags.split(\"\").sort().join(\"\");\n if (foundRegExp) {\n if (prevFlags !== currentFlags) {\n throw new Error(`combining different flags ${prevFlags} and ${currentFlags}.\nThe pattern ${arg} has different flag with other patterns.`);\n }\n }\n prevFlags = currentFlags;\n foundRegExp = true;\n return arg.source;\n } else {\n throw new Error(`unknown type: ${arg}`);\n }\n })\n .join(\"|\");\n return concat([\"(?:\", result, \")\"], foundRegExp ? prevFlags : void 0);\n}\n\nexport function addBoundary(arg: string | RegExp): RegExp {\n let result: string;\n let flags = \"\";\n if (typeof arg === \"string\") {\n result = arg;\n } else if (arg instanceof RegExp) {\n result = arg.source;\n flags = arg.flags;\n } else {\n throw new Error(`unknown type: ${arg}`);\n }\n return concat([\"\\\\b\", result, \"\\\\b\"], flags);\n}\n\nexport function parseRegExpString(str: string): RegExp | null {\n const result = str.match(regexpRegexp);\n if (!result) {\n return null;\n }\n return new RegExp(result[1], result[2]);\n}\n\nexport function spreadAlphaNum(str: string): RegExp {\n const result = str\n .split(\"\")\n .map((v) => {\n const tmpIdx1 = hankakuAlphaNum.indexOf(v.toUpperCase());\n const tmpIdx2 = hankakuAlphaNum.indexOf(v.toLowerCase());\n if (tmpIdx1 === -1 && tmpIdx2 === -1) {\n // not alpha num\n return v;\n } else if (tmpIdx1 === tmpIdx2) {\n // num\n return `[${v}${zenkakuAlphaNum.charAt(tmpIdx1)}]`;\n } else {\n return `[${v.toUpperCase()}${v.toLowerCase()}${zenkakuAlphaNum.charAt(tmpIdx1)}${zenkakuAlphaNum.charAt(tmpIdx2)}]`;\n }\n })\n .join(\"\");\n return new RegExp(result);\n}\n\nexport function addDefaultFlags(regexp: RegExp) {\n let flags = \"gmu\";\n if (regexp.ignoreCase) {\n flags += \"i\";\n }\n return new RegExp(regexp.source, flags);\n}\n\n// Note: Node.js v24がターゲット下限になったらRegExp.escape()に置き換えられる\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape\nexport function escapeSpecialChars(str: string): string {\n return str.replace(/[\\\\*+.?{}()|^$[\\]/]/g, \"\\\\$&\");\n}\n\nexport function equals(a: RegExp, b: RegExp) {\n if (a.source !== b.source) {\n return false;\n }\n if (a.global !== b.global) {\n return false;\n }\n if (a.ignoreCase !== b.ignoreCase) {\n return false;\n }\n if (a.multiline !== b.multiline) {\n return false;\n }\n if (a.unicode !== b.unicode) {\n return false;\n }\n if (a.sticky !== b.sticky) {\n return false;\n }\n if (a.dotAll !== b.dotAll) {\n return false;\n }\n\n return true;\n}\n"]}
|
package/misc/prh.yml
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# yaml-language-server: $schema=https://raw.githubusercontent.com/prh/prh/master/prh.schema.json
|
|
1
2
|
version: 1
|
|
2
3
|
|
|
3
4
|
# 本ファイルは設定の仕方の見本であり、実用的な校正ルールではありません。
|
|
@@ -9,7 +10,7 @@ version: 1
|
|
|
9
10
|
# リポジトリの設定 git submodule add https://github.com/prh/rules.git prh-rules
|
|
10
11
|
|
|
11
12
|
# 別の設定ファイルを読み込み、mergeすることもできます。
|
|
12
|
-
imports:
|
|
13
|
+
imports: []
|
|
13
14
|
# - ./prh-rules/media/techbooster.yml
|
|
14
15
|
# - ./prh-rules/files/markdown.yml
|
|
15
16
|
# - ./prh-rules/files/review.yml
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prh",
|
|
3
|
-
"version": "6.0
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"description": "proofreading helper",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"node": ">=22"
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "tsc",
|
|
16
|
+
"build": "npm run generate-schema && tsc",
|
|
17
|
+
"generate-schema": "ts-json-schema-generator --path lib/raw.ts --type Config --id https://raw.githubusercontent.com/prh/prh/master/prh.schema.json --markdown-description --out prh.schema.json",
|
|
17
18
|
"lint": "eslint lib/ test/",
|
|
18
19
|
"format": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'",
|
|
19
20
|
"test": "npm run build && vitest run",
|
|
@@ -31,19 +32,19 @@
|
|
|
31
32
|
"homepage": "https://github.com/prh/prh",
|
|
32
33
|
"dependencies": {
|
|
33
34
|
"commander": "^14.0.3",
|
|
34
|
-
"diff": "^
|
|
35
|
+
"diff": "^9.0.0",
|
|
35
36
|
"js-yaml": "^4.1.0"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@eslint/js": "^10.0.1",
|
|
39
|
-
"@types/diff": "^8.0.0",
|
|
40
40
|
"@types/js-yaml": "^4.0.0",
|
|
41
41
|
"@types/node": "^25.2.3",
|
|
42
42
|
"eslint": "^10.0.0",
|
|
43
43
|
"eslint-config-prettier": "^10.1.8",
|
|
44
44
|
"glob": "^13.0.5",
|
|
45
45
|
"prettier": "^3.0.0",
|
|
46
|
-
"
|
|
46
|
+
"ts-json-schema-generator": "^2.9.0",
|
|
47
|
+
"typescript": "^6.0.3",
|
|
47
48
|
"typescript-eslint": "^8.0.0",
|
|
48
49
|
"vitest": "^4.0.18"
|
|
49
50
|
}
|
package/prh.schema.json
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$id": "https://raw.githubusercontent.com/prh/prh/master/prh.schema.json",
|
|
3
|
+
"$ref": "#/definitions/Config",
|
|
4
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
+
"definitions": {
|
|
6
|
+
"Config": {
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"imports": {
|
|
10
|
+
"anyOf": [
|
|
11
|
+
{
|
|
12
|
+
"type": "string"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"items": {
|
|
16
|
+
"anyOf": [
|
|
17
|
+
{
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"$ref": "#/definitions/ImportSpec"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"type": "array"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"description": "現在の設定へ統合する別の設定ファイルを指定します。パスは現在の設定ファイルを基準に解決されます。",
|
|
29
|
+
"examples": [
|
|
30
|
+
"./prh-rules/media/techbooster.yml",
|
|
31
|
+
[
|
|
32
|
+
"./prh-rules/media/techbooster.yml",
|
|
33
|
+
"./prh-rules/files/markdown.yml"
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
{
|
|
37
|
+
"ignoreRules": [
|
|
38
|
+
"/テストB/gmu"
|
|
39
|
+
],
|
|
40
|
+
"path": "./prh-rules/media/techbooster.yml"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
],
|
|
44
|
+
"markdownDescription": "現在の設定へ統合する別の設定ファイルを指定します。パスは現在の設定ファイルを基準に解決されます。"
|
|
45
|
+
},
|
|
46
|
+
"meta": {
|
|
47
|
+
"additionalProperties": {},
|
|
48
|
+
"description": "ルールセットのメタデータを指定します。この値は校正処理には影響しません。",
|
|
49
|
+
"markdownDescription": "ルールセットのメタデータを指定します。この値は校正処理には影響しません。",
|
|
50
|
+
"type": "object"
|
|
51
|
+
},
|
|
52
|
+
"rules": {
|
|
53
|
+
"description": "適用する校正ルールを指定します。文字列を指定すると、その文字列を`expected`に指定したルールとして扱われます。",
|
|
54
|
+
"examples": [
|
|
55
|
+
[
|
|
56
|
+
"Cookie",
|
|
57
|
+
{
|
|
58
|
+
"expected": "デフォルト",
|
|
59
|
+
"pattern": "ディフォルト"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
],
|
|
63
|
+
"items": {
|
|
64
|
+
"anyOf": [
|
|
65
|
+
{
|
|
66
|
+
"type": "string"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"$ref": "#/definitions/Rule"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"markdownDescription": "適用する校正ルールを指定します。文字列を指定すると、その文字列を`expected`に指定したルールとして扱われます。",
|
|
74
|
+
"type": "array"
|
|
75
|
+
},
|
|
76
|
+
"targets": {
|
|
77
|
+
"description": "ファイルパスごとに、ファイル内で校正対象とする範囲と除外する範囲を指定します。",
|
|
78
|
+
"examples": [
|
|
79
|
+
[
|
|
80
|
+
{
|
|
81
|
+
"excludes": [
|
|
82
|
+
"/`.*?`/"
|
|
83
|
+
],
|
|
84
|
+
"file": "/\\.md$/"
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
],
|
|
88
|
+
"items": {
|
|
89
|
+
"$ref": "#/definitions/Target"
|
|
90
|
+
},
|
|
91
|
+
"markdownDescription": "ファイルパスごとに、ファイル内で校正対象とする範囲と除外する範囲を指定します。",
|
|
92
|
+
"type": "array"
|
|
93
|
+
},
|
|
94
|
+
"version": {
|
|
95
|
+
"description": "設定ファイル形式のバージョンを指定します。",
|
|
96
|
+
"examples": [
|
|
97
|
+
1
|
|
98
|
+
],
|
|
99
|
+
"markdownDescription": "設定ファイル形式のバージョンを指定します。",
|
|
100
|
+
"type": "number"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"required": [
|
|
104
|
+
"version"
|
|
105
|
+
],
|
|
106
|
+
"type": "object"
|
|
107
|
+
},
|
|
108
|
+
"IgnoreRule": {
|
|
109
|
+
"additionalProperties": false,
|
|
110
|
+
"properties": {
|
|
111
|
+
"expected": {
|
|
112
|
+
"description": "除外するルールを、校正後に期待する文字列で指定します。",
|
|
113
|
+
"examples": [
|
|
114
|
+
"テストA"
|
|
115
|
+
],
|
|
116
|
+
"markdownDescription": "除外するルールを、校正後に期待する文字列で指定します。",
|
|
117
|
+
"type": "string"
|
|
118
|
+
},
|
|
119
|
+
"pattern": {
|
|
120
|
+
"description": "除外するルールを、照合用正規表現を表す文字列で指定します。たとえば、`pattern: テストB`のルールを除外する場合は`/テストB/gmu`を指定します。 `pattern`を省略したルールでは`expected`から生成された正規表現になるため、`prh --rules-yaml`の出力で実際の値を確認してください。",
|
|
121
|
+
"examples": [
|
|
122
|
+
"/テストB/gmu"
|
|
123
|
+
],
|
|
124
|
+
"markdownDescription": "除外するルールを、照合用正規表現を表す文字列で指定します。たとえば、`pattern: テストB`のルールを除外する場合は`/テストB/gmu`を指定します。\n`pattern`を省略したルールでは`expected`から生成された正規表現になるため、`prh --rules-yaml`の出力で実際の値を確認してください。",
|
|
125
|
+
"type": "string"
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"type": "object"
|
|
129
|
+
},
|
|
130
|
+
"ImportSpec": {
|
|
131
|
+
"additionalProperties": false,
|
|
132
|
+
"properties": {
|
|
133
|
+
"disableImports": {
|
|
134
|
+
"default": false,
|
|
135
|
+
"description": "`true`の場合、指定した設定ファイル内の`imports`を処理しません。",
|
|
136
|
+
"markdownDescription": "`true`の場合、指定した設定ファイル内の`imports`を処理しません。",
|
|
137
|
+
"type": "boolean"
|
|
138
|
+
},
|
|
139
|
+
"ignoreRules": {
|
|
140
|
+
"description": "指定した設定ファイルから読み込まれたルールのうち、統合から除外するルールを指定します。要素に文字列を指定した場合は、同じ文字列を`pattern`に指定したものとして扱われます。",
|
|
141
|
+
"examples": [
|
|
142
|
+
[
|
|
143
|
+
"/テストB/gmu"
|
|
144
|
+
],
|
|
145
|
+
[
|
|
146
|
+
{
|
|
147
|
+
"expected": "テストA"
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
],
|
|
151
|
+
"items": {
|
|
152
|
+
"anyOf": [
|
|
153
|
+
{
|
|
154
|
+
"type": "string"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"$ref": "#/definitions/IgnoreRule"
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"markdownDescription": "指定した設定ファイルから読み込まれたルールのうち、統合から除外するルールを指定します。要素に文字列を指定した場合は、同じ文字列を`pattern`に指定したものとして扱われます。",
|
|
162
|
+
"type": "array"
|
|
163
|
+
},
|
|
164
|
+
"path": {
|
|
165
|
+
"description": "統合する設定ファイルのパスを指定します。パスは現在の設定ファイルを基準に解決されます。",
|
|
166
|
+
"examples": [
|
|
167
|
+
"./prh-rules/media/techbooster.yml"
|
|
168
|
+
],
|
|
169
|
+
"markdownDescription": "統合する設定ファイルのパスを指定します。パスは現在の設定ファイルを基準に解決されます。",
|
|
170
|
+
"type": "string"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"required": [
|
|
174
|
+
"path"
|
|
175
|
+
],
|
|
176
|
+
"type": "object"
|
|
177
|
+
},
|
|
178
|
+
"Options": {
|
|
179
|
+
"additionalProperties": false,
|
|
180
|
+
"properties": {
|
|
181
|
+
"wordBoundary": {
|
|
182
|
+
"default": false,
|
|
183
|
+
"description": "`true`の場合、照合用の正規表現の前後に単語境界(`\\b`)を追加します。",
|
|
184
|
+
"markdownDescription": "`true`の場合、照合用の正規表現の前後に単語境界(`\\b`)を追加します。",
|
|
185
|
+
"type": "boolean"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"type": "object"
|
|
189
|
+
},
|
|
190
|
+
"Rule": {
|
|
191
|
+
"additionalProperties": false,
|
|
192
|
+
"properties": {
|
|
193
|
+
"expected": {
|
|
194
|
+
"description": "校正後に期待する文字列を指定します。`pattern`のキャプチャグループを`$1`の形式で参照できます。",
|
|
195
|
+
"examples": [
|
|
196
|
+
"ソフトウェア",
|
|
197
|
+
"($1)"
|
|
198
|
+
],
|
|
199
|
+
"markdownDescription": "校正後に期待する文字列を指定します。`pattern`のキャプチャグループを`$1`の形式で参照できます。",
|
|
200
|
+
"type": "string"
|
|
201
|
+
},
|
|
202
|
+
"options": {
|
|
203
|
+
"$ref": "#/definitions/Options",
|
|
204
|
+
"description": "ルールの照合に使用するオプションを指定します。",
|
|
205
|
+
"examples": [
|
|
206
|
+
{
|
|
207
|
+
"wordBoundary": true
|
|
208
|
+
}
|
|
209
|
+
],
|
|
210
|
+
"markdownDescription": "ルールの照合に使用するオプションを指定します。"
|
|
211
|
+
},
|
|
212
|
+
"pattern": {
|
|
213
|
+
"anyOf": [
|
|
214
|
+
{
|
|
215
|
+
"type": "string"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"items": {
|
|
219
|
+
"type": "string"
|
|
220
|
+
},
|
|
221
|
+
"type": "array"
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"type": "null"
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
"description": "修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。 `pattern`と`patterns`のどちらも省略した場合は`expected`からパターンを生成します。",
|
|
228
|
+
"examples": [
|
|
229
|
+
"ディフォルト",
|
|
230
|
+
"/サーバ(?!ー)/",
|
|
231
|
+
[
|
|
232
|
+
"ハードウエアー",
|
|
233
|
+
"ハードウェアー",
|
|
234
|
+
"ハードウエア"
|
|
235
|
+
]
|
|
236
|
+
],
|
|
237
|
+
"markdownDescription": "修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。\n`pattern`と`patterns`のどちらも省略した場合は`expected`からパターンを生成します。"
|
|
238
|
+
},
|
|
239
|
+
"patterns": {
|
|
240
|
+
"anyOf": [
|
|
241
|
+
{
|
|
242
|
+
"type": "string"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"items": {
|
|
246
|
+
"type": "string"
|
|
247
|
+
},
|
|
248
|
+
"type": "array"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"type": "null"
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"description": "修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。`pattern`の別名であり、両方を指定すると`pattern`が優先されます。両方を省略すると`expected`からパターンを生成します。",
|
|
255
|
+
"examples": [
|
|
256
|
+
[
|
|
257
|
+
"ハードウエアー",
|
|
258
|
+
"ハードウェアー",
|
|
259
|
+
"ハードウエア"
|
|
260
|
+
]
|
|
261
|
+
],
|
|
262
|
+
"markdownDescription": "修正対象に一致する文字列、正規表現形式の文字列、またはそれらの配列を指定します。`pattern`の別名であり、両方を指定すると`pattern`が優先されます。両方を省略すると`expected`からパターンを生成します。"
|
|
263
|
+
},
|
|
264
|
+
"prh": {
|
|
265
|
+
"description": "外部ツール向けの補足メッセージを指定します。この値はprh本体の校正処理には影響しません。",
|
|
266
|
+
"examples": [
|
|
267
|
+
"半角カッコの代わりに全角カッコを使うこと。文字のバランスが崩れるためです"
|
|
268
|
+
],
|
|
269
|
+
"markdownDescription": "外部ツール向けの補足メッセージを指定します。この値はprh本体の校正処理には影響しません。",
|
|
270
|
+
"type": "string"
|
|
271
|
+
},
|
|
272
|
+
"regexpMustEmpty": {
|
|
273
|
+
"description": "`pattern`のキャプチャグループが空であることをルールの適用条件として指定します。対象のグループは`$1`の形式で指定します。",
|
|
274
|
+
"examples": [
|
|
275
|
+
"$1"
|
|
276
|
+
],
|
|
277
|
+
"markdownDescription": "`pattern`のキャプチャグループが空であることをルールの適用条件として指定します。対象のグループは`$1`の形式で指定します。",
|
|
278
|
+
"type": "string"
|
|
279
|
+
},
|
|
280
|
+
"specs": {
|
|
281
|
+
"description": "ルールの変換結果を検証するテストケースを指定します。期待と異なる場合は設定ファイルの読み込みに失敗します。",
|
|
282
|
+
"examples": [
|
|
283
|
+
[
|
|
284
|
+
{
|
|
285
|
+
"from": "jquery",
|
|
286
|
+
"to": "jQuery"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"from": "JQUERY",
|
|
290
|
+
"to": "jQuery"
|
|
291
|
+
}
|
|
292
|
+
]
|
|
293
|
+
],
|
|
294
|
+
"items": {
|
|
295
|
+
"$ref": "#/definitions/RuleSpec"
|
|
296
|
+
},
|
|
297
|
+
"markdownDescription": "ルールの変換結果を検証するテストケースを指定します。期待と異なる場合は設定ファイルの読み込みに失敗します。",
|
|
298
|
+
"type": "array"
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"required": [
|
|
302
|
+
"expected"
|
|
303
|
+
],
|
|
304
|
+
"type": "object"
|
|
305
|
+
},
|
|
306
|
+
"RuleSpec": {
|
|
307
|
+
"additionalProperties": false,
|
|
308
|
+
"properties": {
|
|
309
|
+
"from": {
|
|
310
|
+
"description": "ルールのテストに使用する入力文字列を指定します。",
|
|
311
|
+
"examples": [
|
|
312
|
+
"JQUERY"
|
|
313
|
+
],
|
|
314
|
+
"markdownDescription": "ルールのテストに使用する入力文字列を指定します。",
|
|
315
|
+
"type": "string"
|
|
316
|
+
},
|
|
317
|
+
"to": {
|
|
318
|
+
"description": "入力文字列にルールを適用した結果として期待する文字列を指定します。",
|
|
319
|
+
"examples": [
|
|
320
|
+
"jQuery"
|
|
321
|
+
],
|
|
322
|
+
"markdownDescription": "入力文字列にルールを適用した結果として期待する文字列を指定します。",
|
|
323
|
+
"type": "string"
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
"required": [
|
|
327
|
+
"from",
|
|
328
|
+
"to"
|
|
329
|
+
],
|
|
330
|
+
"type": "object"
|
|
331
|
+
},
|
|
332
|
+
"Target": {
|
|
333
|
+
"additionalProperties": false,
|
|
334
|
+
"properties": {
|
|
335
|
+
"excludes": {
|
|
336
|
+
"description": "ファイル内で校正対象から除外する範囲を指定します。`includes`と`excludes`の両方に一致する範囲は除外されます。",
|
|
337
|
+
"examples": [
|
|
338
|
+
[
|
|
339
|
+
"/`.*?`/",
|
|
340
|
+
"/\\[[^\\]]*\\]\\([^)]+\\)/"
|
|
341
|
+
],
|
|
342
|
+
[
|
|
343
|
+
{
|
|
344
|
+
"pattern": "/^#@.*$/"
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
],
|
|
348
|
+
"items": {
|
|
349
|
+
"anyOf": [
|
|
350
|
+
{
|
|
351
|
+
"type": "string"
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"$ref": "#/definitions/TargetPattern"
|
|
355
|
+
}
|
|
356
|
+
]
|
|
357
|
+
},
|
|
358
|
+
"markdownDescription": "ファイル内で校正対象から除外する範囲を指定します。`includes`と`excludes`の両方に一致する範囲は除外されます。",
|
|
359
|
+
"type": "array"
|
|
360
|
+
},
|
|
361
|
+
"file": {
|
|
362
|
+
"description": "校正範囲の設定を適用するファイルパスに一致する文字列または正規表現形式の文字列を指定します。",
|
|
363
|
+
"examples": [
|
|
364
|
+
"/\\.md$/",
|
|
365
|
+
"/\\.re$/"
|
|
366
|
+
],
|
|
367
|
+
"markdownDescription": "校正範囲の設定を適用するファイルパスに一致する文字列または正規表現形式の文字列を指定します。",
|
|
368
|
+
"type": "string"
|
|
369
|
+
},
|
|
370
|
+
"includes": {
|
|
371
|
+
"description": "ファイル内で校正対象とする範囲を指定します。複数指定した場合は、いずれかに一致する範囲が対象になります。",
|
|
372
|
+
"examples": [
|
|
373
|
+
[
|
|
374
|
+
"/\\/\\/.*$/"
|
|
375
|
+
]
|
|
376
|
+
],
|
|
377
|
+
"items": {
|
|
378
|
+
"anyOf": [
|
|
379
|
+
{
|
|
380
|
+
"type": "string"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"$ref": "#/definitions/TargetPattern"
|
|
384
|
+
}
|
|
385
|
+
]
|
|
386
|
+
},
|
|
387
|
+
"markdownDescription": "ファイル内で校正対象とする範囲を指定します。複数指定した場合は、いずれかに一致する範囲が対象になります。",
|
|
388
|
+
"type": "array"
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
"required": [
|
|
392
|
+
"file"
|
|
393
|
+
],
|
|
394
|
+
"type": "object"
|
|
395
|
+
},
|
|
396
|
+
"TargetPattern": {
|
|
397
|
+
"additionalProperties": false,
|
|
398
|
+
"properties": {
|
|
399
|
+
"pattern": {
|
|
400
|
+
"description": "ファイル内の範囲に一致する文字列または正規表現形式の文字列を指定します。",
|
|
401
|
+
"examples": [
|
|
402
|
+
"/^#@.*$/"
|
|
403
|
+
],
|
|
404
|
+
"markdownDescription": "ファイル内の範囲に一致する文字列または正規表現形式の文字列を指定します。",
|
|
405
|
+
"type": "string"
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"required": [
|
|
409
|
+
"pattern"
|
|
410
|
+
],
|
|
411
|
+
"type": "object"
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|