Skip to content

feat: improve error message #56

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 67 additions & 6 deletions src/no-doubled-joshi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,50 @@ export interface Options {
commaCharacters?: string[];
}

interface ToTextWithPrevTokenParams {
tokens: KuromojiToken[];
sentence: SentenceNode;
}


/**
* "~~~~~~{助詞}" から {Token}"{助詞}" という形になるように、前の単語を含めた助詞の文字列を取得する
*
* 前のNodeがStrの場合は、一つ前のTokenを取得する
* {Str}{助詞} -> {Token}"{助詞}"
*
* それ以外のNodeの場合は、そのNodeの文字列を取得する
* {Code}{助詞} -> {Code}"{助詞}"
* {Strong}{助詞} -> {Strong}"{助詞}"
*
* @param token
* @param tokens
* @param sentence
*/
const toTextWithPrevWord = (token: KuromojiToken, { tokens, sentence }: ToTextWithPrevTokenParams) => {
const index = tokens.indexOf(token);
const prevToken = tokens[index - 1];
// 前のTokenがない場合は、Tokenのsurface_formを返す
const DEFAULT_RESULT = `"${token.surface_form}"`;
if (!prevToken) {
return DEFAULT_RESULT;
}
const originalIndex = prevToken.word_position - 1;
if (originalIndex === undefined) {
return DEFAULT_RESULT;
}
// Tokenの位置に該当するNodeを取得する
const originalNode = sentence.children.find(node => {
return node.range[0] <= originalIndex && originalIndex < node.range[1];
});
if (originalNode === undefined) {
return DEFAULT_RESULT;
}
if (originalNode.type === "Str") {
return `${prevToken.surface_form}"${token.surface_form}"`
}
return `${originalNode.raw}"${token.surface_form}"`;
}
/*
1. Paragraph Node -> text
2. text -> sentences
Expand Down Expand Up @@ -198,36 +242,53 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
}
*/
Object.keys(joshiTokenSurfaceKeyMap).forEach((key) => {
const tokens: KuromojiToken[] = joshiTokenSurfaceKeyMap[key];
const joshiTokenSurfaceTokens: KuromojiToken[] = joshiTokenSurfaceKeyMap[key];
const joshiName = restoreToSurfaceFromKey(key);
// check allow
if (allow.indexOf(joshiName) >= 0) {
if (allow.includes(joshiName)) {
return;
}
// strict mode ではない時例外を除去する
if (!isStrict) {
if (matchExceptionRule(tokens)) {
if (matchExceptionRule(joshiTokenSurfaceTokens)) {
return;
}
}
if (tokens.length <= 1) {
if (joshiTokenSurfaceTokens.length <= 1) {
return; // no duplicated token
}
// if found differenceIndex less than
// tokes are sorted ascending order
tokens.reduce((prev, current) => {
joshiTokenSurfaceTokens.reduce((prev, current) => {
const startPosition = countableTokens.indexOf(prev);
const otherPosition = countableTokens.indexOf(current);
// 助詞token同士の距離が設定値以下ならエラーを報告する
const differenceIndex = otherPosition - startPosition;
if (differenceIndex <= minInterval) {
// 連続する助詞を集める
const startWord = toTextWithPrevWord(prev, {
tokens: tokens,
sentence: sentence
});
const endWord = toTextWithPrevWord(current, {
tokens: tokens,
sentence: sentence
});
// padding positionを計算する
const originalIndex = sentenceSource.originalIndexFromIndex(current.word_position - 1);
report(
// @ts-expect-error: SentenceNodeは独自であるため
sentence,
new RuleError(
`一文に二回以上利用されている助詞 "${joshiName}" がみつかりました。`,
`一文に二回以上利用されている助詞 "${joshiName}" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- ${startWord}
- ${endWord}

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
{
index: originalIndex,
}
Expand Down
160 changes: 144 additions & 16 deletions test/no-doubled-joshi-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,15 @@ tester.run("no-double-joshi", rule, {
text: "私は彼は好きだ",
errors: [
{
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 私"は"
- 彼"は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
// last match
line: 1,
column: 4,
Expand All @@ -85,7 +93,15 @@ tester.run("no-double-joshi", rule, {
text: "あなたは「私は彼は好きだ」と言った。",
errors: [
{
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 私"は"
- 彼"は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
index: 8,
},
],
Expand All @@ -94,7 +110,15 @@ tester.run("no-double-joshi", rule, {
text: "材料不足で代替素材で製品を作った。",
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 不足"で"
- 素材"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 10,
},
Expand All @@ -104,7 +128,15 @@ tester.run("no-double-joshi", rule, {
text: "クォートで囲むことで文字列を作成できる点は、他の文字列リテラルと同じです。",
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- クォート"で"
- こと"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
index: 9,
},
],
Expand All @@ -113,7 +145,15 @@ tester.run("no-double-joshi", rule, {
text: "列車事故でバスで振り替え輸送を行った。 ",
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 事故"で"
- バス"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 8,
},
Expand All @@ -126,12 +166,28 @@ tester.run("no-double-joshi", rule, {
},
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 機"で"
- 洗剤"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 17,
},
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 洗剤"で"
- 機"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 24,
},
Expand All @@ -141,7 +197,15 @@ tester.run("no-double-joshi", rule, {
text: "法律案は十三日の衆議院本会議で賛成多数で可決され、参議院に送付されます",
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 会議"で"
- 多数"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 20,
},
Expand All @@ -155,7 +219,15 @@ tester.run("no-double-joshi", rule, {
},
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 表情"で"
- 小声"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 15,
},
Expand All @@ -168,7 +240,15 @@ tester.run("no-double-joshi", rule, {
},
errors: [
{
message: `一文に二回以上利用されている助詞 "で" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "で" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 白装束"で"
- 足どり"で"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 13,
},
Expand All @@ -181,7 +261,15 @@ tester.run("no-double-joshi", rule, {
},
errors: [
{
message: `一文に二回以上利用されている助詞 "の" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "の" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 既存"の"
- コード"の"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 7,
},
Expand All @@ -191,7 +279,15 @@ tester.run("no-double-joshi", rule, {
text: "これは`obj.method`は何をしているかを示します。",
errors: [
{
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- これ"は"
- \`obj.method\`"は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 16,
},
Expand All @@ -203,7 +299,15 @@ tester.run("no-double-joshi", rule, {
text: "文字列にはそこには問題がある。",
errors: [
{
message: `一文に二回以上利用されている助詞 "には" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "には" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- 列"には"
- そこ"には"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
line: 1,
column: 8,
},
Expand All @@ -219,7 +323,15 @@ tester.run("no-double-joshi", rule, {
* 複数articleを束ねてFirebaseへデプロイ`,
errors: [
{
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- サイト"は"
- スライド"は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
index: 19,
},
],
Expand All @@ -231,7 +343,15 @@ tester.run("no-double-joshi", rule, {
options: { separatorCharacters: ["。"] },
errors: [
{
message: `一文に二回以上利用されている助詞 "は" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- これ"は"
- これ"は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
index: 10,
},
],
Expand All @@ -242,7 +362,15 @@ tester.run("no-double-joshi", rule, {
options: { commaCharacters: [] },
errors: [
{
message: `一文に二回以上利用されている助詞 "が" がみつかりました。`,
message: `一文に二回以上利用されている助詞 "が" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- これ"が"
- これ"が"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
`,
index: 12,
},
],
Expand Down