index.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { TextlintKernel, TextlintKernelRule, TextlintRuleOptions } from '@textlint/kernel';
  2. import textlintToCodeMirror from 'textlint-message-to-codemirror';
  3. import textlintRuleNoInvalidControlCharacter from '@textlint-rule/textlint-rule-no-invalid-control-character';
  4. import textlintRuleNoUnmatchedPair from '@textlint-rule/textlint-rule-no-unmatched-pair';
  5. import textlintRuleCommonMisspellings from 'textlint-rule-common-misspellings';
  6. import textlintRuleDateWeekdayMismatch from 'textlint-rule-date-weekday-mismatch';
  7. import textlintRuleEnCapitalization from 'textlint-rule-en-capitalization';
  8. import textlintRuleJaHiraganaKeishikimeishi from 'textlint-rule-ja-hiragana-keishikimeishi';
  9. import textlintRuleJaNoAbusage from 'textlint-rule-ja-no-abusage';
  10. import textlintRuleJaNoInappropriateWords from 'textlint-rule-ja-no-inappropriate-words';
  11. import textlintRuleJaNoMixedPeriod from 'textlint-rule-ja-no-mixed-period';
  12. import textlintRuleJaNoRedundantExpression from 'textlint-rule-ja-no-redundant-expression';
  13. import textlintRuleJaUnnaturalAlphabet from 'textlint-rule-ja-unnatural-alphabet';
  14. import textlintRuleMaxComma from 'textlint-rule-max-comma';
  15. import textlintRuleMaxKanjiContinuousLen from 'textlint-rule-max-kanji-continuous-len';
  16. import textlintRuleMaxTen from 'textlint-rule-max-ten';
  17. import textlintRuleNoDoubleNegativeJa from 'textlint-rule-no-double-negative-ja';
  18. import textlintRuleNoDoubledConjunction from 'textlint-rule-no-doubled-conjunction';
  19. import textlintRuleNoDoubledJoshi from 'textlint-rule-no-doubled-joshi';
  20. import textlintRuleNoDroppingTheRa from 'textlint-rule-no-dropping-the-ra';
  21. import textlintRuleNoHankakuKana from 'textlint-rule-no-hankaku-kana';
  22. import textlintRuleNoKangxiRadicals from 'textlint-rule-no-kangxi-radicals';
  23. import textlintRuleNoMixedZenkakuAndHankakuAlphabet from 'textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet';
  24. import textlintRuleNoNfd from 'textlint-rule-no-nfd';
  25. import textlintRuleNoSurrogatePair from 'textlint-rule-no-surrogate-pair';
  26. import textlintRuleNoZeroWidthSpaces from 'textlint-rule-no-zero-width-spaces';
  27. import textlintRulePeriodInListItem from 'textlint-rule-period-in-list-item';
  28. import textlintRulePreferTariTari from 'textlint-rule-prefer-tari-tari';
  29. import textlintRuleSentenceLength from 'textlint-rule-sentence-length';
  30. import textlintRuleTerminology from 'textlint-rule-terminology';
  31. import textlintRuleUseSiUnits from 'textlint-rule-use-si-units';
  32. import { AsyncLinter, Annotation } from 'codemirror/addon/lint/lint';
  33. import { loggerFactory } from './utils/logger';
  34. type RulesConfigObj = {
  35. name: string,
  36. options?: unknown,
  37. }
  38. type RuleExtension = {
  39. ext: string
  40. }
  41. const ruleModulesList = {
  42. 'no-invalid-control-character': textlintRuleNoInvalidControlCharacter,
  43. 'no-unmatched-pair': textlintRuleNoUnmatchedPair,
  44. 'common-misspellings': textlintRuleCommonMisspellings,
  45. 'date-weekday-mismatch': textlintRuleDateWeekdayMismatch,
  46. 'en-capitalization': textlintRuleEnCapitalization,
  47. 'ja-hiragana-keishikimeishi': textlintRuleJaHiraganaKeishikimeishi,
  48. 'ja-no-abusage': textlintRuleJaNoAbusage,
  49. 'ja-no-inappropriate-words': textlintRuleJaNoInappropriateWords,
  50. 'ja-no-mixed-period': textlintRuleJaNoMixedPeriod,
  51. 'ja-no-redundant-expression': textlintRuleJaNoRedundantExpression,
  52. 'ja-unnatural-alphabet': textlintRuleJaUnnaturalAlphabet,
  53. 'max-comma': textlintRuleMaxComma,
  54. 'max-kanji-continuous-len': textlintRuleMaxKanjiContinuousLen,
  55. 'max-ten': textlintRuleMaxTen,
  56. 'no-double-negative-ja': textlintRuleNoDoubleNegativeJa,
  57. 'no-doubled-conjunction': textlintRuleNoDoubledConjunction,
  58. 'no-doubled-joshi': textlintRuleNoDoubledJoshi,
  59. 'no-dropping-the-ra': textlintRuleNoDroppingTheRa,
  60. 'no-hankaku-kana': textlintRuleNoHankakuKana,
  61. 'no-kangxi-radicals': textlintRuleNoKangxiRadicals,
  62. 'no-mixed-zenkaku-and-hankaku-alphabet': textlintRuleNoMixedZenkakuAndHankakuAlphabet,
  63. 'no-nfd': textlintRuleNoNfd,
  64. 'no-surrogate-pair': textlintRuleNoSurrogatePair,
  65. 'no-zero-width-spaces': textlintRuleNoZeroWidthSpaces,
  66. 'period-in-list-item': textlintRulePeriodInListItem,
  67. 'prefer-tari-tari': textlintRulePreferTariTari,
  68. 'sentence-length': textlintRuleSentenceLength,
  69. terminology: textlintRuleTerminology,
  70. 'use-si-units': textlintRuleUseSiUnits,
  71. };
  72. const logger = loggerFactory('growi:codemirror:codemirror-textlint');
  73. const kernel = new TextlintKernel();
  74. const textlintOption: TextlintRuleOptions<RuleExtension> = {
  75. ext: '.md',
  76. plugins: [
  77. {
  78. pluginId: 'markdown',
  79. plugin: require('textlint-plugin-markdown'),
  80. },
  81. ],
  82. };
  83. const createSetupRules = (rules, ruleOptions): TextlintKernelRule[] => (
  84. Object.keys(rules).map(ruleName => (
  85. {
  86. ruleId: ruleName,
  87. rule: rules[ruleName],
  88. options: ruleOptions[ruleName],
  89. }
  90. ))
  91. );
  92. export const createValidator = (rulesConfigArray: RulesConfigObj[]): AsyncLinter<RulesConfigObj[]> => {
  93. const filteredConfigArray = rulesConfigArray
  94. .filter((rule) => {
  95. if (ruleModulesList[rule.name] == null) {
  96. logger.error(`Textlint rule ${rule.name} is not installed`);
  97. }
  98. return ruleModulesList[rule.name] != null;
  99. });
  100. const rules = filteredConfigArray
  101. .reduce((rules, rule) => {
  102. rules[rule.name] = ruleModulesList[rule.name];
  103. return rules;
  104. }, {});
  105. const rulesOption = filteredConfigArray
  106. .reduce((rules, rule) => {
  107. rules[rule.name] = rule.options || {};
  108. return rules;
  109. }, {});
  110. Object.assign(
  111. textlintOption,
  112. { rules: createSetupRules(rules, rulesOption) },
  113. );
  114. return (text, callback) => {
  115. if (!text) {
  116. callback([]);
  117. return;
  118. }
  119. kernel
  120. .lintText(text, textlintOption)
  121. .then((result) => {
  122. const lintMessages = result.messages;
  123. const lintErrors: Annotation[] = lintMessages.map(textlintToCodeMirror);
  124. callback(lintErrors);
  125. });
  126. };
  127. };