Skip to content

Commit e11972b

Browse files
authored
fix(rule): カッコで囲まれた場合に外との連続判定ではないとする修正 (#32)
* fix(rule): カッコで囲まれた場合に外との連続判定ではないとする修正 * docs: Update README
1 parent b22aabe commit e11972b

File tree

4 files changed

+32
-7
lines changed

4 files changed

+32
-7
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ textlint --rule no-doubled-joshi README.md
139139

140140
読点文字は `commaCharacters` オプションで指定できます。
141141

142+
### カッコでの区切り
143+
144+
> 次の`escapeHTML`関数は**タグ関数**です(詳細は文字列の章を参照)
145+
146+
括弧(`(``)`)が助詞の間にある場合、間隔値は+1されます。
147+
そのため、この例の助詞``の間隔値は`2`となりデフォルトではエラーとなりません。
148+
149+
括弧記号はkuromoji.jsで定義されている記号を元に判定しています。
150+
142151
## 例外
143152

144153
以下の項目については、曖昧性があるため助詞が連続していてもデフォルトではエラーとして扱いません。

src/no-doubled-joshi.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
create読点Matcher,
99
concatJoishiTokens,
1010
createKeyFromKey,
11-
restoreToSurfaceFromKey
11+
restoreToSurfaceFromKey, is括弧Token
1212
} from "./token-utils";
1313
import { TxtNode } from "@textlint/ast-node-types";
1414
import { TextlintRuleModule } from "@textlint/types";
@@ -113,7 +113,7 @@ export interface Options {
113113
114114
TODO: need abstraction
115115
*/
116-
const report: TextlintRuleModule<Options> = function(context, options = {}) {
116+
const report: TextlintRuleModule<Options> = function (context, options = {}) {
117117
const helper = new RuleHelper(context);
118118
// 最低間隔値
119119
const minInterval = options.min_interval !== undefined ? options.min_interval : defaultOptions.min_interval;
@@ -124,7 +124,7 @@ const report: TextlintRuleModule<Options> = function(context, options = {}) {
124124
const allow = options.allow || defaultOptions.allow;
125125
const separatorCharacters = options.separatorCharacters || defaultOptions.separatorCharacters;
126126
const commaCharacters = options.commaCharacters || defaultOptions.commaCharacters;
127-
const { Syntax, report, RuleError } = context;
127+
const {Syntax, report, RuleError} = context;
128128
const is読点Token = create読点Matcher(commaCharacters);
129129
return {
130130
[Syntax.Paragraph](node) {
@@ -154,10 +154,19 @@ const report: TextlintRuleModule<Options> = function(context, options = {}) {
154154
if (isStrict) {
155155
return is助詞Token(token);
156156
}
157-
// デフォルトでは、"、"を間隔値の距離としてカウントする
157+
// "("や")"などもトークンとしてカウントする
158+
// xxxx(xxx) xxx でカッコの中と外に距離を一つ増やす目的
159+
// https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/31
160+
if (is括弧Token(token)) {
161+
return true;
162+
}
158163
// "、" があると助詞同士の距離が開くようにすることで、並列的な"、"の使い方を許容する目的
159164
// https://github.com/azu/textlint-rule-no-doubled-joshi/issues/2
160-
return is助詞Token(token) || is読点Token(token);
165+
if (is読点Token(token)) {
166+
return true;
167+
}
168+
// デフォルトでは、"、"を間隔値の距離としてカウントする
169+
return is助詞Token(token);
161170
});
162171
const joshiTokenSurfaceKeyMap = createSurfaceKeyMap(countableTokens);
163172
/*

src/token-utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ export const is助詞Token = (token: KuromojiToken) => {
99
return token && /^/.test(token.pos);
1010
};
1111

12+
export const is括弧Token = (token: KuromojiToken) => {
13+
return token && token.pos === "記号" && (token.pos_detail_1 === "括弧開" || token.pos_detail_1 === "括弧閉")
14+
}
15+
1216
/**
1317
* 読点を判定する関数を返す
1418
* 注意: 名詞や記号ではないトークンは読点として扱えない

test/no-doubled-joshi-test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ tester.run("no-double-joshi", rule, {
3131
"AとBとCを持ってきて",
3232
// fix regression - https://travis-ci.org/textlint-ja/textlint-rule-preset-ja-technical-writing/builds/207700760#L720
3333
"慣用的表現、熟語、概数、固有名詞、副詞など、漢数字を使用することが一般的な語句では漢数字を使います。",
34+
// カッコ内は別のセンテンスとしてみなす
35+
// https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/31
36+
" 次の`escapeHTML`関数は**タグ関数**です(詳細は文字列の章を参照)。",
3437
// 1個目の「と」は格助詞、2個めの「と」は接続助詞
3538
"ターミナルで「test」**と**入力する**と**、画面に表示されます。",
3639
// 格助詞の種類が異なる
@@ -185,7 +188,7 @@ tester.run("no-double-joshi", rule, {
185188
},
186189
//
187190
{
188-
text: `今まで「サイトはNetlify」「スライドはGitLab Pages」といった配信分けをしていたのですが
191+
text: `今まで、サイトはNetlifyスライドはGitLab Pagesといった配信分けをしていたのですが
189192
「 \`/slides\` にビルドしたスライドを置きたい」という動機のものと、こんな構成を検討しています。
190193
191194
* 最初にtextlintで文法チェック
@@ -194,7 +197,7 @@ tester.run("no-double-joshi", rule, {
194197
errors: [
195198
{
196199
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
197-
index: 21
200+
index: 19
198201
}
199202
]
200203
},

0 commit comments

Comments
 (0)