Skip to content

Commit 3eb82a9

Browse files
committed
Merge pull request #6 from azu/fixer-support
Fixer support
2 parents 3e1a78c + 1251b35 commit 3eb82a9

File tree

5 files changed

+80
-47
lines changed

5 files changed

+80
-47
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# textlint-rule-prh [![Build Status](https://travis-ci.org/azu/textlint-rule-prh.svg?branch=master)](https://travis-ci.org/azu/textlint-rule-prh)
1+
# textlint-rule-prh [![textlint rule](https://img.shields.io/badge/textlint-fixable-green.svg?style=social)](https://textlint.github.io/) [![Build Status](https://travis-ci.org/azu/textlint-rule-prh.svg?branch=master)](https://travis-ci.org/azu/textlint-rule-prh)
22

33
[textlint](https://github.com/azu/textlint "textlint") rule for [vvakame/prh](https://github.com/vvakame/prh "vvakame/prh").
44

@@ -24,6 +24,12 @@ This rule check the spell by used with `prh.yml`.
2424

2525
`rulePaths` : path to YAML file.
2626

27+
### Fixable
28+
29+
[![textlint rule](https://img.shields.io/badge/textlint-fixable-green.svg?style=social)](https://textlint.github.io/)
30+
31+
`textlint-rule-prh` support `--fix` feature of textlint.
32+
2733
### What is prh.yml?
2834

2935
Please See [vvakame/prh](https://github.com/vvakame/prh "vvakame/prh").

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"bugs": {
1212
"url": "https://github.com/azu/textlint-rule-prh/issues"
1313
},
14-
"version": "2.3.0",
14+
"version": "2.4.0-0",
1515
"description": "textlint rule for prh.",
1616
"main": "lib/prh-rule.js",
1717
"files": [
@@ -41,6 +41,6 @@
4141
"espower-babel": "^3.3.0",
4242
"mocha": "^2.3.2",
4343
"power-assert": "^1.0.0",
44-
"textlint": "^4.0.0"
44+
"textlint": "^5.5.3"
4545
}
4646
}

src/prh-rule.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,22 @@ function mergePrh(...engines) {
3434
});
3535
return mainEngine;
3636
}
37-
export default function (context, options = {}) {
37+
const assertOptions = (options) => {
3838
if (typeof options.ruleContents === "undefined" && typeof options.rulePaths === "undefined") {
3939
throw new Error(`textlint-rule-prh require Rule Options.
4040
Please set .textlinrc:
4141
{
4242
"rules": {
4343
"prh": {
44-
"rulePaths" :["path/to/rule.yaml"]
44+
"rulePaths" :["path/to/prh.yml"]
4545
}
4646
}
4747
}
4848
`);
4949
}
50+
};
51+
function reporter(context, options = {}) {
52+
assertOptions(options);
5053
const textlintRcFilePath = context.config ? context.config.configFile : null;
5154
// .textlinrc directory
5255
const textlintRCDir = textlintRcFilePath ? path.dirname(textlintRcFilePath) : process.cwd();
@@ -58,7 +61,7 @@ Please set .textlinrc:
5861
const prhEngineFiles = createPrhEngine(rulePaths, textlintRCDir);
5962
const prhEngine = mergePrh(prhEngineFiles, prhEngineContent);
6063
const helper = new RuleHelper(context);
61-
const {Syntax, getSource, report, RuleError} = context;
64+
const {Syntax, getSource, report, fixer, RuleError} = context;
6265
return {
6366
[Syntax.Str](node){
6467
if (helper.isChildNode(node, [Syntax.Link, Syntax.Image, Syntax.BlockQuote, Syntax.Emphasis])) {
@@ -87,11 +90,16 @@ Please set .textlinrc:
8790
var position = src.indexToPosition(changeSet.index);
8891

8992
// line, column
90-
report(node, new RuleError(changeSet.matches[0] + " => " + expected, {
93+
report(node, new RuleError(matchedText + " => " + expected, {
9194
line: position.line - 1,
92-
column: position.column
95+
column: position.column,
96+
fix: fixer.replaceTextRange([changeSet.index, changeSet.index + matchedText.length], expected)
9397
}));
9498
});
9599
}
96100
}
101+
}
102+
export default {
103+
linter: reporter,
104+
fixer: reporter
97105
}

test/prh-rule-test.js

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,48 @@ describe("prh-rule-test", function () {
1818
});
1919
context("when match word", function () {
2020
it("should report error", function () {
21-
var result = textlint.lintMarkdown("テストjquery");
22-
assert(result.messages.length > 0);
23-
assert(result.messages[0].line === 1);
24-
assert(result.messages[0].column === 4);
21+
return textlint.lintMarkdown("テストjquery").then(result => {
22+
assert(result.messages.length > 0);
23+
assert(result.messages[0].line === 1);
24+
assert(result.messages[0].column === 4);
25+
});
2526
});
2627
});
2728
context("when match word but s/Web/Web/i pattern", function () {
2829
// fix ignore (the) case
2930
it("should not report", function () {
30-
var result = textlint.lintMarkdown("jQuery");
31-
assert(result.messages.length === 0);
31+
return textlint.lintMarkdown("jQuery").then(result => {
32+
assert(result.messages.length === 0);
33+
});
3234
});
3335
});
3436
context("when match word and s/ベンダ/ベンダー/ pattern", function () {
3537
// expected word contain actual word.
3638
// s/ベンダ/ベンダー/ のようにexpectedがpatternを包含している場合のexpectedを除外
3739
it("should not report", function () {
38-
var result = textlint.lintMarkdown("ベンダー");
39-
assert(result.messages.length === 0);
40+
return textlint.lintMarkdown("ベンダー").then(result => {
41+
assert(result.messages.length === 0);
42+
});
4043
});
4144
});
4245
context("when expected contain $1", function () {
4346
// expected word contain actual word.
4447
// s/ベンダ/ベンダー/ のようにexpectedがpatternを包含している場合のexpectedを除外
4548
it("should convert expected", function () {
46-
var result = textlint.lintMarkdown("広義のソフトウエアについて");
47-
assert(result.messages.length > 0);
48-
var message = result.messages[0].message;
49-
assert.equal(message, "のソフトウエア => のソフトウェア");
49+
return textlint.lintMarkdown("広義のソフトウエアについて").then(result => {
50+
assert(result.messages.length > 0);
51+
var message = result.messages[0].message;
52+
assert.equal(message, "のソフトウエア => のソフトウェア");
53+
});
54+
});
55+
});
56+
context("when fixer", function () {
57+
// expected word contain actual word.
58+
// s/ベンダ/ベンダー/ のようにexpectedがpatternを包含している場合のexpectedを除外
59+
it("should convert expected", function () {
60+
return textlint.fixText("広義のソフトウエアについて", ".md").then(({output}) => {
61+
assert.equal(output, "広義のソフトウェアについて");
62+
});
5063
});
5164
});
5265
});

test/textlintrc-test.js

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ describe(".textlinrc test", function () {
1616
"rulePaths": [path.join(__dirname, "fixtures", "rule.yaml")]
1717
}
1818
});
19-
var result = textlint.lintMarkdown("jquery");
20-
assert(result.messages.length === 1);
21-
assert(result.messages[0].line === 1);
22-
assert(result.messages[0].column === 1);
19+
return textlint.lintMarkdown("jquery").then(result => {
20+
assert(result.messages.length === 1);
21+
assert(result.messages[0].line === 1);
22+
assert(result.messages[0].column === 1);
23+
});
2324
});
2425
it("should resolve path to rule.yaml", function () {
2526
var textlint = new TextLintCore();
@@ -30,10 +31,11 @@ describe(".textlinrc test", function () {
3031
"rulePaths": [path.join(__dirname, "fixtures", "rule.yaml")]
3132
}
3233
});
33-
var result = textlint.lintMarkdown("jquery");
34-
assert(result.messages.length === 1);
35-
assert(result.messages[0].line === 1);
36-
assert(result.messages[0].column === 1);
34+
return textlint.lintMarkdown("jquery").then(result => {
35+
assert(result.messages.length === 1);
36+
assert(result.messages[0].line === 1);
37+
assert(result.messages[0].column === 1);
38+
});
3739
});
3840
it("should resolve yaml content", function () {
3941
var textlint = new TextLintCore();
@@ -45,10 +47,11 @@ describe(".textlinrc test", function () {
4547
"ruleContents": [content]
4648
}
4749
});
48-
var result = textlint.lintMarkdown("jquery");
49-
assert(result.messages.length === 1);
50-
assert(result.messages[0].line === 1);
51-
assert(result.messages[0].column === 1);
50+
return textlint.lintMarkdown("jquery").then(result => {
51+
assert(result.messages.length === 1);
52+
assert(result.messages[0].line === 1);
53+
assert(result.messages[0].column === 1);
54+
});
5255
});
5356
it("should resolve yaml file and content", function () {
5457
var textlint = new TextLintCore();
@@ -63,13 +66,13 @@ describe(".textlinrc test", function () {
6366
"ruleContents": [content]
6467
}
6568
});
66-
var result = textlint.lintMarkdown("jquery A");
67-
assert(result.messages.length === 2);
68-
assert(result.messages[0].line === 1);
69-
assert(result.messages[0].column === 1);
70-
assert(result.messages[1].line === 1);
71-
assert(result.messages[1].column === 8);
72-
69+
return textlint.lintMarkdown("jquery A").then(result => {
70+
assert(result.messages.length === 2);
71+
assert(result.messages[0].line === 1);
72+
assert(result.messages[0].column === 1);
73+
assert(result.messages[1].line === 1);
74+
assert(result.messages[1].column === 8);
75+
});
7376
});
7477

7578
});
@@ -84,14 +87,17 @@ describe(".textlinrc test", function () {
8487
"rulePaths": [path.join(__dirname, "fixtures", "imports.yml")]
8588
}
8689
});
87-
var result = textlint.lintMarkdown("A");
88-
assert(result.messages.length === 1);
89-
var message = result.messages[0].message;
90-
assert.equal(message, "A => a");
91-
var resultB = textlint.lintMarkdown("B");
92-
assert(resultB.messages.length === 1);
93-
var messageB = resultB.messages[0].message;
94-
assert.equal(messageB, "B => b");
90+
return textlint.lintMarkdown("A").then(result => {
91+
assert(result.messages.length === 1);
92+
var message = result.messages[0].message;
93+
assert.equal(message, "A => a");
94+
}).then(() => {
95+
return textlint.lintMarkdown("B").then(result => {
96+
assert(result.messages.length === 1);
97+
var messageB = result.messages[0].message;
98+
assert.equal(messageB, "B => b");
99+
});
100+
});
95101
});
96102
});
97103
});

0 commit comments

Comments
 (0)