@diplodoc/transform
Version:
A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML
56 lines (43 loc) • 1.36 kB
text/typescript
import {bold} from 'chalk';
import {platform} from 'process';
import Token from 'markdown-it/lib/token';
import {Logger} from '../log';
export type MatchTokenFunction = (
tokens: Token[],
idx: number,
) => boolean | null | RegExpMatchArray;
export const nestedCloseTokenIdxFactory =
(tokenName: string, matchOpenToken: MatchTokenFunction, matchCloseToken: MatchTokenFunction) =>
(tokens: Token[], idx: number, path: string, log: Logger) => {
let level = 0;
let i = idx;
while (i < tokens.length) {
if (matchOpenToken(tokens, i)) {
level++;
} else if (matchCloseToken(tokens, i)) {
if (level === 0) {
return i;
}
level--;
}
i++;
}
log.error(`${tokenName} must be closed${path ? ` in ${bold(path)}` : ''}`);
return null;
};
export const сarriage = platform === 'win32' ? '\r\n' : '\n';
export function generateID() {
return Math.random().toString(36).substr(2, 8);
}
export function append<T extends Record<string, []>, Key extends keyof T>(
target: T,
key: Key,
...values: T[Key]
) {
if (!target[key]) {
target[key] = values;
return;
}
values.forEach((value) => target[key].push(value));
return target;
}