UNPKG

@diplodoc/transform

Version:

A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML

71 lines (57 loc) 1.81 kB
import type {MarkdownItPluginCb} from './typings'; import {load} from 'js-yaml'; /* eslint-disable @typescript-eslint/no-explicit-any */ const SEP = '---'; const meta: MarkdownItPluginCb = (md) => { const mdAny = md as any; mdAny.meta = mdAny.meta || {}; const getLine = (state: any, line: number) => state.src.slice(state.bMarks[line], state.eMarks[line]); md.block.ruler.before( 'code', 'meta', (state, startLine, endLine) => { if (startLine !== 0 || state.blkIndent !== 0) { return false; } if (state.tShift[startLine] < 0) { return false; } if (getLine(state, startLine).trim() !== SEP) { return false; } let line = startLine + 1; const lines: string[] = []; let found = false; while (line < endLine) { const str = getLine(state, line); if (str.trim() === SEP) { found = true; break; } if (state.tShift[line] < 0) { return false; } lines.push(str); line++; } if (!found) { return false; } let data: unknown; try { data = load(lines.join('\n')) || {}; } catch { return false; } if (typeof data !== 'object' || data === null || Array.isArray(data)) { return false; } mdAny.meta = data as Record<string, unknown>; state.line = line + 1; return true; }, {alt: []}, ); }; export = meta;