Skip to content

Commit 1b94014

Browse files
committed
Merge pull request #3 from azu/fix-2
"、"を間隔値としてカウントするように
2 parents 6c3be22 + 210ebfe commit 1b94014

File tree

3 files changed

+60
-16
lines changed

3 files changed

+60
-16
lines changed

README.md

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@ Dependencies
2222

2323
## Usage
2424

25+
Via `.textlintrc`(推奨)
26+
27+
```js
28+
{
29+
"rules": {
30+
"no-doubled-joshi": {
31+
"min_interval" : 1,
32+
"strict": false
33+
}
34+
}
35+
}
36+
```
37+
38+
Via CLI
39+
40+
```
41+
textlint --rule no-doubled-joshi README.md
42+
```
43+
44+
2545
### Options
2646

2747
`.textlintrc` options.
@@ -72,20 +92,25 @@ Dependencies
7292

7393
設定が `{ strict: true }` ならばエラーとするが、デフォルトでは`{ strict: false }` となっている。
7494

75-
#### 助詞:連体化 "の"
95+
### 助詞:連体化 "の"
7696

7797
"の" の重なりは例外として許可する。
7898

7999
- [第8回:読みやすさへの工夫 3(てにおは助詞) - たくみの匠](http://www.asca-co.com/takumi/2010/07/3.html "第8回:読みやすさへの工夫 3(てにおは助詞) - たくみの匠")
80100
- [作文入門](http://www.slideshare.net/takahi-i/ss-13429892 "作文入門")
81101
- "の" の消し方について
82102

83-
#### 助詞:格助詞 "を"
103+
### 助詞:格助詞 "を"
84104

85105
> オブジェクトを返す関数を公開する
86106
87107
"を" の重なりは例外として許可する。
88108

109+
### "、"での区切り
110+
111+
> 右がiPhone、左がAndroidです。
112+
113+
"、"を間隔値+1としてカウントするため、上記の文章はデフォルトでは許容される。
89114

90115
## Tests
91116

src/no-doubled-joshi.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,25 @@ import {RuleHelper} from "textlint-rule-helper";
44
import {getTokenizer} from "kuromojin";
55
import splitSentences, {Syntax as SentenceSyntax} from "sentence-splitter";
66
import StringSource from "textlint-util-to-string";
7+
// 助詞どうか
8+
const is助詞Token = token => {
9+
return token.pos === "助詞";
10+
};
11+
const is読点Token = token => {
12+
return token.surface_form === "、" && token.pos === "名詞";
13+
};
714
/**
8-
* create a object that
9-
* map ={
10-
* // these token.surface_form === "Hoge"
11-
* "Hoge" [token, token]
15+
* Create token map object
16+
* {
17+
* "で": [token, token],
18+
* "の": [token, token]
1219
* }
1320
* @param tokens
1421
* @returns {*}
1522
*/
1623
function createSurfaceKeyMap(tokens) {
17-
return tokens.reduce((keyMap, token) => {
24+
// 助詞のみを対象とする
25+
return tokens.filter(is助詞Token).reduce((keyMap, token) => {
1826
// "は" : [token]
1927
if (!keyMap[token.surface_form]) {
2028
keyMap[token.surface_form] = [];
@@ -43,7 +51,6 @@ const defaultOptions = {
4351
strict: false
4452
};
4553

46-
4754
/*
4855
1. Paragraph Node -> text
4956
2. text -> sentences
@@ -74,11 +81,16 @@ export default function (context, options = {}) {
7481
return getTokenizer().then(tokenizer => {
7582
const checkSentence = (sentence) => {
7683
let tokens = tokenizer.tokenizeForSentence(sentence.raw);
77-
const isJoshiToken = token => {
78-
return token.pos === "助詞";
79-
};
80-
let joshiTokens = tokens.filter(isJoshiToken);
81-
let joshiTokenSurfaceKeyMap = createSurfaceKeyMap(joshiTokens);
84+
let countableTokens = tokens.filter(token => {
85+
if (isStrict) {
86+
return is助詞Token(token);
87+
}
88+
// デフォルトでは、"、"を間隔値の距離としてカウントする
89+
// "、" があると助詞同士の距離が開くようにすることで、並列的な"、"の使い方を許容する目的
90+
// https://github.com/azu/textlint-rule-no-doubled-joshi/issues/2
91+
return is助詞Token(token) || is読点Token(token);
92+
});
93+
let joshiTokenSurfaceKeyMap = createSurfaceKeyMap(countableTokens);
8294
/*
8395
# Data Structure
8496
@@ -102,8 +114,8 @@ export default function (context, options = {}) {
102114
// if found differenceIndex less than
103115
// tokes are sorted ascending order
104116
tokens.reduce((prev, current) => {
105-
let startPosition = joshiTokens.indexOf(prev);
106-
let otherPosition = joshiTokens.indexOf(current);
117+
let startPosition = countableTokens.indexOf(prev);
118+
let otherPosition = countableTokens.indexOf(current);
107119
// if difference
108120
let differenceIndex = otherPosition - startPosition;
109121
if (differenceIndex <= minInterval) {

test/no-doubled-joshi-test.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ tester.run("no-double-joshi", rule, {
77
"私は彼が好きだ",
88
"既存のコードの利用", // "の" の例外
99
"オブジェクトを返す関数を公開した", // "を" の例外
10-
"私は彼の鼻は好きだ"
10+
"私は彼の鼻は好きだ",
11+
// 、 tokenを距離 + 1 として考える
12+
"右がiPhone、左がAndroidです。",
13+
"ナイフで切断した後、ハンマーで破砕した。"
1114
],
1215
invalid: [
1316
{
@@ -70,7 +73,11 @@ tester.run("no-double-joshi", rule, {
7073
]
7174
},
7275
{
76+
// 、 で間隔値が+1されるが、strictでは+されない
7377
text: "彼女は困り切った表情で、小声で尋ねた。",
78+
options: {
79+
strict: true
80+
},
7481
errors: [
7582
{
7683
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,

0 commit comments

Comments
 (0)