You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.0 KiB
131 lines
3.0 KiB
'use strict' |
|
|
|
var asciiControl = require('../character/ascii-control.js') |
|
var markdownLineEndingOrSpace = require('../character/markdown-line-ending-or-space.js') |
|
var markdownLineEnding = require('../character/markdown-line-ending.js') |
|
|
|
// eslint-disable-next-line max-params |
|
function destinationFactory( |
|
effects, |
|
ok, |
|
nok, |
|
type, |
|
literalType, |
|
literalMarkerType, |
|
rawType, |
|
stringType, |
|
max |
|
) { |
|
var limit = max || Infinity |
|
var 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 destinationEnclosedBefore |
|
} |
|
|
|
if (asciiControl(code) || code === 41) { |
|
return nok(code) |
|
} |
|
|
|
effects.enter(type) |
|
effects.enter(rawType) |
|
effects.enter(stringType) |
|
effects.enter('chunkString', { |
|
contentType: 'string' |
|
}) |
|
return destinationRaw(code) |
|
} |
|
|
|
function destinationEnclosedBefore(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 destinationEnclosed(code) |
|
} |
|
|
|
function destinationEnclosed(code) { |
|
if (code === 62) { |
|
effects.exit('chunkString') |
|
effects.exit(stringType) |
|
return destinationEnclosedBefore(code) |
|
} |
|
|
|
if (code === null || code === 60 || markdownLineEnding(code)) { |
|
return nok(code) |
|
} |
|
|
|
effects.consume(code) |
|
return code === 92 ? destinationEnclosedEscape : destinationEnclosed |
|
} |
|
|
|
function destinationEnclosedEscape(code) { |
|
if (code === 60 || code === 62 || code === 92) { |
|
effects.consume(code) |
|
return destinationEnclosed |
|
} |
|
|
|
return destinationEnclosed(code) |
|
} |
|
|
|
function destinationRaw(code) { |
|
if (code === 40) { |
|
if (++balance > limit) return nok(code) |
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
if (code === 41) { |
|
if (!balance--) { |
|
effects.exit('chunkString') |
|
effects.exit(stringType) |
|
effects.exit(rawType) |
|
effects.exit(type) |
|
return ok(code) |
|
} |
|
|
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
if (code === null || markdownLineEndingOrSpace(code)) { |
|
if (balance) return nok(code) |
|
effects.exit('chunkString') |
|
effects.exit(stringType) |
|
effects.exit(rawType) |
|
effects.exit(type) |
|
return ok(code) |
|
} |
|
|
|
if (asciiControl(code)) return nok(code) |
|
effects.consume(code) |
|
return code === 92 ? destinationRawEscape : destinationRaw |
|
} |
|
|
|
function destinationRawEscape(code) { |
|
if (code === 40 || code === 41 || code === 92) { |
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
return destinationRaw(code) |
|
} |
|
} |
|
|
|
module.exports = destinationFactory
|
|
|