UNPKG

textlint-rule-no-mix-dearu-desumasu

Version:
101 lines (99 loc) 3.94 kB
// LICENSE : MIT "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PreferTypes = void 0; var _textlintRuleHelper = require("textlint-rule-helper"); var _BodyMixedChecker = _interopRequireDefault(require("./BodyMixedChecker")); var _HeaderMixedChecker = _interopRequireDefault(require("./HeaderMixedChecker")); var _ListMixedChecker = _interopRequireDefault(require("./ListMixedChecker")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const PreferTypes = exports.PreferTypes = { DESUMASU: "ですます", DEARU: "である" }; // デフォルトでその項目で多く出現している方を優先します。 // 明示的にpreferの設定した場合は、そちらを優先した内容をエラーとして表示します。 const defaultOptions = { preferInHeader: "", // "である" or "ですます" preferInBody: "", // "である" or "ですます" preferInList: "", // "である" or "ですます" // 文末以外でも、敬体(ですます調)と常体(である調)を厳しくチェックするかどうか strict: false }; const allowedTypes = [/*auto*/"", PreferTypes.DESUMASU, PreferTypes.DEARU]; const assertPreferOption = preferType => { if (!preferType) { return; } if (!allowedTypes.includes(preferType)) { throw new Error(`preferInHeader, preferInBody, preferInList は ${allowedTypes.map(type => { return `"${type}"`; })} のどれかである必要があります。 実際の値: "${preferType}"`); } }; module.exports = function noMixedDearuDesumasu(context, options = defaultOptions) { const { Syntax, getSource } = context; const helper = new _textlintRuleHelper.RuleHelper(context); const ignoreManager = new _textlintRuleHelper.IgnoreNodeManager(); const isStrict = options.strict !== undefined ? options.strict : defaultOptions.strict; assertPreferOption(options.preferInHeader); assertPreferOption(options.preferInBody); assertPreferOption(options.preferInList); const bodyChecker = new _BodyMixedChecker.default(context, { preferDesumasu: options.preferInBody === PreferTypes.DESUMASU, preferDearu: options.preferInBody === PreferTypes.DEARU, isStrict }); const headerChecker = new _HeaderMixedChecker.default(context, { preferDesumasu: options.preferInHeader === PreferTypes.DESUMASU, preferDearu: options.preferInHeader === PreferTypes.DEARU, isStrict }); const listChecker = new _ListMixedChecker.default(context, { preferDesumasu: options.preferInList === PreferTypes.DESUMASU, preferDearu: options.preferInList === PreferTypes.DEARU, isStrict }); return { // 見出し [Syntax.Header](node) { const text = getSource(node); headerChecker.check(node, text); }, // 箇条書き [Syntax.ListItem](node) { const text = getSource(node); listChecker.check(node, text); }, // 本文 [Syntax.Paragraph](node) { const ignoredNodeTypes = [Syntax.Link, Syntax.Code, Syntax.Image, Syntax.BlockQuote, Syntax.Emphasis]; // 無視リストのTypeが親にある場合は無視する if (helper.isChildNode(node, ignoredNodeTypes)) { return; } // 見出しと箇条書きは別途チェックするので Header > Str などは無視する if (helper.isChildNode(node, [Syntax.Header, Syntax.ListItem])) { return; } // childrenに無視するtypeがいた場合は無視リストに加える ignoreManager.ignoreChildrenByTypes(node, ignoredNodeTypes); // check const text = getSource(node); bodyChecker.check(node, text); }, [Syntax.Document + ":exit"]() { return Promise.all([bodyChecker.checkout(ignoreManager), headerChecker.checkout(ignoreManager), listChecker.checkout(ignoreManager)]); } }; }; //# sourceMappingURL=no-mix-dearu-desumasu.js.map