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.
143 lines
3.4 KiB
143 lines
3.4 KiB
export default destinationFactory |
|
|
|
import asciiControl from '../character/ascii-control.mjs' |
|
import codes from '../character/codes.mjs' |
|
import markdownLineEndingOrSpace from '../character/markdown-line-ending-or-space.mjs' |
|
import markdownLineEnding from '../character/markdown-line-ending.mjs' |
|
import constants from '../constant/constants.mjs' |
|
import types from '../constant/types.mjs' |
|
|
|
// 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 === codes.lessThan) { |
|
effects.enter(type) |
|
effects.enter(literalType) |
|
effects.enter(literalMarkerType) |
|
effects.consume(code) |
|
effects.exit(literalMarkerType) |
|
return destinationEnclosedBefore |
|
} |
|
|
|
if (asciiControl(code) || code === codes.rightParenthesis) { |
|
return nok(code) |
|
} |
|
|
|
effects.enter(type) |
|
effects.enter(rawType) |
|
effects.enter(stringType) |
|
effects.enter(types.chunkString, {contentType: constants.contentTypeString}) |
|
return destinationRaw(code) |
|
} |
|
|
|
function destinationEnclosedBefore(code) { |
|
if (code === codes.greaterThan) { |
|
effects.enter(literalMarkerType) |
|
effects.consume(code) |
|
effects.exit(literalMarkerType) |
|
effects.exit(literalType) |
|
effects.exit(type) |
|
return ok |
|
} |
|
|
|
effects.enter(stringType) |
|
effects.enter(types.chunkString, {contentType: constants.contentTypeString}) |
|
return destinationEnclosed(code) |
|
} |
|
|
|
function destinationEnclosed(code) { |
|
if (code === codes.greaterThan) { |
|
effects.exit(types.chunkString) |
|
effects.exit(stringType) |
|
return destinationEnclosedBefore(code) |
|
} |
|
|
|
if ( |
|
code === codes.eof || |
|
code === codes.lessThan || |
|
markdownLineEnding(code) |
|
) { |
|
return nok(code) |
|
} |
|
|
|
effects.consume(code) |
|
return code === codes.backslash |
|
? destinationEnclosedEscape |
|
: destinationEnclosed |
|
} |
|
|
|
function destinationEnclosedEscape(code) { |
|
if ( |
|
code === codes.lessThan || |
|
code === codes.greaterThan || |
|
code === codes.backslash |
|
) { |
|
effects.consume(code) |
|
return destinationEnclosed |
|
} |
|
|
|
return destinationEnclosed(code) |
|
} |
|
|
|
function destinationRaw(code) { |
|
if (code === codes.leftParenthesis) { |
|
if (++balance > limit) return nok(code) |
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
if (code === codes.rightParenthesis) { |
|
if (!balance--) { |
|
effects.exit(types.chunkString) |
|
effects.exit(stringType) |
|
effects.exit(rawType) |
|
effects.exit(type) |
|
return ok(code) |
|
} |
|
|
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
if (code === codes.eof || markdownLineEndingOrSpace(code)) { |
|
if (balance) return nok(code) |
|
effects.exit(types.chunkString) |
|
effects.exit(stringType) |
|
effects.exit(rawType) |
|
effects.exit(type) |
|
return ok(code) |
|
} |
|
|
|
if (asciiControl(code)) return nok(code) |
|
effects.consume(code) |
|
return code === codes.backslash ? destinationRawEscape : destinationRaw |
|
} |
|
|
|
function destinationRawEscape(code) { |
|
if ( |
|
code === codes.leftParenthesis || |
|
code === codes.rightParenthesis || |
|
code === codes.backslash |
|
) { |
|
effects.consume(code) |
|
return destinationRaw |
|
} |
|
|
|
return destinationRaw(code) |
|
} |
|
}
|
|
|