blob: ed82db02cbc2a629465a618e6fc7c55c2cb3e334 [file] [edit]
exports.tokenize = tokenizeContent
exports.resolve = resolveContent
exports.interruptible = true
exports.lazy = true
var markdownLineEnding = require('../character/markdown-line-ending')
var subtokenize = require('../util/subtokenize')
var prefixSize = require('../util/prefix-size')
var createSpace = require('./factory-space')
var lookaheadConstruct = {tokenize: tokenizeLookaheadConstruct, partial: true}
// Content is transparent: it’s parsed right now. That way, definitions are also
// parsed right now: before text in paragraphs (specifically, media) are parsed.
function resolveContent(events) {
subtokenize(events)
return events
}
function tokenizeContent(effects, ok) {
var previous
return start
function start(code) {
effects.enter('content')
previous = effects.enter('chunkContent', {
contentType: 'content'
})
return data(code)
}
function data(code) {
if (code === null) {
return contentEnd(code)
}
if (markdownLineEnding(code)) {
return effects.check(
lookaheadConstruct,
contentContinue,
contentEnd
)(code)
}
// Data.
effects.consume(code)
return data
}
function contentEnd(code) {
effects.exit('chunkContent')
effects.exit('content')
return ok(code)
}
function contentContinue(code) {
effects.consume(code)
effects.exit('chunkContent')
previous = previous.next = effects.enter('chunkContent', {
contentType: 'content',
previous: previous
})
return data
}
}
function tokenizeLookaheadConstruct(effects, ok, nok) {
var self = this
return startLookahead
function startLookahead(code) {
effects.enter('lineEnding')
effects.consume(code)
effects.exit('lineEnding')
return createSpace(effects, prefixed, 'linePrefix')
}
function prefixed(code) {
if (code === null || markdownLineEnding(code)) {
return nok(code)
}
if (prefixSize(self.events, 'linePrefix') < 4) {
return effects.interrupt(self.parser.constructs.flow, nok, ok)(code)
}
return ok(code)
}
}