diff --git a/README.md b/README.md index c9dbc13..df93606 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,26 @@ Dependencies ## Usage +Via `.textlintrc`(推奨) + +```js +{ + "rules": { + "no-doubled-joshi": { + "min_interval" : 1, + "strict": false + } + } +} +``` + +Via CLI + +``` +textlint --rule no-doubled-joshi README.md +``` + + ### Options `.textlintrc` options. @@ -39,18 +59,18 @@ Dependencies } ``` -- `min_interval` : 助詞の最低間隔値 +- `min_interval`(default: 1) : 助詞の最低間隔値 - 指定した間隔値以下で同じ助詞が出現した場合エラーが出力されます。 -- `strict`: (default: false) 例外もエラーとするかどうか +- `strict`(default: false) :例外もエラーとするかどうか - 下記参照。例外としているものもエラーとするかどうか > 私**は**彼**は**好き この場合の、**は**と**は**の間隔値は1 -> 既存**の**文章**の**修正 +> 既存**の**文と絵**の**修正 -この場合の、**の**と**の**の間隔値は2 +この場合の、**の**と**の**の間隔値は2(間に**の**がある) ## 判定処理 @@ -72,7 +92,7 @@ Dependencies 設定が `{ strict: true }` ならばエラーとするが、デフォルトでは`{ strict: false }` となっている。 -#### 助詞:連体化 "の" +### 助詞:連体化 "の" "の" の重なりは例外として許可する。 @@ -80,12 +100,17 @@ Dependencies - [作文入門](http://www.slideshare.net/takahi-i/ss-13429892 "作文入門") - "の" の消し方について -#### 助詞:格助詞 "を" +### 助詞:格助詞 "を" > オブジェクトを返す関数を公開する "を" の重なりは例外として許可する。 +### "、"での区切り + +> 右がiPhone、左がAndroidです。 + +"、"を間隔値+1としてカウントするため、上記の文章はデフォルトでは許容される。 ## Tests diff --git a/src/no-doubled-joshi.js b/src/no-doubled-joshi.js index 49305cf..4c832e8 100644 --- a/src/no-doubled-joshi.js +++ b/src/no-doubled-joshi.js @@ -4,17 +4,25 @@ import {RuleHelper} from "textlint-rule-helper"; import {getTokenizer} from "kuromojin"; import splitSentences, {Syntax as SentenceSyntax} from "sentence-splitter"; import StringSource from "textlint-util-to-string"; +// 助詞どうか +const is助詞Token = token => { + return token.pos === "助詞"; +}; +const is読点Token = token => { + return token.surface_form === "、" && token.pos === "名詞"; +}; /** - * create a object that - * map ={ - * // these token.surface_form === "Hoge" - * "Hoge" [token, token] + * Create token map object + * { + * "で": [token, token], + * "の": [token, token] * } * @param tokens * @returns {*} */ function createSurfaceKeyMap(tokens) { - return tokens.reduce((keyMap, token) => { + // 助詞のみを対象とする + return tokens.filter(is助詞Token).reduce((keyMap, token) => { // "は" : [token] if (!keyMap[token.surface_form]) { keyMap[token.surface_form] = []; @@ -43,7 +51,6 @@ const defaultOptions = { strict: false }; - /* 1. Paragraph Node -> text 2. text -> sentences @@ -74,11 +81,16 @@ export default function (context, options = {}) { return getTokenizer().then(tokenizer => { const checkSentence = (sentence) => { let tokens = tokenizer.tokenizeForSentence(sentence.raw); - const isJoshiToken = token => { - return token.pos === "助詞"; - }; - let joshiTokens = tokens.filter(isJoshiToken); - let joshiTokenSurfaceKeyMap = createSurfaceKeyMap(joshiTokens); + let countableTokens = tokens.filter(token => { + if (isStrict) { + return is助詞Token(token); + } + // デフォルトでは、"、"を間隔値の距離としてカウントする + // "、" があると助詞同士の距離が開くようにすることで、並列的な"、"の使い方を許容する目的 + // https://github.com/azu/textlint-rule-no-doubled-joshi/issues/2 + return is助詞Token(token) || is読点Token(token); + }); + let joshiTokenSurfaceKeyMap = createSurfaceKeyMap(countableTokens); /* # Data Structure @@ -102,8 +114,8 @@ export default function (context, options = {}) { // if found differenceIndex less than // tokes are sorted ascending order tokens.reduce((prev, current) => { - let startPosition = joshiTokens.indexOf(prev); - let otherPosition = joshiTokens.indexOf(current); + let startPosition = countableTokens.indexOf(prev); + let otherPosition = countableTokens.indexOf(current); // if difference let differenceIndex = otherPosition - startPosition; if (differenceIndex <= minInterval) { diff --git a/test/no-doubled-joshi-test.js b/test/no-doubled-joshi-test.js index a51f241..e7c3012 100644 --- a/test/no-doubled-joshi-test.js +++ b/test/no-doubled-joshi-test.js @@ -7,7 +7,10 @@ tester.run("no-double-joshi", rule, { "私は彼が好きだ", "既存のコードの利用", // "の" の例外 "オブジェクトを返す関数を公開した", // "を" の例外 - "私は彼の鼻は好きだ" + "私は彼の鼻は好きだ", + // 、 tokenを距離 + 1 として考える + "右がiPhone、左がAndroidです。", + "ナイフで切断した後、ハンマーで破砕した。" ], invalid: [ { @@ -70,7 +73,11 @@ tester.run("no-double-joshi", rule, { ] }, { + // 、 で間隔値が+1されるが、strictでは+されない text: "彼女は困り切った表情で、小声で尋ねた。", + options: { + strict: true + }, errors: [ { message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,