|
|
|
|
|
|
|
|
|
|
|
|
|
import { |
|
asciiControl, |
|
markdownLineEndingOrSpace, |
|
markdownLineEnding |
|
} from 'micromark-util-character' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function factoryDestination( |
|
effects, |
|
ok, |
|
nok, |
|
type, |
|
literalType, |
|
literalMarkerType, |
|
rawType, |
|
stringType, |
|
max |
|
) { |
|
const limit = max || Number.POSITIVE_INFINITY |
|
let balance = 0 |
|
return start |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function start(code) { |
|
if (code === 60) { |
|
effects.enter(type) |
|
effects.enter(literalType) |
|
effects.enter(literalMarkerType) |
|
effects.consume(code) |
|
effects.exit(literalMarkerType) |
|
return enclosedBefore |
|
} |
|
|
|
|
|
if (code === null || code === 32 || code === 41 || asciiControl(code)) { |
|
return nok(code) |
|
} |
|
effects.enter(type) |
|
effects.enter(rawType) |
|
effects.enter(stringType) |
|
effects.enter('chunkString', { |
|
contentType: 'string' |
|
}) |
|
return raw(code) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function enclosedBefore(code) { |
|
if (code === 62) { |
|
effects.enter(literalMarkerType) |
|
effects.consume(code) |
|
effects.exit(literalMarkerType) |
|
effects.exit(literalType) |
|
effects.exit(type) |
|
return ok |
|
} |
|
effects.enter(stringType) |
|
effects.enter('chunkString', { |
|
contentType: 'string' |
|
}) |
|
return enclosed(code) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function enclosed(code) { |
|
if (code === 62) { |
|
effects.exit('chunkString') |
|
effects.exit(stringType) |
|
return enclosedBefore(code) |
|
} |
|
if (code === null || code === 60 || markdownLineEnding(code)) { |
|
return nok(code) |
|
} |
|
effects.consume(code) |
|
return code === 92 ? enclosedEscape : enclosed |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function enclosedEscape(code) { |
|
if (code === 60 || code === 62 || code === 92) { |
|
effects.consume(code) |
|
return enclosed |
|
} |
|
return enclosed(code) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function raw(code) { |
|
if ( |
|
!balance && |
|
(code === null || code === 41 || markdownLineEndingOrSpace(code)) |
|
) { |
|
effects.exit('chunkString') |
|
effects.exit(stringType) |
|
effects.exit(rawType) |
|
effects.exit(type) |
|
return ok(code) |
|
} |
|
if (balance < limit && code === 40) { |
|
effects.consume(code) |
|
balance++ |
|
return raw |
|
} |
|
if (code === 41) { |
|
effects.consume(code) |
|
balance-- |
|
return raw |
|
} |
|
|
|
|
|
|
|
|
|
if (code === null || code === 32 || code === 40 || asciiControl(code)) { |
|
return nok(code) |
|
} |
|
effects.consume(code) |
|
return code === 92 ? rawEscape : raw |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function rawEscape(code) { |
|
if (code === 40 || code === 41 || code === 92) { |
|
effects.consume(code) |
|
return raw |
|
} |
|
return raw(code) |
|
} |
|
} |
|
|