|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- '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
|