textlint

textlint

  • Docs
  • Rules
  • Blog
  • Help
  • GitHub

›Developer Guide

User Manual

  • Getting Started with textlint
  • Command Line Interface
  • Configuring textlint
  • Ignoring Text
  • Integrating with Editors, Tools, etc..

Developer Guide

  • Creating Rules
  • Creating Filter Rule
  • Creating Fixable Rule
  • Creating Preset
  • Advanced: Paragraph Rule
  • How to implement "after-all" in the rule?
  • Plugin
  • Formatter
  • Use as Node Modules
  • TxtAST Interface

Contributing

  • Contributing Guideline
Edit

Creating Preset

"preset" is a collection of rules and rulesConfig.

The basic source code format for a preset is:

module.exports = {
    rules: {
        "no-todo": require("textlint-rule-no-todo").default
    },
    rulesConfig: {
        "no-todo": true
    }
};
  • "rules" is rule creator object.
  • "rulesConfig" is rule config object for "rules".

Example

e.g.) "textlint-rule-preset-gizmo"

textlint-rule-preset-gizmo includes the following rules:

  • ruleA
  • ruleB

textlint-rule-preset-gizmo.js:

module.exports = {
    rules: {
        ruleA: require("textlint-rule-A"),
        ruleB: require("textlint-rule-B")
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Usage of "textlint-rule-preset-gizmo":

.textlintrc.json

{
    "rules": {
        "preset-gizmo": {
            "ruleA": false
            /* ruleB's options is defined by preset-gizmo */
        }
    }
}

Recommended: use @textlint/module-interop for loading external package.

When require external textlint rule package, you should use @textlint/module-interop instead of require function. Because, some rule package expose exports.default instead of exports. That .default property is generated by ES2015+ transpiler like Babel, TypeScript.

@textlint/module-interop help to load both of exports.default and exports.

const { moduleInterop } = require("@textlint/module-interop");
module.exports = {
    rules: {
        ruleA: moduleInterop(require("textlint-rule-external-A")),
        ruleB: moduleInterop(require("@scope/textlint-rule-external-B"))
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Of course, If you use Babel or TypeScript(with esModuleInterop option), you can just use import statement. These transpiler wrap require function with interop helper function automatically.

import RuleA from "textlint-rule-external-A";
// It will be transpiled to `const RuleA = __importDefault(require("textlint-rule-external-A"))`
import RuleB from "@scope/textlint-rule-external-B";
// It will be transpiled to `const RuleB = __importDefault(require("textlint-rule-external-B"))`
module.exports = {
    rules: {
        ruleA: RuleA,
        ruleB: RuleB
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Publishing

If you want to publish your textlint rule preset, see following documents.

Package Naming Conventions

textlint rule package naming should have textlint-rule-preset- prefix.

  • textlint-rule-preset-<name>
  • @scope/textlint-rule-preset-<name>
    • textlint supports Scoped packages

Example: textlint-rule-preset-example

textlint user use it following:

{
    "rules": {
        "preset-example": true
    }
}

Example: @textlint-rule/textlint-rule-preset-google-developer

textlint user use it following:

{
    "rules": {
        "@textlint-rule/preset-google-developer": true
    }
}

Keywords

You should add textlintrule to npm's keywords

{
  "name": "textlint-rule-preset-foo-bar",
  "description": "Your preset of rules description",
  "version": "1.0.1",
  "keywords": [
    "textlintrule"
  ]
}
← Creating Fixable RuleAdvanced: Paragraph Rule →
  • Example
  • Publishing
    • Package Naming Conventions
    • Keywords
textlint
Docs
User ManualDeveloper Guide
Community
Project Chat
More
BlogGitHubStar
Copyright © 2023 textlint organization