import fs from 'fs' import MarkdownIt from 'markdown-it' import { RuleBlock } from 'markdown-it/lib/parser_block' export default (md: MarkdownIt): void => { const parser: RuleBlock = (state, startLine, endLine, silent) => { const CH = '<'.charCodeAt(0) const pos = state.bMarks[startLine] + state.tShift[startLine] const max = state.eMarks[startLine] if (state.sCount[startLine] - state.blkIndent >= 4) { return false } for (let i = 0; i < 3; ++i) { const ch = state.src.charCodeAt(pos + i) if (ch !== CH || pos + i >= max) return false } if (silent) { return true } const start = pos + 3 const end = state.skipSpacesBack(max, pos) const rawPath = state.src .slice(start, end) .trim() .replace(/^@/, process.cwd()) const content = fs.existsSync(rawPath) ? fs.readFileSync(rawPath).toString() : 'Not found: ' + rawPath const meta = rawPath.replace(rawPath, '') state.line = startLine + 1 const token = state.push('fence', 'code', 0) token.info = rawPath.split('.').pop() + meta token.content = content token.markup = '```' token.map = [startLine, startLine + 1] return true } md.block.ruler.before('fence', 'snippet', parser) }