@vrcd-community/zhlint
Version:
A linting tool for Chinese language.
59 lines (58 loc) • 2.31 kB
JavaScript
/**
* @fileoverview
*
* This rule will decide whether to keep a space outside inline code with
* content like:
* - xxx `foo` xxx
* - xxx <code>foo</code> xxx
* in markdown/html.
*
* Options:
* - spaceOutsideCode: boolean | undefined
* - `true`: keep one space outside (default)
* - `false`: no space outside
* - `undefined`: do nothing, just keep the original format
*
* Details:
* - code x code
* - content x code
* - code x content
*/
import { checkSpaceAfter, findVisibleTokenAfter, findVisibleTokenBefore, findWrappersBetween } from './util.js';
import { isLetterType, HyperTokenType } from '../parser/index.js';
import { CODE_NOSPACE_OUTSIDE, CODE_SPACE_OUTSIDE } from './messages.js';
const generateHandler = (options) => {
const needSpaceOption = options === null || options === void 0 ? void 0 : options.spaceOutsideCode;
const spaceAfter = needSpaceOption ? ' ' : '';
const message = needSpaceOption ? CODE_SPACE_OUTSIDE : CODE_NOSPACE_OUTSIDE;
const handleHyperSpaceOption = (token, _, group) => {
// skip if there is no options
if (typeof needSpaceOption === 'undefined') {
return;
}
// skip non-code tokens
if (token.type !== HyperTokenType.CODE_CONTENT) {
return;
}
// skip non-after-token situations
const contentTokenBefore = findVisibleTokenBefore(group, token);
const contentTokenAfter = findVisibleTokenAfter(group, token);
const { spaceHost: beforeSpaceHost } = findWrappersBetween(group, contentTokenBefore, token);
const { spaceHost: afterSpaceHost } = findWrappersBetween(group, token, contentTokenAfter);
// content x code
if (contentTokenBefore && isLetterType(contentTokenBefore.type)) {
beforeSpaceHost && checkSpaceAfter(beforeSpaceHost, spaceAfter, message);
}
// code x content or code x code
if (contentTokenAfter &&
(isLetterType(contentTokenAfter.type) ||
contentTokenAfter.type === HyperTokenType.CODE_CONTENT)) {
afterSpaceHost && checkSpaceAfter(afterSpaceHost, spaceAfter, message);
}
};
return handleHyperSpaceOption;
};
export const defaultConfig = {
spaceOutsideCode: true
};
export default generateHandler;