Skip to content

Commit

Permalink
feat(rule): 異なる種類の助詞の重複を許可する
Browse files Browse the repository at this point in the history
 助詞の品詞細分類1までを見て助詞同士を比較する。

 > ターミナルで「test」**と**入力する**と**、画面に表示されます。

 1個目の「と」は格助詞、2個めの「と」は接続助詞となるため、異なるものとして認識しエラーとしない。

 fix #6
  • Loading branch information
azu committed Feb 22, 2016
1 parent be216db commit c6fc90b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 11 deletions.
31 changes: 21 additions & 10 deletions src/no-doubled-joshi.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@ import {getTokenizer} from "kuromojin";
import splitSentences, {Syntax as SentenceSyntax} from "sentence-splitter";
import StringSource from "textlint-util-to-string";
// 助詞どうか
const is助詞Token = token => {
const is助詞Token = (token) => {
return token.pos === "助詞";
};
const is読点Token = token => {
const is読点Token = (token) => {
return token.surface_form === "、" && token.pos === "名詞";
};
// 助詞tokenから品詞細分類1までを元にしたkeyを作る
const createKeyFromKey = (token) => {
// e.g.) は:助詞.係助詞
return `${token.surface_form}:${token.pos}.${token.pos_detail_1}`
};
// keyからsurfaceを取り出す
const restoreToSurfaceFromKey = (key) => {
return key.split(":")[0];
};
/**
* Create token map object
* {
Expand All @@ -23,11 +32,12 @@ const is読点Token = token => {
function createSurfaceKeyMap(tokens) {
// 助詞のみを対象とする
return tokens.filter(is助詞Token).reduce((keyMap, token) => {
// "は" : [token]
if (!keyMap[token.surface_form]) {
keyMap[token.surface_form] = [];
// "は:助詞.係助詞" : [token]
const tokenKey = createKeyFromKey(token);
if (!keyMap[tokenKey]) {
keyMap[tokenKey] = [];
}
keyMap[token.surface_form].push(token);
keyMap[tokenKey].push(token);
return keyMap;
}, {});
}
Expand Down Expand Up @@ -100,12 +110,13 @@ export default function (context, options = {}) {
joshiTokens = [tokenA, tokenB, tokenC, tokenD, tokenE, tokenF]
joshiTokenSurfaceKeyMap = {
"は": [tokenA, tokenC, tokenE],
"で": [tokenB, tokenD, tokenF]
"は:助詞.係助詞": [tokenA, tokenC, tokenE],
"で:助詞.係助詞": [tokenB, tokenD, tokenF]
}
*/
Object.keys(joshiTokenSurfaceKeyMap).forEach(key => {
let tokens = joshiTokenSurfaceKeyMap[key];
const tokens = joshiTokenSurfaceKeyMap[key];
const joshiName = restoreToSurfaceFromKey(key);
// strict mode ではない時例外を除去する
if (!isStrict) {
if (matchExceptionRule(tokens)) {
Expand Down Expand Up @@ -134,7 +145,7 @@ export default function (context, options = {}) {
// this is padding column start with 0 (== -1)
column: originalPosition.column
};
report(node, new RuleError(`一文に二回以上利用されている助詞 "${key}" がみつかりました。`, padding));
report(node, new RuleError(`一文に二回以上利用されている助詞 "${joshiName}" がみつかりました。`, padding));
}
return current;
});
Expand Down
20 changes: 19 additions & 1 deletion test/no-doubled-joshi-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ import assert from "power-assert";
import rule from "../src/no-doubled-joshi";
import TextLintTester from "textlint-tester";
var tester = new TextLintTester();
/*
`**`のような装飾は取り除かれてから評価されているので、
テストでの強調という意味合いのみで利用する。
*/
tester.run("no-double-joshi", rule, {

valid: [
"私は彼が好きだ",
"既存のコードの利用", // "の" の例外
Expand All @@ -11,9 +16,13 @@ tester.run("no-double-joshi", rule, {
// 、 tokenを距離 + 1 として考える
"右がiPhone、左がAndroidです。",
"ナイフで切断した後、ハンマーで破砕した。",
"まずは試していただいて"
// 接続助詞のてが重複は許容
"まずは試していただいて",
// 1個目の「と」は格助詞、2個めの「と」は接続助詞
"ターミナルで「test」**と**入力する**と**、画面に表示されます。"
],
invalid: [
// エラー位置は最後の助詞の位置を表示する
{
text: "私は彼は好きだ",
errors: [
Expand Down Expand Up @@ -122,6 +131,15 @@ tester.run("no-double-joshi", rule, {
column: 16
}
]
}, {
text: "これとあれとそれを持ってきて。",
errors: [
{
message: `一文に二回以上利用されている助詞 "と" がみつかりました。`,
line: 1,
column: 6
}
]
}
]
});

0 comments on commit c6fc90b

Please sign in to comment.