micromark
Version:
small commonmark compliant markdown parser with positional info and concrete tokens
71 lines (58 loc) • 1.82 kB
JavaScript
import chunkedSplice from '../util/chunked-splice.mjs'
import markdownLineEnding from '../character/markdown-line-ending.mjs'
import spaceFactory from './factory-space.mjs'
import prefixSize from '../util/prefix-size.mjs'
var codeIndented = {
name: 'codeIndented',
tokenize: tokenizeCodeIndented,
resolve: resolveCodeIndented
}
var indentedContentConstruct = {
tokenize: tokenizeIndentedContent,
partial: true
}
function resolveCodeIndented(events, context) {
var code = {
type: 'codeIndented',
start: events[0][1].start,
end: events[events.length - 1][1].end
}
chunkedSplice(events, 0, 0, [['enter', code, context]])
chunkedSplice(events, events.length, 0, [['exit', code, context]])
return events
}
function tokenizeCodeIndented(effects, ok, nok) {
return effects.attempt(indentedContentConstruct, afterPrefix, nok)
function afterPrefix(code) {
if (code === null) {
return ok(code)
}
if (markdownLineEnding(code)) {
return effects.attempt(indentedContentConstruct, afterPrefix, ok)(code)
}
effects.enter('codeFlowValue')
return content(code)
}
function content(code) {
if (code === null || markdownLineEnding(code)) {
effects.exit('codeFlowValue')
return afterPrefix(code)
}
effects.consume(code)
return content
}
}
function tokenizeIndentedContent(effects, ok, nok) {
var self = this
return spaceFactory(effects, afterPrefix, 'linePrefix', 4 + 1)
function afterPrefix(code) {
if (markdownLineEnding(code)) {
effects.enter('lineEnding')
effects.consume(code)
effects.exit('lineEnding')
return spaceFactory(effects, afterPrefix, 'linePrefix', 4 + 1)
}
return prefixSize(self.events, 'linePrefix') < 4 ? nok(code) : ok(code)
}
}
export default codeIndented