textlint-rule-no-mix-dearu-desumasu
Version:
textlint rule that no mixed である and ですます.
101 lines (99 loc) • 3.94 kB
JavaScript
// LICENSE : MIT
;
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