UNPKG

@vrcd-community/zhlint

Version:

A linting tool for Chinese language.

209 lines (208 loc) 6.95 kB
/** * @fileOverview * * This file contains the types for the parser. * * - Chars * - Pairs * - Marks * - Tokens */ // Char export var CharType; (function (CharType) { CharType["EMPTY"] = "empty"; CharType["SPACE"] = "space"; CharType["WESTERN_LETTER"] = "western-letter"; CharType["CJK_CHAR"] = "cjk-char"; // periods, commas, secondary commas, colons, semicolons, exclamation marks, question marks, etc. CharType["HALFWIDTH_PAUSE_OR_STOP"] = "halfwidth-pause-or-stop"; CharType["FULLWIDTH_PAUSE_OR_STOP"] = "fullwidth-pause-or-stop"; // single, double, corner, white corner // + book title marks // left x right CharType["HALFWIDTH_QUOTATION"] = "halfwidth-quotation"; CharType["FULLWIDTH_QUOTATION"] = "fullwidth-quotation"; // parentheses CharType["HALFWIDTH_BRACKET"] = "halfwidth-bracket"; CharType["FULLWIDTH_BRACKET"] = "fullwidth-bracket"; // // parenthesis, black lenticular brackets, white lenticular brackets, // // square brackets, tortoise shell brackets, curly brackets // // left x right // PARENTHESIS = 'parenthesis', // // double angle brackets, angle brackets // // left x right // BOOK_TITLE_MARK = 'book-title', // dashes, ellipsis, connector marks, interpuncts, proper noun marks, solidi, etc. CharType["HALFWIDTH_OTHER_PUNCTUATION"] = "halfwidth-other-punctuation"; CharType["FULLWIDTH_OTHER_PUNCTUATION"] = "fullwidth-other-punctuation"; // // ⁈, ⁇, ‼, ⁉ // SPECIAL_PUNCTUATION_MARK = 'special-punctuation', CharType["UNKNOWN"] = "unknown"; })(CharType || (CharType = {})); export const BRACKET_CHAR_SET = { left: '([{(〔[{', right: ')]})〕]}' }; export const QUOTATION_CHAR_SET = { left: `“‘《〈『「【〖`, right: `”’》〉』」】〗`, neutral: `'"` }; export const SHORTHAND_CHARS = `'’`; export const SHORTHAND_PAIR_SET = { [`'`]: `'`, [`’`]: `‘` }; const FULLWIDTH_PAIRS = `“”‘’()〔〕[]{}《》〈〉「」『』【】〖〗`; export const isFullwidthPair = (str) => FULLWIDTH_PAIRS.indexOf(str) >= 0; // Mark /** * Marks are hyper info, including content and wrappers. * They are categorized by parsers, not by usage. */ export var MarkType; (function (MarkType) { /** * Brackets */ MarkType["BRACKETS"] = "brackets"; /** * Inline Markdown marks */ MarkType["HYPER"] = "hyper"; /** * - \`xxx\` * - <code>xxx</code> * - Hexo/VuePress container * - Other html code */ MarkType["RAW"] = "raw"; })(MarkType || (MarkType = {})); export var MarkSideType; (function (MarkSideType) { MarkSideType["LEFT"] = "left"; MarkSideType["RIGHT"] = "right"; })(MarkSideType || (MarkSideType = {})); export const isRawMark = (mark) => { return mark.code !== undefined; }; /** * TODO: paired html tags should be hyper mark */ export var HyperTokenType; (function (HyperTokenType) { /** * Brackets */ HyperTokenType["BRACKET_MARK"] = "bracket-mark"; /** * Inline Markdown marks */ HyperTokenType["HYPER_MARK"] = "hyper-mark"; /** * - \`xxx\` * - <code>xxx</code> */ HyperTokenType["CODE_CONTENT"] = "code-content"; /** * - Hexo/VuePress container * - Other html code */ HyperTokenType["HYPER_CONTENT"] = "hyper-content"; /** * Unpaired brackets/quotations */ HyperTokenType["UNMATCHED"] = "unmatched"; /** * For indeterminate tokens */ HyperTokenType["INDETERMINATED"] = "indeterminated"; })(HyperTokenType || (HyperTokenType = {})); export var GroupTokenType; (function (GroupTokenType) { GroupTokenType["GROUP"] = "group"; })(GroupTokenType || (GroupTokenType = {})); export const getHalfwidthTokenType = (type) => { switch (type) { case CharType.CJK_CHAR: return CharType.WESTERN_LETTER; case CharType.FULLWIDTH_PAUSE_OR_STOP: return CharType.HALFWIDTH_PAUSE_OR_STOP; case CharType.FULLWIDTH_OTHER_PUNCTUATION: return CharType.HALFWIDTH_OTHER_PUNCTUATION; } return type; }; export const getFullwidthTokenType = (type) => { switch (type) { case CharType.WESTERN_LETTER: return CharType.CJK_CHAR; case CharType.HALFWIDTH_PAUSE_OR_STOP: return CharType.FULLWIDTH_PAUSE_OR_STOP; case CharType.HALFWIDTH_OTHER_PUNCTUATION: return CharType.FULLWIDTH_OTHER_PUNCTUATION; } return type; }; export const isLetterType = (type) => { return type === CharType.WESTERN_LETTER || type === CharType.CJK_CHAR; }; export const isPauseOrStopType = (type) => { return (type === CharType.HALFWIDTH_PAUSE_OR_STOP || type === CharType.FULLWIDTH_PAUSE_OR_STOP); }; export const isQuotationType = (type) => { return (type === CharType.HALFWIDTH_QUOTATION || type === CharType.FULLWIDTH_QUOTATION); }; export const isBracketType = (type) => { return (type === CharType.HALFWIDTH_BRACKET || type === CharType.FULLWIDTH_BRACKET); }; export const isOtherPunctuationType = (type) => { return (type === CharType.HALFWIDTH_OTHER_PUNCTUATION || type === CharType.FULLWIDTH_OTHER_PUNCTUATION); }; export const isSinglePunctuationType = (type) => { return isPauseOrStopType(type) || isOtherPunctuationType(type); }; export const isPunctuationType = (type) => { return (isPauseOrStopType(type) || isQuotationType(type) || isBracketType(type) || isOtherPunctuationType(type)); }; export const isHalfwidthPunctuationType = (type) => { return (type === CharType.HALFWIDTH_PAUSE_OR_STOP || type === CharType.HALFWIDTH_QUOTATION || type === CharType.HALFWIDTH_BRACKET || type === CharType.HALFWIDTH_OTHER_PUNCTUATION); }; export const isHalfwidthType = (type) => { return type === CharType.WESTERN_LETTER || isHalfwidthPunctuationType(type); }; export const isFullwidthPunctuationType = (type) => { return (type === CharType.FULLWIDTH_PAUSE_OR_STOP || type === CharType.FULLWIDTH_QUOTATION || type === CharType.FULLWIDTH_BRACKET || type === CharType.FULLWIDTH_OTHER_PUNCTUATION); }; export const isFullwidthType = (type) => { return type === CharType.CJK_CHAR || isFullwidthPunctuationType(type); }; export const isNonCodeVisibleType = (type) => { return (isLetterType(type) || isSinglePunctuationType(type) || type === HyperTokenType.BRACKET_MARK || type === GroupTokenType.GROUP); }; export const isVisibleType = (type) => { return isNonCodeVisibleType(type) || type === HyperTokenType.CODE_CONTENT; }; export const isInvisibleType = (type) => { // OTHERS? return type === HyperTokenType.HYPER_MARK; }; export const isVisibilityUnknownType = (type) => { return type === HyperTokenType.HYPER_CONTENT; };