@vrcd-community/zhlint
Version:
A linting tool for Chinese language.
62 lines (61 loc) • 2.14 kB
JavaScript
/**
* @fileoverview
*
* This rule is to ensure all the existing spaces should be outside hyper
* marks like *, _, [, ], etc.
*
* Options:
* - noSpaceInsideMark: boolean | undefined
*
* For example:
* - `x _ ** yyy ** _ z` should be `x _**yyy**_ z`
*
* Details:
* - left-mark x left-mark: `x _ **yyy**_ z`
* ^^^
* - right-mark x right-mark: `x _**yyy** _ z`
* ^^^
* - left-mark x non-mark: `x _** yyy**_ z`
* ^^^
* - non-mark x right-mark: `x _**yyy **_ z`
* ^^^
*/
import { checkSpaceAfter, findTokenAfter, isWrapper, getWrapperSide } from './util.js';
import { MarkSideType } from '../parser/index.js';
import { MARKDOWN_NOSPACE_INSIDE } from './messages.js';
const generateHandler = (options) => {
const noSpaceInsideMarkOption = options === null || options === void 0 ? void 0 : options.noSpaceInsideHyperMark;
return (token, _, group) => {
// skip if there is no options
if (!noSpaceInsideMarkOption) {
return;
}
// skip non-after-token situations
const tokenAfter = findTokenAfter(group, token);
if (!tokenAfter) {
return;
}
// skip non-mark situations
if (!isWrapper(token) && !isWrapper(tokenAfter)) {
return;
}
// 1. left x left, right x right
// 2. left x non-mark
// 3. non-mark x right
const markSideBefore = getWrapperSide(token);
const markSideAfter = getWrapperSide(tokenAfter);
if (markSideBefore === markSideAfter) {
checkSpaceAfter(token, '', MARKDOWN_NOSPACE_INSIDE);
}
else if (markSideBefore === MarkSideType.LEFT && !isWrapper(tokenAfter)) {
checkSpaceAfter(token, '', MARKDOWN_NOSPACE_INSIDE);
}
else if (markSideAfter === MarkSideType.RIGHT && !isWrapper(token)) {
checkSpaceAfter(token, '', MARKDOWN_NOSPACE_INSIDE);
}
};
};
export const defaultConfig = {
noSpaceInsideMark: true
};
export default generateHandler;