| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import textlintRuleNoUnmatchedPair from '@textlint-rule/textlint-rule-no-unmatched-pair';
- import { TextlintKernel, TextlintKernelRule, TextlintRuleOptions } from '@textlint/kernel';
- import { AsyncLinter, Annotation } from 'codemirror/addon/lint/lint';
- import textlintToCodeMirror from 'textlint-message-to-codemirror';
- import textlintRuleCommonMisspellings from 'textlint-rule-common-misspellings';
- import textlintRuleDateWeekdayMismatch from 'textlint-rule-date-weekday-mismatch';
- // import textlintRuleEnCapitalization from 'textlint-rule-en-capitalization'; // omit because en-pos package is too big
- import textlintRuleJaHiraganaKeishikimeishi from 'textlint-rule-ja-hiragana-keishikimeishi';
- import textlintRuleJaNoAbusage from 'textlint-rule-ja-no-abusage';
- import textlintRuleJaNoInappropriateWords from 'textlint-rule-ja-no-inappropriate-words';
- import textlintRuleJaNoMixedPeriod from 'textlint-rule-ja-no-mixed-period';
- import textlintRuleJaNoRedundantExpression from 'textlint-rule-ja-no-redundant-expression';
- import textlintRuleJaUnnaturalAlphabet from 'textlint-rule-ja-unnatural-alphabet';
- import textlintRuleMaxComma from 'textlint-rule-max-comma';
- import textlintRuleMaxKanjiContinuousLen from 'textlint-rule-max-kanji-continuous-len';
- import textlintRuleMaxTen from 'textlint-rule-max-ten';
- import textlintRuleNoDoubleNegativeJa from 'textlint-rule-no-double-negative-ja';
- import textlintRuleNoDoubledConjunction from 'textlint-rule-no-doubled-conjunction';
- import textlintRuleNoDoubledJoshi from 'textlint-rule-no-doubled-joshi';
- import textlintRuleNoDroppingTheRa from 'textlint-rule-no-dropping-the-ra';
- import textlintRuleNoHankakuKana from 'textlint-rule-no-hankaku-kana';
- import textlintRuleNoKangxiRadicals from 'textlint-rule-no-kangxi-radicals';
- import textlintRuleNoMixedZenkakuAndHankakuAlphabet from 'textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet';
- import textlintRuleNoNfd from 'textlint-rule-no-nfd';
- import textlintRuleNoSurrogatePair from 'textlint-rule-no-surrogate-pair';
- import textlintRuleNoZeroWidthSpaces from 'textlint-rule-no-zero-width-spaces';
- import textlintRulePeriodInListItem from 'textlint-rule-period-in-list-item';
- import textlintRulePreferTariTari from 'textlint-rule-prefer-tari-tari';
- import textlintRuleSentenceLength from 'textlint-rule-sentence-length';
- import textlintRuleUseSiUnits from 'textlint-rule-use-si-units';
- import { loggerFactory } from './utils/logger';
- type RulesConfigObj = {
- name: string,
- options?: unknown,
- isEnabled?: boolean,
- }
- type RuleExtension = {
- ext: string
- }
- const ruleModulesList = {
- 'no-unmatched-pair': textlintRuleNoUnmatchedPair,
- 'common-misspellings': textlintRuleCommonMisspellings,
- 'date-weekday-mismatch': textlintRuleDateWeekdayMismatch,
- // 'en-capitalization': textlintRuleEnCapitalization, // omit because en-pos package is too big
- 'ja-hiragana-keishikimeishi': textlintRuleJaHiraganaKeishikimeishi,
- 'ja-no-abusage': textlintRuleJaNoAbusage,
- 'ja-no-inappropriate-words': textlintRuleJaNoInappropriateWords,
- 'ja-no-mixed-period': textlintRuleJaNoMixedPeriod,
- 'ja-no-redundant-expression': textlintRuleJaNoRedundantExpression,
- 'ja-unnatural-alphabet': textlintRuleJaUnnaturalAlphabet,
- 'max-comma': textlintRuleMaxComma,
- 'max-kanji-continuous-len': textlintRuleMaxKanjiContinuousLen,
- 'max-ten': textlintRuleMaxTen,
- 'no-double-negative-ja': textlintRuleNoDoubleNegativeJa,
- 'no-doubled-conjunction': textlintRuleNoDoubledConjunction,
- 'no-doubled-joshi': textlintRuleNoDoubledJoshi,
- 'no-dropping-the-ra': textlintRuleNoDroppingTheRa,
- 'no-hankaku-kana': textlintRuleNoHankakuKana,
- 'no-kangxi-radicals': textlintRuleNoKangxiRadicals,
- 'no-mixed-zenkaku-and-hankaku-alphabet': textlintRuleNoMixedZenkakuAndHankakuAlphabet,
- 'no-nfd': textlintRuleNoNfd,
- 'no-surrogate-pair': textlintRuleNoSurrogatePair,
- 'no-zero-width-spaces': textlintRuleNoZeroWidthSpaces,
- 'period-in-list-item': textlintRulePeriodInListItem,
- 'prefer-tari-tari': textlintRulePreferTariTari,
- 'sentence-length': textlintRuleSentenceLength,
- 'use-si-units': textlintRuleUseSiUnits,
- };
- const logger = loggerFactory('growi:codemirror:codemirror-textlint');
- const kernel = new TextlintKernel();
- const textlintOption: TextlintRuleOptions<RuleExtension> = {
- ext: '.md',
- plugins: [
- {
- pluginId: 'markdown',
- plugin: require('textlint-plugin-markdown'),
- },
- ],
- };
- const createSetupRules = (rules, ruleOptions): TextlintKernelRule[] => (
- Object.keys(rules).map(ruleName => (
- {
- ruleId: ruleName,
- rule: rules[ruleName],
- options: ruleOptions[ruleName],
- }
- ))
- );
- export const createValidator = (rulesConfigArray: RulesConfigObj[] | null): AsyncLinter<RulesConfigObj[] | null> => {
- if (rulesConfigArray != null) {
- const filteredConfigArray = rulesConfigArray
- .filter((rule) => {
- if (ruleModulesList[rule.name] == null) {
- logger.error(`Textlint rule ${rule.name} is not installed`);
- }
- return (ruleModulesList[rule.name] != null && rule.isEnabled !== false);
- });
- const rules = filteredConfigArray
- .reduce((rules, rule) => {
- rules[rule.name] = ruleModulesList[rule.name];
- return rules;
- }, {});
- const rulesOption = filteredConfigArray
- .reduce((rules, rule) => {
- rules[rule.name] = rule.options || {};
- return rules;
- }, {});
- Object.assign(
- textlintOption,
- { rules: createSetupRules(rules, rulesOption) },
- );
- }
- const defaultSetupRules: TextlintKernelRule[] = Object.entries(ruleModulesList)
- .map(ruleName => ({
- ruleId: ruleName[0],
- rule: ruleName[1],
- }));
- if (rulesConfigArray == null) {
- Object.assign(
- textlintOption,
- { rules: defaultSetupRules },
- );
- }
- return (text, callback) => {
- if (!text) {
- callback([]);
- return;
- }
- kernel
- .lintText(text, textlintOption)
- .then((result) => {
- const lintMessages = result.messages;
- const lintErrors: Annotation[] = lintMessages.map(textlintToCodeMirror);
- callback(lintErrors);
- });
- };
- };
|