|
1 | 1 | // LICENSE : MIT
|
2 | 2 | "use strict";
|
3 | 3 | import { RuleHelper } from "textlint-rule-helper";
|
4 |
| -import { getTokenizer } from "kuromojin"; |
| 4 | +import { tokenize } from "kuromojin"; |
5 | 5 | import { splitAST, Syntax as SentenceSyntax } from "sentence-splitter";
|
6 | 6 | import { StringSource } from "textlint-util-to-string";
|
7 | 7 |
|
@@ -103,59 +103,58 @@ module.exports = function (context, options = {}) {
|
103 | 103 | 2. sentence to tokens
|
104 | 104 | 3. check tokens
|
105 | 105 | */
|
106 |
| - return getTokenizer().then((tokenizer) => { |
107 |
| - sentences.forEach((sentence) => { |
108 |
| - const source = new StringSource(sentence); |
109 |
| - const text = source.toString(); |
110 |
| - const tokens = tokenizer.tokenizeForSentence(text); |
111 |
| - let currentTenCount = 0; |
112 |
| - let lastToken = null; |
113 |
| - tokens.forEach((token, index) => { |
114 |
| - const surface = token.surface_form; |
115 |
| - if (surface === touten) { |
116 |
| - // 名詞に囲まわれている場合は例外とする |
117 |
| - const isSandwiched = isSandwichedMeishi({ |
118 |
| - before: findSiblingMeaningToken({ |
119 |
| - tokens, |
120 |
| - currentIndex: index, |
121 |
| - direction: "prev" |
122 |
| - }), |
123 |
| - token: token, |
124 |
| - after: findSiblingMeaningToken({ |
125 |
| - tokens, |
126 |
| - currentIndex: index, |
127 |
| - direction: "next" |
128 |
| - }) |
129 |
| - }); |
130 |
| - // strictなら例外を例外としない |
131 |
| - if (!isStrict && isSandwiched) { |
132 |
| - return; |
133 |
| - } |
134 |
| - currentTenCount++; |
135 |
| - lastToken = token; |
136 |
| - } |
137 |
| - if (surface === kuten) { |
138 |
| - // reset |
139 |
| - currentTenCount = 0; |
140 |
| - } |
141 |
| - // report |
142 |
| - if (currentTenCount > maxLen) { |
143 |
| - const positionInSentence = source.originalIndexFromIndex(lastToken.word_position - 1); |
144 |
| - // relative index from Paragraph Node |
145 |
| - // Sentence start(relative) + word position(relative) |
146 |
| - const index = sentence.range[0] - node.range[0] + positionInSentence; |
147 |
| - const ruleError = new context.RuleError( |
148 |
| - `一つの文で"${touten}"を${maxLen + 1}つ以上使用しています`, |
149 |
| - { |
150 |
| - index |
151 |
| - } |
152 |
| - ); |
153 |
| - report(node, ruleError); |
154 |
| - currentTenCount = 0; |
| 106 | + const checkSentence = async (sentence) => { |
| 107 | + const source = new StringSource(sentence); |
| 108 | + const text = source.toString(); |
| 109 | + const tokens = await tokenize(text); |
| 110 | + let currentTenCount = 0; |
| 111 | + let lastToken = null; |
| 112 | + tokens.forEach((token, index) => { |
| 113 | + const surface = token.surface_form; |
| 114 | + if (surface === touten) { |
| 115 | + // 名詞に囲まわれている場合は例外とする |
| 116 | + const isSandwiched = isSandwichedMeishi({ |
| 117 | + before: findSiblingMeaningToken({ |
| 118 | + tokens, |
| 119 | + currentIndex: index, |
| 120 | + direction: "prev" |
| 121 | + }), |
| 122 | + token: token, |
| 123 | + after: findSiblingMeaningToken({ |
| 124 | + tokens, |
| 125 | + currentIndex: index, |
| 126 | + direction: "next" |
| 127 | + }) |
| 128 | + }); |
| 129 | + // strictなら例外を例外としない |
| 130 | + if (!isStrict && isSandwiched) { |
| 131 | + return; |
155 | 132 | }
|
156 |
| - }); |
| 133 | + currentTenCount++; |
| 134 | + lastToken = token; |
| 135 | + } |
| 136 | + if (surface === kuten) { |
| 137 | + // reset |
| 138 | + currentTenCount = 0; |
| 139 | + } |
| 140 | + // report |
| 141 | + if (currentTenCount > maxLen) { |
| 142 | + const positionInSentence = source.originalIndexFromIndex(lastToken.word_position - 1); |
| 143 | + // relative index from Paragraph Node |
| 144 | + // Sentence start(relative) + word position(relative) |
| 145 | + const index = sentence.range[0] - node.range[0] + positionInSentence; |
| 146 | + const ruleError = new context.RuleError( |
| 147 | + `一つの文で"${touten}"を${maxLen + 1}つ以上使用しています`, |
| 148 | + { |
| 149 | + index |
| 150 | + } |
| 151 | + ); |
| 152 | + report(node, ruleError); |
| 153 | + currentTenCount = 0; |
| 154 | + } |
157 | 155 | });
|
158 |
| - }); |
| 156 | + }; |
| 157 | + return Promise.all(sentences.map(checkSentence)); |
159 | 158 | }
|
160 | 159 | };
|
161 | 160 | };
|
0 commit comments