123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- import {
- asciiControl,
- markdownLineEndingOrSpace,
- markdownLineEnding
- } from 'micromark-util-character'
- import {codes, constants, types} from 'micromark-util-symbol'
- 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 === codes.lessThan) {
- effects.enter(type)
- effects.enter(literalType)
- effects.enter(literalMarkerType)
- effects.consume(code)
- effects.exit(literalMarkerType)
- return enclosedBefore
- }
-
- if (
- code === codes.eof ||
- code === codes.space ||
- code === codes.rightParenthesis ||
- asciiControl(code)
- ) {
- return nok(code)
- }
- effects.enter(type)
- effects.enter(rawType)
- effects.enter(stringType)
- effects.enter(types.chunkString, {contentType: constants.contentTypeString})
- return raw(code)
- }
-
- function enclosedBefore(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 enclosed(code)
- }
-
- function enclosed(code) {
- if (code === codes.greaterThan) {
- effects.exit(types.chunkString)
- effects.exit(stringType)
- return enclosedBefore(code)
- }
- if (
- code === codes.eof ||
- code === codes.lessThan ||
- markdownLineEnding(code)
- ) {
- return nok(code)
- }
- effects.consume(code)
- return code === codes.backslash ? enclosedEscape : enclosed
- }
-
- function enclosedEscape(code) {
- if (
- code === codes.lessThan ||
- code === codes.greaterThan ||
- code === codes.backslash
- ) {
- effects.consume(code)
- return enclosed
- }
- return enclosed(code)
- }
-
- function raw(code) {
- if (
- !balance &&
- (code === codes.eof ||
- code === codes.rightParenthesis ||
- markdownLineEndingOrSpace(code))
- ) {
- effects.exit(types.chunkString)
- effects.exit(stringType)
- effects.exit(rawType)
- effects.exit(type)
- return ok(code)
- }
- if (balance < limit && code === codes.leftParenthesis) {
- effects.consume(code)
- balance++
- return raw
- }
- if (code === codes.rightParenthesis) {
- effects.consume(code)
- balance--
- return raw
- }
-
-
-
- if (
- code === codes.eof ||
- code === codes.space ||
- code === codes.leftParenthesis ||
- asciiControl(code)
- ) {
- return nok(code)
- }
- effects.consume(code)
- return code === codes.backslash ? rawEscape : raw
- }
-
- function rawEscape(code) {
- if (
- code === codes.leftParenthesis ||
- code === codes.rightParenthesis ||
- code === codes.backslash
- ) {
- effects.consume(code)
- return raw
- }
- return raw(code)
- }
- }
|