Просмотр исходного кода

Merge pull request #4225 from weseek/feat/7247-add-schema

Feat/7247 add schema, move default rules to package
Yuki Takei 4 лет назад
Родитель
Сommit
713f1ca94e

+ 3 - 29
packages/app/src/components/PageEditor/CodeMirrorEditor.jsx

@@ -158,35 +158,9 @@ export default class CodeMirrorEditor extends AbstractEditor {
       ? { dicPath: '/static/dict/cdn' }
       : { dicPath: 'https://cdn.jsdelivr.net/npm/kuromoji@0.1.2/dict' };
 
-    this.textlintConfig = [
-      { name: 'no-unmatched-pair' },
-      { name: 'common-misspellings' },
-      { name: 'date-weekday-mismatch' },
-      { name: 'en-capitalization' },
-      { name: 'ja-hiragana-keishikimeishi' },
-      { name: 'ja-no-abusage' },
-      { name: 'ja-no-inappropriate-words' },
-      { name: 'ja-no-mixed-period' },
-      { name: 'ja-no-redundant-expression' },
-      { name: 'ja-unnatural-alphabet' },
-      { name: 'max-comma' },
-      { name: 'max-kanji-continuous-len' },
-      { name: 'max-ten' },
-      { name: 'no-double-negative-ja' },
-      { name: 'no-doubled-conjunction' },
-      { name: 'no-doubled-joshi' },
-      { name: 'no-dropping-the-ra' },
-      { name: 'no-hankaku-kana' },
-      { name: 'no-kangxi-radicals' },
-      { name: 'no-mixed-zenkaku-and-hankaku-alphabet' },
-      { name: 'no-nfd' },
-      { name: 'no-surrogate-pair' },
-      { name: 'no-zero-width-spaces' },
-      { name: 'period-in-list-item' },
-      { name: 'prefer-tari-tari' },
-      { name: 'sentence-length' },
-      { name: 'use-si-units' },
-    ];
+    // TODO: Get configs from db
+    this.isTextlintEnabled = true;
+    // this.textlintConfig = [];
 
     this.interceptorManager = new InterceptorManager();
     this.interceptorManager.addInterceptors([

+ 41 - 0
packages/app/src/server/models/editor-settings.ts

@@ -0,0 +1,41 @@
+import {
+  Schema, Model, Document,
+} from 'mongoose';
+import { getOrCreateModel } from '../util/mongoose-utils';
+
+
+export interface ILintRule {
+  name: string;
+  options?: unknown;
+  isEnabled?: boolean;
+}
+
+export interface ITextlintSettings {
+  isTexlintEnabled: string;
+  textlintRules: ILintRule[];
+}
+
+export interface IEditorSettings {
+  userId: Schema.Types.ObjectId;
+  textlintSettings: ITextlintSettings;
+}
+
+export interface EditorSettingsDocument extends IEditorSettings, Document {}
+export type EditorSettingsModel = Model<EditorSettingsDocument>
+
+const textlintSettingsSchema = new Schema<ITextlintSettings>({
+  isTextlintEnabled: { type: Boolean, default: true },
+  textlintRules: {
+    type: [
+      { name: { type: String }, options: { type: Object }, isEnabled: { type: Boolean } },
+    ],
+  },
+});
+
+const editorSettingsSchema = new Schema<IEditorSettings>({
+  userId: { type: String },
+  textlintSettings: textlintSettingsSchema,
+});
+
+
+export default getOrCreateModel<EditorSettingsDocument, EditorSettingsModel>('EditorSettings', editorSettingsSchema);

+ 0 - 4
packages/app/src/server/models/user.js

@@ -35,9 +35,6 @@ module.exports = function(crowi) {
     userEvent.on('activated', userEvent.onActivated);
   }
 
-  const editorCurrentSettingsSchema = new mongoose.Schema({
-    isTextlintEnabled: { type: Boolean, default: true },
-  });
 
   const userSchema = new mongoose.Schema({
     userId: String,
@@ -70,7 +67,6 @@ module.exports = function(crowi) {
     lastLoginAt: { type: Date },
     admin: { type: Boolean, default: 0, index: true },
     isInvitationEmailSended: { type: Boolean, default: false },
-    editorCurrentSettings: editorCurrentSettingsSchema,
   }, {
     toObject: {
       transform: (doc, ret, opt) => {

+ 34 - 21
packages/codemirror-textlint/src/index.ts

@@ -94,32 +94,45 @@ const createSetupRules = (rules, ruleOptions): TextlintKernelRule[] => (
 
 
 export const createValidator = (rulesConfigArray: RulesConfigObj[]): AsyncLinter<RulesConfigObj[]> => {
+  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;
+      });
 
-  const filteredConfigArray = rulesConfigArray
-    .filter((rule) => {
-      if (ruleModulesList[rule.name] == null) {
-        logger.error(`Textlint rule ${rule.name} is not installed`);
-      }
-      return ruleModulesList[rule.name] != null;
-    });
+    const rules = filteredConfigArray
+      .reduce((rules, rule) => {
+        rules[rule.name] = ruleModulesList[rule.name];
+        return rules;
+      }, {});
 
-  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;
+      }, {});
 
-  const rulesOption = filteredConfigArray
-    .reduce((rules, rule) => {
-      rules[rule.name] = rule.options || {};
-      return rules;
-    }, {});
+    Object.assign(
+      textlintOption,
+      { rules: createSetupRules(rules, rulesOption) },
+    );
+  }
 
-  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) {