el-beeswarm
Version:
<div style="display: flex; padding: 1rem; flex-direction: column; align-items: center; justify-content: center; height: 100vh; text-align: center; display: flex;
144 lines (123 loc) • 3.5 kB
JavaScript
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)
}
}