UNPKG

micromark

Version:

small commonmark compliant markdown parser with positional info and concrete tokens

74 lines (60 loc) 1.66 kB
import markdownLineEnding from '../character/markdown-line-ending.mjs' import spaceFactory from './factory-space.mjs' function titleFactory(effects, ok, nok, type, markerType, stringType) { var marker return start function start(code) { effects.enter(type) effects.enter(markerType) effects.consume(code) effects.exit(markerType) marker = code === 40 ? 41 : code return atFirstTitleBreak } function atFirstTitleBreak(code) { if (code === marker) { effects.enter(markerType) effects.consume(code) effects.exit(markerType) effects.exit(type) return ok } effects.enter(stringType) return atTitleBreak(code) } function atTitleBreak(code) { if (code === marker) { effects.exit(stringType) return atFirstTitleBreak(marker) } if (code === null) { return nok(code) } // Note: blank lines can’t exist in content. if (markdownLineEnding(code)) { effects.enter('lineEnding') effects.consume(code) effects.exit('lineEnding') return spaceFactory(effects, atTitleBreak, 'linePrefix') } effects.enter('chunkString', { contentType: 'string' }) return title(code) } function title(code) { if (code === marker || code === null || markdownLineEnding(code)) { effects.exit('chunkString') return atTitleBreak(code) } effects.consume(code) return code === 92 ? titleEscape : title } function titleEscape(code) { if (code === marker || code === 92) { effects.consume(code) return title } return title(code) } } export default titleFactory