/** | |
* @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct | |
* @typedef {import('micromark-util-types').Initializer} Initializer | |
* @typedef {import('micromark-util-types').State} State | |
* @typedef {import('micromark-util-types').Token} Token | |
* @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext | |
*/ | |
import {factorySpace} from 'micromark-factory-space' | |
import {markdownLineEnding} from 'micromark-util-character' | |
/** @type {InitialConstruct} */ | |
export const content = { | |
tokenize: initializeContent | |
} | |
/** | |
* @this {TokenizeContext} | |
* @type {Initializer} | |
*/ | |
function initializeContent(effects) { | |
const contentStart = effects.attempt( | |
this.parser.constructs.contentInitial, | |
afterContentStartConstruct, | |
paragraphInitial | |
) | |
/** @type {Token} */ | |
let previous | |
return contentStart | |
/** @type {State} */ | |
function afterContentStartConstruct(code) { | |
if (code === null) { | |
effects.consume(code) | |
return | |
} | |
effects.enter('lineEnding') | |
effects.consume(code) | |
effects.exit('lineEnding') | |
return factorySpace(effects, contentStart, 'linePrefix') | |
} | |
/** @type {State} */ | |
function paragraphInitial(code) { | |
effects.enter('paragraph') | |
return lineStart(code) | |
} | |
/** @type {State} */ | |
function lineStart(code) { | |
const token = effects.enter('chunkText', { | |
contentType: 'text', | |
previous | |
}) | |
if (previous) { | |
previous.next = token | |
} | |
previous = token | |
return data(code) | |
} | |
/** @type {State} */ | |
function data(code) { | |
if (code === null) { | |
effects.exit('chunkText') | |
effects.exit('paragraph') | |
effects.consume(code) | |
return | |
} | |
if (markdownLineEnding(code)) { | |
effects.consume(code) | |
effects.exit('chunkText') | |
return lineStart | |
} | |
// Data. | |
effects.consume(code) | |
return data | |
} | |
} | |