micromark-extension-directive/lib/factory-attributes.js
Titus Wormer 826d54ca7f
.
2020-10-22 16:45:27 +02:00

301 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict'
module.exports = createAttributes
// To do: use `dist/`
var asciiAlpha = require('micromark/dist/character/ascii-alpha')
var asciiAlphanumeric = require('micromark/dist/character/ascii-alphanumeric')
var markdownLineEnding = require('micromark/dist/character/markdown-line-ending')
var markdownLineEndingOrSpace = require('micromark/dist/character/markdown-line-ending-or-space')
var markdownSpace = require('micromark/dist/character/markdown-space')
var createWhitespace = require('micromark/dist/tokenize/factory-whitespace')
var createSpace = require('micromark/dist/tokenize/factory-space')
/* eslint-disable-next-line max-params */
function createAttributes(
effects,
ok,
nok,
attributesType,
attributesMarkerType,
attributeType,
attributeIdType,
attributeClassType,
attributeNameType,
attributeInitializerType,
attributeValueLiteralType,
attributeValueType,
attributeValueMarker,
attributeValueData,
disallowEol
) {
var type
var marker
return start
function start(code) {
// Always a `{`
effects.enter(attributesType)
effects.enter(attributesMarkerType)
effects.consume(code)
effects.exit(attributesMarkerType)
return between
}
function between(code) {
if (code === 35 /* `#` */) {
type = attributeIdType
return shortcutStart(code)
}
if (code === 46 /* `.` */) {
type = attributeClassType
return shortcutStart(code)
}
if (code === 58 /* `:` */ || code === 95 /* `_` */ || asciiAlpha(code)) {
effects.enter(attributeType)
effects.enter(attributeNameType)
effects.consume(code)
return name
}
if (disallowEol && markdownSpace(code)) {
return createSpace(effects, between, 'whitespace')(code)
}
if (!disallowEol && markdownLineEndingOrSpace(code)) {
return createWhitespace(effects, between)(code)
}
return end(code)
}
function shortcutStart(code) {
effects.enter(attributeType)
effects.enter(type)
effects.enter(type + 'Marker')
effects.consume(code)
effects.exit(type + 'Marker')
return shortcutStartAfter
}
function shortcutStartAfter(code) {
if (
code === null /* EOF */ ||
code === 34 /* `"` */ ||
code === 35 /* `#` */ ||
code === 39 /* `'` */ ||
code === 46 /* `.` */ ||
code === 60 /* `<` */ ||
code === 61 /* `=` */ ||
code === 62 /* `>` */ ||
code === 96 /* `` ` `` */ ||
code === 125 /* `}` */ ||
markdownLineEndingOrSpace(code)
) {
return nok(code)
}
effects.enter(type + 'Value')
effects.consume(code)
return shortcut
}
function shortcut(code) {
if (
code === null /* EOF */ ||
code === 34 /* `"` */ ||
code === 39 /* `'` */ ||
code === 60 /* `<` */ ||
code === 61 /* `=` */ ||
code === 62 /* `>` */ ||
code === 96 /* `` ` `` */
) {
return nok(code)
}
if (
code === 35 /* `#` */ ||
code === 46 /* `.` */ ||
code === 125 /* `}` */ ||
markdownLineEndingOrSpace(code)
) {
effects.exit(type + 'Value')
effects.exit(type)
effects.exit(attributeType)
return between(code)
}
effects.consume(code)
return shortcut
}
function name(code) {
if (
code === 45 /* `-` */ ||
code === 46 /* `.` */ ||
code === 58 /* `:` */ ||
code === 95 /* `_` */ ||
asciiAlphanumeric(code)
) {
effects.consume(code)
return name
}
effects.exit(attributeNameType)
if (disallowEol && markdownSpace(code)) {
return createSpace(effects, nameAfter, 'whitespace')(code)
}
if (!disallowEol && markdownLineEndingOrSpace(code)) {
return createWhitespace(effects, nameAfter)(code)
}
return nameAfter(code)
}
function nameAfter(code) {
if (code === 61 /* `=` */) {
effects.enter(attributeInitializerType)
effects.consume(code)
effects.exit(attributeInitializerType)
return valueBefore
}
// Attribute w/o value.
effects.exit(attributeType)
return between(code)
}
function valueBefore(code) {
if (
code === null /* EOF */ ||
code === 60 /* `<` */ ||
code === 61 /* `=` */ ||
code === 62 /* `>` */ ||
code === 96 /* `` ` `` */ ||
code === 125 /* `}` */ ||
(disallowEol && markdownLineEnding(code))
) {
return nok(code)
}
if (code === 34 /* `"` */ || code === 39 /* `'` */) {
effects.enter(attributeValueLiteralType)
effects.enter(attributeValueMarker)
effects.consume(code)
effects.exit(attributeValueMarker)
marker = code
return valueQuotedStart
}
if (disallowEol && markdownSpace(code)) {
return createSpace(effects, valueBefore, 'whitespace')(code)
}
if (!disallowEol && markdownLineEndingOrSpace(code)) {
return createWhitespace(effects, valueBefore)(code)
}
effects.enter(attributeValueType)
effects.enter(attributeValueData)
effects.consume(code)
marker = undefined
return valueUnquoted
}
function valueUnquoted(code) {
if (
code === null /* EOF */ ||
code === 34 /* `"` */ ||
code === 39 /* `'` */ ||
code === 60 /* `<` */ ||
code === 61 /* `=` */ ||
code === 62 /* `>` */ ||
code === 96 /* `` ` `` */
) {
return nok(code)
}
if (code === 125 /* `}` */ || markdownLineEndingOrSpace(code)) {
effects.exit(attributeValueData)
effects.exit(attributeValueType)
effects.exit(attributeType)
return between(code)
}
effects.consume(code)
return valueUnquoted
}
function valueQuotedStart(code) {
if (code === marker) {
effects.enter(attributeValueMarker)
effects.consume(code)
effects.exit(attributeValueMarker)
effects.exit(attributeValueLiteralType)
effects.exit(attributeType)
return valueQuotedAfter
}
effects.enter(attributeValueType)
return valueQuotedBetween(code)
}
function valueQuotedBetween(code) {
if (code === marker) {
effects.exit(attributeValueType)
return valueQuotedStart(code)
}
if (code === null /* EOF */) {
return nok(code)
}
// Note: blank lines cant exist in content.
if (markdownLineEnding(code)) {
return disallowEol
? nok(code)
: createWhitespace(effects, valueQuotedBetween)(code)
}
effects.enter(attributeValueData)
effects.consume(code)
return valueQuoted
}
function valueQuoted(code) {
if (
code === marker ||
code === null /* EOF */ ||
markdownLineEnding(code)
) {
effects.exit(attributeValueData)
return valueQuotedBetween(code)
}
effects.consume(code)
return valueQuoted
}
function valueQuotedAfter(code) {
return code === 125 /* `}` */ || markdownLineEndingOrSpace(code)
? between(code)
: end(code)
}
function end(code) {
if (code === 125 /* `}` */) {
effects.enter(attributesMarkerType)
effects.consume(code)
effects.exit(attributesMarkerType)
effects.exit(attributesType)
return ok
}
return nok(code)
}
}