diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6c33d04dae6093..33aaa6304fee00 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -22,3 +22,16 @@ updates: applies-to: version-updates patterns: - '*' + + - package-ecosystem: npm + directory: /tools/lint-md + schedule: + interval: monthly + commit-message: + prefix: tools + open-pull-requests-limit: 10 + groups: + lint-md: + applies-to: version-updates + patterns: + - '*' diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index d6e5a7a264020d..11d6ac02a0d511 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -28,7 +28,6 @@ on: - histogram - icu # - libuv - - lint-md-dependencies - llhttp - minimatch - nbytes @@ -187,24 +186,6 @@ jobs: # cat temp-output # tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true # rm temp-output - - id: lint-md-dependencies - subsystem: tools - label: tools - run: | - cd tools/lint-md - npm ci - NEW_VERSION=$(npm outdated --parseable | cut -d: -f4 | xargs) - if [ "$NEW_VERSION" != "" ]; then - echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV - rm -rf package-lock.json node_modules - # Include $NEW_VERSION to explicitly update the package.json - # entry for the dependency and also so that semver-major updates - # are not skipped. - npm install --ignore-scripts $NEW_VERSION - npm install --ignore-scripts - cd ../.. - make lint-md-rollup - fi - id: llhttp subsystem: deps label: dependencies diff --git a/.gitignore b/.gitignore index 748e1904bc6c8c..60a3ff8b4a4cd8 100644 --- a/.gitignore +++ b/.gitignore @@ -114,6 +114,7 @@ tools/*/*.i.tmp /tools/doc/node_modules /tools/clang-format/node_modules /tools/eslint/node_modules +/tools/lint-md/node_modules # === Rules for test artifacts === /*.tap diff --git a/Makefile b/Makefile index 7f3f09ecbcbb82..b6cd644e2865ec 100644 --- a/Makefile +++ b/Makefile @@ -1335,21 +1335,6 @@ bench-addons-clean: $(RM) -r benchmark/napi/*/build $(RM) benchmark/napi/.buildstamp -.PHONY: lint-md-rollup -lint-md-rollup: - $(RM) tools/.*mdlintstamp - cd tools/lint-md && npm ci && npm run build - -.PHONY: lint-md-clean -.NOTPARALLEL: lint-md-clean -lint-md-clean: - $(RM) -r tools/lint-md/node_modules - $(RM) tools/.*mdlintstamp - -.PHONY: lint-md-build -lint-md-build: - $(warning Deprecated no-op target 'lint-md-build') - ifeq ("$(wildcard tools/.mdlintstamp)","") LINT_MD_NEWER = else @@ -1361,8 +1346,13 @@ LINT_MD_FILES = $(shell $(FIND) $(LINT_MD_TARGETS) -type f \ ! -path '*node_modules*' ! -path 'test/fixtures/*' -name '*.md' \ $(LINT_MD_NEWER)) run-lint-md = tools/lint-md/lint-md.mjs $(LINT_MD_FILES) + +# Check for a specific file, as (empty) directories are persisted in git. +tools/lint-md/node_modules/remark-parse/package.json: + -cd tools/lint-md && $(call available-node,$(run-npm-ci)) + # Lint all changed markdown files maintained by us -tools/.mdlintstamp: $(LINT_MD_FILES) +tools/.mdlintstamp: tools/lint-md/node_modules/remark-parse/package.json $(LINT_MD_FILES) $(info Running Markdown linter...) @$(call available-node,$(run-lint-md)) @touch $@ @@ -1372,7 +1362,7 @@ lint-md: lint-js-doc | tools/.mdlintstamp ## Lint the markdown documents maintai run-format-md = tools/lint-md/lint-md.mjs --format $(LINT_MD_FILES) .PHONY: format-md -format-md: ## Format the markdown documents maintained by us in the codebase. +format-md: tools/lint-md/node_modules/remark-parse/package.json ## Format the markdown documents maintained by us in the codebase. @$(call available-node,$(run-format-md)) @@ -1601,6 +1591,7 @@ lint-clean: ## Remove linting artifacts. $(RM) tools/.*lintstamp $(RM) .eslintcache $(RM) -r tools/eslint/node_modules + $(RM) -r tools/lint-md/node_modules $(RM) tools/pip/site_packages HAS_DOCKER ?= $(shell command -v docker > /dev/null 2>&1; [ $$? -eq 0 ] && echo 1 || echo 0) diff --git a/eslint.config.mjs b/eslint.config.mjs index f22bbc3bbd2f99..a26ea19154e8c7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -54,7 +54,6 @@ export default [ 'test/message/esm_display_syntax_error.mjs', 'tools/github_reporter/**', 'tools/icu/**', - 'tools/lint-md/lint-md.mjs', ], }, // #endregion diff --git a/tools/lint-md/.gitignore b/tools/lint-md/.gitignore deleted file mode 100644 index 3c3629e647f5dd..00000000000000 --- a/tools/lint-md/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/tools/lint-md/lint-md.mjs b/tools/lint-md/lint-md.mjs index 81c72856249fae..4116d7e803b64e 100644 --- a/tools/lint-md/lint-md.mjs +++ b/tools/lint-md/lint-md.mjs @@ -1,23913 +1,37 @@ import fs from 'fs'; -import path$1 from 'path'; -import { pathToFileURL } from 'url'; -import minpath from 'node:path'; -import process$1 from 'node:process'; -import { fileURLToPath } from 'node:url'; -import fs$1 from 'node:fs'; -import os from 'node:os'; -import tty from 'node:tty'; -function bail(error) { - if (error) { - throw error - } -} - -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - -var extend$2; -var hasRequiredExtend; -function requireExtend () { - if (hasRequiredExtend) return extend$2; - hasRequiredExtend = 1; - var hasOwn = Object.prototype.hasOwnProperty; - var toStr = Object.prototype.toString; - var defineProperty = Object.defineProperty; - var gOPD = Object.getOwnPropertyDescriptor; - var isArray = function isArray(arr) { - if (typeof Array.isArray === 'function') { - return Array.isArray(arr); - } - return toStr.call(arr) === '[object Array]'; - }; - var isPlainObject = function isPlainObject(obj) { - if (!obj || toStr.call(obj) !== '[object Object]') { - return false; - } - var hasOwnConstructor = hasOwn.call(obj, 'constructor'); - var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); - if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { - return false; - } - var key; - for (key in obj) { } - return typeof key === 'undefined' || hasOwn.call(obj, key); - }; - var setProperty = function setProperty(target, options) { - if (defineProperty && options.name === '__proto__') { - defineProperty(target, options.name, { - enumerable: true, - configurable: true, - value: options.newValue, - writable: true - }); - } else { - target[options.name] = options.newValue; - } - }; - var getProperty = function getProperty(obj, name) { - if (name === '__proto__') { - if (!hasOwn.call(obj, name)) { - return void 0; - } else if (gOPD) { - return gOPD(obj, name).value; - } - } - return obj[name]; - }; - extend$2 = function extend() { - var options, name, src, copy, copyIsArray, clone; - var target = arguments[0]; - var i = 1; - var length = arguments.length; - var deep = false; - if (typeof target === 'boolean') { - deep = target; - target = arguments[1] || {}; - i = 2; - } - if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { - target = {}; - } - for (; i < length; ++i) { - options = arguments[i]; - if (options != null) { - for (name in options) { - src = getProperty(target, name); - copy = getProperty(options, name); - if (target !== copy) { - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } else { - clone = src && isPlainObject(src) ? src : {}; - } - setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); - } else if (typeof copy !== 'undefined') { - setProperty(target, { name: name, newValue: copy }); - } - } - } - } - } - return target; - }; - return extend$2; -} - -var extendExports = requireExtend(); -var extend$1 = /*@__PURE__*/getDefaultExportFromCjs(extendExports); - -function ok$1() {} - -function isPlainObject(value) { - if (typeof value !== 'object' || value === null) { - return false; - } - const prototype = Object.getPrototypeOf(value); - return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value); -} - -function trough() { - const fns = []; - const pipeline = {run, use}; - return pipeline - function run(...values) { - let middlewareIndex = -1; - const callback = values.pop(); - if (typeof callback !== 'function') { - throw new TypeError('Expected function as last argument, not ' + callback) - } - next(null, ...values); - function next(error, ...output) { - const fn = fns[++middlewareIndex]; - let index = -1; - if (error) { - callback(error); - return - } - while (++index < values.length) { - if (output[index] === null || output[index] === undefined) { - output[index] = values[index]; - } - } - values = output; - if (fn) { - wrap(fn, next)(...output); - } else { - callback(null, ...output); - } - } - } - function use(middelware) { - if (typeof middelware !== 'function') { - throw new TypeError( - 'Expected `middelware` to be a function, not ' + middelware - ) - } - fns.push(middelware); - return pipeline - } -} -function wrap(middleware, callback) { - let called; - return wrapped - function wrapped(...parameters) { - const fnExpectsCallback = middleware.length > parameters.length; - let result; - if (fnExpectsCallback) { - parameters.push(done); - } - try { - result = middleware.apply(this, parameters); - } catch (error) { - const exception = (error); - if (fnExpectsCallback && called) { - throw exception - } - return done(exception) - } - if (!fnExpectsCallback) { - if (result && result.then && typeof result.then === 'function') { - result.then(then, done); - } else if (result instanceof Error) { - done(result); - } else { - then(result); - } - } - } - function done(error, ...output) { - if (!called) { - called = true; - callback(error, ...output); - } - } - function then(value) { - done(null, value); - } -} - -function stringifyPosition(value) { - if (!value || typeof value !== 'object') { - return '' - } - if ('position' in value || 'type' in value) { - return position$1(value.position) - } - if ('start' in value || 'end' in value) { - return position$1(value) - } - if ('line' in value || 'column' in value) { - return point$2(value) - } - return '' -} -function point$2(point) { - return index(point && point.line) + ':' + index(point && point.column) -} -function position$1(pos) { - return point$2(pos && pos.start) + '-' + point$2(pos && pos.end) -} -function index(value) { - return value && typeof value === 'number' ? value : 1 -} - -class VFileMessage extends Error { - constructor(causeOrReason, optionsOrParentOrPlace, origin) { - super(); - if (typeof optionsOrParentOrPlace === 'string') { - origin = optionsOrParentOrPlace; - optionsOrParentOrPlace = undefined; - } - let reason = ''; - let options = {}; - let legacyCause = false; - if (optionsOrParentOrPlace) { - if ( - 'line' in optionsOrParentOrPlace && - 'column' in optionsOrParentOrPlace - ) { - options = {place: optionsOrParentOrPlace}; - } - else if ( - 'start' in optionsOrParentOrPlace && - 'end' in optionsOrParentOrPlace - ) { - options = {place: optionsOrParentOrPlace}; - } - else if ('type' in optionsOrParentOrPlace) { - options = { - ancestors: [optionsOrParentOrPlace], - place: optionsOrParentOrPlace.position - }; - } - else { - options = {...optionsOrParentOrPlace}; - } - } - if (typeof causeOrReason === 'string') { - reason = causeOrReason; - } - else if (!options.cause && causeOrReason) { - legacyCause = true; - reason = causeOrReason.message; - options.cause = causeOrReason; - } - if (!options.ruleId && !options.source && typeof origin === 'string') { - const index = origin.indexOf(':'); - if (index === -1) { - options.ruleId = origin; - } else { - options.source = origin.slice(0, index); - options.ruleId = origin.slice(index + 1); - } - } - if (!options.place && options.ancestors && options.ancestors) { - const parent = options.ancestors[options.ancestors.length - 1]; - if (parent) { - options.place = parent.position; - } - } - const start = - options.place && 'start' in options.place - ? options.place.start - : options.place; - this.ancestors = options.ancestors || undefined; - this.cause = options.cause || undefined; - this.column = start ? start.column : undefined; - this.fatal = undefined; - this.file; - this.message = reason; - this.line = start ? start.line : undefined; - this.name = stringifyPosition(options.place) || '1:1'; - this.place = options.place || undefined; - this.reason = this.message; - this.ruleId = options.ruleId || undefined; - this.source = options.source || undefined; - this.stack = - legacyCause && options.cause && typeof options.cause.stack === 'string' - ? options.cause.stack - : ''; - this.actual; - this.expected; - this.note; - this.url; - } -} -VFileMessage.prototype.file = ''; -VFileMessage.prototype.name = ''; -VFileMessage.prototype.reason = ''; -VFileMessage.prototype.message = ''; -VFileMessage.prototype.stack = ''; -VFileMessage.prototype.column = undefined; -VFileMessage.prototype.line = undefined; -VFileMessage.prototype.ancestors = undefined; -VFileMessage.prototype.cause = undefined; -VFileMessage.prototype.fatal = undefined; -VFileMessage.prototype.place = undefined; -VFileMessage.prototype.ruleId = undefined; -VFileMessage.prototype.source = undefined; - -function isUrl(fileUrlOrPath) { - return Boolean( - fileUrlOrPath !== null && - typeof fileUrlOrPath === 'object' && - 'href' in fileUrlOrPath && - fileUrlOrPath.href && - 'protocol' in fileUrlOrPath && - fileUrlOrPath.protocol && - fileUrlOrPath.auth === undefined - ) -} - -const order = ([ - 'history', - 'path', - 'basename', - 'stem', - 'extname', - 'dirname' -]); -class VFile { - constructor(value) { - let options; - if (!value) { - options = {}; - } else if (isUrl(value)) { - options = {path: value}; - } else if (typeof value === 'string' || isUint8Array$2(value)) { - options = {value}; - } else { - options = value; - } - this.cwd = 'cwd' in options ? '' : process$1.cwd(); - this.data = {}; - this.history = []; - this.messages = []; - this.value; - this.map; - this.result; - this.stored; - let index = -1; - while (++index < order.length) { - const field = order[index]; - if ( - field in options && - options[field] !== undefined && - options[field] !== null - ) { - this[field] = field === 'history' ? [...options[field]] : options[field]; - } - } - let field; - for (field in options) { - if (!order.includes(field)) { - this[field] = options[field]; - } - } - } - get basename() { - return typeof this.path === 'string' - ? minpath.basename(this.path) - : undefined - } - set basename(basename) { - assertNonEmpty(basename, 'basename'); - assertPart(basename, 'basename'); - this.path = minpath.join(this.dirname || '', basename); - } - get dirname() { - return typeof this.path === 'string' - ? minpath.dirname(this.path) - : undefined - } - set dirname(dirname) { - assertPath(this.basename, 'dirname'); - this.path = minpath.join(dirname || '', this.basename); - } - get extname() { - return typeof this.path === 'string' - ? minpath.extname(this.path) - : undefined - } - set extname(extname) { - assertPart(extname, 'extname'); - assertPath(this.dirname, 'extname'); - if (extname) { - if (extname.codePointAt(0) !== 46 ) { - throw new Error('`extname` must start with `.`') - } - if (extname.includes('.', 1)) { - throw new Error('`extname` cannot contain multiple dots') - } - } - this.path = minpath.join(this.dirname, this.stem + (extname || '')); - } - get path() { - return this.history[this.history.length - 1] - } - set path(path) { - if (isUrl(path)) { - path = fileURLToPath(path); - } - assertNonEmpty(path, 'path'); - if (this.path !== path) { - this.history.push(path); - } - } - get stem() { - return typeof this.path === 'string' - ? minpath.basename(this.path, this.extname) - : undefined - } - set stem(stem) { - assertNonEmpty(stem, 'stem'); - assertPart(stem, 'stem'); - this.path = minpath.join(this.dirname || '', stem + (this.extname || '')); - } - fail(causeOrReason, optionsOrParentOrPlace, origin) { - const message = this.message(causeOrReason, optionsOrParentOrPlace, origin); - message.fatal = true; - throw message - } - info(causeOrReason, optionsOrParentOrPlace, origin) { - const message = this.message(causeOrReason, optionsOrParentOrPlace, origin); - message.fatal = undefined; - return message - } - message(causeOrReason, optionsOrParentOrPlace, origin) { - const message = new VFileMessage( - causeOrReason, - optionsOrParentOrPlace, - origin - ); - if (this.path) { - message.name = this.path + ':' + message.name; - message.file = this.path; - } - message.fatal = false; - this.messages.push(message); - return message - } - toString(encoding) { - if (this.value === undefined) { - return '' - } - if (typeof this.value === 'string') { - return this.value - } - const decoder = new TextDecoder(encoding || undefined); - return decoder.decode(this.value) - } -} -function assertPart(part, name) { - if (part && part.includes(minpath.sep)) { - throw new Error( - '`' + name + '` cannot be a path: did not expect `' + minpath.sep + '`' - ) - } -} -function assertNonEmpty(part, name) { - if (!part) { - throw new Error('`' + name + '` cannot be empty') - } -} -function assertPath(path, name) { - if (!path) { - throw new Error('Setting `' + name + '` requires `path` to be set too') - } -} -function isUint8Array$2(value) { - return Boolean( - value && - typeof value === 'object' && - 'byteLength' in value && - 'byteOffset' in value - ) -} - -const CallableInstance = - ( - ( - function (property) { - const self = this; - const constr = self.constructor; - const proto = ( - constr.prototype - ); - const value = proto[property]; - const apply = function () { - return value.apply(apply, arguments) - }; - Object.setPrototypeOf(apply, proto); - return apply - } - ) - ); - -const own$5 = {}.hasOwnProperty; -class Processor extends CallableInstance { - constructor() { - super('copy'); - this.Compiler = undefined; - this.Parser = undefined; - this.attachers = []; - this.compiler = undefined; - this.freezeIndex = -1; - this.frozen = undefined; - this.namespace = {}; - this.parser = undefined; - this.transformers = trough(); - } - copy() { - const destination = - ( - new Processor() - ); - let index = -1; - while (++index < this.attachers.length) { - const attacher = this.attachers[index]; - destination.use(...attacher); - } - destination.data(extend$1(true, {}, this.namespace)); - return destination - } - data(key, value) { - if (typeof key === 'string') { - if (arguments.length === 2) { - assertUnfrozen('data', this.frozen); - this.namespace[key] = value; - return this - } - return (own$5.call(this.namespace, key) && this.namespace[key]) || undefined - } - if (key) { - assertUnfrozen('data', this.frozen); - this.namespace = key; - return this - } - return this.namespace - } - freeze() { - if (this.frozen) { - return this - } - const self = ( (this)); - while (++this.freezeIndex < this.attachers.length) { - const [attacher, ...options] = this.attachers[this.freezeIndex]; - if (options[0] === false) { - continue - } - if (options[0] === true) { - options[0] = undefined; - } - const transformer = attacher.call(self, ...options); - if (typeof transformer === 'function') { - this.transformers.use(transformer); - } - } - this.frozen = true; - this.freezeIndex = Number.POSITIVE_INFINITY; - return this - } - parse(file) { - this.freeze(); - const realFile = vfile(file); - const parser = this.parser || this.Parser; - assertParser('parse', parser); - return parser(String(realFile), realFile) - } - process(file, done) { - const self = this; - this.freeze(); - assertParser('process', this.parser || this.Parser); - assertCompiler('process', this.compiler || this.Compiler); - return done ? executor(undefined, done) : new Promise(executor) - function executor(resolve, reject) { - const realFile = vfile(file); - const parseTree = - ( - (self.parse(realFile)) - ); - self.run(parseTree, realFile, function (error, tree, file) { - if (error || !tree || !file) { - return realDone(error) - } - const compileTree = - ( - (tree) - ); - const compileResult = self.stringify(compileTree, file); - if (looksLikeAValue(compileResult)) { - file.value = compileResult; - } else { - file.result = compileResult; - } - realDone(error, (file)); - }); - function realDone(error, file) { - if (error || !file) { - reject(error); - } else if (resolve) { - resolve(file); - } else { - done(undefined, file); - } - } - } - } - processSync(file) { - let complete = false; - let result; - this.freeze(); - assertParser('processSync', this.parser || this.Parser); - assertCompiler('processSync', this.compiler || this.Compiler); - this.process(file, realDone); - assertDone('processSync', 'process', complete); - return result - function realDone(error, file) { - complete = true; - bail(error); - result = file; - } - } - run(tree, file, done) { - assertNode(tree); - this.freeze(); - const transformers = this.transformers; - if (!done && typeof file === 'function') { - done = file; - file = undefined; - } - return done ? executor(undefined, done) : new Promise(executor) - function executor(resolve, reject) { - const realFile = vfile(file); - transformers.run(tree, realFile, realDone); - function realDone(error, outputTree, file) { - const resultingTree = - ( - outputTree || tree - ); - if (error) { - reject(error); - } else if (resolve) { - resolve(resultingTree); - } else { - done(undefined, resultingTree, file); - } - } - } - } - runSync(tree, file) { - let complete = false; - let result; - this.run(tree, file, realDone); - assertDone('runSync', 'run', complete); - return result - function realDone(error, tree) { - bail(error); - result = tree; - complete = true; - } - } - stringify(tree, file) { - this.freeze(); - const realFile = vfile(file); - const compiler = this.compiler || this.Compiler; - assertCompiler('stringify', compiler); - assertNode(tree); - return compiler(tree, realFile) - } - use(value, ...parameters) { - const attachers = this.attachers; - const namespace = this.namespace; - assertUnfrozen('use', this.frozen); - if (value === null || value === undefined) ; else if (typeof value === 'function') { - addPlugin(value, parameters); - } else if (typeof value === 'object') { - if (Array.isArray(value)) { - addList(value); - } else { - addPreset(value); - } - } else { - throw new TypeError('Expected usable value, not `' + value + '`') - } - return this - function add(value) { - if (typeof value === 'function') { - addPlugin(value, []); - } else if (typeof value === 'object') { - if (Array.isArray(value)) { - const [plugin, ...parameters] = - (value); - addPlugin(plugin, parameters); - } else { - addPreset(value); - } - } else { - throw new TypeError('Expected usable value, not `' + value + '`') - } - } - function addPreset(result) { - if (!('plugins' in result) && !('settings' in result)) { - throw new Error( - 'Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither' - ) - } - addList(result.plugins); - if (result.settings) { - namespace.settings = extend$1(true, namespace.settings, result.settings); - } - } - function addList(plugins) { - let index = -1; - if (plugins === null || plugins === undefined) ; else if (Array.isArray(plugins)) { - while (++index < plugins.length) { - const thing = plugins[index]; - add(thing); - } - } else { - throw new TypeError('Expected a list of plugins, not `' + plugins + '`') - } - } - function addPlugin(plugin, parameters) { - let index = -1; - let entryIndex = -1; - while (++index < attachers.length) { - if (attachers[index][0] === plugin) { - entryIndex = index; - break - } - } - if (entryIndex === -1) { - attachers.push([plugin, ...parameters]); - } - else if (parameters.length > 0) { - let [primary, ...rest] = parameters; - const currentPrimary = attachers[entryIndex][1]; - if (isPlainObject(currentPrimary) && isPlainObject(primary)) { - primary = extend$1(true, currentPrimary, primary); - } - attachers[entryIndex] = [plugin, primary, ...rest]; - } - } - } -} -const unified = new Processor().freeze(); -function assertParser(name, value) { - if (typeof value !== 'function') { - throw new TypeError('Cannot `' + name + '` without `parser`') - } -} -function assertCompiler(name, value) { - if (typeof value !== 'function') { - throw new TypeError('Cannot `' + name + '` without `compiler`') - } -} -function assertUnfrozen(name, frozen) { - if (frozen) { - throw new Error( - 'Cannot call `' + - name + - '` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.' - ) - } -} -function assertNode(node) { - if (!isPlainObject(node) || typeof node.type !== 'string') { - throw new TypeError('Expected node, got `' + node + '`') - } -} -function assertDone(name, asyncName, complete) { - if (!complete) { - throw new Error( - '`' + name + '` finished async. Use `' + asyncName + '` instead' - ) - } -} -function vfile(value) { - return looksLikeAVFile$1(value) ? value : new VFile(value) -} -function looksLikeAVFile$1(value) { - return Boolean( - value && - typeof value === 'object' && - 'message' in value && - 'messages' in value - ) -} -function looksLikeAValue(value) { - return typeof value === 'string' || isUint8Array$1(value) -} -function isUint8Array$1(value) { - return Boolean( - value && - typeof value === 'object' && - 'byteLength' in value && - 'byteOffset' in value - ) -} - -const emptyOptions$2 = {}; -function toString(value, options) { - const settings = emptyOptions$2; - const includeImageAlt = - typeof settings.includeImageAlt === 'boolean' - ? settings.includeImageAlt - : true; - const includeHtml = - typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true; - return one(value, includeImageAlt, includeHtml) -} -function one(value, includeImageAlt, includeHtml) { - if (node(value)) { - if ('value' in value) { - return value.type === 'html' && !includeHtml ? '' : value.value - } - if (includeImageAlt && 'alt' in value && value.alt) { - return value.alt - } - if ('children' in value) { - return all(value.children, includeImageAlt, includeHtml) - } - } - if (Array.isArray(value)) { - return all(value, includeImageAlt, includeHtml) - } - return '' -} -function all(values, includeImageAlt, includeHtml) { - const result = []; - let index = -1; - while (++index < values.length) { - result[index] = one(values[index], includeImageAlt, includeHtml); - } - return result.join('') -} -function node(value) { - return Boolean(value && typeof value === 'object') -} - -const characterEntities = { - AElig: 'Æ', - AMP: '&', - Aacute: 'Á', - Abreve: 'Ă', - Acirc: 'Â', - Acy: 'А', - Afr: '𝔄', - Agrave: 'À', - Alpha: 'Α', - Amacr: 'Ā', - And: '⩓', - Aogon: 'Ą', - Aopf: '𝔸', - ApplyFunction: '', - Aring: 'Å', - Ascr: '𝒜', - Assign: '≔', - Atilde: 'Ã', - Auml: 'Ä', - Backslash: '∖', - Barv: '⫧', - Barwed: '⌆', - Bcy: 'Б', - Because: '∵', - Bernoullis: 'ℬ', - Beta: 'Β', - Bfr: '𝔅', - Bopf: '𝔹', - Breve: '˘', - Bscr: 'ℬ', - Bumpeq: '≎', - CHcy: 'Ч', - COPY: '©', - Cacute: 'Ć', - Cap: '⋒', - CapitalDifferentialD: 'ⅅ', - Cayleys: 'ℭ', - Ccaron: 'Č', - Ccedil: 'Ç', - Ccirc: 'Ĉ', - Cconint: '∰', - Cdot: 'Ċ', - Cedilla: '¸', - CenterDot: '·', - Cfr: 'ℭ', - Chi: 'Χ', - CircleDot: '⊙', - CircleMinus: '⊖', - CirclePlus: '⊕', - CircleTimes: '⊗', - ClockwiseContourIntegral: '∲', - CloseCurlyDoubleQuote: '”', - CloseCurlyQuote: '’', - Colon: '∷', - Colone: '⩴', - Congruent: '≡', - Conint: '∯', - ContourIntegral: '∮', - Copf: 'ℂ', - Coproduct: '∐', - CounterClockwiseContourIntegral: '∳', - Cross: '⨯', - Cscr: '𝒞', - Cup: '⋓', - CupCap: '≍', - DD: 'ⅅ', - DDotrahd: '⤑', - DJcy: 'Ђ', - DScy: 'Ѕ', - DZcy: 'Џ', - Dagger: '‡', - Darr: '↡', - Dashv: '⫤', - Dcaron: 'Ď', - Dcy: 'Д', - Del: '∇', - Delta: 'Δ', - Dfr: '𝔇', - DiacriticalAcute: '´', - DiacriticalDot: '˙', - DiacriticalDoubleAcute: '˝', - DiacriticalGrave: '`', - DiacriticalTilde: '˜', - Diamond: '⋄', - DifferentialD: 'ⅆ', - Dopf: '𝔻', - Dot: '¨', - DotDot: '⃜', - DotEqual: '≐', - DoubleContourIntegral: '∯', - DoubleDot: '¨', - DoubleDownArrow: '⇓', - DoubleLeftArrow: '⇐', - DoubleLeftRightArrow: '⇔', - DoubleLeftTee: '⫤', - DoubleLongLeftArrow: '⟸', - DoubleLongLeftRightArrow: '⟺', - DoubleLongRightArrow: '⟹', - DoubleRightArrow: '⇒', - DoubleRightTee: '⊨', - DoubleUpArrow: '⇑', - DoubleUpDownArrow: '⇕', - DoubleVerticalBar: '∥', - DownArrow: '↓', - DownArrowBar: '⤓', - DownArrowUpArrow: '⇵', - DownBreve: '̑', - DownLeftRightVector: '⥐', - DownLeftTeeVector: '⥞', - DownLeftVector: '↽', - DownLeftVectorBar: '⥖', - DownRightTeeVector: '⥟', - DownRightVector: '⇁', - DownRightVectorBar: '⥗', - DownTee: '⊤', - DownTeeArrow: '↧', - Downarrow: '⇓', - Dscr: '𝒟', - Dstrok: 'Đ', - ENG: 'Ŋ', - ETH: 'Ð', - Eacute: 'É', - Ecaron: 'Ě', - Ecirc: 'Ê', - Ecy: 'Э', - Edot: 'Ė', - Efr: '𝔈', - Egrave: 'È', - Element: '∈', - Emacr: 'Ē', - EmptySmallSquare: '◻', - EmptyVerySmallSquare: '▫', - Eogon: 'Ę', - Eopf: '𝔼', - Epsilon: 'Ε', - Equal: '⩵', - EqualTilde: '≂', - Equilibrium: '⇌', - Escr: 'ℰ', - Esim: '⩳', - Eta: 'Η', - Euml: 'Ë', - Exists: '∃', - ExponentialE: 'ⅇ', - Fcy: 'Ф', - Ffr: '𝔉', - FilledSmallSquare: '◼', - FilledVerySmallSquare: '▪', - Fopf: '𝔽', - ForAll: '∀', - Fouriertrf: 'ℱ', - Fscr: 'ℱ', - GJcy: 'Ѓ', - GT: '>', - Gamma: 'Γ', - Gammad: 'Ϝ', - Gbreve: 'Ğ', - Gcedil: 'Ģ', - Gcirc: 'Ĝ', - Gcy: 'Г', - Gdot: 'Ġ', - Gfr: '𝔊', - Gg: '⋙', - Gopf: '𝔾', - GreaterEqual: '≥', - GreaterEqualLess: '⋛', - GreaterFullEqual: '≧', - GreaterGreater: '⪢', - GreaterLess: '≷', - GreaterSlantEqual: '⩾', - GreaterTilde: '≳', - Gscr: '𝒢', - Gt: '≫', - HARDcy: 'Ъ', - Hacek: 'ˇ', - Hat: '^', - Hcirc: 'Ĥ', - Hfr: 'ℌ', - HilbertSpace: 'ℋ', - Hopf: 'ℍ', - HorizontalLine: '─', - Hscr: 'ℋ', - Hstrok: 'Ħ', - HumpDownHump: '≎', - HumpEqual: '≏', - IEcy: 'Е', - IJlig: 'IJ', - IOcy: 'Ё', - Iacute: 'Í', - Icirc: 'Î', - Icy: 'И', - Idot: 'İ', - Ifr: 'ℑ', - Igrave: 'Ì', - Im: 'ℑ', - Imacr: 'Ī', - ImaginaryI: 'ⅈ', - Implies: '⇒', - Int: '∬', - Integral: '∫', - Intersection: '⋂', - InvisibleComma: '', - InvisibleTimes: '', - Iogon: 'Į', - Iopf: '𝕀', - Iota: 'Ι', - Iscr: 'ℐ', - Itilde: 'Ĩ', - Iukcy: 'І', - Iuml: 'Ï', - Jcirc: 'Ĵ', - Jcy: 'Й', - Jfr: '𝔍', - Jopf: '𝕁', - Jscr: '𝒥', - Jsercy: 'Ј', - Jukcy: 'Є', - KHcy: 'Х', - KJcy: 'Ќ', - Kappa: 'Κ', - Kcedil: 'Ķ', - Kcy: 'К', - Kfr: '𝔎', - Kopf: '𝕂', - Kscr: '𝒦', - LJcy: 'Љ', - LT: '<', - Lacute: 'Ĺ', - Lambda: 'Λ', - Lang: '⟪', - Laplacetrf: 'ℒ', - Larr: '↞', - Lcaron: 'Ľ', - Lcedil: 'Ļ', - Lcy: 'Л', - LeftAngleBracket: '⟨', - LeftArrow: '←', - LeftArrowBar: '⇤', - LeftArrowRightArrow: '⇆', - LeftCeiling: '⌈', - LeftDoubleBracket: '⟦', - LeftDownTeeVector: '⥡', - LeftDownVector: '⇃', - LeftDownVectorBar: '⥙', - LeftFloor: '⌊', - LeftRightArrow: '↔', - LeftRightVector: '⥎', - LeftTee: '⊣', - LeftTeeArrow: '↤', - LeftTeeVector: '⥚', - LeftTriangle: '⊲', - LeftTriangleBar: '⧏', - LeftTriangleEqual: '⊴', - LeftUpDownVector: '⥑', - LeftUpTeeVector: '⥠', - LeftUpVector: '↿', - LeftUpVectorBar: '⥘', - LeftVector: '↼', - LeftVectorBar: '⥒', - Leftarrow: '⇐', - Leftrightarrow: '⇔', - LessEqualGreater: '⋚', - LessFullEqual: '≦', - LessGreater: '≶', - LessLess: '⪡', - LessSlantEqual: '⩽', - LessTilde: '≲', - Lfr: '𝔏', - Ll: '⋘', - Lleftarrow: '⇚', - Lmidot: 'Ŀ', - LongLeftArrow: '⟵', - LongLeftRightArrow: '⟷', - LongRightArrow: '⟶', - Longleftarrow: '⟸', - Longleftrightarrow: '⟺', - Longrightarrow: '⟹', - Lopf: '𝕃', - LowerLeftArrow: '↙', - LowerRightArrow: '↘', - Lscr: 'ℒ', - Lsh: '↰', - Lstrok: 'Ł', - Lt: '≪', - Map: '⤅', - Mcy: 'М', - MediumSpace: ' ', - Mellintrf: 'ℳ', - Mfr: '𝔐', - MinusPlus: '∓', - Mopf: '𝕄', - Mscr: 'ℳ', - Mu: 'Μ', - NJcy: 'Њ', - Nacute: 'Ń', - Ncaron: 'Ň', - Ncedil: 'Ņ', - Ncy: 'Н', - NegativeMediumSpace: '', - NegativeThickSpace: '', - NegativeThinSpace: '', - NegativeVeryThinSpace: '', - NestedGreaterGreater: '≫', - NestedLessLess: '≪', - NewLine: '\n', - Nfr: '𝔑', - NoBreak: '', - NonBreakingSpace: ' ', - Nopf: 'ℕ', - Not: '⫬', - NotCongruent: '≢', - NotCupCap: '≭', - NotDoubleVerticalBar: '∦', - NotElement: '∉', - NotEqual: '≠', - NotEqualTilde: '≂̸', - NotExists: '∄', - NotGreater: '≯', - NotGreaterEqual: '≱', - NotGreaterFullEqual: '≧̸', - NotGreaterGreater: '≫̸', - NotGreaterLess: '≹', - NotGreaterSlantEqual: '⩾̸', - NotGreaterTilde: '≵', - NotHumpDownHump: '≎̸', - NotHumpEqual: '≏̸', - NotLeftTriangle: '⋪', - NotLeftTriangleBar: '⧏̸', - NotLeftTriangleEqual: '⋬', - NotLess: '≮', - NotLessEqual: '≰', - NotLessGreater: '≸', - NotLessLess: '≪̸', - NotLessSlantEqual: '⩽̸', - NotLessTilde: '≴', - NotNestedGreaterGreater: '⪢̸', - NotNestedLessLess: '⪡̸', - NotPrecedes: '⊀', - NotPrecedesEqual: '⪯̸', - NotPrecedesSlantEqual: '⋠', - NotReverseElement: '∌', - NotRightTriangle: '⋫', - NotRightTriangleBar: '⧐̸', - NotRightTriangleEqual: '⋭', - NotSquareSubset: '⊏̸', - NotSquareSubsetEqual: '⋢', - NotSquareSuperset: '⊐̸', - NotSquareSupersetEqual: '⋣', - NotSubset: '⊂⃒', - NotSubsetEqual: '⊈', - NotSucceeds: '⊁', - NotSucceedsEqual: '⪰̸', - NotSucceedsSlantEqual: '⋡', - NotSucceedsTilde: '≿̸', - NotSuperset: '⊃⃒', - NotSupersetEqual: '⊉', - NotTilde: '≁', - NotTildeEqual: '≄', - NotTildeFullEqual: '≇', - NotTildeTilde: '≉', - NotVerticalBar: '∤', - Nscr: '𝒩', - Ntilde: 'Ñ', - Nu: 'Ν', - OElig: 'Œ', - Oacute: 'Ó', - Ocirc: 'Ô', - Ocy: 'О', - Odblac: 'Ő', - Ofr: '𝔒', - Ograve: 'Ò', - Omacr: 'Ō', - Omega: 'Ω', - Omicron: 'Ο', - Oopf: '𝕆', - OpenCurlyDoubleQuote: '“', - OpenCurlyQuote: '‘', - Or: '⩔', - Oscr: '𝒪', - Oslash: 'Ø', - Otilde: 'Õ', - Otimes: '⨷', - Ouml: 'Ö', - OverBar: '‾', - OverBrace: '⏞', - OverBracket: '⎴', - OverParenthesis: '⏜', - PartialD: '∂', - Pcy: 'П', - Pfr: '𝔓', - Phi: 'Φ', - Pi: 'Π', - PlusMinus: '±', - Poincareplane: 'ℌ', - Popf: 'ℙ', - Pr: '⪻', - Precedes: '≺', - PrecedesEqual: '⪯', - PrecedesSlantEqual: '≼', - PrecedesTilde: '≾', - Prime: '″', - Product: '∏', - Proportion: '∷', - Proportional: '∝', - Pscr: '𝒫', - Psi: 'Ψ', - QUOT: '"', - Qfr: '𝔔', - Qopf: 'ℚ', - Qscr: '𝒬', - RBarr: '⤐', - REG: '®', - Racute: 'Ŕ', - Rang: '⟫', - Rarr: '↠', - Rarrtl: '⤖', - Rcaron: 'Ř', - Rcedil: 'Ŗ', - Rcy: 'Р', - Re: 'ℜ', - ReverseElement: '∋', - ReverseEquilibrium: '⇋', - ReverseUpEquilibrium: '⥯', - Rfr: 'ℜ', - Rho: 'Ρ', - RightAngleBracket: '⟩', - RightArrow: '→', - RightArrowBar: '⇥', - RightArrowLeftArrow: '⇄', - RightCeiling: '⌉', - RightDoubleBracket: '⟧', - RightDownTeeVector: '⥝', - RightDownVector: '⇂', - RightDownVectorBar: '⥕', - RightFloor: '⌋', - RightTee: '⊢', - RightTeeArrow: '↦', - RightTeeVector: '⥛', - RightTriangle: '⊳', - RightTriangleBar: '⧐', - RightTriangleEqual: '⊵', - RightUpDownVector: '⥏', - RightUpTeeVector: '⥜', - RightUpVector: '↾', - RightUpVectorBar: '⥔', - RightVector: '⇀', - RightVectorBar: '⥓', - Rightarrow: '⇒', - Ropf: 'ℝ', - RoundImplies: '⥰', - Rrightarrow: '⇛', - Rscr: 'ℛ', - Rsh: '↱', - RuleDelayed: '⧴', - SHCHcy: 'Щ', - SHcy: 'Ш', - SOFTcy: 'Ь', - Sacute: 'Ś', - Sc: '⪼', - Scaron: 'Š', - Scedil: 'Ş', - Scirc: 'Ŝ', - Scy: 'С', - Sfr: '𝔖', - ShortDownArrow: '↓', - ShortLeftArrow: '←', - ShortRightArrow: '→', - ShortUpArrow: '↑', - Sigma: 'Σ', - SmallCircle: '∘', - Sopf: '𝕊', - Sqrt: '√', - Square: '□', - SquareIntersection: '⊓', - SquareSubset: '⊏', - SquareSubsetEqual: '⊑', - SquareSuperset: '⊐', - SquareSupersetEqual: '⊒', - SquareUnion: '⊔', - Sscr: '𝒮', - Star: '⋆', - Sub: '⋐', - Subset: '⋐', - SubsetEqual: '⊆', - Succeeds: '≻', - SucceedsEqual: '⪰', - SucceedsSlantEqual: '≽', - SucceedsTilde: '≿', - SuchThat: '∋', - Sum: '∑', - Sup: '⋑', - Superset: '⊃', - SupersetEqual: '⊇', - Supset: '⋑', - THORN: 'Þ', - TRADE: '™', - TSHcy: 'Ћ', - TScy: 'Ц', - Tab: '\t', - Tau: 'Τ', - Tcaron: 'Ť', - Tcedil: 'Ţ', - Tcy: 'Т', - Tfr: '𝔗', - Therefore: '∴', - Theta: 'Θ', - ThickSpace: ' ', - ThinSpace: ' ', - Tilde: '∼', - TildeEqual: '≃', - TildeFullEqual: '≅', - TildeTilde: '≈', - Topf: '𝕋', - TripleDot: '⃛', - Tscr: '𝒯', - Tstrok: 'Ŧ', - Uacute: 'Ú', - Uarr: '↟', - Uarrocir: '⥉', - Ubrcy: 'Ў', - Ubreve: 'Ŭ', - Ucirc: 'Û', - Ucy: 'У', - Udblac: 'Ű', - Ufr: '𝔘', - Ugrave: 'Ù', - Umacr: 'Ū', - UnderBar: '_', - UnderBrace: '⏟', - UnderBracket: '⎵', - UnderParenthesis: '⏝', - Union: '⋃', - UnionPlus: '⊎', - Uogon: 'Ų', - Uopf: '𝕌', - UpArrow: '↑', - UpArrowBar: '⤒', - UpArrowDownArrow: '⇅', - UpDownArrow: '↕', - UpEquilibrium: '⥮', - UpTee: '⊥', - UpTeeArrow: '↥', - Uparrow: '⇑', - Updownarrow: '⇕', - UpperLeftArrow: '↖', - UpperRightArrow: '↗', - Upsi: 'ϒ', - Upsilon: 'Υ', - Uring: 'Ů', - Uscr: '𝒰', - Utilde: 'Ũ', - Uuml: 'Ü', - VDash: '⊫', - Vbar: '⫫', - Vcy: 'В', - Vdash: '⊩', - Vdashl: '⫦', - Vee: '⋁', - Verbar: '‖', - Vert: '‖', - VerticalBar: '∣', - VerticalLine: '|', - VerticalSeparator: '❘', - VerticalTilde: '≀', - VeryThinSpace: ' ', - Vfr: '𝔙', - Vopf: '𝕍', - Vscr: '𝒱', - Vvdash: '⊪', - Wcirc: 'Ŵ', - Wedge: '⋀', - Wfr: '𝔚', - Wopf: '𝕎', - Wscr: '𝒲', - Xfr: '𝔛', - Xi: 'Ξ', - Xopf: '𝕏', - Xscr: '𝒳', - YAcy: 'Я', - YIcy: 'Ї', - YUcy: 'Ю', - Yacute: 'Ý', - Ycirc: 'Ŷ', - Ycy: 'Ы', - Yfr: '𝔜', - Yopf: '𝕐', - Yscr: '𝒴', - Yuml: 'Ÿ', - ZHcy: 'Ж', - Zacute: 'Ź', - Zcaron: 'Ž', - Zcy: 'З', - Zdot: 'Ż', - ZeroWidthSpace: '', - Zeta: 'Ζ', - Zfr: 'ℨ', - Zopf: 'ℤ', - Zscr: '𝒵', - aacute: 'á', - abreve: 'ă', - ac: '∾', - acE: '∾̳', - acd: '∿', - acirc: 'â', - acute: '´', - acy: 'а', - aelig: 'æ', - af: '', - afr: '𝔞', - agrave: 'à', - alefsym: 'ℵ', - aleph: 'ℵ', - alpha: 'α', - amacr: 'ā', - amalg: '⨿', - amp: '&', - and: '∧', - andand: '⩕', - andd: '⩜', - andslope: '⩘', - andv: '⩚', - ang: '∠', - ange: '⦤', - angle: '∠', - angmsd: '∡', - angmsdaa: '⦨', - angmsdab: '⦩', - angmsdac: '⦪', - angmsdad: '⦫', - angmsdae: '⦬', - angmsdaf: '⦭', - angmsdag: '⦮', - angmsdah: '⦯', - angrt: '∟', - angrtvb: '⊾', - angrtvbd: '⦝', - angsph: '∢', - angst: 'Å', - angzarr: '⍼', - aogon: 'ą', - aopf: '𝕒', - ap: '≈', - apE: '⩰', - apacir: '⩯', - ape: '≊', - apid: '≋', - apos: "'", - approx: '≈', - approxeq: '≊', - aring: 'å', - ascr: '𝒶', - ast: '*', - asymp: '≈', - asympeq: '≍', - atilde: 'ã', - auml: 'ä', - awconint: '∳', - awint: '⨑', - bNot: '⫭', - backcong: '≌', - backepsilon: '϶', - backprime: '‵', - backsim: '∽', - backsimeq: '⋍', - barvee: '⊽', - barwed: '⌅', - barwedge: '⌅', - bbrk: '⎵', - bbrktbrk: '⎶', - bcong: '≌', - bcy: 'б', - bdquo: '„', - becaus: '∵', - because: '∵', - bemptyv: '⦰', - bepsi: '϶', - bernou: 'ℬ', - beta: 'β', - beth: 'ℶ', - between: '≬', - bfr: '𝔟', - bigcap: '⋂', - bigcirc: '◯', - bigcup: '⋃', - bigodot: '⨀', - bigoplus: '⨁', - bigotimes: '⨂', - bigsqcup: '⨆', - bigstar: '★', - bigtriangledown: '▽', - bigtriangleup: '△', - biguplus: '⨄', - bigvee: '⋁', - bigwedge: '⋀', - bkarow: '⤍', - blacklozenge: '⧫', - blacksquare: '▪', - blacktriangle: '▴', - blacktriangledown: '▾', - blacktriangleleft: '◂', - blacktriangleright: '▸', - blank: '␣', - blk12: '▒', - blk14: '░', - blk34: '▓', - block: '█', - bne: '=⃥', - bnequiv: '≡⃥', - bnot: '⌐', - bopf: '𝕓', - bot: '⊥', - bottom: '⊥', - bowtie: '⋈', - boxDL: '╗', - boxDR: '╔', - boxDl: '╖', - boxDr: '╓', - boxH: '═', - boxHD: '╦', - boxHU: '╩', - boxHd: '╤', - boxHu: '╧', - boxUL: '╝', - boxUR: '╚', - boxUl: '╜', - boxUr: '╙', - boxV: '║', - boxVH: '╬', - boxVL: '╣', - boxVR: '╠', - boxVh: '╫', - boxVl: '╢', - boxVr: '╟', - boxbox: '⧉', - boxdL: '╕', - boxdR: '╒', - boxdl: '┐', - boxdr: '┌', - boxh: '─', - boxhD: '╥', - boxhU: '╨', - boxhd: '┬', - boxhu: '┴', - boxminus: '⊟', - boxplus: '⊞', - boxtimes: '⊠', - boxuL: '╛', - boxuR: '╘', - boxul: '┘', - boxur: '└', - boxv: '│', - boxvH: '╪', - boxvL: '╡', - boxvR: '╞', - boxvh: '┼', - boxvl: '┤', - boxvr: '├', - bprime: '‵', - breve: '˘', - brvbar: '¦', - bscr: '𝒷', - bsemi: '⁏', - bsim: '∽', - bsime: '⋍', - bsol: '\\', - bsolb: '⧅', - bsolhsub: '⟈', - bull: '•', - bullet: '•', - bump: '≎', - bumpE: '⪮', - bumpe: '≏', - bumpeq: '≏', - cacute: 'ć', - cap: '∩', - capand: '⩄', - capbrcup: '⩉', - capcap: '⩋', - capcup: '⩇', - capdot: '⩀', - caps: '∩︀', - caret: '⁁', - caron: 'ˇ', - ccaps: '⩍', - ccaron: 'č', - ccedil: 'ç', - ccirc: 'ĉ', - ccups: '⩌', - ccupssm: '⩐', - cdot: 'ċ', - cedil: '¸', - cemptyv: '⦲', - cent: '¢', - centerdot: '·', - cfr: '𝔠', - chcy: 'ч', - check: '✓', - checkmark: '✓', - chi: 'χ', - cir: '○', - cirE: '⧃', - circ: 'ˆ', - circeq: '≗', - circlearrowleft: '↺', - circlearrowright: '↻', - circledR: '®', - circledS: 'Ⓢ', - circledast: '⊛', - circledcirc: '⊚', - circleddash: '⊝', - cire: '≗', - cirfnint: '⨐', - cirmid: '⫯', - cirscir: '⧂', - clubs: '♣', - clubsuit: '♣', - colon: ':', - colone: '≔', - coloneq: '≔', - comma: ',', - commat: '@', - comp: '∁', - compfn: '∘', - complement: '∁', - complexes: 'ℂ', - cong: '≅', - congdot: '⩭', - conint: '∮', - copf: '𝕔', - coprod: '∐', - copy: '©', - copysr: '℗', - crarr: '↵', - cross: '✗', - cscr: '𝒸', - csub: '⫏', - csube: '⫑', - csup: '⫐', - csupe: '⫒', - ctdot: '⋯', - cudarrl: '⤸', - cudarrr: '⤵', - cuepr: '⋞', - cuesc: '⋟', - cularr: '↶', - cularrp: '⤽', - cup: '∪', - cupbrcap: '⩈', - cupcap: '⩆', - cupcup: '⩊', - cupdot: '⊍', - cupor: '⩅', - cups: '∪︀', - curarr: '↷', - curarrm: '⤼', - curlyeqprec: '⋞', - curlyeqsucc: '⋟', - curlyvee: '⋎', - curlywedge: '⋏', - curren: '¤', - curvearrowleft: '↶', - curvearrowright: '↷', - cuvee: '⋎', - cuwed: '⋏', - cwconint: '∲', - cwint: '∱', - cylcty: '⌭', - dArr: '⇓', - dHar: '⥥', - dagger: '†', - daleth: 'ℸ', - darr: '↓', - dash: '‐', - dashv: '⊣', - dbkarow: '⤏', - dblac: '˝', - dcaron: 'ď', - dcy: 'д', - dd: 'ⅆ', - ddagger: '‡', - ddarr: '⇊', - ddotseq: '⩷', - deg: '°', - delta: 'δ', - demptyv: '⦱', - dfisht: '⥿', - dfr: '𝔡', - dharl: '⇃', - dharr: '⇂', - diam: '⋄', - diamond: '⋄', - diamondsuit: '♦', - diams: '♦', - die: '¨', - digamma: 'ϝ', - disin: '⋲', - div: '÷', - divide: '÷', - divideontimes: '⋇', - divonx: '⋇', - djcy: 'ђ', - dlcorn: '⌞', - dlcrop: '⌍', - dollar: '$', - dopf: '𝕕', - dot: '˙', - doteq: '≐', - doteqdot: '≑', - dotminus: '∸', - dotplus: '∔', - dotsquare: '⊡', - doublebarwedge: '⌆', - downarrow: '↓', - downdownarrows: '⇊', - downharpoonleft: '⇃', - downharpoonright: '⇂', - drbkarow: '⤐', - drcorn: '⌟', - drcrop: '⌌', - dscr: '𝒹', - dscy: 'ѕ', - dsol: '⧶', - dstrok: 'đ', - dtdot: '⋱', - dtri: '▿', - dtrif: '▾', - duarr: '⇵', - duhar: '⥯', - dwangle: '⦦', - dzcy: 'џ', - dzigrarr: '⟿', - eDDot: '⩷', - eDot: '≑', - eacute: 'é', - easter: '⩮', - ecaron: 'ě', - ecir: '≖', - ecirc: 'ê', - ecolon: '≕', - ecy: 'э', - edot: 'ė', - ee: 'ⅇ', - efDot: '≒', - efr: '𝔢', - eg: '⪚', - egrave: 'è', - egs: '⪖', - egsdot: '⪘', - el: '⪙', - elinters: '⏧', - ell: 'ℓ', - els: '⪕', - elsdot: '⪗', - emacr: 'ē', - empty: '∅', - emptyset: '∅', - emptyv: '∅', - emsp13: ' ', - emsp14: ' ', - emsp: ' ', - eng: 'ŋ', - ensp: ' ', - eogon: 'ę', - eopf: '𝕖', - epar: '⋕', - eparsl: '⧣', - eplus: '⩱', - epsi: 'ε', - epsilon: 'ε', - epsiv: 'ϵ', - eqcirc: '≖', - eqcolon: '≕', - eqsim: '≂', - eqslantgtr: '⪖', - eqslantless: '⪕', - equals: '=', - equest: '≟', - equiv: '≡', - equivDD: '⩸', - eqvparsl: '⧥', - erDot: '≓', - erarr: '⥱', - escr: 'ℯ', - esdot: '≐', - esim: '≂', - eta: 'η', - eth: 'ð', - euml: 'ë', - euro: '€', - excl: '!', - exist: '∃', - expectation: 'ℰ', - exponentiale: 'ⅇ', - fallingdotseq: '≒', - fcy: 'ф', - female: '♀', - ffilig: 'ffi', - fflig: 'ff', - ffllig: 'ffl', - ffr: '𝔣', - filig: 'fi', - fjlig: 'fj', - flat: '♭', - fllig: 'fl', - fltns: '▱', - fnof: 'ƒ', - fopf: '𝕗', - forall: '∀', - fork: '⋔', - forkv: '⫙', - fpartint: '⨍', - frac12: '½', - frac13: '⅓', - frac14: '¼', - frac15: '⅕', - frac16: '⅙', - frac18: '⅛', - frac23: '⅔', - frac25: '⅖', - frac34: '¾', - frac35: '⅗', - frac38: '⅜', - frac45: '⅘', - frac56: '⅚', - frac58: '⅝', - frac78: '⅞', - frasl: '⁄', - frown: '⌢', - fscr: '𝒻', - gE: '≧', - gEl: '⪌', - gacute: 'ǵ', - gamma: 'γ', - gammad: 'ϝ', - gap: '⪆', - gbreve: 'ğ', - gcirc: 'ĝ', - gcy: 'г', - gdot: 'ġ', - ge: '≥', - gel: '⋛', - geq: '≥', - geqq: '≧', - geqslant: '⩾', - ges: '⩾', - gescc: '⪩', - gesdot: '⪀', - gesdoto: '⪂', - gesdotol: '⪄', - gesl: '⋛︀', - gesles: '⪔', - gfr: '𝔤', - gg: '≫', - ggg: '⋙', - gimel: 'ℷ', - gjcy: 'ѓ', - gl: '≷', - glE: '⪒', - gla: '⪥', - glj: '⪤', - gnE: '≩', - gnap: '⪊', - gnapprox: '⪊', - gne: '⪈', - gneq: '⪈', - gneqq: '≩', - gnsim: '⋧', - gopf: '𝕘', - grave: '`', - gscr: 'ℊ', - gsim: '≳', - gsime: '⪎', - gsiml: '⪐', - gt: '>', - gtcc: '⪧', - gtcir: '⩺', - gtdot: '⋗', - gtlPar: '⦕', - gtquest: '⩼', - gtrapprox: '⪆', - gtrarr: '⥸', - gtrdot: '⋗', - gtreqless: '⋛', - gtreqqless: '⪌', - gtrless: '≷', - gtrsim: '≳', - gvertneqq: '≩︀', - gvnE: '≩︀', - hArr: '⇔', - hairsp: ' ', - half: '½', - hamilt: 'ℋ', - hardcy: 'ъ', - harr: '↔', - harrcir: '⥈', - harrw: '↭', - hbar: 'ℏ', - hcirc: 'ĥ', - hearts: '♥', - heartsuit: '♥', - hellip: '…', - hercon: '⊹', - hfr: '𝔥', - hksearow: '⤥', - hkswarow: '⤦', - hoarr: '⇿', - homtht: '∻', - hookleftarrow: '↩', - hookrightarrow: '↪', - hopf: '𝕙', - horbar: '―', - hscr: '𝒽', - hslash: 'ℏ', - hstrok: 'ħ', - hybull: '⁃', - hyphen: '‐', - iacute: 'í', - ic: '', - icirc: 'î', - icy: 'и', - iecy: 'е', - iexcl: '¡', - iff: '⇔', - ifr: '𝔦', - igrave: 'ì', - ii: 'ⅈ', - iiiint: '⨌', - iiint: '∭', - iinfin: '⧜', - iiota: '℩', - ijlig: 'ij', - imacr: 'ī', - image: 'ℑ', - imagline: 'ℐ', - imagpart: 'ℑ', - imath: 'ı', - imof: '⊷', - imped: 'Ƶ', - in: '∈', - incare: '℅', - infin: '∞', - infintie: '⧝', - inodot: 'ı', - int: '∫', - intcal: '⊺', - integers: 'ℤ', - intercal: '⊺', - intlarhk: '⨗', - intprod: '⨼', - iocy: 'ё', - iogon: 'į', - iopf: '𝕚', - iota: 'ι', - iprod: '⨼', - iquest: '¿', - iscr: '𝒾', - isin: '∈', - isinE: '⋹', - isindot: '⋵', - isins: '⋴', - isinsv: '⋳', - isinv: '∈', - it: '', - itilde: 'ĩ', - iukcy: 'і', - iuml: 'ï', - jcirc: 'ĵ', - jcy: 'й', - jfr: '𝔧', - jmath: 'ȷ', - jopf: '𝕛', - jscr: '𝒿', - jsercy: 'ј', - jukcy: 'є', - kappa: 'κ', - kappav: 'ϰ', - kcedil: 'ķ', - kcy: 'к', - kfr: '𝔨', - kgreen: 'ĸ', - khcy: 'х', - kjcy: 'ќ', - kopf: '𝕜', - kscr: '𝓀', - lAarr: '⇚', - lArr: '⇐', - lAtail: '⤛', - lBarr: '⤎', - lE: '≦', - lEg: '⪋', - lHar: '⥢', - lacute: 'ĺ', - laemptyv: '⦴', - lagran: 'ℒ', - lambda: 'λ', - lang: '⟨', - langd: '⦑', - langle: '⟨', - lap: '⪅', - laquo: '«', - larr: '←', - larrb: '⇤', - larrbfs: '⤟', - larrfs: '⤝', - larrhk: '↩', - larrlp: '↫', - larrpl: '⤹', - larrsim: '⥳', - larrtl: '↢', - lat: '⪫', - latail: '⤙', - late: '⪭', - lates: '⪭︀', - lbarr: '⤌', - lbbrk: '❲', - lbrace: '{', - lbrack: '[', - lbrke: '⦋', - lbrksld: '⦏', - lbrkslu: '⦍', - lcaron: 'ľ', - lcedil: 'ļ', - lceil: '⌈', - lcub: '{', - lcy: 'л', - ldca: '⤶', - ldquo: '“', - ldquor: '„', - ldrdhar: '⥧', - ldrushar: '⥋', - ldsh: '↲', - le: '≤', - leftarrow: '←', - leftarrowtail: '↢', - leftharpoondown: '↽', - leftharpoonup: '↼', - leftleftarrows: '⇇', - leftrightarrow: '↔', - leftrightarrows: '⇆', - leftrightharpoons: '⇋', - leftrightsquigarrow: '↭', - leftthreetimes: '⋋', - leg: '⋚', - leq: '≤', - leqq: '≦', - leqslant: '⩽', - les: '⩽', - lescc: '⪨', - lesdot: '⩿', - lesdoto: '⪁', - lesdotor: '⪃', - lesg: '⋚︀', - lesges: '⪓', - lessapprox: '⪅', - lessdot: '⋖', - lesseqgtr: '⋚', - lesseqqgtr: '⪋', - lessgtr: '≶', - lesssim: '≲', - lfisht: '⥼', - lfloor: '⌊', - lfr: '𝔩', - lg: '≶', - lgE: '⪑', - lhard: '↽', - lharu: '↼', - lharul: '⥪', - lhblk: '▄', - ljcy: 'љ', - ll: '≪', - llarr: '⇇', - llcorner: '⌞', - llhard: '⥫', - lltri: '◺', - lmidot: 'ŀ', - lmoust: '⎰', - lmoustache: '⎰', - lnE: '≨', - lnap: '⪉', - lnapprox: '⪉', - lne: '⪇', - lneq: '⪇', - lneqq: '≨', - lnsim: '⋦', - loang: '⟬', - loarr: '⇽', - lobrk: '⟦', - longleftarrow: '⟵', - longleftrightarrow: '⟷', - longmapsto: '⟼', - longrightarrow: '⟶', - looparrowleft: '↫', - looparrowright: '↬', - lopar: '⦅', - lopf: '𝕝', - loplus: '⨭', - lotimes: '⨴', - lowast: '∗', - lowbar: '_', - loz: '◊', - lozenge: '◊', - lozf: '⧫', - lpar: '(', - lparlt: '⦓', - lrarr: '⇆', - lrcorner: '⌟', - lrhar: '⇋', - lrhard: '⥭', - lrm: '', - lrtri: '⊿', - lsaquo: '‹', - lscr: '𝓁', - lsh: '↰', - lsim: '≲', - lsime: '⪍', - lsimg: '⪏', - lsqb: '[', - lsquo: '‘', - lsquor: '‚', - lstrok: 'ł', - lt: '<', - ltcc: '⪦', - ltcir: '⩹', - ltdot: '⋖', - lthree: '⋋', - ltimes: '⋉', - ltlarr: '⥶', - ltquest: '⩻', - ltrPar: '⦖', - ltri: '◃', - ltrie: '⊴', - ltrif: '◂', - lurdshar: '⥊', - luruhar: '⥦', - lvertneqq: '≨︀', - lvnE: '≨︀', - mDDot: '∺', - macr: '¯', - male: '♂', - malt: '✠', - maltese: '✠', - map: '↦', - mapsto: '↦', - mapstodown: '↧', - mapstoleft: '↤', - mapstoup: '↥', - marker: '▮', - mcomma: '⨩', - mcy: 'м', - mdash: '—', - measuredangle: '∡', - mfr: '𝔪', - mho: '℧', - micro: 'µ', - mid: '∣', - midast: '*', - midcir: '⫰', - middot: '·', - minus: '−', - minusb: '⊟', - minusd: '∸', - minusdu: '⨪', - mlcp: '⫛', - mldr: '…', - mnplus: '∓', - models: '⊧', - mopf: '𝕞', - mp: '∓', - mscr: '𝓂', - mstpos: '∾', - mu: 'μ', - multimap: '⊸', - mumap: '⊸', - nGg: '⋙̸', - nGt: '≫⃒', - nGtv: '≫̸', - nLeftarrow: '⇍', - nLeftrightarrow: '⇎', - nLl: '⋘̸', - nLt: '≪⃒', - nLtv: '≪̸', - nRightarrow: '⇏', - nVDash: '⊯', - nVdash: '⊮', - nabla: '∇', - nacute: 'ń', - nang: '∠⃒', - nap: '≉', - napE: '⩰̸', - napid: '≋̸', - napos: 'ʼn', - napprox: '≉', - natur: '♮', - natural: '♮', - naturals: 'ℕ', - nbsp: ' ', - nbump: '≎̸', - nbumpe: '≏̸', - ncap: '⩃', - ncaron: 'ň', - ncedil: 'ņ', - ncong: '≇', - ncongdot: '⩭̸', - ncup: '⩂', - ncy: 'н', - ndash: '–', - ne: '≠', - neArr: '⇗', - nearhk: '⤤', - nearr: '↗', - nearrow: '↗', - nedot: '≐̸', - nequiv: '≢', - nesear: '⤨', - nesim: '≂̸', - nexist: '∄', - nexists: '∄', - nfr: '𝔫', - ngE: '≧̸', - nge: '≱', - ngeq: '≱', - ngeqq: '≧̸', - ngeqslant: '⩾̸', - nges: '⩾̸', - ngsim: '≵', - ngt: '≯', - ngtr: '≯', - nhArr: '⇎', - nharr: '↮', - nhpar: '⫲', - ni: '∋', - nis: '⋼', - nisd: '⋺', - niv: '∋', - njcy: 'њ', - nlArr: '⇍', - nlE: '≦̸', - nlarr: '↚', - nldr: '‥', - nle: '≰', - nleftarrow: '↚', - nleftrightarrow: '↮', - nleq: '≰', - nleqq: '≦̸', - nleqslant: '⩽̸', - nles: '⩽̸', - nless: '≮', - nlsim: '≴', - nlt: '≮', - nltri: '⋪', - nltrie: '⋬', - nmid: '∤', - nopf: '𝕟', - not: '¬', - notin: '∉', - notinE: '⋹̸', - notindot: '⋵̸', - notinva: '∉', - notinvb: '⋷', - notinvc: '⋶', - notni: '∌', - notniva: '∌', - notnivb: '⋾', - notnivc: '⋽', - npar: '∦', - nparallel: '∦', - nparsl: '⫽⃥', - npart: '∂̸', - npolint: '⨔', - npr: '⊀', - nprcue: '⋠', - npre: '⪯̸', - nprec: '⊀', - npreceq: '⪯̸', - nrArr: '⇏', - nrarr: '↛', - nrarrc: '⤳̸', - nrarrw: '↝̸', - nrightarrow: '↛', - nrtri: '⋫', - nrtrie: '⋭', - nsc: '⊁', - nsccue: '⋡', - nsce: '⪰̸', - nscr: '𝓃', - nshortmid: '∤', - nshortparallel: '∦', - nsim: '≁', - nsime: '≄', - nsimeq: '≄', - nsmid: '∤', - nspar: '∦', - nsqsube: '⋢', - nsqsupe: '⋣', - nsub: '⊄', - nsubE: '⫅̸', - nsube: '⊈', - nsubset: '⊂⃒', - nsubseteq: '⊈', - nsubseteqq: '⫅̸', - nsucc: '⊁', - nsucceq: '⪰̸', - nsup: '⊅', - nsupE: '⫆̸', - nsupe: '⊉', - nsupset: '⊃⃒', - nsupseteq: '⊉', - nsupseteqq: '⫆̸', - ntgl: '≹', - ntilde: 'ñ', - ntlg: '≸', - ntriangleleft: '⋪', - ntrianglelefteq: '⋬', - ntriangleright: '⋫', - ntrianglerighteq: '⋭', - nu: 'ν', - num: '#', - numero: '№', - numsp: ' ', - nvDash: '⊭', - nvHarr: '⤄', - nvap: '≍⃒', - nvdash: '⊬', - nvge: '≥⃒', - nvgt: '>⃒', - nvinfin: '⧞', - nvlArr: '⤂', - nvle: '≤⃒', - nvlt: '<⃒', - nvltrie: '⊴⃒', - nvrArr: '⤃', - nvrtrie: '⊵⃒', - nvsim: '∼⃒', - nwArr: '⇖', - nwarhk: '⤣', - nwarr: '↖', - nwarrow: '↖', - nwnear: '⤧', - oS: 'Ⓢ', - oacute: 'ó', - oast: '⊛', - ocir: '⊚', - ocirc: 'ô', - ocy: 'о', - odash: '⊝', - odblac: 'ő', - odiv: '⨸', - odot: '⊙', - odsold: '⦼', - oelig: 'œ', - ofcir: '⦿', - ofr: '𝔬', - ogon: '˛', - ograve: 'ò', - ogt: '⧁', - ohbar: '⦵', - ohm: 'Ω', - oint: '∮', - olarr: '↺', - olcir: '⦾', - olcross: '⦻', - oline: '‾', - olt: '⧀', - omacr: 'ō', - omega: 'ω', - omicron: 'ο', - omid: '⦶', - ominus: '⊖', - oopf: '𝕠', - opar: '⦷', - operp: '⦹', - oplus: '⊕', - or: '∨', - orarr: '↻', - ord: '⩝', - order: 'ℴ', - orderof: 'ℴ', - ordf: 'ª', - ordm: 'º', - origof: '⊶', - oror: '⩖', - orslope: '⩗', - orv: '⩛', - oscr: 'ℴ', - oslash: 'ø', - osol: '⊘', - otilde: 'õ', - otimes: '⊗', - otimesas: '⨶', - ouml: 'ö', - ovbar: '⌽', - par: '∥', - para: '¶', - parallel: '∥', - parsim: '⫳', - parsl: '⫽', - part: '∂', - pcy: 'п', - percnt: '%', - period: '.', - permil: '‰', - perp: '⊥', - pertenk: '‱', - pfr: '𝔭', - phi: 'φ', - phiv: 'ϕ', - phmmat: 'ℳ', - phone: '☎', - pi: 'π', - pitchfork: '⋔', - piv: 'ϖ', - planck: 'ℏ', - planckh: 'ℎ', - plankv: 'ℏ', - plus: '+', - plusacir: '⨣', - plusb: '⊞', - pluscir: '⨢', - plusdo: '∔', - plusdu: '⨥', - pluse: '⩲', - plusmn: '±', - plussim: '⨦', - plustwo: '⨧', - pm: '±', - pointint: '⨕', - popf: '𝕡', - pound: '£', - pr: '≺', - prE: '⪳', - prap: '⪷', - prcue: '≼', - pre: '⪯', - prec: '≺', - precapprox: '⪷', - preccurlyeq: '≼', - preceq: '⪯', - precnapprox: '⪹', - precneqq: '⪵', - precnsim: '⋨', - precsim: '≾', - prime: '′', - primes: 'ℙ', - prnE: '⪵', - prnap: '⪹', - prnsim: '⋨', - prod: '∏', - profalar: '⌮', - profline: '⌒', - profsurf: '⌓', - prop: '∝', - propto: '∝', - prsim: '≾', - prurel: '⊰', - pscr: '𝓅', - psi: 'ψ', - puncsp: ' ', - qfr: '𝔮', - qint: '⨌', - qopf: '𝕢', - qprime: '⁗', - qscr: '𝓆', - quaternions: 'ℍ', - quatint: '⨖', - quest: '?', - questeq: '≟', - quot: '"', - rAarr: '⇛', - rArr: '⇒', - rAtail: '⤜', - rBarr: '⤏', - rHar: '⥤', - race: '∽̱', - racute: 'ŕ', - radic: '√', - raemptyv: '⦳', - rang: '⟩', - rangd: '⦒', - range: '⦥', - rangle: '⟩', - raquo: '»', - rarr: '→', - rarrap: '⥵', - rarrb: '⇥', - rarrbfs: '⤠', - rarrc: '⤳', - rarrfs: '⤞', - rarrhk: '↪', - rarrlp: '↬', - rarrpl: '⥅', - rarrsim: '⥴', - rarrtl: '↣', - rarrw: '↝', - ratail: '⤚', - ratio: '∶', - rationals: 'ℚ', - rbarr: '⤍', - rbbrk: '❳', - rbrace: '}', - rbrack: ']', - rbrke: '⦌', - rbrksld: '⦎', - rbrkslu: '⦐', - rcaron: 'ř', - rcedil: 'ŗ', - rceil: '⌉', - rcub: '}', - rcy: 'р', - rdca: '⤷', - rdldhar: '⥩', - rdquo: '”', - rdquor: '”', - rdsh: '↳', - real: 'ℜ', - realine: 'ℛ', - realpart: 'ℜ', - reals: 'ℝ', - rect: '▭', - reg: '®', - rfisht: '⥽', - rfloor: '⌋', - rfr: '𝔯', - rhard: '⇁', - rharu: '⇀', - rharul: '⥬', - rho: 'ρ', - rhov: 'ϱ', - rightarrow: '→', - rightarrowtail: '↣', - rightharpoondown: '⇁', - rightharpoonup: '⇀', - rightleftarrows: '⇄', - rightleftharpoons: '⇌', - rightrightarrows: '⇉', - rightsquigarrow: '↝', - rightthreetimes: '⋌', - ring: '˚', - risingdotseq: '≓', - rlarr: '⇄', - rlhar: '⇌', - rlm: '', - rmoust: '⎱', - rmoustache: '⎱', - rnmid: '⫮', - roang: '⟭', - roarr: '⇾', - robrk: '⟧', - ropar: '⦆', - ropf: '𝕣', - roplus: '⨮', - rotimes: '⨵', - rpar: ')', - rpargt: '⦔', - rppolint: '⨒', - rrarr: '⇉', - rsaquo: '›', - rscr: '𝓇', - rsh: '↱', - rsqb: ']', - rsquo: '’', - rsquor: '’', - rthree: '⋌', - rtimes: '⋊', - rtri: '▹', - rtrie: '⊵', - rtrif: '▸', - rtriltri: '⧎', - ruluhar: '⥨', - rx: '℞', - sacute: 'ś', - sbquo: '‚', - sc: '≻', - scE: '⪴', - scap: '⪸', - scaron: 'š', - sccue: '≽', - sce: '⪰', - scedil: 'ş', - scirc: 'ŝ', - scnE: '⪶', - scnap: '⪺', - scnsim: '⋩', - scpolint: '⨓', - scsim: '≿', - scy: 'с', - sdot: '⋅', - sdotb: '⊡', - sdote: '⩦', - seArr: '⇘', - searhk: '⤥', - searr: '↘', - searrow: '↘', - sect: '§', - semi: ';', - seswar: '⤩', - setminus: '∖', - setmn: '∖', - sext: '✶', - sfr: '𝔰', - sfrown: '⌢', - sharp: '♯', - shchcy: 'щ', - shcy: 'ш', - shortmid: '∣', - shortparallel: '∥', - shy: '', - sigma: 'σ', - sigmaf: 'ς', - sigmav: 'ς', - sim: '∼', - simdot: '⩪', - sime: '≃', - simeq: '≃', - simg: '⪞', - simgE: '⪠', - siml: '⪝', - simlE: '⪟', - simne: '≆', - simplus: '⨤', - simrarr: '⥲', - slarr: '←', - smallsetminus: '∖', - smashp: '⨳', - smeparsl: '⧤', - smid: '∣', - smile: '⌣', - smt: '⪪', - smte: '⪬', - smtes: '⪬︀', - softcy: 'ь', - sol: '/', - solb: '⧄', - solbar: '⌿', - sopf: '𝕤', - spades: '♠', - spadesuit: '♠', - spar: '∥', - sqcap: '⊓', - sqcaps: '⊓︀', - sqcup: '⊔', - sqcups: '⊔︀', - sqsub: '⊏', - sqsube: '⊑', - sqsubset: '⊏', - sqsubseteq: '⊑', - sqsup: '⊐', - sqsupe: '⊒', - sqsupset: '⊐', - sqsupseteq: '⊒', - squ: '□', - square: '□', - squarf: '▪', - squf: '▪', - srarr: '→', - sscr: '𝓈', - ssetmn: '∖', - ssmile: '⌣', - sstarf: '⋆', - star: '☆', - starf: '★', - straightepsilon: 'ϵ', - straightphi: 'ϕ', - strns: '¯', - sub: '⊂', - subE: '⫅', - subdot: '⪽', - sube: '⊆', - subedot: '⫃', - submult: '⫁', - subnE: '⫋', - subne: '⊊', - subplus: '⪿', - subrarr: '⥹', - subset: '⊂', - subseteq: '⊆', - subseteqq: '⫅', - subsetneq: '⊊', - subsetneqq: '⫋', - subsim: '⫇', - subsub: '⫕', - subsup: '⫓', - succ: '≻', - succapprox: '⪸', - succcurlyeq: '≽', - succeq: '⪰', - succnapprox: '⪺', - succneqq: '⪶', - succnsim: '⋩', - succsim: '≿', - sum: '∑', - sung: '♪', - sup1: '¹', - sup2: '²', - sup3: '³', - sup: '⊃', - supE: '⫆', - supdot: '⪾', - supdsub: '⫘', - supe: '⊇', - supedot: '⫄', - suphsol: '⟉', - suphsub: '⫗', - suplarr: '⥻', - supmult: '⫂', - supnE: '⫌', - supne: '⊋', - supplus: '⫀', - supset: '⊃', - supseteq: '⊇', - supseteqq: '⫆', - supsetneq: '⊋', - supsetneqq: '⫌', - supsim: '⫈', - supsub: '⫔', - supsup: '⫖', - swArr: '⇙', - swarhk: '⤦', - swarr: '↙', - swarrow: '↙', - swnwar: '⤪', - szlig: 'ß', - target: '⌖', - tau: 'τ', - tbrk: '⎴', - tcaron: 'ť', - tcedil: 'ţ', - tcy: 'т', - tdot: '⃛', - telrec: '⌕', - tfr: '𝔱', - there4: '∴', - therefore: '∴', - theta: 'θ', - thetasym: 'ϑ', - thetav: 'ϑ', - thickapprox: '≈', - thicksim: '∼', - thinsp: ' ', - thkap: '≈', - thksim: '∼', - thorn: 'þ', - tilde: '˜', - times: '×', - timesb: '⊠', - timesbar: '⨱', - timesd: '⨰', - tint: '∭', - toea: '⤨', - top: '⊤', - topbot: '⌶', - topcir: '⫱', - topf: '𝕥', - topfork: '⫚', - tosa: '⤩', - tprime: '‴', - trade: '™', - triangle: '▵', - triangledown: '▿', - triangleleft: '◃', - trianglelefteq: '⊴', - triangleq: '≜', - triangleright: '▹', - trianglerighteq: '⊵', - tridot: '◬', - trie: '≜', - triminus: '⨺', - triplus: '⨹', - trisb: '⧍', - tritime: '⨻', - trpezium: '⏢', - tscr: '𝓉', - tscy: 'ц', - tshcy: 'ћ', - tstrok: 'ŧ', - twixt: '≬', - twoheadleftarrow: '↞', - twoheadrightarrow: '↠', - uArr: '⇑', - uHar: '⥣', - uacute: 'ú', - uarr: '↑', - ubrcy: 'ў', - ubreve: 'ŭ', - ucirc: 'û', - ucy: 'у', - udarr: '⇅', - udblac: 'ű', - udhar: '⥮', - ufisht: '⥾', - ufr: '𝔲', - ugrave: 'ù', - uharl: '↿', - uharr: '↾', - uhblk: '▀', - ulcorn: '⌜', - ulcorner: '⌜', - ulcrop: '⌏', - ultri: '◸', - umacr: 'ū', - uml: '¨', - uogon: 'ų', - uopf: '𝕦', - uparrow: '↑', - updownarrow: '↕', - upharpoonleft: '↿', - upharpoonright: '↾', - uplus: '⊎', - upsi: 'υ', - upsih: 'ϒ', - upsilon: 'υ', - upuparrows: '⇈', - urcorn: '⌝', - urcorner: '⌝', - urcrop: '⌎', - uring: 'ů', - urtri: '◹', - uscr: '𝓊', - utdot: '⋰', - utilde: 'ũ', - utri: '▵', - utrif: '▴', - uuarr: '⇈', - uuml: 'ü', - uwangle: '⦧', - vArr: '⇕', - vBar: '⫨', - vBarv: '⫩', - vDash: '⊨', - vangrt: '⦜', - varepsilon: 'ϵ', - varkappa: 'ϰ', - varnothing: '∅', - varphi: 'ϕ', - varpi: 'ϖ', - varpropto: '∝', - varr: '↕', - varrho: 'ϱ', - varsigma: 'ς', - varsubsetneq: '⊊︀', - varsubsetneqq: '⫋︀', - varsupsetneq: '⊋︀', - varsupsetneqq: '⫌︀', - vartheta: 'ϑ', - vartriangleleft: '⊲', - vartriangleright: '⊳', - vcy: 'в', - vdash: '⊢', - vee: '∨', - veebar: '⊻', - veeeq: '≚', - vellip: '⋮', - verbar: '|', - vert: '|', - vfr: '𝔳', - vltri: '⊲', - vnsub: '⊂⃒', - vnsup: '⊃⃒', - vopf: '𝕧', - vprop: '∝', - vrtri: '⊳', - vscr: '𝓋', - vsubnE: '⫋︀', - vsubne: '⊊︀', - vsupnE: '⫌︀', - vsupne: '⊋︀', - vzigzag: '⦚', - wcirc: 'ŵ', - wedbar: '⩟', - wedge: '∧', - wedgeq: '≙', - weierp: '℘', - wfr: '𝔴', - wopf: '𝕨', - wp: '℘', - wr: '≀', - wreath: '≀', - wscr: '𝓌', - xcap: '⋂', - xcirc: '◯', - xcup: '⋃', - xdtri: '▽', - xfr: '𝔵', - xhArr: '⟺', - xharr: '⟷', - xi: 'ξ', - xlArr: '⟸', - xlarr: '⟵', - xmap: '⟼', - xnis: '⋻', - xodot: '⨀', - xopf: '𝕩', - xoplus: '⨁', - xotime: '⨂', - xrArr: '⟹', - xrarr: '⟶', - xscr: '𝓍', - xsqcup: '⨆', - xuplus: '⨄', - xutri: '△', - xvee: '⋁', - xwedge: '⋀', - yacute: 'ý', - yacy: 'я', - ycirc: 'ŷ', - ycy: 'ы', - yen: '¥', - yfr: '𝔶', - yicy: 'ї', - yopf: '𝕪', - yscr: '𝓎', - yucy: 'ю', - yuml: 'ÿ', - zacute: 'ź', - zcaron: 'ž', - zcy: 'з', - zdot: 'ż', - zeetrf: 'ℨ', - zeta: 'ζ', - zfr: '𝔷', - zhcy: 'ж', - zigrarr: '⇝', - zopf: '𝕫', - zscr: '𝓏', - zwj: '', - zwnj: '' -}; - -const own$4 = {}.hasOwnProperty; -function decodeNamedCharacterReference(value) { - return own$4.call(characterEntities, value) ? characterEntities[value] : false -} - -function splice(list, start, remove, items) { - const end = list.length; - let chunkStart = 0; - let parameters; - if (start < 0) { - start = -start > end ? 0 : end + start; - } else { - start = start > end ? end : start; - } - remove = remove > 0 ? remove : 0; - if (items.length < 10000) { - parameters = Array.from(items); - parameters.unshift(start, remove); - list.splice(...parameters); - } else { - if (remove) list.splice(start, remove); - while (chunkStart < items.length) { - parameters = items.slice(chunkStart, chunkStart + 10000); - parameters.unshift(start, 0); - list.splice(...parameters); - chunkStart += 10000; - start += 10000; - } - } -} -function push(list, items) { - if (list.length > 0) { - splice(list, list.length, 0, items); - return list - } - return items -} - -const hasOwnProperty = {}.hasOwnProperty; -function combineExtensions(extensions) { - const all = {}; - let index = -1; - while (++index < extensions.length) { - syntaxExtension(all, extensions[index]); - } - return all -} -function syntaxExtension(all, extension) { - let hook; - for (hook in extension) { - const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined; - const left = maybe || (all[hook] = {}); - const right = extension[hook]; - let code; - if (right) { - for (code in right) { - if (!hasOwnProperty.call(left, code)) left[code] = []; - const value = right[code]; - constructs( - left[code], - Array.isArray(value) ? value : value ? [value] : [] - ); - } - } - } -} -function constructs(existing, list) { - let index = -1; - const before = []; - while (++index < list.length) { -(list[index].add === 'after' ? existing : before).push(list[index]); - } - splice(existing, 0, 0, before); -} - -function decodeNumericCharacterReference(value, base) { - const code = Number.parseInt(value, base); - if ( - code < 9 || code === 11 || code > 13 && code < 32 || - code > 126 && code < 160 || - code > 55_295 && code < 57_344 || - code > 64_975 && code < 65_008 || - (code & 65_535) === 65_535 || (code & 65_535) === 65_534 || - code > 1_114_111) { - return "\uFFFD"; - } - return String.fromCodePoint(code); -} - -function normalizeIdentifier(value) { - return ( - value - .replace(/[\t\n\r ]+/g, ' ') - .replace(/^ | $/g, '') - .toLowerCase() - .toUpperCase() - ) -} - -const asciiAlpha = regexCheck(/[A-Za-z]/); -const asciiAlphanumeric = regexCheck(/[\dA-Za-z]/); -const asciiAtext = regexCheck(/[#-'*+\--9=?A-Z^-~]/); -function asciiControl(code) { - return ( - code !== null && (code < 32 || code === 127) - ); -} -const asciiDigit = regexCheck(/\d/); -const asciiHexDigit = regexCheck(/[\dA-Fa-f]/); -const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/); -function markdownLineEnding(code) { - return code !== null && code < -2; -} -function markdownLineEndingOrSpace(code) { - return code !== null && (code < 0 || code === 32); -} -function markdownSpace(code) { - return code === -2 || code === -1 || code === 32; -} -const unicodePunctuation = regexCheck(/\p{P}|\p{S}/u); -const unicodeWhitespace = regexCheck(/\s/); -function regexCheck(regex) { - return check; - function check(code) { - return code !== null && code > -1 && regex.test(String.fromCharCode(code)); - } -} - -function factorySpace(effects, ok, type, max) { - const limit = max ? max - 1 : Number.POSITIVE_INFINITY; - let size = 0; - return start - function start(code) { - if (markdownSpace(code)) { - effects.enter(type); - return prefix(code) - } - return ok(code) - } - function prefix(code) { - if (markdownSpace(code) && size++ < limit) { - effects.consume(code); - return prefix - } - effects.exit(type); - return ok(code) - } -} - -const content$1 = { - tokenize: initializeContent -}; -function initializeContent(effects) { - const contentStart = effects.attempt( - this.parser.constructs.contentInitial, - afterContentStartConstruct, - paragraphInitial - ); - let previous; - return contentStart - function afterContentStartConstruct(code) { - if (code === null) { - effects.consume(code); - return - } - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return factorySpace(effects, contentStart, 'linePrefix') - } - function paragraphInitial(code) { - effects.enter('paragraph'); - return lineStart(code) - } - function lineStart(code) { - const token = effects.enter('chunkText', { - contentType: 'text', - previous - }); - if (previous) { - previous.next = token; - } - previous = token; - return data(code) - } - function data(code) { - if (code === null) { - effects.exit('chunkText'); - effects.exit('paragraph'); - effects.consume(code); - return - } - if (markdownLineEnding(code)) { - effects.consume(code); - effects.exit('chunkText'); - return lineStart - } - effects.consume(code); - return data - } -} - -const document$1 = { - tokenize: initializeDocument -}; -const containerConstruct = { - tokenize: tokenizeContainer -}; -function initializeDocument(effects) { - const self = this; - const stack = []; - let continued = 0; - let childFlow; - let childToken; - let lineStartOffset; - return start - function start(code) { - if (continued < stack.length) { - const item = stack[continued]; - self.containerState = item[1]; - return effects.attempt( - item[0].continuation, - documentContinue, - checkNewContainers - )(code) - } - return checkNewContainers(code) - } - function documentContinue(code) { - continued++; - if (self.containerState._closeFlow) { - self.containerState._closeFlow = undefined; - if (childFlow) { - closeFlow(); - } - const indexBeforeExits = self.events.length; - let indexBeforeFlow = indexBeforeExits; - let point; - while (indexBeforeFlow--) { - if ( - self.events[indexBeforeFlow][0] === 'exit' && - self.events[indexBeforeFlow][1].type === 'chunkFlow' - ) { - point = self.events[indexBeforeFlow][1].end; - break - } - } - exitContainers(continued); - let index = indexBeforeExits; - while (index < self.events.length) { - self.events[index][1].end = Object.assign({}, point); - index++; - } - splice( - self.events, - indexBeforeFlow + 1, - 0, - self.events.slice(indexBeforeExits) - ); - self.events.length = index; - return checkNewContainers(code) - } - return start(code) - } - function checkNewContainers(code) { - if (continued === stack.length) { - if (!childFlow) { - return documentContinued(code) - } - if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) { - return flowStart(code) - } - self.interrupt = Boolean( - childFlow.currentConstruct && !childFlow._gfmTableDynamicInterruptHack - ); - } - self.containerState = {}; - return effects.check( - containerConstruct, - thereIsANewContainer, - thereIsNoNewContainer - )(code) - } - function thereIsANewContainer(code) { - if (childFlow) closeFlow(); - exitContainers(continued); - return documentContinued(code) - } - function thereIsNoNewContainer(code) { - self.parser.lazy[self.now().line] = continued !== stack.length; - lineStartOffset = self.now().offset; - return flowStart(code) - } - function documentContinued(code) { - self.containerState = {}; - return effects.attempt( - containerConstruct, - containerContinue, - flowStart - )(code) - } - function containerContinue(code) { - continued++; - stack.push([self.currentConstruct, self.containerState]); - return documentContinued(code) - } - function flowStart(code) { - if (code === null) { - if (childFlow) closeFlow(); - exitContainers(0); - effects.consume(code); - return - } - childFlow = childFlow || self.parser.flow(self.now()); - effects.enter('chunkFlow', { - contentType: 'flow', - previous: childToken, - _tokenizer: childFlow - }); - return flowContinue(code) - } - function flowContinue(code) { - if (code === null) { - writeToChild(effects.exit('chunkFlow'), true); - exitContainers(0); - effects.consume(code); - return - } - if (markdownLineEnding(code)) { - effects.consume(code); - writeToChild(effects.exit('chunkFlow')); - continued = 0; - self.interrupt = undefined; - return start - } - effects.consume(code); - return flowContinue - } - function writeToChild(token, eof) { - const stream = self.sliceStream(token); - if (eof) stream.push(null); - token.previous = childToken; - if (childToken) childToken.next = token; - childToken = token; - childFlow.defineSkip(token.start); - childFlow.write(stream); - if (self.parser.lazy[token.start.line]) { - let index = childFlow.events.length; - while (index--) { - if ( - childFlow.events[index][1].start.offset < lineStartOffset && - (!childFlow.events[index][1].end || - childFlow.events[index][1].end.offset > lineStartOffset) - ) { - return - } - } - const indexBeforeExits = self.events.length; - let indexBeforeFlow = indexBeforeExits; - let seen; - let point; - while (indexBeforeFlow--) { - if ( - self.events[indexBeforeFlow][0] === 'exit' && - self.events[indexBeforeFlow][1].type === 'chunkFlow' - ) { - if (seen) { - point = self.events[indexBeforeFlow][1].end; - break - } - seen = true; - } - } - exitContainers(continued); - index = indexBeforeExits; - while (index < self.events.length) { - self.events[index][1].end = Object.assign({}, point); - index++; - } - splice( - self.events, - indexBeforeFlow + 1, - 0, - self.events.slice(indexBeforeExits) - ); - self.events.length = index; - } - } - function exitContainers(size) { - let index = stack.length; - while (index-- > size) { - const entry = stack[index]; - self.containerState = entry[1]; - entry[0].exit.call(self, effects); - } - stack.length = size; - } - function closeFlow() { - childFlow.write([null]); - childToken = undefined; - childFlow = undefined; - self.containerState._closeFlow = undefined; - } -} -function tokenizeContainer(effects, ok, nok) { - return factorySpace( - effects, - effects.attempt(this.parser.constructs.document, ok, nok), - 'linePrefix', - this.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4 - ) -} - -function classifyCharacter(code) { - if ( - code === null || - markdownLineEndingOrSpace(code) || - unicodeWhitespace(code) - ) { - return 1 - } - if (unicodePunctuation(code)) { - return 2 - } -} - -function resolveAll(constructs, events, context) { - const called = []; - let index = -1; - while (++index < constructs.length) { - const resolve = constructs[index].resolveAll; - if (resolve && !called.includes(resolve)) { - events = resolve(events, context); - called.push(resolve); - } - } - return events -} - -const attention = { - name: 'attention', - tokenize: tokenizeAttention, - resolveAll: resolveAllAttention -}; -function resolveAllAttention(events, context) { - let index = -1; - let open; - let group; - let text; - let openingSequence; - let closingSequence; - let use; - let nextEvents; - let offset; - while (++index < events.length) { - if (events[index][0] === 'enter' && events[index][1].type === 'attentionSequence' && events[index][1]._close) { - open = index; - while (open--) { - if (events[open][0] === 'exit' && events[open][1].type === 'attentionSequence' && events[open][1]._open && - context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) { - if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) { - continue; - } - use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1; - const start = Object.assign({}, events[open][1].end); - const end = Object.assign({}, events[index][1].start); - movePoint(start, -use); - movePoint(end, use); - openingSequence = { - type: use > 1 ? "strongSequence" : "emphasisSequence", - start, - end: Object.assign({}, events[open][1].end) - }; - closingSequence = { - type: use > 1 ? "strongSequence" : "emphasisSequence", - start: Object.assign({}, events[index][1].start), - end - }; - text = { - type: use > 1 ? "strongText" : "emphasisText", - start: Object.assign({}, events[open][1].end), - end: Object.assign({}, events[index][1].start) - }; - group = { - type: use > 1 ? "strong" : "emphasis", - start: Object.assign({}, openingSequence.start), - end: Object.assign({}, closingSequence.end) - }; - events[open][1].end = Object.assign({}, openingSequence.start); - events[index][1].start = Object.assign({}, closingSequence.end); - nextEvents = []; - if (events[open][1].end.offset - events[open][1].start.offset) { - nextEvents = push(nextEvents, [['enter', events[open][1], context], ['exit', events[open][1], context]]); - } - nextEvents = push(nextEvents, [['enter', group, context], ['enter', openingSequence, context], ['exit', openingSequence, context], ['enter', text, context]]); - nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context)); - nextEvents = push(nextEvents, [['exit', text, context], ['enter', closingSequence, context], ['exit', closingSequence, context], ['exit', group, context]]); - if (events[index][1].end.offset - events[index][1].start.offset) { - offset = 2; - nextEvents = push(nextEvents, [['enter', events[index][1], context], ['exit', events[index][1], context]]); - } else { - offset = 0; - } - splice(events, open - 1, index - open + 3, nextEvents); - index = open + nextEvents.length - offset - 2; - break; - } - } - } - } - index = -1; - while (++index < events.length) { - if (events[index][1].type === 'attentionSequence') { - events[index][1].type = 'data'; - } - } - return events; -} -function tokenizeAttention(effects, ok) { - const attentionMarkers = this.parser.constructs.attentionMarkers.null; - const previous = this.previous; - const before = classifyCharacter(previous); - let marker; - return start; - function start(code) { - marker = code; - effects.enter('attentionSequence'); - return inside(code); - } - function inside(code) { - if (code === marker) { - effects.consume(code); - return inside; - } - const token = effects.exit('attentionSequence'); - const after = classifyCharacter(code); - const open = !after || after === 2 && before || attentionMarkers.includes(code); - const close = !before || before === 2 && after || attentionMarkers.includes(previous); - token._open = Boolean(marker === 42 ? open : open && (before || !close)); - token._close = Boolean(marker === 42 ? close : close && (after || !open)); - return ok(code); - } -} -function movePoint(point, offset) { - point.column += offset; - point.offset += offset; - point._bufferIndex += offset; -} - -const autolink = { - name: 'autolink', - tokenize: tokenizeAutolink -}; -function tokenizeAutolink(effects, ok, nok) { - let size = 0; - return start; - function start(code) { - effects.enter("autolink"); - effects.enter("autolinkMarker"); - effects.consume(code); - effects.exit("autolinkMarker"); - effects.enter("autolinkProtocol"); - return open; - } - function open(code) { - if (asciiAlpha(code)) { - effects.consume(code); - return schemeOrEmailAtext; - } - if (code === 64) { - return nok(code); - } - return emailAtext(code); - } - function schemeOrEmailAtext(code) { - if (code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) { - size = 1; - return schemeInsideOrEmailAtext(code); - } - return emailAtext(code); - } - function schemeInsideOrEmailAtext(code) { - if (code === 58) { - effects.consume(code); - size = 0; - return urlInside; - } - if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) { - effects.consume(code); - return schemeInsideOrEmailAtext; - } - size = 0; - return emailAtext(code); - } - function urlInside(code) { - if (code === 62) { - effects.exit("autolinkProtocol"); - effects.enter("autolinkMarker"); - effects.consume(code); - effects.exit("autolinkMarker"); - effects.exit("autolink"); - return ok; - } - if (code === null || code === 32 || code === 60 || asciiControl(code)) { - return nok(code); - } - effects.consume(code); - return urlInside; - } - function emailAtext(code) { - if (code === 64) { - effects.consume(code); - return emailAtSignOrDot; - } - if (asciiAtext(code)) { - effects.consume(code); - return emailAtext; - } - return nok(code); - } - function emailAtSignOrDot(code) { - return asciiAlphanumeric(code) ? emailLabel(code) : nok(code); - } - function emailLabel(code) { - if (code === 46) { - effects.consume(code); - size = 0; - return emailAtSignOrDot; - } - if (code === 62) { - effects.exit("autolinkProtocol").type = "autolinkEmail"; - effects.enter("autolinkMarker"); - effects.consume(code); - effects.exit("autolinkMarker"); - effects.exit("autolink"); - return ok; - } - return emailValue(code); - } - function emailValue(code) { - if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) { - const next = code === 45 ? emailValue : emailLabel; - effects.consume(code); - return next; - } - return nok(code); - } -} - -const blankLine = { - tokenize: tokenizeBlankLine, - partial: true -}; -function tokenizeBlankLine(effects, ok, nok) { - return start; - function start(code) { - return markdownSpace(code) ? factorySpace(effects, after, "linePrefix")(code) : after(code); - } - function after(code) { - return code === null || markdownLineEnding(code) ? ok(code) : nok(code); - } -} - -const blockQuote = { - name: 'blockQuote', - tokenize: tokenizeBlockQuoteStart, - continuation: { - tokenize: tokenizeBlockQuoteContinuation - }, - exit: exit$1 -}; -function tokenizeBlockQuoteStart(effects, ok, nok) { - const self = this; - return start; - function start(code) { - if (code === 62) { - const state = self.containerState; - if (!state.open) { - effects.enter("blockQuote", { - _container: true - }); - state.open = true; - } - effects.enter("blockQuotePrefix"); - effects.enter("blockQuoteMarker"); - effects.consume(code); - effects.exit("blockQuoteMarker"); - return after; - } - return nok(code); - } - function after(code) { - if (markdownSpace(code)) { - effects.enter("blockQuotePrefixWhitespace"); - effects.consume(code); - effects.exit("blockQuotePrefixWhitespace"); - effects.exit("blockQuotePrefix"); - return ok; - } - effects.exit("blockQuotePrefix"); - return ok(code); - } -} -function tokenizeBlockQuoteContinuation(effects, ok, nok) { - const self = this; - return contStart; - function contStart(code) { - if (markdownSpace(code)) { - return factorySpace(effects, contBefore, "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code); - } - return contBefore(code); - } - function contBefore(code) { - return effects.attempt(blockQuote, ok, nok)(code); - } -} -function exit$1(effects) { - effects.exit("blockQuote"); -} - -const characterEscape = { - name: 'characterEscape', - tokenize: tokenizeCharacterEscape -}; -function tokenizeCharacterEscape(effects, ok, nok) { - return start; - function start(code) { - effects.enter("characterEscape"); - effects.enter("escapeMarker"); - effects.consume(code); - effects.exit("escapeMarker"); - return inside; - } - function inside(code) { - if (asciiPunctuation(code)) { - effects.enter("characterEscapeValue"); - effects.consume(code); - effects.exit("characterEscapeValue"); - effects.exit("characterEscape"); - return ok; - } - return nok(code); - } -} - -const characterReference = { - name: 'characterReference', - tokenize: tokenizeCharacterReference -}; -function tokenizeCharacterReference(effects, ok, nok) { - const self = this; - let size = 0; - let max; - let test; - return start; - function start(code) { - effects.enter("characterReference"); - effects.enter("characterReferenceMarker"); - effects.consume(code); - effects.exit("characterReferenceMarker"); - return open; - } - function open(code) { - if (code === 35) { - effects.enter("characterReferenceMarkerNumeric"); - effects.consume(code); - effects.exit("characterReferenceMarkerNumeric"); - return numeric; - } - effects.enter("characterReferenceValue"); - max = 31; - test = asciiAlphanumeric; - return value(code); - } - function numeric(code) { - if (code === 88 || code === 120) { - effects.enter("characterReferenceMarkerHexadecimal"); - effects.consume(code); - effects.exit("characterReferenceMarkerHexadecimal"); - effects.enter("characterReferenceValue"); - max = 6; - test = asciiHexDigit; - return value; - } - effects.enter("characterReferenceValue"); - max = 7; - test = asciiDigit; - return value(code); - } - function value(code) { - if (code === 59 && size) { - const token = effects.exit("characterReferenceValue"); - if (test === asciiAlphanumeric && !decodeNamedCharacterReference(self.sliceSerialize(token))) { - return nok(code); - } - effects.enter("characterReferenceMarker"); - effects.consume(code); - effects.exit("characterReferenceMarker"); - effects.exit("characterReference"); - return ok; - } - if (test(code) && size++ < max) { - effects.consume(code); - return value; - } - return nok(code); - } -} - -const nonLazyContinuation = { - tokenize: tokenizeNonLazyContinuation, - partial: true -}; -const codeFenced = { - name: 'codeFenced', - tokenize: tokenizeCodeFenced, - concrete: true -}; -function tokenizeCodeFenced(effects, ok, nok) { - const self = this; - const closeStart = { - tokenize: tokenizeCloseStart, - partial: true - }; - let initialPrefix = 0; - let sizeOpen = 0; - let marker; - return start; - function start(code) { - return beforeSequenceOpen(code); - } - function beforeSequenceOpen(code) { - const tail = self.events[self.events.length - 1]; - initialPrefix = tail && tail[1].type === "linePrefix" ? tail[2].sliceSerialize(tail[1], true).length : 0; - marker = code; - effects.enter("codeFenced"); - effects.enter("codeFencedFence"); - effects.enter("codeFencedFenceSequence"); - return sequenceOpen(code); - } - function sequenceOpen(code) { - if (code === marker) { - sizeOpen++; - effects.consume(code); - return sequenceOpen; - } - if (sizeOpen < 3) { - return nok(code); - } - effects.exit("codeFencedFenceSequence"); - return markdownSpace(code) ? factorySpace(effects, infoBefore, "whitespace")(code) : infoBefore(code); - } - function infoBefore(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("codeFencedFence"); - return self.interrupt ? ok(code) : effects.check(nonLazyContinuation, atNonLazyBreak, after)(code); - } - effects.enter("codeFencedFenceInfo"); - effects.enter("chunkString", { - contentType: "string" - }); - return info(code); - } - function info(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("chunkString"); - effects.exit("codeFencedFenceInfo"); - return infoBefore(code); - } - if (markdownSpace(code)) { - effects.exit("chunkString"); - effects.exit("codeFencedFenceInfo"); - return factorySpace(effects, metaBefore, "whitespace")(code); - } - if (code === 96 && code === marker) { - return nok(code); - } - effects.consume(code); - return info; - } - function metaBefore(code) { - if (code === null || markdownLineEnding(code)) { - return infoBefore(code); - } - effects.enter("codeFencedFenceMeta"); - effects.enter("chunkString", { - contentType: "string" - }); - return meta(code); - } - function meta(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("chunkString"); - effects.exit("codeFencedFenceMeta"); - return infoBefore(code); - } - if (code === 96 && code === marker) { - return nok(code); - } - effects.consume(code); - return meta; - } - function atNonLazyBreak(code) { - return effects.attempt(closeStart, after, contentBefore)(code); - } - function contentBefore(code) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return contentStart; - } - function contentStart(code) { - return initialPrefix > 0 && markdownSpace(code) ? factorySpace(effects, beforeContentChunk, "linePrefix", initialPrefix + 1)(code) : beforeContentChunk(code); - } - function beforeContentChunk(code) { - if (code === null || markdownLineEnding(code)) { - return effects.check(nonLazyContinuation, atNonLazyBreak, after)(code); - } - effects.enter("codeFlowValue"); - return contentChunk(code); - } - function contentChunk(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("codeFlowValue"); - return beforeContentChunk(code); - } - effects.consume(code); - return contentChunk; - } - function after(code) { - effects.exit("codeFenced"); - return ok(code); - } - function tokenizeCloseStart(effects, ok, nok) { - let size = 0; - return startBefore; - function startBefore(code) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return start; - } - function start(code) { - effects.enter("codeFencedFence"); - return markdownSpace(code) ? factorySpace(effects, beforeSequenceClose, "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : beforeSequenceClose(code); - } - function beforeSequenceClose(code) { - if (code === marker) { - effects.enter("codeFencedFenceSequence"); - return sequenceClose(code); - } - return nok(code); - } - function sequenceClose(code) { - if (code === marker) { - size++; - effects.consume(code); - return sequenceClose; - } - if (size >= sizeOpen) { - effects.exit("codeFencedFenceSequence"); - return markdownSpace(code) ? factorySpace(effects, sequenceCloseAfter, "whitespace")(code) : sequenceCloseAfter(code); - } - return nok(code); - } - function sequenceCloseAfter(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("codeFencedFence"); - return ok(code); - } - return nok(code); - } - } -} -function tokenizeNonLazyContinuation(effects, ok, nok) { - const self = this; - return start; - function start(code) { - if (code === null) { - return nok(code); - } - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return lineStart; - } - function lineStart(code) { - return self.parser.lazy[self.now().line] ? nok(code) : ok(code); - } -} - -const codeIndented = { - name: 'codeIndented', - tokenize: tokenizeCodeIndented -}; -const furtherStart = { - tokenize: tokenizeFurtherStart, - partial: true -}; -function tokenizeCodeIndented(effects, ok, nok) { - const self = this; - return start; - function start(code) { - effects.enter("codeIndented"); - return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1)(code); - } - function afterPrefix(code) { - const tail = self.events[self.events.length - 1]; - return tail && tail[1].type === "linePrefix" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? atBreak(code) : nok(code); - } - function atBreak(code) { - if (code === null) { - return after(code); - } - if (markdownLineEnding(code)) { - return effects.attempt(furtherStart, atBreak, after)(code); - } - effects.enter("codeFlowValue"); - return inside(code); - } - function inside(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("codeFlowValue"); - return atBreak(code); - } - effects.consume(code); - return inside; - } - function after(code) { - effects.exit("codeIndented"); - return ok(code); - } -} -function tokenizeFurtherStart(effects, ok, nok) { - const self = this; - return furtherStart; - function furtherStart(code) { - if (self.parser.lazy[self.now().line]) { - return nok(code); - } - if (markdownLineEnding(code)) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return furtherStart; - } - return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1)(code); - } - function afterPrefix(code) { - const tail = self.events[self.events.length - 1]; - return tail && tail[1].type === "linePrefix" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? ok(code) : markdownLineEnding(code) ? furtherStart(code) : nok(code); - } -} - -const codeText = { - name: 'codeText', - tokenize: tokenizeCodeText, - resolve: resolveCodeText, - previous: previous$1 -}; -function resolveCodeText(events) { - let tailExitIndex = events.length - 4; - let headEnterIndex = 3; - let index; - let enter; - if ((events[headEnterIndex][1].type === "lineEnding" || events[headEnterIndex][1].type === 'space') && (events[tailExitIndex][1].type === "lineEnding" || events[tailExitIndex][1].type === 'space')) { - index = headEnterIndex; - while (++index < tailExitIndex) { - if (events[index][1].type === "codeTextData") { - events[headEnterIndex][1].type = "codeTextPadding"; - events[tailExitIndex][1].type = "codeTextPadding"; - headEnterIndex += 2; - tailExitIndex -= 2; - break; - } - } - } - index = headEnterIndex - 1; - tailExitIndex++; - while (++index <= tailExitIndex) { - if (enter === undefined) { - if (index !== tailExitIndex && events[index][1].type !== "lineEnding") { - enter = index; - } - } else if (index === tailExitIndex || events[index][1].type === "lineEnding") { - events[enter][1].type = "codeTextData"; - if (index !== enter + 2) { - events[enter][1].end = events[index - 1][1].end; - events.splice(enter + 2, index - enter - 2); - tailExitIndex -= index - enter - 2; - index = enter + 2; - } - enter = undefined; - } - } - return events; -} -function previous$1(code) { - return code !== 96 || this.events[this.events.length - 1][1].type === "characterEscape"; -} -function tokenizeCodeText(effects, ok, nok) { - let sizeOpen = 0; - let size; - let token; - return start; - function start(code) { - effects.enter("codeText"); - effects.enter("codeTextSequence"); - return sequenceOpen(code); - } - function sequenceOpen(code) { - if (code === 96) { - effects.consume(code); - sizeOpen++; - return sequenceOpen; - } - effects.exit("codeTextSequence"); - return between(code); - } - function between(code) { - if (code === null) { - return nok(code); - } - if (code === 32) { - effects.enter('space'); - effects.consume(code); - effects.exit('space'); - return between; - } - if (code === 96) { - token = effects.enter("codeTextSequence"); - size = 0; - return sequenceClose(code); - } - if (markdownLineEnding(code)) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return between; - } - effects.enter("codeTextData"); - return data(code); - } - function data(code) { - if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) { - effects.exit("codeTextData"); - return between(code); - } - effects.consume(code); - return data; - } - function sequenceClose(code) { - if (code === 96) { - effects.consume(code); - size++; - return sequenceClose; - } - if (size === sizeOpen) { - effects.exit("codeTextSequence"); - effects.exit("codeText"); - return ok(code); - } - token.type = "codeTextData"; - return data(code); - } -} - -class SpliceBuffer { - constructor(initial) { - this.left = initial ? [...initial] : []; - this.right = []; - } - get(index) { - if (index < 0 || index >= this.left.length + this.right.length) { - throw new RangeError('Cannot access index `' + index + '` in a splice buffer of size `' + (this.left.length + this.right.length) + '`'); - } - if (index < this.left.length) return this.left[index]; - return this.right[this.right.length - index + this.left.length - 1]; - } - get length() { - return this.left.length + this.right.length; - } - shift() { - this.setCursor(0); - return this.right.pop(); - } - slice(start, end) { - const stop = end === null || end === undefined ? Number.POSITIVE_INFINITY : end; - if (stop < this.left.length) { - return this.left.slice(start, stop); - } - if (start > this.left.length) { - return this.right.slice(this.right.length - stop + this.left.length, this.right.length - start + this.left.length).reverse(); - } - return this.left.slice(start).concat(this.right.slice(this.right.length - stop + this.left.length).reverse()); - } - splice(start, deleteCount, items) { - const count = deleteCount || 0; - this.setCursor(Math.trunc(start)); - const removed = this.right.splice(this.right.length - count, Number.POSITIVE_INFINITY); - if (items) chunkedPush(this.left, items); - return removed.reverse(); - } - pop() { - this.setCursor(Number.POSITIVE_INFINITY); - return this.left.pop(); - } - push(item) { - this.setCursor(Number.POSITIVE_INFINITY); - this.left.push(item); - } - pushMany(items) { - this.setCursor(Number.POSITIVE_INFINITY); - chunkedPush(this.left, items); - } - unshift(item) { - this.setCursor(0); - this.right.push(item); - } - unshiftMany(items) { - this.setCursor(0); - chunkedPush(this.right, items.reverse()); - } - setCursor(n) { - if (n === this.left.length || n > this.left.length && this.right.length === 0 || n < 0 && this.left.length === 0) return; - if (n < this.left.length) { - const removed = this.left.splice(n, Number.POSITIVE_INFINITY); - chunkedPush(this.right, removed.reverse()); - } else { - const removed = this.right.splice(this.left.length + this.right.length - n, Number.POSITIVE_INFINITY); - chunkedPush(this.left, removed.reverse()); - } - } -} -function chunkedPush(list, right) { - let chunkStart = 0; - if (right.length < 10000) { - list.push(...right); - } else { - while (chunkStart < right.length) { - list.push(...right.slice(chunkStart, chunkStart + 10000)); - chunkStart += 10000; - } - } -} - -function subtokenize(eventsArray) { - const jumps = {}; - let index = -1; - let event; - let lineIndex; - let otherIndex; - let otherEvent; - let parameters; - let subevents; - let more; - const events = new SpliceBuffer(eventsArray); - while (++index < events.length) { - while (index in jumps) { - index = jumps[index]; - } - event = events.get(index); - if (index && event[1].type === "chunkFlow" && events.get(index - 1)[1].type === "listItemPrefix") { - subevents = event[1]._tokenizer.events; - otherIndex = 0; - if (otherIndex < subevents.length && subevents[otherIndex][1].type === "lineEndingBlank") { - otherIndex += 2; - } - if (otherIndex < subevents.length && subevents[otherIndex][1].type === "content") { - while (++otherIndex < subevents.length) { - if (subevents[otherIndex][1].type === "content") { - break; - } - if (subevents[otherIndex][1].type === "chunkText") { - subevents[otherIndex][1]._isInFirstContentOfListItem = true; - otherIndex++; - } - } - } - } - if (event[0] === 'enter') { - if (event[1].contentType) { - Object.assign(jumps, subcontent(events, index)); - index = jumps[index]; - more = true; - } - } - else if (event[1]._container) { - otherIndex = index; - lineIndex = undefined; - while (otherIndex--) { - otherEvent = events.get(otherIndex); - if (otherEvent[1].type === "lineEnding" || otherEvent[1].type === "lineEndingBlank") { - if (otherEvent[0] === 'enter') { - if (lineIndex) { - events.get(lineIndex)[1].type = "lineEndingBlank"; - } - otherEvent[1].type = "lineEnding"; - lineIndex = otherIndex; - } - } else { - break; - } - } - if (lineIndex) { - event[1].end = Object.assign({}, events.get(lineIndex)[1].start); - parameters = events.slice(lineIndex, index); - parameters.unshift(event); - events.splice(lineIndex, index - lineIndex + 1, parameters); - } - } - } - splice(eventsArray, 0, Number.POSITIVE_INFINITY, events.slice(0)); - return !more; -} -function subcontent(events, eventIndex) { - const token = events.get(eventIndex)[1]; - const context = events.get(eventIndex)[2]; - let startPosition = eventIndex - 1; - const startPositions = []; - const tokenizer = token._tokenizer || context.parser[token.contentType](token.start); - const childEvents = tokenizer.events; - const jumps = []; - const gaps = {}; - let stream; - let previous; - let index = -1; - let current = token; - let adjust = 0; - let start = 0; - const breaks = [start]; - while (current) { - while (events.get(++startPosition)[1] !== current) { - } - startPositions.push(startPosition); - if (!current._tokenizer) { - stream = context.sliceStream(current); - if (!current.next) { - stream.push(null); - } - if (previous) { - tokenizer.defineSkip(current.start); - } - if (current._isInFirstContentOfListItem) { - tokenizer._gfmTasklistFirstContentOfListItem = true; - } - tokenizer.write(stream); - if (current._isInFirstContentOfListItem) { - tokenizer._gfmTasklistFirstContentOfListItem = undefined; - } - } - previous = current; - current = current.next; - } - current = token; - while (++index < childEvents.length) { - if ( - childEvents[index][0] === 'exit' && childEvents[index - 1][0] === 'enter' && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) { - start = index + 1; - breaks.push(start); - current._tokenizer = undefined; - current.previous = undefined; - current = current.next; - } - } - tokenizer.events = []; - if (current) { - current._tokenizer = undefined; - current.previous = undefined; - } else { - breaks.pop(); - } - index = breaks.length; - while (index--) { - const slice = childEvents.slice(breaks[index], breaks[index + 1]); - const start = startPositions.pop(); - jumps.push([start, start + slice.length - 1]); - events.splice(start, 2, slice); - } - jumps.reverse(); - index = -1; - while (++index < jumps.length) { - gaps[adjust + jumps[index][0]] = adjust + jumps[index][1]; - adjust += jumps[index][1] - jumps[index][0] - 1; - } - return gaps; -} - -const content = { - tokenize: tokenizeContent, - resolve: resolveContent -}; -const continuationConstruct = { - tokenize: tokenizeContinuation, - partial: true -}; -function resolveContent(events) { - subtokenize(events); - return events; -} -function tokenizeContent(effects, ok) { - let previous; - return chunkStart; - function chunkStart(code) { - effects.enter("content"); - previous = effects.enter("chunkContent", { - contentType: "content" - }); - return chunkInside(code); - } - function chunkInside(code) { - if (code === null) { - return contentEnd(code); - } - if (markdownLineEnding(code)) { - return effects.check(continuationConstruct, contentContinue, contentEnd)(code); - } - effects.consume(code); - return chunkInside; - } - function contentEnd(code) { - effects.exit("chunkContent"); - effects.exit("content"); - return ok(code); - } - function contentContinue(code) { - effects.consume(code); - effects.exit("chunkContent"); - previous.next = effects.enter("chunkContent", { - contentType: "content", - previous - }); - previous = previous.next; - return chunkInside; - } -} -function tokenizeContinuation(effects, ok, nok) { - const self = this; - return startLookahead; - function startLookahead(code) { - effects.exit("chunkContent"); - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return factorySpace(effects, prefixed, "linePrefix"); - } - function prefixed(code) { - if (code === null || markdownLineEnding(code)) { - return nok(code); - } - const tail = self.events[self.events.length - 1]; - if (!self.parser.constructs.disable.null.includes('codeIndented') && tail && tail[1].type === "linePrefix" && tail[2].sliceSerialize(tail[1], true).length >= 4) { - return ok(code); - } - return effects.interrupt(self.parser.constructs.flow, nok, ok)(code); - } -} - -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 === 60) { - effects.enter(type); - effects.enter(literalType); - effects.enter(literalMarkerType); - effects.consume(code); - effects.exit(literalMarkerType); - return enclosedBefore - } - if (code === null || code === 32 || code === 41 || asciiControl(code)) { - return nok(code) - } - effects.enter(type); - effects.enter(rawType); - effects.enter(stringType); - effects.enter('chunkString', { - contentType: 'string' - }); - return raw(code) - } - function enclosedBefore(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 enclosed(code) - } - function enclosed(code) { - if (code === 62) { - effects.exit('chunkString'); - effects.exit(stringType); - return enclosedBefore(code) - } - if (code === null || code === 60 || markdownLineEnding(code)) { - return nok(code) - } - effects.consume(code); - return code === 92 ? enclosedEscape : enclosed - } - function enclosedEscape(code) { - if (code === 60 || code === 62 || code === 92) { - effects.consume(code); - return enclosed - } - return enclosed(code) - } - function raw(code) { - if ( - !balance && - (code === null || code === 41 || markdownLineEndingOrSpace(code)) - ) { - effects.exit('chunkString'); - effects.exit(stringType); - effects.exit(rawType); - effects.exit(type); - return ok(code) - } - if (balance < limit && code === 40) { - effects.consume(code); - balance++; - return raw - } - if (code === 41) { - effects.consume(code); - balance--; - return raw - } - if (code === null || code === 32 || code === 40 || asciiControl(code)) { - return nok(code) - } - effects.consume(code); - return code === 92 ? rawEscape : raw - } - function rawEscape(code) { - if (code === 40 || code === 41 || code === 92) { - effects.consume(code); - return raw - } - return raw(code) - } -} - -function factoryLabel(effects, ok, nok, type, markerType, stringType) { - const self = this; - let size = 0; - let seen; - return start - function start(code) { - effects.enter(type); - effects.enter(markerType); - effects.consume(code); - effects.exit(markerType); - effects.enter(stringType); - return atBreak - } - function atBreak(code) { - if ( - size > 999 || - code === null || - code === 91 || - (code === 93 && !seen) || - (code === 94 && - !size && - '_hiddenFootnoteSupport' in self.parser.constructs) - ) { - return nok(code) - } - if (code === 93) { - effects.exit(stringType); - effects.enter(markerType); - effects.consume(code); - effects.exit(markerType); - effects.exit(type); - return ok - } - if (markdownLineEnding(code)) { - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return atBreak - } - effects.enter('chunkString', { - contentType: 'string' - }); - return labelInside(code) - } - function labelInside(code) { - if ( - code === null || - code === 91 || - code === 93 || - markdownLineEnding(code) || - size++ > 999 - ) { - effects.exit('chunkString'); - return atBreak(code) - } - effects.consume(code); - if (!seen) seen = !markdownSpace(code); - return code === 92 ? labelEscape : labelInside - } - function labelEscape(code) { - if (code === 91 || code === 92 || code === 93) { - effects.consume(code); - size++; - return labelInside - } - return labelInside(code) - } -} - -function factoryTitle(effects, ok, nok, type, markerType, stringType) { - let marker; - return start - function start(code) { - if (code === 34 || code === 39 || code === 40) { - effects.enter(type); - effects.enter(markerType); - effects.consume(code); - effects.exit(markerType); - marker = code === 40 ? 41 : code; - return begin - } - return nok(code) - } - function begin(code) { - if (code === marker) { - effects.enter(markerType); - effects.consume(code); - effects.exit(markerType); - effects.exit(type); - return ok - } - effects.enter(stringType); - return atBreak(code) - } - function atBreak(code) { - if (code === marker) { - effects.exit(stringType); - return begin(marker) - } - if (code === null) { - return nok(code) - } - if (markdownLineEnding(code)) { - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return factorySpace(effects, atBreak, 'linePrefix') - } - effects.enter('chunkString', { - contentType: 'string' - }); - return inside(code) - } - function inside(code) { - if (code === marker || code === null || markdownLineEnding(code)) { - effects.exit('chunkString'); - return atBreak(code) - } - effects.consume(code); - return code === 92 ? escape : inside - } - function escape(code) { - if (code === marker || code === 92) { - effects.consume(code); - return inside - } - return inside(code) - } -} - -function factoryWhitespace(effects, ok) { - let seen; - return start - function start(code) { - if (markdownLineEnding(code)) { - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - seen = true; - return start - } - if (markdownSpace(code)) { - return factorySpace( - effects, - start, - seen ? 'linePrefix' : 'lineSuffix' - )(code) - } - return ok(code) - } -} - -const definition$1 = { - name: 'definition', - tokenize: tokenizeDefinition -}; -const titleBefore = { - tokenize: tokenizeTitleBefore, - partial: true -}; -function tokenizeDefinition(effects, ok, nok) { - const self = this; - let identifier; - return start; - function start(code) { - effects.enter("definition"); - return before(code); - } - function before(code) { - return factoryLabel.call(self, effects, labelAfter, - nok, "definitionLabel", "definitionLabelMarker", "definitionLabelString")(code); - } - function labelAfter(code) { - identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1)); - if (code === 58) { - effects.enter("definitionMarker"); - effects.consume(code); - effects.exit("definitionMarker"); - return markerAfter; - } - return nok(code); - } - function markerAfter(code) { - return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, destinationBefore)(code) : destinationBefore(code); - } - function destinationBefore(code) { - return factoryDestination(effects, destinationAfter, - nok, "definitionDestination", "definitionDestinationLiteral", "definitionDestinationLiteralMarker", "definitionDestinationRaw", "definitionDestinationString")(code); - } - function destinationAfter(code) { - return effects.attempt(titleBefore, after, after)(code); - } - function after(code) { - return markdownSpace(code) ? factorySpace(effects, afterWhitespace, "whitespace")(code) : afterWhitespace(code); - } - function afterWhitespace(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("definition"); - self.parser.defined.push(identifier); - return ok(code); - } - return nok(code); - } -} -function tokenizeTitleBefore(effects, ok, nok) { - return titleBefore; - function titleBefore(code) { - return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, beforeMarker)(code) : nok(code); - } - function beforeMarker(code) { - return factoryTitle(effects, titleAfter, nok, "definitionTitle", "definitionTitleMarker", "definitionTitleString")(code); - } - function titleAfter(code) { - return markdownSpace(code) ? factorySpace(effects, titleAfterOptionalWhitespace, "whitespace")(code) : titleAfterOptionalWhitespace(code); - } - function titleAfterOptionalWhitespace(code) { - return code === null || markdownLineEnding(code) ? ok(code) : nok(code); - } -} - -const hardBreakEscape = { - name: 'hardBreakEscape', - tokenize: tokenizeHardBreakEscape -}; -function tokenizeHardBreakEscape(effects, ok, nok) { - return start; - function start(code) { - effects.enter("hardBreakEscape"); - effects.consume(code); - return after; - } - function after(code) { - if (markdownLineEnding(code)) { - effects.exit("hardBreakEscape"); - return ok(code); - } - return nok(code); - } -} - -const headingAtx = { - name: 'headingAtx', - tokenize: tokenizeHeadingAtx, - resolve: resolveHeadingAtx -}; -function resolveHeadingAtx(events, context) { - let contentEnd = events.length - 2; - let contentStart = 3; - let content; - let text; - if (events[contentStart][1].type === "whitespace") { - contentStart += 2; - } - if (contentEnd - 2 > contentStart && events[contentEnd][1].type === "whitespace") { - contentEnd -= 2; - } - if (events[contentEnd][1].type === "atxHeadingSequence" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === "whitespace")) { - contentEnd -= contentStart + 1 === contentEnd ? 2 : 4; - } - if (contentEnd > contentStart) { - content = { - type: "atxHeadingText", - start: events[contentStart][1].start, - end: events[contentEnd][1].end - }; - text = { - type: "chunkText", - start: events[contentStart][1].start, - end: events[contentEnd][1].end, - contentType: "text" - }; - splice(events, contentStart, contentEnd - contentStart + 1, [['enter', content, context], ['enter', text, context], ['exit', text, context], ['exit', content, context]]); - } - return events; -} -function tokenizeHeadingAtx(effects, ok, nok) { - let size = 0; - return start; - function start(code) { - effects.enter("atxHeading"); - return before(code); - } - function before(code) { - effects.enter("atxHeadingSequence"); - return sequenceOpen(code); - } - function sequenceOpen(code) { - if (code === 35 && size++ < 6) { - effects.consume(code); - return sequenceOpen; - } - if (code === null || markdownLineEndingOrSpace(code)) { - effects.exit("atxHeadingSequence"); - return atBreak(code); - } - return nok(code); - } - function atBreak(code) { - if (code === 35) { - effects.enter("atxHeadingSequence"); - return sequenceFurther(code); - } - if (code === null || markdownLineEnding(code)) { - effects.exit("atxHeading"); - return ok(code); - } - if (markdownSpace(code)) { - return factorySpace(effects, atBreak, "whitespace")(code); - } - effects.enter("atxHeadingText"); - return data(code); - } - function sequenceFurther(code) { - if (code === 35) { - effects.consume(code); - return sequenceFurther; - } - effects.exit("atxHeadingSequence"); - return atBreak(code); - } - function data(code) { - if (code === null || code === 35 || markdownLineEndingOrSpace(code)) { - effects.exit("atxHeadingText"); - return atBreak(code); - } - effects.consume(code); - return data; - } -} - -const htmlBlockNames = [ - 'address', - 'article', - 'aside', - 'base', - 'basefont', - 'blockquote', - 'body', - 'caption', - 'center', - 'col', - 'colgroup', - 'dd', - 'details', - 'dialog', - 'dir', - 'div', - 'dl', - 'dt', - 'fieldset', - 'figcaption', - 'figure', - 'footer', - 'form', - 'frame', - 'frameset', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'header', - 'hr', - 'html', - 'iframe', - 'legend', - 'li', - 'link', - 'main', - 'menu', - 'menuitem', - 'nav', - 'noframes', - 'ol', - 'optgroup', - 'option', - 'p', - 'param', - 'search', - 'section', - 'summary', - 'table', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'title', - 'tr', - 'track', - 'ul' -]; -const htmlRawNames = ['pre', 'script', 'style', 'textarea']; - -const htmlFlow = { - name: 'htmlFlow', - tokenize: tokenizeHtmlFlow, - resolveTo: resolveToHtmlFlow, - concrete: true -}; -const blankLineBefore = { - tokenize: tokenizeBlankLineBefore, - partial: true -}; -const nonLazyContinuationStart = { - tokenize: tokenizeNonLazyContinuationStart, - partial: true -}; -function resolveToHtmlFlow(events) { - let index = events.length; - while (index--) { - if (events[index][0] === 'enter' && events[index][1].type === "htmlFlow") { - break; - } - } - if (index > 1 && events[index - 2][1].type === "linePrefix") { - events[index][1].start = events[index - 2][1].start; - events[index + 1][1].start = events[index - 2][1].start; - events.splice(index - 2, 2); - } - return events; -} -function tokenizeHtmlFlow(effects, ok, nok) { - const self = this; - let marker; - let closingTag; - let buffer; - let index; - let markerB; - return start; - function start(code) { - return before(code); - } - function before(code) { - effects.enter("htmlFlow"); - effects.enter("htmlFlowData"); - effects.consume(code); - return open; - } - function open(code) { - if (code === 33) { - effects.consume(code); - return declarationOpen; - } - if (code === 47) { - effects.consume(code); - closingTag = true; - return tagCloseStart; - } - if (code === 63) { - effects.consume(code); - marker = 3; - return self.interrupt ? ok : continuationDeclarationInside; - } - if (asciiAlpha(code)) { - effects.consume(code); - buffer = String.fromCharCode(code); - return tagName; - } - return nok(code); - } - function declarationOpen(code) { - if (code === 45) { - effects.consume(code); - marker = 2; - return commentOpenInside; - } - if (code === 91) { - effects.consume(code); - marker = 5; - index = 0; - return cdataOpenInside; - } - if (asciiAlpha(code)) { - effects.consume(code); - marker = 4; - return self.interrupt ? ok : continuationDeclarationInside; - } - return nok(code); - } - function commentOpenInside(code) { - if (code === 45) { - effects.consume(code); - return self.interrupt ? ok : continuationDeclarationInside; - } - return nok(code); - } - function cdataOpenInside(code) { - const value = "CDATA["; - if (code === value.charCodeAt(index++)) { - effects.consume(code); - if (index === value.length) { - return self.interrupt ? ok : continuation; - } - return cdataOpenInside; - } - return nok(code); - } - function tagCloseStart(code) { - if (asciiAlpha(code)) { - effects.consume(code); - buffer = String.fromCharCode(code); - return tagName; - } - return nok(code); - } - function tagName(code) { - if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { - const slash = code === 47; - const name = buffer.toLowerCase(); - if (!slash && !closingTag && htmlRawNames.includes(name)) { - marker = 1; - return self.interrupt ? ok(code) : continuation(code); - } - if (htmlBlockNames.includes(buffer.toLowerCase())) { - marker = 6; - if (slash) { - effects.consume(code); - return basicSelfClosing; - } - return self.interrupt ? ok(code) : continuation(code); - } - marker = 7; - return self.interrupt && !self.parser.lazy[self.now().line] ? nok(code) : closingTag ? completeClosingTagAfter(code) : completeAttributeNameBefore(code); - } - if (code === 45 || asciiAlphanumeric(code)) { - effects.consume(code); - buffer += String.fromCharCode(code); - return tagName; - } - return nok(code); - } - function basicSelfClosing(code) { - if (code === 62) { - effects.consume(code); - return self.interrupt ? ok : continuation; - } - return nok(code); - } - function completeClosingTagAfter(code) { - if (markdownSpace(code)) { - effects.consume(code); - return completeClosingTagAfter; - } - return completeEnd(code); - } - function completeAttributeNameBefore(code) { - if (code === 47) { - effects.consume(code); - return completeEnd; - } - if (code === 58 || code === 95 || asciiAlpha(code)) { - effects.consume(code); - return completeAttributeName; - } - if (markdownSpace(code)) { - effects.consume(code); - return completeAttributeNameBefore; - } - return completeEnd(code); - } - function completeAttributeName(code) { - if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) { - effects.consume(code); - return completeAttributeName; - } - return completeAttributeNameAfter(code); - } - function completeAttributeNameAfter(code) { - if (code === 61) { - effects.consume(code); - return completeAttributeValueBefore; - } - if (markdownSpace(code)) { - effects.consume(code); - return completeAttributeNameAfter; - } - return completeAttributeNameBefore(code); - } - function completeAttributeValueBefore(code) { - if (code === null || code === 60 || code === 61 || code === 62 || code === 96) { - return nok(code); - } - if (code === 34 || code === 39) { - effects.consume(code); - markerB = code; - return completeAttributeValueQuoted; - } - if (markdownSpace(code)) { - effects.consume(code); - return completeAttributeValueBefore; - } - return completeAttributeValueUnquoted(code); - } - function completeAttributeValueQuoted(code) { - if (code === markerB) { - effects.consume(code); - markerB = null; - return completeAttributeValueQuotedAfter; - } - if (code === null || markdownLineEnding(code)) { - return nok(code); - } - effects.consume(code); - return completeAttributeValueQuoted; - } - function completeAttributeValueUnquoted(code) { - if (code === null || code === 34 || code === 39 || code === 47 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) { - return completeAttributeNameAfter(code); - } - effects.consume(code); - return completeAttributeValueUnquoted; - } - function completeAttributeValueQuotedAfter(code) { - if (code === 47 || code === 62 || markdownSpace(code)) { - return completeAttributeNameBefore(code); - } - return nok(code); - } - function completeEnd(code) { - if (code === 62) { - effects.consume(code); - return completeAfter; - } - return nok(code); - } - function completeAfter(code) { - if (code === null || markdownLineEnding(code)) { - return continuation(code); - } - if (markdownSpace(code)) { - effects.consume(code); - return completeAfter; - } - return nok(code); - } - function continuation(code) { - if (code === 45 && marker === 2) { - effects.consume(code); - return continuationCommentInside; - } - if (code === 60 && marker === 1) { - effects.consume(code); - return continuationRawTagOpen; - } - if (code === 62 && marker === 4) { - effects.consume(code); - return continuationClose; - } - if (code === 63 && marker === 3) { - effects.consume(code); - return continuationDeclarationInside; - } - if (code === 93 && marker === 5) { - effects.consume(code); - return continuationCdataInside; - } - if (markdownLineEnding(code) && (marker === 6 || marker === 7)) { - effects.exit("htmlFlowData"); - return effects.check(blankLineBefore, continuationAfter, continuationStart)(code); - } - if (code === null || markdownLineEnding(code)) { - effects.exit("htmlFlowData"); - return continuationStart(code); - } - effects.consume(code); - return continuation; - } - function continuationStart(code) { - return effects.check(nonLazyContinuationStart, continuationStartNonLazy, continuationAfter)(code); - } - function continuationStartNonLazy(code) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return continuationBefore; - } - function continuationBefore(code) { - if (code === null || markdownLineEnding(code)) { - return continuationStart(code); - } - effects.enter("htmlFlowData"); - return continuation(code); - } - function continuationCommentInside(code) { - if (code === 45) { - effects.consume(code); - return continuationDeclarationInside; - } - return continuation(code); - } - function continuationRawTagOpen(code) { - if (code === 47) { - effects.consume(code); - buffer = ''; - return continuationRawEndTag; - } - return continuation(code); - } - function continuationRawEndTag(code) { - if (code === 62) { - const name = buffer.toLowerCase(); - if (htmlRawNames.includes(name)) { - effects.consume(code); - return continuationClose; - } - return continuation(code); - } - if (asciiAlpha(code) && buffer.length < 8) { - effects.consume(code); - buffer += String.fromCharCode(code); - return continuationRawEndTag; - } - return continuation(code); - } - function continuationCdataInside(code) { - if (code === 93) { - effects.consume(code); - return continuationDeclarationInside; - } - return continuation(code); - } - function continuationDeclarationInside(code) { - if (code === 62) { - effects.consume(code); - return continuationClose; - } - if (code === 45 && marker === 2) { - effects.consume(code); - return continuationDeclarationInside; - } - return continuation(code); - } - function continuationClose(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("htmlFlowData"); - return continuationAfter(code); - } - effects.consume(code); - return continuationClose; - } - function continuationAfter(code) { - effects.exit("htmlFlow"); - return ok(code); - } -} -function tokenizeNonLazyContinuationStart(effects, ok, nok) { - const self = this; - return start; - function start(code) { - if (markdownLineEnding(code)) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return after; - } - return nok(code); - } - function after(code) { - return self.parser.lazy[self.now().line] ? nok(code) : ok(code); - } -} -function tokenizeBlankLineBefore(effects, ok, nok) { - return start; - function start(code) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return effects.attempt(blankLine, ok, nok); - } -} - -const htmlText = { - name: 'htmlText', - tokenize: tokenizeHtmlText -}; -function tokenizeHtmlText(effects, ok, nok) { - const self = this; - let marker; - let index; - let returnState; - return start; - function start(code) { - effects.enter("htmlText"); - effects.enter("htmlTextData"); - effects.consume(code); - return open; - } - function open(code) { - if (code === 33) { - effects.consume(code); - return declarationOpen; - } - if (code === 47) { - effects.consume(code); - return tagCloseStart; - } - if (code === 63) { - effects.consume(code); - return instruction; - } - if (asciiAlpha(code)) { - effects.consume(code); - return tagOpen; - } - return nok(code); - } - function declarationOpen(code) { - if (code === 45) { - effects.consume(code); - return commentOpenInside; - } - if (code === 91) { - effects.consume(code); - index = 0; - return cdataOpenInside; - } - if (asciiAlpha(code)) { - effects.consume(code); - return declaration; - } - return nok(code); - } - function commentOpenInside(code) { - if (code === 45) { - effects.consume(code); - return commentEnd; - } - return nok(code); - } - function comment(code) { - if (code === null) { - return nok(code); - } - if (code === 45) { - effects.consume(code); - return commentClose; - } - if (markdownLineEnding(code)) { - returnState = comment; - return lineEndingBefore(code); - } - effects.consume(code); - return comment; - } - function commentClose(code) { - if (code === 45) { - effects.consume(code); - return commentEnd; - } - return comment(code); - } - function commentEnd(code) { - return code === 62 ? end(code) : code === 45 ? commentClose(code) : comment(code); - } - function cdataOpenInside(code) { - const value = "CDATA["; - if (code === value.charCodeAt(index++)) { - effects.consume(code); - return index === value.length ? cdata : cdataOpenInside; - } - return nok(code); - } - function cdata(code) { - if (code === null) { - return nok(code); - } - if (code === 93) { - effects.consume(code); - return cdataClose; - } - if (markdownLineEnding(code)) { - returnState = cdata; - return lineEndingBefore(code); - } - effects.consume(code); - return cdata; - } - function cdataClose(code) { - if (code === 93) { - effects.consume(code); - return cdataEnd; - } - return cdata(code); - } - function cdataEnd(code) { - if (code === 62) { - return end(code); - } - if (code === 93) { - effects.consume(code); - return cdataEnd; - } - return cdata(code); - } - function declaration(code) { - if (code === null || code === 62) { - return end(code); - } - if (markdownLineEnding(code)) { - returnState = declaration; - return lineEndingBefore(code); - } - effects.consume(code); - return declaration; - } - function instruction(code) { - if (code === null) { - return nok(code); - } - if (code === 63) { - effects.consume(code); - return instructionClose; - } - if (markdownLineEnding(code)) { - returnState = instruction; - return lineEndingBefore(code); - } - effects.consume(code); - return instruction; - } - function instructionClose(code) { - return code === 62 ? end(code) : instruction(code); - } - function tagCloseStart(code) { - if (asciiAlpha(code)) { - effects.consume(code); - return tagClose; - } - return nok(code); - } - function tagClose(code) { - if (code === 45 || asciiAlphanumeric(code)) { - effects.consume(code); - return tagClose; - } - return tagCloseBetween(code); - } - function tagCloseBetween(code) { - if (markdownLineEnding(code)) { - returnState = tagCloseBetween; - return lineEndingBefore(code); - } - if (markdownSpace(code)) { - effects.consume(code); - return tagCloseBetween; - } - return end(code); - } - function tagOpen(code) { - if (code === 45 || asciiAlphanumeric(code)) { - effects.consume(code); - return tagOpen; - } - if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { - return tagOpenBetween(code); - } - return nok(code); - } - function tagOpenBetween(code) { - if (code === 47) { - effects.consume(code); - return end; - } - if (code === 58 || code === 95 || asciiAlpha(code)) { - effects.consume(code); - return tagOpenAttributeName; - } - if (markdownLineEnding(code)) { - returnState = tagOpenBetween; - return lineEndingBefore(code); - } - if (markdownSpace(code)) { - effects.consume(code); - return tagOpenBetween; - } - return end(code); - } - function tagOpenAttributeName(code) { - if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) { - effects.consume(code); - return tagOpenAttributeName; - } - return tagOpenAttributeNameAfter(code); - } - function tagOpenAttributeNameAfter(code) { - if (code === 61) { - effects.consume(code); - return tagOpenAttributeValueBefore; - } - if (markdownLineEnding(code)) { - returnState = tagOpenAttributeNameAfter; - return lineEndingBefore(code); - } - if (markdownSpace(code)) { - effects.consume(code); - return tagOpenAttributeNameAfter; - } - return tagOpenBetween(code); - } - function tagOpenAttributeValueBefore(code) { - if (code === null || code === 60 || code === 61 || code === 62 || code === 96) { - return nok(code); - } - if (code === 34 || code === 39) { - effects.consume(code); - marker = code; - return tagOpenAttributeValueQuoted; - } - if (markdownLineEnding(code)) { - returnState = tagOpenAttributeValueBefore; - return lineEndingBefore(code); - } - if (markdownSpace(code)) { - effects.consume(code); - return tagOpenAttributeValueBefore; - } - effects.consume(code); - return tagOpenAttributeValueUnquoted; - } - function tagOpenAttributeValueQuoted(code) { - if (code === marker) { - effects.consume(code); - marker = undefined; - return tagOpenAttributeValueQuotedAfter; - } - if (code === null) { - return nok(code); - } - if (markdownLineEnding(code)) { - returnState = tagOpenAttributeValueQuoted; - return lineEndingBefore(code); - } - effects.consume(code); - return tagOpenAttributeValueQuoted; - } - function tagOpenAttributeValueUnquoted(code) { - if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) { - return nok(code); - } - if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { - return tagOpenBetween(code); - } - effects.consume(code); - return tagOpenAttributeValueUnquoted; - } - function tagOpenAttributeValueQuotedAfter(code) { - if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { - return tagOpenBetween(code); - } - return nok(code); - } - function end(code) { - if (code === 62) { - effects.consume(code); - effects.exit("htmlTextData"); - effects.exit("htmlText"); - return ok; - } - return nok(code); - } - function lineEndingBefore(code) { - effects.exit("htmlTextData"); - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return lineEndingAfter; - } - function lineEndingAfter(code) { - return markdownSpace(code) ? factorySpace(effects, lineEndingAfterPrefix, "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : lineEndingAfterPrefix(code); - } - function lineEndingAfterPrefix(code) { - effects.enter("htmlTextData"); - return returnState(code); - } -} - -const labelEnd = { - name: 'labelEnd', - tokenize: tokenizeLabelEnd, - resolveTo: resolveToLabelEnd, - resolveAll: resolveAllLabelEnd -}; -const resourceConstruct = { - tokenize: tokenizeResource -}; -const referenceFullConstruct = { - tokenize: tokenizeReferenceFull -}; -const referenceCollapsedConstruct = { - tokenize: tokenizeReferenceCollapsed -}; -function resolveAllLabelEnd(events) { - let index = -1; - while (++index < events.length) { - const token = events[index][1]; - if (token.type === "labelImage" || token.type === "labelLink" || token.type === "labelEnd") { - events.splice(index + 1, token.type === "labelImage" ? 4 : 2); - token.type = "data"; - index++; - } - } - return events; -} -function resolveToLabelEnd(events, context) { - let index = events.length; - let offset = 0; - let token; - let open; - let close; - let media; - while (index--) { - token = events[index][1]; - if (open) { - if (token.type === "link" || token.type === "labelLink" && token._inactive) { - break; - } - if (events[index][0] === 'enter' && token.type === "labelLink") { - token._inactive = true; - } - } else if (close) { - if (events[index][0] === 'enter' && (token.type === "labelImage" || token.type === "labelLink") && !token._balanced) { - open = index; - if (token.type !== "labelLink") { - offset = 2; - break; - } - } - } else if (token.type === "labelEnd") { - close = index; - } - } - const group = { - type: events[open][1].type === "labelLink" ? "link" : "image", - start: Object.assign({}, events[open][1].start), - end: Object.assign({}, events[events.length - 1][1].end) - }; - const label = { - type: "label", - start: Object.assign({}, events[open][1].start), - end: Object.assign({}, events[close][1].end) - }; - const text = { - type: "labelText", - start: Object.assign({}, events[open + offset + 2][1].end), - end: Object.assign({}, events[close - 2][1].start) - }; - media = [['enter', group, context], ['enter', label, context]]; - media = push(media, events.slice(open + 1, open + offset + 3)); - media = push(media, [['enter', text, context]]); - media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context)); - media = push(media, [['exit', text, context], events[close - 2], events[close - 1], ['exit', label, context]]); - media = push(media, events.slice(close + 1)); - media = push(media, [['exit', group, context]]); - splice(events, open, events.length, media); - return events; -} -function tokenizeLabelEnd(effects, ok, nok) { - const self = this; - let index = self.events.length; - let labelStart; - let defined; - while (index--) { - if ((self.events[index][1].type === "labelImage" || self.events[index][1].type === "labelLink") && !self.events[index][1]._balanced) { - labelStart = self.events[index][1]; - break; - } - } - return start; - function start(code) { - if (!labelStart) { - return nok(code); - } - if (labelStart._inactive) { - return labelEndNok(code); - } - defined = self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize({ - start: labelStart.end, - end: self.now() - }))); - effects.enter("labelEnd"); - effects.enter("labelMarker"); - effects.consume(code); - effects.exit("labelMarker"); - effects.exit("labelEnd"); - return after; - } - function after(code) { - if (code === 40) { - return effects.attempt(resourceConstruct, labelEndOk, defined ? labelEndOk : labelEndNok)(code); - } - if (code === 91) { - return effects.attempt(referenceFullConstruct, labelEndOk, defined ? referenceNotFull : labelEndNok)(code); - } - return defined ? labelEndOk(code) : labelEndNok(code); - } - function referenceNotFull(code) { - return effects.attempt(referenceCollapsedConstruct, labelEndOk, labelEndNok)(code); - } - function labelEndOk(code) { - return ok(code); - } - function labelEndNok(code) { - labelStart._balanced = true; - return nok(code); - } -} -function tokenizeResource(effects, ok, nok) { - return resourceStart; - function resourceStart(code) { - effects.enter("resource"); - effects.enter("resourceMarker"); - effects.consume(code); - effects.exit("resourceMarker"); - return resourceBefore; - } - function resourceBefore(code) { - return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceOpen)(code) : resourceOpen(code); - } - function resourceOpen(code) { - if (code === 41) { - return resourceEnd(code); - } - return factoryDestination(effects, resourceDestinationAfter, resourceDestinationMissing, "resourceDestination", "resourceDestinationLiteral", "resourceDestinationLiteralMarker", "resourceDestinationRaw", "resourceDestinationString", 32)(code); - } - function resourceDestinationAfter(code) { - return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceBetween)(code) : resourceEnd(code); - } - function resourceDestinationMissing(code) { - return nok(code); - } - function resourceBetween(code) { - if (code === 34 || code === 39 || code === 40) { - return factoryTitle(effects, resourceTitleAfter, nok, "resourceTitle", "resourceTitleMarker", "resourceTitleString")(code); - } - return resourceEnd(code); - } - function resourceTitleAfter(code) { - return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceEnd)(code) : resourceEnd(code); - } - function resourceEnd(code) { - if (code === 41) { - effects.enter("resourceMarker"); - effects.consume(code); - effects.exit("resourceMarker"); - effects.exit("resource"); - return ok; - } - return nok(code); - } -} -function tokenizeReferenceFull(effects, ok, nok) { - const self = this; - return referenceFull; - function referenceFull(code) { - return factoryLabel.call(self, effects, referenceFullAfter, referenceFullMissing, "reference", "referenceMarker", "referenceString")(code); - } - function referenceFullAfter(code) { - return self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) ? ok(code) : nok(code); - } - function referenceFullMissing(code) { - return nok(code); - } -} -function tokenizeReferenceCollapsed(effects, ok, nok) { - return referenceCollapsedStart; - function referenceCollapsedStart(code) { - effects.enter("reference"); - effects.enter("referenceMarker"); - effects.consume(code); - effects.exit("referenceMarker"); - return referenceCollapsedOpen; - } - function referenceCollapsedOpen(code) { - if (code === 93) { - effects.enter("referenceMarker"); - effects.consume(code); - effects.exit("referenceMarker"); - effects.exit("reference"); - return ok; - } - return nok(code); - } -} - -const labelStartImage = { - name: 'labelStartImage', - tokenize: tokenizeLabelStartImage, - resolveAll: labelEnd.resolveAll -}; -function tokenizeLabelStartImage(effects, ok, nok) { - const self = this; - return start; - function start(code) { - effects.enter("labelImage"); - effects.enter("labelImageMarker"); - effects.consume(code); - effects.exit("labelImageMarker"); - return open; - } - function open(code) { - if (code === 91) { - effects.enter("labelMarker"); - effects.consume(code); - effects.exit("labelMarker"); - effects.exit("labelImage"); - return after; - } - return nok(code); - } - function after(code) { - return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code); - } -} - -const labelStartLink = { - name: 'labelStartLink', - tokenize: tokenizeLabelStartLink, - resolveAll: labelEnd.resolveAll -}; -function tokenizeLabelStartLink(effects, ok, nok) { - const self = this; - return start; - function start(code) { - effects.enter("labelLink"); - effects.enter("labelMarker"); - effects.consume(code); - effects.exit("labelMarker"); - effects.exit("labelLink"); - return after; - } - function after(code) { - return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code); - } -} - -const lineEnding = { - name: 'lineEnding', - tokenize: tokenizeLineEnding -}; -function tokenizeLineEnding(effects, ok) { - return start; - function start(code) { - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return factorySpace(effects, ok, "linePrefix"); - } -} - -const thematicBreak$1 = { - name: 'thematicBreak', - tokenize: tokenizeThematicBreak -}; -function tokenizeThematicBreak(effects, ok, nok) { - let size = 0; - let marker; - return start; - function start(code) { - effects.enter("thematicBreak"); - return before(code); - } - function before(code) { - marker = code; - return atBreak(code); - } - function atBreak(code) { - if (code === marker) { - effects.enter("thematicBreakSequence"); - return sequence(code); - } - if (size >= 3 && (code === null || markdownLineEnding(code))) { - effects.exit("thematicBreak"); - return ok(code); - } - return nok(code); - } - function sequence(code) { - if (code === marker) { - effects.consume(code); - size++; - return sequence; - } - effects.exit("thematicBreakSequence"); - return markdownSpace(code) ? factorySpace(effects, atBreak, "whitespace")(code) : atBreak(code); - } -} - -const list$2 = { - name: 'list', - tokenize: tokenizeListStart, - continuation: { - tokenize: tokenizeListContinuation - }, - exit: tokenizeListEnd -}; -const listItemPrefixWhitespaceConstruct = { - tokenize: tokenizeListItemPrefixWhitespace, - partial: true -}; -const indentConstruct = { - tokenize: tokenizeIndent$1, - partial: true -}; -function tokenizeListStart(effects, ok, nok) { - const self = this; - const tail = self.events[self.events.length - 1]; - let initialSize = tail && tail[1].type === "linePrefix" ? tail[2].sliceSerialize(tail[1], true).length : 0; - let size = 0; - return start; - function start(code) { - const kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? "listUnordered" : "listOrdered"); - if (kind === "listUnordered" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) { - if (!self.containerState.type) { - self.containerState.type = kind; - effects.enter(kind, { - _container: true - }); - } - if (kind === "listUnordered") { - effects.enter("listItemPrefix"); - return code === 42 || code === 45 ? effects.check(thematicBreak$1, nok, atMarker)(code) : atMarker(code); - } - if (!self.interrupt || code === 49) { - effects.enter("listItemPrefix"); - effects.enter("listItemValue"); - return inside(code); - } - } - return nok(code); - } - function inside(code) { - if (asciiDigit(code) && ++size < 10) { - effects.consume(code); - return inside; - } - if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) { - effects.exit("listItemValue"); - return atMarker(code); - } - return nok(code); - } - function atMarker(code) { - effects.enter("listItemMarker"); - effects.consume(code); - effects.exit("listItemMarker"); - self.containerState.marker = self.containerState.marker || code; - return effects.check(blankLine, - self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix)); - } - function onBlank(code) { - self.containerState.initialBlankLine = true; - initialSize++; - return endOfPrefix(code); - } - function otherPrefix(code) { - if (markdownSpace(code)) { - effects.enter("listItemPrefixWhitespace"); - effects.consume(code); - effects.exit("listItemPrefixWhitespace"); - return endOfPrefix; - } - return nok(code); - } - function endOfPrefix(code) { - self.containerState.size = initialSize + self.sliceSerialize(effects.exit("listItemPrefix"), true).length; - return ok(code); - } -} -function tokenizeListContinuation(effects, ok, nok) { - const self = this; - self.containerState._closeFlow = undefined; - return effects.check(blankLine, onBlank, notBlank); - function onBlank(code) { - self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine; - return factorySpace(effects, ok, "listItemIndent", self.containerState.size + 1)(code); - } - function notBlank(code) { - if (self.containerState.furtherBlankLines || !markdownSpace(code)) { - self.containerState.furtherBlankLines = undefined; - self.containerState.initialBlankLine = undefined; - return notInCurrentItem(code); - } - self.containerState.furtherBlankLines = undefined; - self.containerState.initialBlankLine = undefined; - return effects.attempt(indentConstruct, ok, notInCurrentItem)(code); - } - function notInCurrentItem(code) { - self.containerState._closeFlow = true; - self.interrupt = undefined; - return factorySpace(effects, effects.attempt(list$2, ok, nok), "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code); - } -} -function tokenizeIndent$1(effects, ok, nok) { - const self = this; - return factorySpace(effects, afterPrefix, "listItemIndent", self.containerState.size + 1); - function afterPrefix(code) { - const tail = self.events[self.events.length - 1]; - return tail && tail[1].type === "listItemIndent" && tail[2].sliceSerialize(tail[1], true).length === self.containerState.size ? ok(code) : nok(code); - } -} -function tokenizeListEnd(effects) { - effects.exit(this.containerState.type); -} -function tokenizeListItemPrefixWhitespace(effects, ok, nok) { - const self = this; - return factorySpace(effects, afterPrefix, "listItemPrefixWhitespace", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4 + 1); - function afterPrefix(code) { - const tail = self.events[self.events.length - 1]; - return !markdownSpace(code) && tail && tail[1].type === "listItemPrefixWhitespace" ? ok(code) : nok(code); - } -} - -const setextUnderline = { - name: 'setextUnderline', - tokenize: tokenizeSetextUnderline, - resolveTo: resolveToSetextUnderline -}; -function resolveToSetextUnderline(events, context) { - let index = events.length; - let content; - let text; - let definition; - while (index--) { - if (events[index][0] === 'enter') { - if (events[index][1].type === "content") { - content = index; - break; - } - if (events[index][1].type === "paragraph") { - text = index; - } - } - else { - if (events[index][1].type === "content") { - events.splice(index, 1); - } - if (!definition && events[index][1].type === "definition") { - definition = index; - } - } - } - const heading = { - type: "setextHeading", - start: Object.assign({}, events[text][1].start), - end: Object.assign({}, events[events.length - 1][1].end) - }; - events[text][1].type = "setextHeadingText"; - if (definition) { - events.splice(text, 0, ['enter', heading, context]); - events.splice(definition + 1, 0, ['exit', events[content][1], context]); - events[content][1].end = Object.assign({}, events[definition][1].end); - } else { - events[content][1] = heading; - } - events.push(['exit', heading, context]); - return events; -} -function tokenizeSetextUnderline(effects, ok, nok) { - const self = this; - let marker; - return start; - function start(code) { - let index = self.events.length; - let paragraph; - while (index--) { - if (self.events[index][1].type !== "lineEnding" && self.events[index][1].type !== "linePrefix" && self.events[index][1].type !== "content") { - paragraph = self.events[index][1].type === "paragraph"; - break; - } - } - if (!self.parser.lazy[self.now().line] && (self.interrupt || paragraph)) { - effects.enter("setextHeadingLine"); - marker = code; - return before(code); - } - return nok(code); - } - function before(code) { - effects.enter("setextHeadingLineSequence"); - return inside(code); - } - function inside(code) { - if (code === marker) { - effects.consume(code); - return inside; - } - effects.exit("setextHeadingLineSequence"); - return markdownSpace(code) ? factorySpace(effects, after, "lineSuffix")(code) : after(code); - } - function after(code) { - if (code === null || markdownLineEnding(code)) { - effects.exit("setextHeadingLine"); - return ok(code); - } - return nok(code); - } -} - -const flow$1 = { - tokenize: initializeFlow -}; -function initializeFlow(effects) { - const self = this; - const initial = effects.attempt( - blankLine, - atBlankEnding, - effects.attempt( - this.parser.constructs.flowInitial, - afterConstruct, - factorySpace( - effects, - effects.attempt( - this.parser.constructs.flow, - afterConstruct, - effects.attempt(content, afterConstruct) - ), - 'linePrefix' - ) - ) - ); - return initial - function atBlankEnding(code) { - if (code === null) { - effects.consume(code); - return - } - effects.enter('lineEndingBlank'); - effects.consume(code); - effects.exit('lineEndingBlank'); - self.currentConstruct = undefined; - return initial - } - function afterConstruct(code) { - if (code === null) { - effects.consume(code); - return - } - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - self.currentConstruct = undefined; - return initial - } -} - -const resolver = { - resolveAll: createResolver() -}; -const string$1 = initializeFactory('string'); -const text$3 = initializeFactory('text'); -function initializeFactory(field) { - return { - tokenize: initializeText, - resolveAll: createResolver( - field === 'text' ? resolveAllLineSuffixes : undefined - ) - } - function initializeText(effects) { - const self = this; - const constructs = this.parser.constructs[field]; - const text = effects.attempt(constructs, start, notText); - return start - function start(code) { - return atBreak(code) ? text(code) : notText(code) - } - function notText(code) { - if (code === null) { - effects.consume(code); - return - } - effects.enter('data'); - effects.consume(code); - return data - } - function data(code) { - if (atBreak(code)) { - effects.exit('data'); - return text(code) - } - effects.consume(code); - return data - } - function atBreak(code) { - if (code === null) { - return true - } - const list = constructs[code]; - let index = -1; - if (list) { - while (++index < list.length) { - const item = list[index]; - if (!item.previous || item.previous.call(self, self.previous)) { - return true - } - } - } - return false - } - } -} -function createResolver(extraResolver) { - return resolveAllText - function resolveAllText(events, context) { - let index = -1; - let enter; - while (++index <= events.length) { - if (enter === undefined) { - if (events[index] && events[index][1].type === 'data') { - enter = index; - index++; - } - } else if (!events[index] || events[index][1].type !== 'data') { - if (index !== enter + 2) { - events[enter][1].end = events[index - 1][1].end; - events.splice(enter + 2, index - enter - 2); - index = enter + 2; - } - enter = undefined; - } - } - return extraResolver ? extraResolver(events, context) : events - } -} -function resolveAllLineSuffixes(events, context) { - let eventIndex = 0; - while (++eventIndex <= events.length) { - if ( - (eventIndex === events.length || - events[eventIndex][1].type === 'lineEnding') && - events[eventIndex - 1][1].type === 'data' - ) { - const data = events[eventIndex - 1][1]; - const chunks = context.sliceStream(data); - let index = chunks.length; - let bufferIndex = -1; - let size = 0; - let tabs; - while (index--) { - const chunk = chunks[index]; - if (typeof chunk === 'string') { - bufferIndex = chunk.length; - while (chunk.charCodeAt(bufferIndex - 1) === 32) { - size++; - bufferIndex--; - } - if (bufferIndex) break - bufferIndex = -1; - } - else if (chunk === -2) { - tabs = true; - size++; - } else if (chunk === -1) ; else { - index++; - break - } - } - if (size) { - const token = { - type: - eventIndex === events.length || tabs || size < 2 - ? 'lineSuffix' - : 'hardBreakTrailing', - start: { - line: data.end.line, - column: data.end.column - size, - offset: data.end.offset - size, - _index: data.start._index + index, - _bufferIndex: index - ? bufferIndex - : data.start._bufferIndex + bufferIndex - }, - end: Object.assign({}, data.end) - }; - data.end = Object.assign({}, token.start); - if (data.start.offset === data.end.offset) { - Object.assign(data, token); - } else { - events.splice( - eventIndex, - 0, - ['enter', token, context], - ['exit', token, context] - ); - eventIndex += 2; - } - } - eventIndex++; - } - } - return events -} - -function createTokenizer(parser, initialize, from) { - let point = Object.assign( - from - ? Object.assign({}, from) - : { - line: 1, - column: 1, - offset: 0 - }, - { - _index: 0, - _bufferIndex: -1 - } - ); - const columnStart = {}; - const resolveAllConstructs = []; - let chunks = []; - let stack = []; - const effects = { - consume, - enter, - exit, - attempt: constructFactory(onsuccessfulconstruct), - check: constructFactory(onsuccessfulcheck), - interrupt: constructFactory(onsuccessfulcheck, { - interrupt: true - }) - }; - const context = { - previous: null, - code: null, - containerState: {}, - events: [], - parser, - sliceStream, - sliceSerialize, - now, - defineSkip, - write - }; - let state = initialize.tokenize.call(context, effects); - if (initialize.resolveAll) { - resolveAllConstructs.push(initialize); - } - return context - function write(slice) { - chunks = push(chunks, slice); - main(); - if (chunks[chunks.length - 1] !== null) { - return [] - } - addResult(initialize, 0); - context.events = resolveAll(resolveAllConstructs, context.events, context); - return context.events - } - function sliceSerialize(token, expandTabs) { - return serializeChunks(sliceStream(token), expandTabs) - } - function sliceStream(token) { - return sliceChunks(chunks, token) - } - function now() { - const {line, column, offset, _index, _bufferIndex} = point; - return { - line, - column, - offset, - _index, - _bufferIndex - } - } - function defineSkip(value) { - columnStart[value.line] = value.column; - accountForPotentialSkip(); - } - function main() { - let chunkIndex; - while (point._index < chunks.length) { - const chunk = chunks[point._index]; - if (typeof chunk === 'string') { - chunkIndex = point._index; - if (point._bufferIndex < 0) { - point._bufferIndex = 0; - } - while ( - point._index === chunkIndex && - point._bufferIndex < chunk.length - ) { - go(chunk.charCodeAt(point._bufferIndex)); - } - } else { - go(chunk); - } - } - } - function go(code) { - state = state(code); - } - function consume(code) { - if (markdownLineEnding(code)) { - point.line++; - point.column = 1; - point.offset += code === -3 ? 2 : 1; - accountForPotentialSkip(); - } else if (code !== -1) { - point.column++; - point.offset++; - } - if (point._bufferIndex < 0) { - point._index++; - } else { - point._bufferIndex++; - if (point._bufferIndex === chunks[point._index].length) { - point._bufferIndex = -1; - point._index++; - } - } - context.previous = code; - } - function enter(type, fields) { - const token = fields || {}; - token.type = type; - token.start = now(); - context.events.push(['enter', token, context]); - stack.push(token); - return token - } - function exit(type) { - const token = stack.pop(); - token.end = now(); - context.events.push(['exit', token, context]); - return token - } - function onsuccessfulconstruct(construct, info) { - addResult(construct, info.from); - } - function onsuccessfulcheck(_, info) { - info.restore(); - } - function constructFactory(onreturn, fields) { - return hook - function hook(constructs, returnState, bogusState) { - let listOfConstructs; - let constructIndex; - let currentConstruct; - let info; - return Array.isArray(constructs) - ? handleListOfConstructs(constructs) - : 'tokenize' in constructs - ? - handleListOfConstructs([constructs]) - : handleMapOfConstructs(constructs) - function handleMapOfConstructs(map) { - return start - function start(code) { - const def = code !== null && map[code]; - const all = code !== null && map.null; - const list = [ - ...(Array.isArray(def) ? def : def ? [def] : []), - ...(Array.isArray(all) ? all : all ? [all] : []) - ]; - return handleListOfConstructs(list)(code) - } - } - function handleListOfConstructs(list) { - listOfConstructs = list; - constructIndex = 0; - if (list.length === 0) { - return bogusState - } - return handleConstruct(list[constructIndex]) - } - function handleConstruct(construct) { - return start - function start(code) { - info = store(); - currentConstruct = construct; - if (!construct.partial) { - context.currentConstruct = construct; - } - if ( - construct.name && - context.parser.constructs.disable.null.includes(construct.name) - ) { - return nok() - } - return construct.tokenize.call( - fields ? Object.assign(Object.create(context), fields) : context, - effects, - ok, - nok - )(code) - } - } - function ok(code) { - onreturn(currentConstruct, info); - return returnState - } - function nok(code) { - info.restore(); - if (++constructIndex < listOfConstructs.length) { - return handleConstruct(listOfConstructs[constructIndex]) - } - return bogusState - } - } - } - function addResult(construct, from) { - if (construct.resolveAll && !resolveAllConstructs.includes(construct)) { - resolveAllConstructs.push(construct); - } - if (construct.resolve) { - splice( - context.events, - from, - context.events.length - from, - construct.resolve(context.events.slice(from), context) - ); - } - if (construct.resolveTo) { - context.events = construct.resolveTo(context.events, context); - } - } - function store() { - const startPoint = now(); - const startPrevious = context.previous; - const startCurrentConstruct = context.currentConstruct; - const startEventsIndex = context.events.length; - const startStack = Array.from(stack); - return { - restore, - from: startEventsIndex - } - function restore() { - point = startPoint; - context.previous = startPrevious; - context.currentConstruct = startCurrentConstruct; - context.events.length = startEventsIndex; - stack = startStack; - accountForPotentialSkip(); - } - } - function accountForPotentialSkip() { - if (point.line in columnStart && point.column < 2) { - point.column = columnStart[point.line]; - point.offset += columnStart[point.line] - 1; - } - } -} -function sliceChunks(chunks, token) { - const startIndex = token.start._index; - const startBufferIndex = token.start._bufferIndex; - const endIndex = token.end._index; - const endBufferIndex = token.end._bufferIndex; - let view; - if (startIndex === endIndex) { - view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)]; - } else { - view = chunks.slice(startIndex, endIndex); - if (startBufferIndex > -1) { - const head = view[0]; - if (typeof head === 'string') { - view[0] = head.slice(startBufferIndex); - } else { - view.shift(); - } - } - if (endBufferIndex > 0) { - view.push(chunks[endIndex].slice(0, endBufferIndex)); - } - } - return view -} -function serializeChunks(chunks, expandTabs) { - let index = -1; - const result = []; - let atTab; - while (++index < chunks.length) { - const chunk = chunks[index]; - let value; - if (typeof chunk === 'string') { - value = chunk; - } else - switch (chunk) { - case -5: { - value = '\r'; - break - } - case -4: { - value = '\n'; - break - } - case -3: { - value = '\r' + '\n'; - break - } - case -2: { - value = expandTabs ? ' ' : '\t'; - break - } - case -1: { - if (!expandTabs && atTab) continue - value = ' '; - break - } - default: { - value = String.fromCharCode(chunk); - } - } - atTab = chunk === -2; - result.push(value); - } - return result.join('') -} - -const document = { - [42]: list$2, - [43]: list$2, - [45]: list$2, - [48]: list$2, - [49]: list$2, - [50]: list$2, - [51]: list$2, - [52]: list$2, - [53]: list$2, - [54]: list$2, - [55]: list$2, - [56]: list$2, - [57]: list$2, - [62]: blockQuote -}; -const contentInitial = { - [91]: definition$1 -}; -const flowInitial = { - [-2]: codeIndented, - [-1]: codeIndented, - [32]: codeIndented -}; -const flow = { - [35]: headingAtx, - [42]: thematicBreak$1, - [45]: [setextUnderline, thematicBreak$1], - [60]: htmlFlow, - [61]: setextUnderline, - [95]: thematicBreak$1, - [96]: codeFenced, - [126]: codeFenced -}; -const string = { - [38]: characterReference, - [92]: characterEscape -}; -const text$2 = { - [-5]: lineEnding, - [-4]: lineEnding, - [-3]: lineEnding, - [33]: labelStartImage, - [38]: characterReference, - [42]: attention, - [60]: [autolink, htmlText], - [91]: labelStartLink, - [92]: [hardBreakEscape, characterEscape], - [93]: labelEnd, - [95]: attention, - [96]: codeText -}; -const insideSpan = { - null: [attention, resolver] -}; -const attentionMarkers = { - null: [42, 95] -}; -const disable = { - null: [] -}; - -var defaultConstructs = /*#__PURE__*/Object.freeze({ - __proto__: null, - attentionMarkers: attentionMarkers, - contentInitial: contentInitial, - disable: disable, - document: document, - flow: flow, - flowInitial: flowInitial, - insideSpan: insideSpan, - string: string, - text: text$2 -}); - -function parse$1(options) { - const settings = options || {}; - const constructs = - combineExtensions([defaultConstructs, ...(settings.extensions || [])]); - const parser = { - defined: [], - lazy: {}, - constructs, - content: create(content$1), - document: create(document$1), - flow: create(flow$1), - string: create(string$1), - text: create(text$3) - }; - return parser - function create(initial) { - return creator - function creator(from) { - return createTokenizer(parser, initial, from) - } - } -} - -function postprocess(events) { - while (!subtokenize(events)) { - } - return events -} - -const search = /[\0\t\n\r]/g; -function preprocess() { - let column = 1; - let buffer = ''; - let start = true; - let atCarriageReturn; - return preprocessor - function preprocessor(value, encoding, end) { - const chunks = []; - let match; - let next; - let startPosition; - let endPosition; - let code; - value = - buffer + - (typeof value === 'string' - ? value.toString() - : new TextDecoder(encoding || undefined).decode(value)); - startPosition = 0; - buffer = ''; - if (start) { - if (value.charCodeAt(0) === 65279) { - startPosition++; - } - start = undefined; - } - while (startPosition < value.length) { - search.lastIndex = startPosition; - match = search.exec(value); - endPosition = - match && match.index !== undefined ? match.index : value.length; - code = value.charCodeAt(endPosition); - if (!match) { - buffer = value.slice(startPosition); - break - } - if (code === 10 && startPosition === endPosition && atCarriageReturn) { - chunks.push(-3); - atCarriageReturn = undefined; - } else { - if (atCarriageReturn) { - chunks.push(-5); - atCarriageReturn = undefined; - } - if (startPosition < endPosition) { - chunks.push(value.slice(startPosition, endPosition)); - column += endPosition - startPosition; - } - switch (code) { - case 0: { - chunks.push(65533); - column++; - break - } - case 9: { - next = Math.ceil(column / 4) * 4; - chunks.push(-2); - while (column++ < next) chunks.push(-1); - break - } - case 10: { - chunks.push(-4); - column = 1; - break - } - default: { - atCarriageReturn = true; - column = 1; - } - } - } - startPosition = endPosition + 1; - } - if (end) { - if (atCarriageReturn) chunks.push(-5); - if (buffer) chunks.push(buffer); - chunks.push(null); - } - return chunks - } -} - -const characterEscapeOrReference = - /\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi; -function decodeString(value) { - return value.replace(characterEscapeOrReference, decode) -} -function decode($0, $1, $2) { - if ($1) { - return $1 - } - const head = $2.charCodeAt(0); - if (head === 35) { - const head = $2.charCodeAt(1); - const hex = head === 120 || head === 88; - return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10) - } - return decodeNamedCharacterReference($2) || $0 -} - -const own$3 = {}.hasOwnProperty; -function fromMarkdown(value, encoding, options) { - if (typeof encoding !== 'string') { - options = encoding; - encoding = undefined; - } - return compiler(options)(postprocess(parse$1(options).document().write(preprocess()(value, encoding, true)))); -} -function compiler(options) { - const config = { - transforms: [], - canContainEols: ['emphasis', 'fragment', 'heading', 'paragraph', 'strong'], - enter: { - autolink: opener(link), - autolinkProtocol: onenterdata, - autolinkEmail: onenterdata, - atxHeading: opener(heading), - blockQuote: opener(blockQuote), - characterEscape: onenterdata, - characterReference: onenterdata, - codeFenced: opener(codeFlow), - codeFencedFenceInfo: buffer, - codeFencedFenceMeta: buffer, - codeIndented: opener(codeFlow, buffer), - codeText: opener(codeText, buffer), - codeTextData: onenterdata, - data: onenterdata, - codeFlowValue: onenterdata, - definition: opener(definition), - definitionDestinationString: buffer, - definitionLabelString: buffer, - definitionTitleString: buffer, - emphasis: opener(emphasis), - hardBreakEscape: opener(hardBreak), - hardBreakTrailing: opener(hardBreak), - htmlFlow: opener(html, buffer), - htmlFlowData: onenterdata, - htmlText: opener(html, buffer), - htmlTextData: onenterdata, - image: opener(image), - label: buffer, - link: opener(link), - listItem: opener(listItem), - listItemValue: onenterlistitemvalue, - listOrdered: opener(list, onenterlistordered), - listUnordered: opener(list), - paragraph: opener(paragraph), - reference: onenterreference, - referenceString: buffer, - resourceDestinationString: buffer, - resourceTitleString: buffer, - setextHeading: opener(heading), - strong: opener(strong), - thematicBreak: opener(thematicBreak) - }, - exit: { - atxHeading: closer(), - atxHeadingSequence: onexitatxheadingsequence, - autolink: closer(), - autolinkEmail: onexitautolinkemail, - autolinkProtocol: onexitautolinkprotocol, - blockQuote: closer(), - characterEscapeValue: onexitdata, - characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker, - characterReferenceMarkerNumeric: onexitcharacterreferencemarker, - characterReferenceValue: onexitcharacterreferencevalue, - characterReference: onexitcharacterreference, - codeFenced: closer(onexitcodefenced), - codeFencedFence: onexitcodefencedfence, - codeFencedFenceInfo: onexitcodefencedfenceinfo, - codeFencedFenceMeta: onexitcodefencedfencemeta, - codeFlowValue: onexitdata, - codeIndented: closer(onexitcodeindented), - codeText: closer(onexitcodetext), - codeTextData: onexitdata, - data: onexitdata, - definition: closer(), - definitionDestinationString: onexitdefinitiondestinationstring, - definitionLabelString: onexitdefinitionlabelstring, - definitionTitleString: onexitdefinitiontitlestring, - emphasis: closer(), - hardBreakEscape: closer(onexithardbreak), - hardBreakTrailing: closer(onexithardbreak), - htmlFlow: closer(onexithtmlflow), - htmlFlowData: onexitdata, - htmlText: closer(onexithtmltext), - htmlTextData: onexitdata, - image: closer(onexitimage), - label: onexitlabel, - labelText: onexitlabeltext, - lineEnding: onexitlineending, - link: closer(onexitlink), - listItem: closer(), - listOrdered: closer(), - listUnordered: closer(), - paragraph: closer(), - referenceString: onexitreferencestring, - resourceDestinationString: onexitresourcedestinationstring, - resourceTitleString: onexitresourcetitlestring, - resource: onexitresource, - setextHeading: closer(onexitsetextheading), - setextHeadingLineSequence: onexitsetextheadinglinesequence, - setextHeadingText: onexitsetextheadingtext, - strong: closer(), - thematicBreak: closer() - } - }; - configure$1(config, (options || {}).mdastExtensions || []); - const data = {}; - return compile; - function compile(events) { - let tree = { - type: 'root', - children: [] - }; - const context = { - stack: [tree], - tokenStack: [], - config, - enter, - exit, - buffer, - resume, - data - }; - const listStack = []; - let index = -1; - while (++index < events.length) { - if (events[index][1].type === "listOrdered" || events[index][1].type === "listUnordered") { - if (events[index][0] === 'enter') { - listStack.push(index); - } else { - const tail = listStack.pop(); - index = prepareList(events, tail, index); - } - } - } - index = -1; - while (++index < events.length) { - const handler = config[events[index][0]]; - if (own$3.call(handler, events[index][1].type)) { - handler[events[index][1].type].call(Object.assign({ - sliceSerialize: events[index][2].sliceSerialize - }, context), events[index][1]); - } - } - if (context.tokenStack.length > 0) { - const tail = context.tokenStack[context.tokenStack.length - 1]; - const handler = tail[1] || defaultOnError; - handler.call(context, undefined, tail[0]); - } - tree.position = { - start: point$1(events.length > 0 ? events[0][1].start : { - line: 1, - column: 1, - offset: 0 - }), - end: point$1(events.length > 0 ? events[events.length - 2][1].end : { - line: 1, - column: 1, - offset: 0 - }) - }; - index = -1; - while (++index < config.transforms.length) { - tree = config.transforms[index](tree) || tree; - } - return tree; - } - function prepareList(events, start, length) { - let index = start - 1; - let containerBalance = -1; - let listSpread = false; - let listItem; - let lineIndex; - let firstBlankLineIndex; - let atMarker; - while (++index <= length) { - const event = events[index]; - switch (event[1].type) { - case "listUnordered": - case "listOrdered": - case "blockQuote": - { - if (event[0] === 'enter') { - containerBalance++; - } else { - containerBalance--; - } - atMarker = undefined; - break; - } - case "lineEndingBlank": - { - if (event[0] === 'enter') { - if (listItem && !atMarker && !containerBalance && !firstBlankLineIndex) { - firstBlankLineIndex = index; - } - atMarker = undefined; - } - break; - } - case "linePrefix": - case "listItemValue": - case "listItemMarker": - case "listItemPrefix": - case "listItemPrefixWhitespace": - { - break; - } - default: - { - atMarker = undefined; - } - } - if (!containerBalance && event[0] === 'enter' && event[1].type === "listItemPrefix" || containerBalance === -1 && event[0] === 'exit' && (event[1].type === "listUnordered" || event[1].type === "listOrdered")) { - if (listItem) { - let tailIndex = index; - lineIndex = undefined; - while (tailIndex--) { - const tailEvent = events[tailIndex]; - if (tailEvent[1].type === "lineEnding" || tailEvent[1].type === "lineEndingBlank") { - if (tailEvent[0] === 'exit') continue; - if (lineIndex) { - events[lineIndex][1].type = "lineEndingBlank"; - listSpread = true; - } - tailEvent[1].type = "lineEnding"; - lineIndex = tailIndex; - } else if (tailEvent[1].type === "linePrefix" || tailEvent[1].type === "blockQuotePrefix" || tailEvent[1].type === "blockQuotePrefixWhitespace" || tailEvent[1].type === "blockQuoteMarker" || tailEvent[1].type === "listItemIndent") ; else { - break; - } - } - if (firstBlankLineIndex && (!lineIndex || firstBlankLineIndex < lineIndex)) { - listItem._spread = true; - } - listItem.end = Object.assign({}, lineIndex ? events[lineIndex][1].start : event[1].end); - events.splice(lineIndex || index, 0, ['exit', listItem, event[2]]); - index++; - length++; - } - if (event[1].type === "listItemPrefix") { - const item = { - type: 'listItem', - _spread: false, - start: Object.assign({}, event[1].start), - end: undefined - }; - listItem = item; - events.splice(index, 0, ['enter', item, event[2]]); - index++; - length++; - firstBlankLineIndex = undefined; - atMarker = true; - } - } - } - events[start][1]._spread = listSpread; - return length; - } - function opener(create, and) { - return open; - function open(token) { - enter.call(this, create(token), token); - if (and) and.call(this, token); - } - } - function buffer() { - this.stack.push({ - type: 'fragment', - children: [] - }); - } - function enter(node, token, errorHandler) { - const parent = this.stack[this.stack.length - 1]; - const siblings = parent.children; - siblings.push(node); - this.stack.push(node); - this.tokenStack.push([token, errorHandler]); - node.position = { - start: point$1(token.start), - end: undefined - }; - } - function closer(and) { - return close; - function close(token) { - if (and) and.call(this, token); - exit.call(this, token); - } - } - function exit(token, onExitError) { - const node = this.stack.pop(); - const open = this.tokenStack.pop(); - if (!open) { - throw new Error('Cannot close `' + token.type + '` (' + stringifyPosition({ - start: token.start, - end: token.end - }) + '): it’s not open'); - } else if (open[0].type !== token.type) { - if (onExitError) { - onExitError.call(this, token, open[0]); - } else { - const handler = open[1] || defaultOnError; - handler.call(this, token, open[0]); - } - } - node.position.end = point$1(token.end); - } - function resume() { - return toString(this.stack.pop()); - } - function onenterlistordered() { - this.data.expectingFirstListItemValue = true; - } - function onenterlistitemvalue(token) { - if (this.data.expectingFirstListItemValue) { - const ancestor = this.stack[this.stack.length - 2]; - ancestor.start = Number.parseInt(this.sliceSerialize(token), 10); - this.data.expectingFirstListItemValue = undefined; - } - } - function onexitcodefencedfenceinfo() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.lang = data; - } - function onexitcodefencedfencemeta() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.meta = data; - } - function onexitcodefencedfence() { - if (this.data.flowCodeInside) return; - this.buffer(); - this.data.flowCodeInside = true; - } - function onexitcodefenced() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.value = data.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g, ''); - this.data.flowCodeInside = undefined; - } - function onexitcodeindented() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.value = data.replace(/(\r?\n|\r)$/g, ''); - } - function onexitdefinitionlabelstring(token) { - const label = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.label = label; - node.identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase(); - } - function onexitdefinitiontitlestring() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.title = data; - } - function onexitdefinitiondestinationstring() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.url = data; - } - function onexitatxheadingsequence(token) { - const node = this.stack[this.stack.length - 1]; - if (!node.depth) { - const depth = this.sliceSerialize(token).length; - node.depth = depth; - } - } - function onexitsetextheadingtext() { - this.data.setextHeadingSlurpLineEnding = true; - } - function onexitsetextheadinglinesequence(token) { - const node = this.stack[this.stack.length - 1]; - node.depth = this.sliceSerialize(token).codePointAt(0) === 61 ? 1 : 2; - } - function onexitsetextheading() { - this.data.setextHeadingSlurpLineEnding = undefined; - } - function onenterdata(token) { - const node = this.stack[this.stack.length - 1]; - const siblings = node.children; - let tail = siblings[siblings.length - 1]; - if (!tail || tail.type !== 'text') { - tail = text(); - tail.position = { - start: point$1(token.start), - end: undefined - }; - siblings.push(tail); - } - this.stack.push(tail); - } - function onexitdata(token) { - const tail = this.stack.pop(); - tail.value += this.sliceSerialize(token); - tail.position.end = point$1(token.end); - } - function onexitlineending(token) { - const context = this.stack[this.stack.length - 1]; - if (this.data.atHardBreak) { - const tail = context.children[context.children.length - 1]; - tail.position.end = point$1(token.end); - this.data.atHardBreak = undefined; - return; - } - if (!this.data.setextHeadingSlurpLineEnding && config.canContainEols.includes(context.type)) { - onenterdata.call(this, token); - onexitdata.call(this, token); - } - } - function onexithardbreak() { - this.data.atHardBreak = true; - } - function onexithtmlflow() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.value = data; - } - function onexithtmltext() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.value = data; - } - function onexitcodetext() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.value = data; - } - function onexitlink() { - const node = this.stack[this.stack.length - 1]; - if (this.data.inReference) { - const referenceType = this.data.referenceType || 'shortcut'; - node.type += 'Reference'; - node.referenceType = referenceType; - delete node.url; - delete node.title; - } else { - delete node.identifier; - delete node.label; - } - this.data.referenceType = undefined; - } - function onexitimage() { - const node = this.stack[this.stack.length - 1]; - if (this.data.inReference) { - const referenceType = this.data.referenceType || 'shortcut'; - node.type += 'Reference'; - node.referenceType = referenceType; - delete node.url; - delete node.title; - } else { - delete node.identifier; - delete node.label; - } - this.data.referenceType = undefined; - } - function onexitlabeltext(token) { - const string = this.sliceSerialize(token); - const ancestor = this.stack[this.stack.length - 2]; - ancestor.label = decodeString(string); - ancestor.identifier = normalizeIdentifier(string).toLowerCase(); - } - function onexitlabel() { - const fragment = this.stack[this.stack.length - 1]; - const value = this.resume(); - const node = this.stack[this.stack.length - 1]; - this.data.inReference = true; - if (node.type === 'link') { - const children = fragment.children; - node.children = children; - } else { - node.alt = value; - } - } - function onexitresourcedestinationstring() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.url = data; - } - function onexitresourcetitlestring() { - const data = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.title = data; - } - function onexitresource() { - this.data.inReference = undefined; - } - function onenterreference() { - this.data.referenceType = 'collapsed'; - } - function onexitreferencestring(token) { - const label = this.resume(); - const node = this.stack[this.stack.length - 1]; - node.label = label; - node.identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase(); - this.data.referenceType = 'full'; - } - function onexitcharacterreferencemarker(token) { - this.data.characterReferenceType = token.type; - } - function onexitcharacterreferencevalue(token) { - const data = this.sliceSerialize(token); - const type = this.data.characterReferenceType; - let value; - if (type) { - value = decodeNumericCharacterReference(data, type === "characterReferenceMarkerNumeric" ? 10 : 16); - this.data.characterReferenceType = undefined; - } else { - const result = decodeNamedCharacterReference(data); - value = result; - } - const tail = this.stack[this.stack.length - 1]; - tail.value += value; - } - function onexitcharacterreference(token) { - const tail = this.stack.pop(); - tail.position.end = point$1(token.end); - } - function onexitautolinkprotocol(token) { - onexitdata.call(this, token); - const node = this.stack[this.stack.length - 1]; - node.url = this.sliceSerialize(token); - } - function onexitautolinkemail(token) { - onexitdata.call(this, token); - const node = this.stack[this.stack.length - 1]; - node.url = 'mailto:' + this.sliceSerialize(token); - } - function blockQuote() { - return { - type: 'blockquote', - children: [] - }; - } - function codeFlow() { - return { - type: 'code', - lang: null, - meta: null, - value: '' - }; - } - function codeText() { - return { - type: 'inlineCode', - value: '' - }; - } - function definition() { - return { - type: 'definition', - identifier: '', - label: null, - title: null, - url: '' - }; - } - function emphasis() { - return { - type: 'emphasis', - children: [] - }; - } - function heading() { - return { - type: 'heading', - depth: 0, - children: [] - }; - } - function hardBreak() { - return { - type: 'break' - }; - } - function html() { - return { - type: 'html', - value: '' - }; - } - function image() { - return { - type: 'image', - title: null, - url: '', - alt: null - }; - } - function link() { - return { - type: 'link', - title: null, - url: '', - children: [] - }; - } - function list(token) { - return { - type: 'list', - ordered: token.type === 'listOrdered', - start: null, - spread: token._spread, - children: [] - }; - } - function listItem(token) { - return { - type: 'listItem', - spread: token._spread, - checked: null, - children: [] - }; - } - function paragraph() { - return { - type: 'paragraph', - children: [] - }; - } - function strong() { - return { - type: 'strong', - children: [] - }; - } - function text() { - return { - type: 'text', - value: '' - }; - } - function thematicBreak() { - return { - type: 'thematicBreak' - }; - } -} -function point$1(d) { - return { - line: d.line, - column: d.column, - offset: d.offset - }; -} -function configure$1(combined, extensions) { - let index = -1; - while (++index < extensions.length) { - const value = extensions[index]; - if (Array.isArray(value)) { - configure$1(combined, value); - } else { - extension(combined, value); - } - } -} -function extension(combined, extension) { - let key; - for (key in extension) { - if (own$3.call(extension, key)) { - switch (key) { - case 'canContainEols': - { - const right = extension[key]; - if (right) { - combined[key].push(...right); - } - break; - } - case 'transforms': - { - const right = extension[key]; - if (right) { - combined[key].push(...right); - } - break; - } - case 'enter': - case 'exit': - { - const right = extension[key]; - if (right) { - Object.assign(combined[key], right); - } - break; - } - } - } - } -} -function defaultOnError(left, right) { - if (left) { - throw new Error('Cannot close `' + left.type + '` (' + stringifyPosition({ - start: left.start, - end: left.end - }) + '): a different token (`' + right.type + '`, ' + stringifyPosition({ - start: right.start, - end: right.end - }) + ') is open'); - } else { - throw new Error('Cannot close document, a token (`' + right.type + '`, ' + stringifyPosition({ - start: right.start, - end: right.end - }) + ') is still open'); - } -} - -function remarkParse(options) { - const self = this; - self.parser = parser; - function parser(doc) { - return fromMarkdown(doc, { - ...self.data('settings'), - ...options, - extensions: self.data('micromarkExtensions') || [], - mdastExtensions: self.data('fromMarkdownExtensions') || [] - }) - } -} - -const own$2 = {}.hasOwnProperty; -function zwitch(key, options) { - const settings = options || {}; - function one(value, ...parameters) { - let fn = one.invalid; - const handlers = one.handlers; - if (value && own$2.call(value, key)) { - const id = String(value[key]); - fn = own$2.call(handlers, id) ? handlers[id] : one.unknown; - } - if (fn) { - return fn.call(this, value, ...parameters) - } - } - one.handlers = settings.handlers || {}; - one.invalid = settings.invalid; - one.unknown = settings.unknown; - return one -} - -const own$1 = {}.hasOwnProperty; -function configure(base, extension) { - let index = -1; - let key; - if (extension.extensions) { - while (++index < extension.extensions.length) { - configure(base, extension.extensions[index]); - } - } - for (key in extension) { - if (own$1.call(extension, key)) { - switch (key) { - case 'extensions': { - break - } - case 'unsafe': { - list$1(base[key], extension[key]); - break - } - case 'join': { - list$1(base[key], extension[key]); - break - } - case 'handlers': { - map$4(base[key], extension[key]); - break - } - default: { - base.options[key] = extension[key]; - } - } - } - } - return base -} -function list$1(left, right) { - if (right) { - left.push(...right); - } -} -function map$4(left, right) { - if (right) { - Object.assign(left, right); - } -} - -function blockquote(node, _, state, info) { - const exit = state.enter('blockquote'); - const tracker = state.createTracker(info); - tracker.move('> '); - tracker.shift(2); - const value = state.indentLines( - state.containerFlow(node, tracker.current()), - map$3 - ); - exit(); - return value -} -function map$3(line, _, blank) { - return '>' + (blank ? '' : ' ') + line -} - -function patternInScope(stack, pattern) { - return ( - listInScope(stack, pattern.inConstruct, true) && - !listInScope(stack, pattern.notInConstruct, false) - ) -} -function listInScope(stack, list, none) { - if (typeof list === 'string') { - list = [list]; - } - if (!list || list.length === 0) { - return none - } - let index = -1; - while (++index < list.length) { - if (stack.includes(list[index])) { - return true - } - } - return false -} - -function hardBreak(_, _1, state, info) { - let index = -1; - while (++index < state.unsafe.length) { - if ( - state.unsafe[index].character === '\n' && - patternInScope(state.stack, state.unsafe[index]) - ) { - return /[ \t]/.test(info.before) ? '' : ' ' - } - } - return '\\\n' -} - -function longestStreak(value, substring) { - const source = String(value); - let index = source.indexOf(substring); - let expected = index; - let count = 0; - let max = 0; - if (typeof substring !== 'string') { - throw new TypeError('Expected substring') - } - while (index !== -1) { - if (index === expected) { - if (++count > max) { - max = count; - } - } else { - count = 1; - } - expected = index + substring.length; - index = source.indexOf(substring, expected); - } - return max -} - -function formatCodeAsIndented(node, state) { - return Boolean( - state.options.fences === false && - node.value && - !node.lang && - /[^ \r\n]/.test(node.value) && - !/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(node.value) - ) -} - -function checkFence(state) { - const marker = state.options.fence || '`'; - if (marker !== '`' && marker !== '~') { - throw new Error( - 'Cannot serialize code with `' + - marker + - '` for `options.fence`, expected `` ` `` or `~`' - ) - } - return marker -} - -function code$1(node, _, state, info) { - const marker = checkFence(state); - const raw = node.value || ''; - const suffix = marker === '`' ? 'GraveAccent' : 'Tilde'; - if (formatCodeAsIndented(node, state)) { - const exit = state.enter('codeIndented'); - const value = state.indentLines(raw, map$2); - exit(); - return value - } - const tracker = state.createTracker(info); - const sequence = marker.repeat(Math.max(longestStreak(raw, marker) + 1, 3)); - const exit = state.enter('codeFenced'); - let value = tracker.move(sequence); - if (node.lang) { - const subexit = state.enter(`codeFencedLang${suffix}`); - value += tracker.move( - state.safe(node.lang, { - before: value, - after: ' ', - encode: ['`'], - ...tracker.current() - }) - ); - subexit(); - } - if (node.lang && node.meta) { - const subexit = state.enter(`codeFencedMeta${suffix}`); - value += tracker.move(' '); - value += tracker.move( - state.safe(node.meta, { - before: value, - after: '\n', - encode: ['`'], - ...tracker.current() - }) - ); - subexit(); - } - value += tracker.move('\n'); - if (raw) { - value += tracker.move(raw + '\n'); - } - value += tracker.move(sequence); - exit(); - return value -} -function map$2(line, _, blank) { - return (blank ? '' : ' ') + line -} - -function checkQuote(state) { - const marker = state.options.quote || '"'; - if (marker !== '"' && marker !== "'") { - throw new Error( - 'Cannot serialize title with `' + - marker + - '` for `options.quote`, expected `"`, or `\'`' - ) - } - return marker -} - -function definition(node, _, state, info) { - const quote = checkQuote(state); - const suffix = quote === '"' ? 'Quote' : 'Apostrophe'; - const exit = state.enter('definition'); - let subexit = state.enter('label'); - const tracker = state.createTracker(info); - let value = tracker.move('['); - value += tracker.move( - state.safe(state.associationId(node), { - before: value, - after: ']', - ...tracker.current() - }) - ); - value += tracker.move(']: '); - subexit(); - if ( - !node.url || - /[\0- \u007F]/.test(node.url) - ) { - subexit = state.enter('destinationLiteral'); - value += tracker.move('<'); - value += tracker.move( - state.safe(node.url, {before: value, after: '>', ...tracker.current()}) - ); - value += tracker.move('>'); - } else { - subexit = state.enter('destinationRaw'); - value += tracker.move( - state.safe(node.url, { - before: value, - after: node.title ? ' ' : '\n', - ...tracker.current() - }) - ); - } - subexit(); - if (node.title) { - subexit = state.enter(`title${suffix}`); - value += tracker.move(' ' + quote); - value += tracker.move( - state.safe(node.title, { - before: value, - after: quote, - ...tracker.current() - }) - ); - value += tracker.move(quote); - subexit(); - } - exit(); - return value -} - -function checkEmphasis(state) { - const marker = state.options.emphasis || '*'; - if (marker !== '*' && marker !== '_') { - throw new Error( - 'Cannot serialize emphasis with `' + - marker + - '` for `options.emphasis`, expected `*`, or `_`' - ) - } - return marker -} - -emphasis.peek = emphasisPeek; -function emphasis(node, _, state, info) { - const marker = checkEmphasis(state); - const exit = state.enter('emphasis'); - const tracker = state.createTracker(info); - let value = tracker.move(marker); - value += tracker.move( - state.containerPhrasing(node, { - before: value, - after: marker, - ...tracker.current() - }) - ); - value += tracker.move(marker); - exit(); - return value -} -function emphasisPeek(_, _1, state) { - return state.options.emphasis || '*' -} - -const convert = - ( - function (test) { - if (test === null || test === undefined) { - return ok - } - if (typeof test === 'function') { - return castFactory(test) - } - if (typeof test === 'object') { - return Array.isArray(test) ? anyFactory(test) : propsFactory(test) - } - if (typeof test === 'string') { - return typeFactory(test) - } - throw new Error('Expected function, string, or object as test') - } - ); -function anyFactory(tests) { - const checks = []; - let index = -1; - while (++index < tests.length) { - checks[index] = convert(tests[index]); - } - return castFactory(any) - function any(...parameters) { - let index = -1; - while (++index < checks.length) { - if (checks[index].apply(this, parameters)) return true - } - return false - } -} -function propsFactory(check) { - const checkAsRecord = (check); - return castFactory(all) - function all(node) { - const nodeAsRecord = ( - (node) - ); - let key; - for (key in check) { - if (nodeAsRecord[key] !== checkAsRecord[key]) return false - } - return true - } -} -function typeFactory(check) { - return castFactory(type) - function type(node) { - return node && node.type === check - } -} -function castFactory(testFunction) { - return check - function check(value, index, parent) { - return Boolean( - looksLikeANode(value) && - testFunction.call( - this, - value, - typeof index === 'number' ? index : undefined, - parent || undefined - ) - ) - } -} -function ok() { - return true -} -function looksLikeANode(value) { - return value !== null && typeof value === 'object' && 'type' in value -} - -function color$1(d) { - return '\u001B[33m' + d + '\u001B[39m' -} - -const empty$1 = []; -const CONTINUE = true; -const EXIT = false; -const SKIP = 'skip'; -function visitParents(tree, test, visitor, reverse) { - let check; - if (typeof test === 'function' && typeof visitor !== 'function') { - reverse = visitor; - visitor = test; - } else { - check = test; - } - const is = convert(check); - const step = reverse ? -1 : 1; - factory(tree, undefined, [])(); - function factory(node, index, parents) { - const value = ( - node && typeof node === 'object' ? node : {} - ); - if (typeof value.type === 'string') { - const name = - typeof value.tagName === 'string' - ? value.tagName - : - typeof value.name === 'string' - ? value.name - : undefined; - Object.defineProperty(visit, 'name', { - value: - 'node (' + color$1(node.type + (name ? '<' + name + '>' : '')) + ')' - }); - } - return visit - function visit() { - let result = empty$1; - let subresult; - let offset; - let grandparents; - if (!test || is(node, index, parents[parents.length - 1] || undefined)) { - result = toResult(visitor(node, parents)); - if (result[0] === EXIT) { - return result - } - } - if ('children' in node && node.children) { - const nodeAsParent = (node); - if (nodeAsParent.children && result[0] !== SKIP) { - offset = (reverse ? nodeAsParent.children.length : -1) + step; - grandparents = parents.concat(nodeAsParent); - while (offset > -1 && offset < nodeAsParent.children.length) { - const child = nodeAsParent.children[offset]; - subresult = factory(child, offset, grandparents)(); - if (subresult[0] === EXIT) { - return subresult - } - offset = - typeof subresult[1] === 'number' ? subresult[1] : offset + step; - } - } - } - return result - } - } -} -function toResult(value) { - if (Array.isArray(value)) { - return value - } - if (typeof value === 'number') { - return [CONTINUE, value] - } - return value === null || value === undefined ? empty$1 : [value] -} - -function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) { - let reverse; - let test; - let visitor; - if ( - typeof testOrVisitor === 'function' && - typeof visitorOrReverse !== 'function' - ) { - test = undefined; - visitor = testOrVisitor; - reverse = visitorOrReverse; - } else { - test = testOrVisitor; - visitor = visitorOrReverse; - reverse = maybeReverse; - } - visitParents(tree, test, overload, reverse); - function overload(node, parents) { - const parent = parents[parents.length - 1]; - const index = parent ? parent.children.indexOf(node) : undefined; - return visitor(node, index, parent) - } -} - -function formatHeadingAsSetext(node, state) { - let literalWithBreak = false; - visit(node, function (node) { - if ( - ('value' in node && /\r?\n|\r/.test(node.value)) || - node.type === 'break' - ) { - literalWithBreak = true; - return EXIT - } - }); - return Boolean( - (!node.depth || node.depth < 3) && - toString(node) && - (state.options.setext || literalWithBreak) - ) -} - -function heading(node, _, state, info) { - const rank = Math.max(Math.min(6, node.depth || 1), 1); - const tracker = state.createTracker(info); - if (formatHeadingAsSetext(node, state)) { - const exit = state.enter('headingSetext'); - const subexit = state.enter('phrasing'); - const value = state.containerPhrasing(node, { - ...tracker.current(), - before: '\n', - after: '\n' - }); - subexit(); - exit(); - return ( - value + - '\n' + - (rank === 1 ? '=' : '-').repeat( - value.length - - (Math.max(value.lastIndexOf('\r'), value.lastIndexOf('\n')) + 1) - ) - ) - } - const sequence = '#'.repeat(rank); - const exit = state.enter('headingAtx'); - const subexit = state.enter('phrasing'); - tracker.move(sequence + ' '); - let value = state.containerPhrasing(node, { - before: '# ', - after: '\n', - ...tracker.current() - }); - if (/^[\t ]/.test(value)) { - value = - '' + - value.charCodeAt(0).toString(16).toUpperCase() + - ';' + - value.slice(1); - } - value = value ? sequence + ' ' + value : sequence; - if (state.options.closeAtx) { - value += ' ' + sequence; - } - subexit(); - exit(); - return value -} - -html$1.peek = htmlPeek; -function html$1(node) { - return node.value || '' -} -function htmlPeek() { - return '<' -} - -image.peek = imagePeek; -function image(node, _, state, info) { - const quote = checkQuote(state); - const suffix = quote === '"' ? 'Quote' : 'Apostrophe'; - const exit = state.enter('image'); - let subexit = state.enter('label'); - const tracker = state.createTracker(info); - let value = tracker.move('!['); - value += tracker.move( - state.safe(node.alt, {before: value, after: ']', ...tracker.current()}) - ); - value += tracker.move(']('); - subexit(); - if ( - (!node.url && node.title) || - /[\0- \u007F]/.test(node.url) - ) { - subexit = state.enter('destinationLiteral'); - value += tracker.move('<'); - value += tracker.move( - state.safe(node.url, {before: value, after: '>', ...tracker.current()}) - ); - value += tracker.move('>'); - } else { - subexit = state.enter('destinationRaw'); - value += tracker.move( - state.safe(node.url, { - before: value, - after: node.title ? ' ' : ')', - ...tracker.current() - }) - ); - } - subexit(); - if (node.title) { - subexit = state.enter(`title${suffix}`); - value += tracker.move(' ' + quote); - value += tracker.move( - state.safe(node.title, { - before: value, - after: quote, - ...tracker.current() - }) - ); - value += tracker.move(quote); - subexit(); - } - value += tracker.move(')'); - exit(); - return value -} -function imagePeek() { - return '!' -} - -imageReference.peek = imageReferencePeek; -function imageReference(node, _, state, info) { - const type = node.referenceType; - const exit = state.enter('imageReference'); - let subexit = state.enter('label'); - const tracker = state.createTracker(info); - let value = tracker.move('!['); - const alt = state.safe(node.alt, { - before: value, - after: ']', - ...tracker.current() - }); - value += tracker.move(alt + ']['); - subexit(); - const stack = state.stack; - state.stack = []; - subexit = state.enter('reference'); - const reference = state.safe(state.associationId(node), { - before: value, - after: ']', - ...tracker.current() - }); - subexit(); - state.stack = stack; - exit(); - if (type === 'full' || !alt || alt !== reference) { - value += tracker.move(reference + ']'); - } else if (type === 'shortcut') { - value = value.slice(0, -1); - } else { - value += tracker.move(']'); - } - return value -} -function imageReferencePeek() { - return '!' -} - -inlineCode.peek = inlineCodePeek; -function inlineCode(node, _, state) { - let value = node.value || ''; - let sequence = '`'; - let index = -1; - while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) { - sequence += '`'; - } - if ( - /[^ \r\n]/.test(value) && - ((/^[ \r\n]/.test(value) && /[ \r\n]$/.test(value)) || /^`|`$/.test(value)) - ) { - value = ' ' + value + ' '; - } - while (++index < state.unsafe.length) { - const pattern = state.unsafe[index]; - const expression = state.compilePattern(pattern); - let match; - if (!pattern.atBreak) continue - while ((match = expression.exec(value))) { - let position = match.index; - if ( - value.charCodeAt(position) === 10 && - value.charCodeAt(position - 1) === 13 - ) { - position--; - } - value = value.slice(0, position) + ' ' + value.slice(match.index + 1); - } - } - return sequence + value + sequence -} -function inlineCodePeek() { - return '`' -} - -function formatLinkAsAutolink(node, state) { - const raw = toString(node); - return Boolean( - !state.options.resourceLink && - node.url && - !node.title && - node.children && - node.children.length === 1 && - node.children[0].type === 'text' && - (raw === node.url || 'mailto:' + raw === node.url) && - /^[a-z][a-z+.-]+:/i.test(node.url) && - !/[\0- <>\u007F]/.test(node.url) - ) -} - -link.peek = linkPeek; -function link(node, _, state, info) { - const quote = checkQuote(state); - const suffix = quote === '"' ? 'Quote' : 'Apostrophe'; - const tracker = state.createTracker(info); - let exit; - let subexit; - if (formatLinkAsAutolink(node, state)) { - const stack = state.stack; - state.stack = []; - exit = state.enter('autolink'); - let value = tracker.move('<'); - value += tracker.move( - state.containerPhrasing(node, { - before: value, - after: '>', - ...tracker.current() - }) - ); - value += tracker.move('>'); - exit(); - state.stack = stack; - return value - } - exit = state.enter('link'); - subexit = state.enter('label'); - let value = tracker.move('['); - value += tracker.move( - state.containerPhrasing(node, { - before: value, - after: '](', - ...tracker.current() - }) - ); - value += tracker.move(']('); - subexit(); - if ( - (!node.url && node.title) || - /[\0- \u007F]/.test(node.url) - ) { - subexit = state.enter('destinationLiteral'); - value += tracker.move('<'); - value += tracker.move( - state.safe(node.url, {before: value, after: '>', ...tracker.current()}) - ); - value += tracker.move('>'); - } else { - subexit = state.enter('destinationRaw'); - value += tracker.move( - state.safe(node.url, { - before: value, - after: node.title ? ' ' : ')', - ...tracker.current() - }) - ); - } - subexit(); - if (node.title) { - subexit = state.enter(`title${suffix}`); - value += tracker.move(' ' + quote); - value += tracker.move( - state.safe(node.title, { - before: value, - after: quote, - ...tracker.current() - }) - ); - value += tracker.move(quote); - subexit(); - } - value += tracker.move(')'); - exit(); - return value -} -function linkPeek(node, _, state) { - return formatLinkAsAutolink(node, state) ? '<' : '[' -} - -linkReference.peek = linkReferencePeek; -function linkReference(node, _, state, info) { - const type = node.referenceType; - const exit = state.enter('linkReference'); - let subexit = state.enter('label'); - const tracker = state.createTracker(info); - let value = tracker.move('['); - const text = state.containerPhrasing(node, { - before: value, - after: ']', - ...tracker.current() - }); - value += tracker.move(text + ']['); - subexit(); - const stack = state.stack; - state.stack = []; - subexit = state.enter('reference'); - const reference = state.safe(state.associationId(node), { - before: value, - after: ']', - ...tracker.current() - }); - subexit(); - state.stack = stack; - exit(); - if (type === 'full' || !text || text !== reference) { - value += tracker.move(reference + ']'); - } else if (type === 'shortcut') { - value = value.slice(0, -1); - } else { - value += tracker.move(']'); - } - return value -} -function linkReferencePeek() { - return '[' -} - -function checkBullet(state) { - const marker = state.options.bullet || '*'; - if (marker !== '*' && marker !== '+' && marker !== '-') { - throw new Error( - 'Cannot serialize items with `' + - marker + - '` for `options.bullet`, expected `*`, `+`, or `-`' - ) - } - return marker -} - -function checkBulletOther(state) { - const bullet = checkBullet(state); - const bulletOther = state.options.bulletOther; - if (!bulletOther) { - return bullet === '*' ? '-' : '*' - } - if (bulletOther !== '*' && bulletOther !== '+' && bulletOther !== '-') { - throw new Error( - 'Cannot serialize items with `' + - bulletOther + - '` for `options.bulletOther`, expected `*`, `+`, or `-`' - ) - } - if (bulletOther === bullet) { - throw new Error( - 'Expected `bullet` (`' + - bullet + - '`) and `bulletOther` (`' + - bulletOther + - '`) to be different' - ) - } - return bulletOther -} - -function checkBulletOrdered(state) { - const marker = state.options.bulletOrdered || '.'; - if (marker !== '.' && marker !== ')') { - throw new Error( - 'Cannot serialize items with `' + - marker + - '` for `options.bulletOrdered`, expected `.` or `)`' - ) - } - return marker -} - -function checkRule(state) { - const marker = state.options.rule || '*'; - if (marker !== '*' && marker !== '-' && marker !== '_') { - throw new Error( - 'Cannot serialize rules with `' + - marker + - '` for `options.rule`, expected `*`, `-`, or `_`' - ) - } - return marker -} - -function list(node, parent, state, info) { - const exit = state.enter('list'); - const bulletCurrent = state.bulletCurrent; - let bullet = node.ordered ? checkBulletOrdered(state) : checkBullet(state); - const bulletOther = node.ordered - ? bullet === '.' - ? ')' - : '.' - : checkBulletOther(state); - let useDifferentMarker = - parent && state.bulletLastUsed ? bullet === state.bulletLastUsed : false; - if (!node.ordered) { - const firstListItem = node.children ? node.children[0] : undefined; - if ( - (bullet === '*' || bullet === '-') && - firstListItem && - (!firstListItem.children || !firstListItem.children[0]) && - state.stack[state.stack.length - 1] === 'list' && - state.stack[state.stack.length - 2] === 'listItem' && - state.stack[state.stack.length - 3] === 'list' && - state.stack[state.stack.length - 4] === 'listItem' && - state.indexStack[state.indexStack.length - 1] === 0 && - state.indexStack[state.indexStack.length - 2] === 0 && - state.indexStack[state.indexStack.length - 3] === 0 - ) { - useDifferentMarker = true; - } - if (checkRule(state) === bullet && firstListItem) { - let index = -1; - while (++index < node.children.length) { - const item = node.children[index]; - if ( - item && - item.type === 'listItem' && - item.children && - item.children[0] && - item.children[0].type === 'thematicBreak' - ) { - useDifferentMarker = true; - break - } - } - } - } - if (useDifferentMarker) { - bullet = bulletOther; - } - state.bulletCurrent = bullet; - const value = state.containerFlow(node, info); - state.bulletLastUsed = bullet; - state.bulletCurrent = bulletCurrent; - exit(); - return value -} - -function checkListItemIndent(state) { - const style = state.options.listItemIndent || 'one'; - if (style !== 'tab' && style !== 'one' && style !== 'mixed') { - throw new Error( - 'Cannot serialize items with `' + - style + - '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`' - ) - } - return style -} - -function listItem(node, parent, state, info) { - const listItemIndent = checkListItemIndent(state); - let bullet = state.bulletCurrent || checkBullet(state); - if (parent && parent.type === 'list' && parent.ordered) { - bullet = - (typeof parent.start === 'number' && parent.start > -1 - ? parent.start - : 1) + - (state.options.incrementListMarker === false - ? 0 - : parent.children.indexOf(node)) + - bullet; - } - let size = bullet.length + 1; - if ( - listItemIndent === 'tab' || - (listItemIndent === 'mixed' && - ((parent && parent.type === 'list' && parent.spread) || node.spread)) - ) { - size = Math.ceil(size / 4) * 4; - } - const tracker = state.createTracker(info); - tracker.move(bullet + ' '.repeat(size - bullet.length)); - tracker.shift(size); - const exit = state.enter('listItem'); - const value = state.indentLines( - state.containerFlow(node, tracker.current()), - map - ); - exit(); - return value - function map(line, index, blank) { - if (index) { - return (blank ? '' : ' '.repeat(size)) + line - } - return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line - } -} - -function paragraph(node, _, state, info) { - const exit = state.enter('paragraph'); - const subexit = state.enter('phrasing'); - const value = state.containerPhrasing(node, info); - subexit(); - exit(); - return value -} - -const phrasing = - ( - convert([ - 'break', - 'delete', - 'emphasis', - 'footnote', - 'footnoteReference', - 'image', - 'imageReference', - 'inlineCode', - 'inlineMath', - 'link', - 'linkReference', - 'mdxJsxTextElement', - 'mdxTextExpression', - 'strong', - 'text', - 'textDirective' - ]) - ); - -function root(node, _, state, info) { - const hasPhrasing = node.children.some(function (d) { - return phrasing(d) - }); - const fn = hasPhrasing ? state.containerPhrasing : state.containerFlow; - return fn.call(state, node, info) -} - -function checkStrong(state) { - const marker = state.options.strong || '*'; - if (marker !== '*' && marker !== '_') { - throw new Error( - 'Cannot serialize strong with `' + - marker + - '` for `options.strong`, expected `*`, or `_`' - ) - } - return marker -} - -strong.peek = strongPeek; -function strong(node, _, state, info) { - const marker = checkStrong(state); - const exit = state.enter('strong'); - const tracker = state.createTracker(info); - let value = tracker.move(marker + marker); - value += tracker.move( - state.containerPhrasing(node, { - before: value, - after: marker, - ...tracker.current() - }) - ); - value += tracker.move(marker + marker); - exit(); - return value -} -function strongPeek(_, _1, state) { - return state.options.strong || '*' -} - -function text$1(node, _, state, info) { - return state.safe(node.value, info) -} - -function checkRuleRepetition(state) { - const repetition = state.options.ruleRepetition || 3; - if (repetition < 3) { - throw new Error( - 'Cannot serialize rules with repetition `' + - repetition + - '` for `options.ruleRepetition`, expected `3` or more' - ) - } - return repetition -} - -function thematicBreak(_, _1, state) { - const value = ( - checkRule(state) + (state.options.ruleSpaces ? ' ' : '') - ).repeat(checkRuleRepetition(state)); - return state.options.ruleSpaces ? value.slice(0, -1) : value -} - -const handle = { - blockquote, - break: hardBreak, - code: code$1, - definition, - emphasis, - hardBreak, - heading, - html: html$1, - image, - imageReference, - inlineCode, - link, - linkReference, - list, - listItem, - paragraph, - root, - strong, - text: text$1, - thematicBreak -}; - -const join = [joinDefaults]; -function joinDefaults(left, right, parent, state) { - if ( - right.type === 'code' && - formatCodeAsIndented(right, state) && - (left.type === 'list' || - (left.type === right.type && formatCodeAsIndented(left, state))) - ) { - return false - } - if ('spread' in parent && typeof parent.spread === 'boolean') { - if ( - left.type === 'paragraph' && - (left.type === right.type || - right.type === 'definition' || - (right.type === 'heading' && formatHeadingAsSetext(right, state))) - ) { - return - } - return parent.spread ? 1 : 0 - } -} - -const fullPhrasingSpans = [ - 'autolink', - 'destinationLiteral', - 'destinationRaw', - 'reference', - 'titleQuote', - 'titleApostrophe' -]; -const unsafe = [ - {character: '\t', after: '[\\r\\n]', inConstruct: 'phrasing'}, - {character: '\t', before: '[\\r\\n]', inConstruct: 'phrasing'}, - { - character: '\t', - inConstruct: ['codeFencedLangGraveAccent', 'codeFencedLangTilde'] - }, - { - character: '\r', - inConstruct: [ - 'codeFencedLangGraveAccent', - 'codeFencedLangTilde', - 'codeFencedMetaGraveAccent', - 'codeFencedMetaTilde', - 'destinationLiteral', - 'headingAtx' - ] - }, - { - character: '\n', - inConstruct: [ - 'codeFencedLangGraveAccent', - 'codeFencedLangTilde', - 'codeFencedMetaGraveAccent', - 'codeFencedMetaTilde', - 'destinationLiteral', - 'headingAtx' - ] - }, - {character: ' ', after: '[\\r\\n]', inConstruct: 'phrasing'}, - {character: ' ', before: '[\\r\\n]', inConstruct: 'phrasing'}, - { - character: ' ', - inConstruct: ['codeFencedLangGraveAccent', 'codeFencedLangTilde'] - }, - { - character: '!', - after: '\\[', - inConstruct: 'phrasing', - notInConstruct: fullPhrasingSpans - }, - {character: '"', inConstruct: 'titleQuote'}, - {atBreak: true, character: '#'}, - {character: '#', inConstruct: 'headingAtx', after: '(?:[\r\n]|$)'}, - {character: '&', after: '[#A-Za-z]', inConstruct: 'phrasing'}, - {character: "'", inConstruct: 'titleApostrophe'}, - {character: '(', inConstruct: 'destinationRaw'}, - { - before: '\\]', - character: '(', - inConstruct: 'phrasing', - notInConstruct: fullPhrasingSpans - }, - {atBreak: true, before: '\\d+', character: ')'}, - {character: ')', inConstruct: 'destinationRaw'}, - {atBreak: true, character: '*', after: '(?:[ \t\r\n*])'}, - {character: '*', inConstruct: 'phrasing', notInConstruct: fullPhrasingSpans}, - {atBreak: true, character: '+', after: '(?:[ \t\r\n])'}, - {atBreak: true, character: '-', after: '(?:[ \t\r\n-])'}, - {atBreak: true, before: '\\d+', character: '.', after: '(?:[ \t\r\n]|$)'}, - {atBreak: true, character: '<', after: '[!/?A-Za-z]'}, - { - character: '<', - after: '[!/?A-Za-z]', - inConstruct: 'phrasing', - notInConstruct: fullPhrasingSpans - }, - {character: '<', inConstruct: 'destinationLiteral'}, - {atBreak: true, character: '='}, - {atBreak: true, character: '>'}, - {character: '>', inConstruct: 'destinationLiteral'}, - {atBreak: true, character: '['}, - {character: '[', inConstruct: 'phrasing', notInConstruct: fullPhrasingSpans}, - {character: '[', inConstruct: ['label', 'reference']}, - {character: '\\', after: '[\\r\\n]', inConstruct: 'phrasing'}, - {character: ']', inConstruct: ['label', 'reference']}, - {atBreak: true, character: '_'}, - {character: '_', inConstruct: 'phrasing', notInConstruct: fullPhrasingSpans}, - {atBreak: true, character: '`'}, - { - character: '`', - inConstruct: ['codeFencedLangGraveAccent', 'codeFencedMetaGraveAccent'] - }, - {character: '`', inConstruct: 'phrasing', notInConstruct: fullPhrasingSpans}, - {atBreak: true, character: '~'} -]; - -function association(node) { - if (node.label || !node.identifier) { - return node.label || '' - } - return decodeString(node.identifier) -} - -function compilePattern(pattern) { - if (!pattern._compiled) { - const before = - (pattern.atBreak ? '[\\r\\n][\\t ]*' : '') + - (pattern.before ? '(?:' + pattern.before + ')' : ''); - pattern._compiled = new RegExp( - (before ? '(' + before + ')' : '') + - (/[|\\{}()[\]^$+*?.-]/.test(pattern.character) ? '\\' : '') + - pattern.character + - (pattern.after ? '(?:' + pattern.after + ')' : ''), - 'g' - ); - } - return pattern._compiled -} - -function containerPhrasing(parent, state, info) { - const indexStack = state.indexStack; - const children = parent.children || []; - const results = []; - let index = -1; - let before = info.before; - indexStack.push(-1); - let tracker = state.createTracker(info); - while (++index < children.length) { - const child = children[index]; - let after; - indexStack[indexStack.length - 1] = index; - if (index + 1 < children.length) { - let handle = state.handle.handlers[children[index + 1].type]; - if (handle && handle.peek) handle = handle.peek; - after = handle - ? handle(children[index + 1], parent, state, { - before: '', - after: '', - ...tracker.current() - }).charAt(0) - : ''; - } else { - after = info.after; - } - if ( - results.length > 0 && - (before === '\r' || before === '\n') && - child.type === 'html' - ) { - results[results.length - 1] = results[results.length - 1].replace( - /(\r?\n|\r)$/, - ' ' - ); - before = ' '; - tracker = state.createTracker(info); - tracker.move(results.join('')); - } - results.push( - tracker.move( - state.handle(child, parent, state, { - ...tracker.current(), - before, - after - }) - ) - ); - before = results[results.length - 1].slice(-1); - } - indexStack.pop(); - return results.join('') -} - -function containerFlow(parent, state, info) { - const indexStack = state.indexStack; - const children = parent.children || []; - const tracker = state.createTracker(info); - const results = []; - let index = -1; - indexStack.push(-1); - while (++index < children.length) { - const child = children[index]; - indexStack[indexStack.length - 1] = index; - results.push( - tracker.move( - state.handle(child, parent, state, { - before: '\n', - after: '\n', - ...tracker.current() - }) - ) - ); - if (child.type !== 'list') { - state.bulletLastUsed = undefined; - } - if (index < children.length - 1) { - results.push( - tracker.move(between(child, children[index + 1], parent, state)) - ); - } - } - indexStack.pop(); - return results.join('') -} -function between(left, right, parent, state) { - let index = state.join.length; - while (index--) { - const result = state.join[index](left, right, parent, state); - if (result === true || result === 1) { - break - } - if (typeof result === 'number') { - return '\n'.repeat(1 + result) - } - if (result === false) { - return '\n\n\n\n' - } - } - return '\n\n' -} - -const eol$1 = /\r?\n|\r/g; -function indentLines(value, map) { - const result = []; - let start = 0; - let line = 0; - let match; - while ((match = eol$1.exec(value))) { - one(value.slice(start, match.index)); - result.push(match[0]); - start = match.index + match[0].length; - line++; - } - one(value.slice(start)); - return result.join('') - function one(value) { - result.push(map(value, line, !value)); - } -} - -function safe(state, input, config) { - const value = (config.before || '') + (input || '') + (config.after || ''); - const positions = []; - const result = []; - const infos = {}; - let index = -1; - while (++index < state.unsafe.length) { - const pattern = state.unsafe[index]; - if (!patternInScope(state.stack, pattern)) { - continue - } - const expression = state.compilePattern(pattern); - let match; - while ((match = expression.exec(value))) { - const before = 'before' in pattern || Boolean(pattern.atBreak); - const after = 'after' in pattern; - const position = match.index + (before ? match[1].length : 0); - if (positions.includes(position)) { - if (infos[position].before && !before) { - infos[position].before = false; - } - if (infos[position].after && !after) { - infos[position].after = false; - } - } else { - positions.push(position); - infos[position] = {before, after}; - } - } - } - positions.sort(numerical); - let start = config.before ? config.before.length : 0; - const end = value.length - (config.after ? config.after.length : 0); - index = -1; - while (++index < positions.length) { - const position = positions[index]; - if (position < start || position >= end) { - continue - } - if ( - (position + 1 < end && - positions[index + 1] === position + 1 && - infos[position].after && - !infos[position + 1].before && - !infos[position + 1].after) || - (positions[index - 1] === position - 1 && - infos[position].before && - !infos[position - 1].before && - !infos[position - 1].after) - ) { - continue - } - if (start !== position) { - result.push(escapeBackslashes(value.slice(start, position), '\\')); - } - start = position; - if ( - /[!-/:-@[-`{-~]/.test(value.charAt(position)) && - (!config.encode || !config.encode.includes(value.charAt(position))) - ) { - result.push('\\'); - } else { - result.push( - '' + value.charCodeAt(position).toString(16).toUpperCase() + ';' - ); - start++; - } - } - result.push(escapeBackslashes(value.slice(start, end), config.after)); - return result.join('') -} -function numerical(a, b) { - return a - b -} -function escapeBackslashes(value, after) { - const expression = /\\(?=[!-/:-@[-`{-~])/g; - const positions = []; - const results = []; - const whole = value + after; - let index = -1; - let start = 0; - let match; - while ((match = expression.exec(whole))) { - positions.push(match.index); - } - while (++index < positions.length) { - if (start !== positions[index]) { - results.push(value.slice(start, positions[index])); - } - results.push('\\'); - start = positions[index]; - } - results.push(value.slice(start)); - return results.join('') -} - -function track(config) { - const options = config || {}; - const now = options.now || {}; - let lineShift = options.lineShift || 0; - let line = now.line || 1; - let column = now.column || 1; - return {move, current, shift} - function current() { - return {now: {line, column}, lineShift} - } - function shift(value) { - lineShift += value; - } - function move(input) { - const value = input || ''; - const chunks = value.split(/\r?\n|\r/g); - const tail = chunks[chunks.length - 1]; - line += chunks.length - 1; - column = - chunks.length === 1 ? column + tail.length : 1 + tail.length + lineShift; - return value - } -} - -function toMarkdown(tree, options = {}) { - const state = { - enter, - indentLines, - associationId: association, - containerPhrasing: containerPhrasingBound, - containerFlow: containerFlowBound, - createTracker: track, - compilePattern, - safe: safeBound, - stack: [], - unsafe: [...unsafe], - join: [...join], - handlers: {...handle}, - options: {}, - indexStack: [], - handle: undefined - }; - configure(state, options); - if (state.options.tightDefinitions) { - state.join.push(joinDefinition); - } - state.handle = zwitch('type', { - invalid, - unknown, - handlers: state.handlers - }); - let result = state.handle(tree, undefined, state, { - before: '\n', - after: '\n', - now: {line: 1, column: 1}, - lineShift: 0 - }); - if ( - result && - result.charCodeAt(result.length - 1) !== 10 && - result.charCodeAt(result.length - 1) !== 13 - ) { - result += '\n'; - } - return result - function enter(name) { - state.stack.push(name); - return exit - function exit() { - state.stack.pop(); - } - } -} -function invalid(value) { - throw new Error('Cannot handle value `' + value + '`, expected node') -} -function unknown(value) { - const node = (value); - throw new Error('Cannot handle unknown node `' + node.type + '`') -} -function joinDefinition(left, right) { - if (left.type === 'definition' && left.type === right.type) { - return 0 - } -} -function containerPhrasingBound(parent, info) { - return containerPhrasing(parent, this, info) -} -function containerFlowBound(parent, info) { - return containerFlow(parent, this, info) -} -function safeBound(value, config) { - return safe(this, value, config) -} - -function remarkStringify(options) { - const self = this; - self.compiler = compiler; - function compiler(tree) { - return toMarkdown(tree, { - ...self.data('settings'), - ...options, - extensions: self.data('toMarkdownExtensions') || [] - }) - } -} - -function ccount(value, character) { - const source = String(value); - if (typeof character !== 'string') { - throw new TypeError('Expected character') - } - let count = 0; - let index = source.indexOf(character); - while (index !== -1) { - count++; - index = source.indexOf(character, index + character.length); - } - return count -} - -function escapeStringRegexp(string) { - if (typeof string !== 'string') { - throw new TypeError('Expected a string'); - } - return string - .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') - .replace(/-/g, '\\x2d'); -} - -function findAndReplace(tree, list, options) { - const settings = options || {}; - const ignored = convert(settings.ignore || []); - const pairs = toPairs(list); - let pairIndex = -1; - while (++pairIndex < pairs.length) { - visitParents(tree, 'text', visitor); - } - function visitor(node, parents) { - let index = -1; - let grandparent; - while (++index < parents.length) { - const parent = parents[index]; - const siblings = grandparent ? grandparent.children : undefined; - if ( - ignored( - parent, - siblings ? siblings.indexOf(parent) : undefined, - grandparent - ) - ) { - return - } - grandparent = parent; - } - if (grandparent) { - return handler(node, parents) - } - } - function handler(node, parents) { - const parent = parents[parents.length - 1]; - const find = pairs[pairIndex][0]; - const replace = pairs[pairIndex][1]; - let start = 0; - const siblings = parent.children; - const index = siblings.indexOf(node); - let change = false; - let nodes = []; - find.lastIndex = 0; - let match = find.exec(node.value); - while (match) { - const position = match.index; - const matchObject = { - index: match.index, - input: match.input, - stack: [...parents, node] - }; - let value = replace(...match, matchObject); - if (typeof value === 'string') { - value = value.length > 0 ? {type: 'text', value} : undefined; - } - if (value === false) { - find.lastIndex = position + 1; - } else { - if (start !== position) { - nodes.push({ - type: 'text', - value: node.value.slice(start, position) - }); - } - if (Array.isArray(value)) { - nodes.push(...value); - } else if (value) { - nodes.push(value); - } - start = position + match[0].length; - change = true; - } - if (!find.global) { - break - } - match = find.exec(node.value); - } - if (change) { - if (start < node.value.length) { - nodes.push({type: 'text', value: node.value.slice(start)}); - } - parent.children.splice(index, 1, ...nodes); - } else { - nodes = [node]; - } - return index + nodes.length - } -} -function toPairs(tupleOrList) { - const result = []; - if (!Array.isArray(tupleOrList)) { - throw new TypeError('Expected find and replace tuple or list of tuples') - } - const list = - !tupleOrList[0] || Array.isArray(tupleOrList[0]) - ? tupleOrList - : [tupleOrList]; - let index = -1; - while (++index < list.length) { - const tuple = list[index]; - result.push([toExpression(tuple[0]), toFunction(tuple[1])]); - } - return result -} -function toExpression(find) { - return typeof find === 'string' ? new RegExp(escapeStringRegexp(find), 'g') : find -} -function toFunction(replace) { - return typeof replace === 'function' - ? replace - : function () { - return replace - } -} - -const inConstruct = 'phrasing'; -const notInConstruct = ['autolink', 'link', 'image', 'label']; -function gfmAutolinkLiteralFromMarkdown() { - return { - transforms: [transformGfmAutolinkLiterals], - enter: { - literalAutolink: enterLiteralAutolink, - literalAutolinkEmail: enterLiteralAutolinkValue, - literalAutolinkHttp: enterLiteralAutolinkValue, - literalAutolinkWww: enterLiteralAutolinkValue - }, - exit: { - literalAutolink: exitLiteralAutolink, - literalAutolinkEmail: exitLiteralAutolinkEmail, - literalAutolinkHttp: exitLiteralAutolinkHttp, - literalAutolinkWww: exitLiteralAutolinkWww - } - } -} -function gfmAutolinkLiteralToMarkdown() { - return { - unsafe: [ - { - character: '@', - before: '[+\\-.\\w]', - after: '[\\-.\\w]', - inConstruct, - notInConstruct - }, - { - character: '.', - before: '[Ww]', - after: '[\\-.\\w]', - inConstruct, - notInConstruct - }, - { - character: ':', - before: '[ps]', - after: '\\/', - inConstruct, - notInConstruct - } - ] - } -} -function enterLiteralAutolink(token) { - this.enter({type: 'link', title: null, url: '', children: []}, token); -} -function enterLiteralAutolinkValue(token) { - this.config.enter.autolinkProtocol.call(this, token); -} -function exitLiteralAutolinkHttp(token) { - this.config.exit.autolinkProtocol.call(this, token); -} -function exitLiteralAutolinkWww(token) { - this.config.exit.data.call(this, token); - const node = this.stack[this.stack.length - 1]; - ok$1(node.type === 'link'); - node.url = 'http://' + this.sliceSerialize(token); -} -function exitLiteralAutolinkEmail(token) { - this.config.exit.autolinkEmail.call(this, token); -} -function exitLiteralAutolink(token) { - this.exit(token); -} -function transformGfmAutolinkLiterals(tree) { - findAndReplace( - tree, - [ - [/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi, findUrl], - [/(?<=^|\s|\p{P}|\p{S})([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/gu, findEmail] - ], - {ignore: ['link', 'linkReference']} - ); -} -function findUrl(_, protocol, domain, path, match) { - let prefix = ''; - if (!previous(match)) { - return false - } - if (/^w/i.test(protocol)) { - domain = protocol + domain; - protocol = ''; - prefix = 'http://'; - } - if (!isCorrectDomain(domain)) { - return false - } - const parts = splitUrl(domain + path); - if (!parts[0]) return false - const result = { - type: 'link', - title: null, - url: prefix + protocol + parts[0], - children: [{type: 'text', value: protocol + parts[0]}] - }; - if (parts[1]) { - return [result, {type: 'text', value: parts[1]}] - } - return result -} -function findEmail(_, atext, label, match) { - if ( - !previous(match, true) || - /[-\d_]$/.test(label) - ) { - return false - } - return { - type: 'link', - title: null, - url: 'mailto:' + atext + '@' + label, - children: [{type: 'text', value: atext + '@' + label}] - } -} -function isCorrectDomain(domain) { - const parts = domain.split('.'); - if ( - parts.length < 2 || - (parts[parts.length - 1] && - (/_/.test(parts[parts.length - 1]) || - !/[a-zA-Z\d]/.test(parts[parts.length - 1]))) || - (parts[parts.length - 2] && - (/_/.test(parts[parts.length - 2]) || - !/[a-zA-Z\d]/.test(parts[parts.length - 2]))) - ) { - return false - } - return true -} -function splitUrl(url) { - const trailExec = /[!"&'),.:;<>?\]}]+$/.exec(url); - if (!trailExec) { - return [url, undefined] - } - url = url.slice(0, trailExec.index); - let trail = trailExec[0]; - let closingParenIndex = trail.indexOf(')'); - const openingParens = ccount(url, '('); - let closingParens = ccount(url, ')'); - while (closingParenIndex !== -1 && openingParens > closingParens) { - url += trail.slice(0, closingParenIndex + 1); - trail = trail.slice(closingParenIndex + 1); - closingParenIndex = trail.indexOf(')'); - closingParens++; - } - return [url, trail] -} -function previous(match, email) { - const code = match.input.charCodeAt(match.index - 1); - return ( - (match.index === 0 || - unicodeWhitespace(code) || - unicodePunctuation(code)) && - (!email || code !== 47) - ) -} - -footnoteReference.peek = footnoteReferencePeek; -function gfmFootnoteFromMarkdown() { - return { - enter: { - gfmFootnoteDefinition: enterFootnoteDefinition, - gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString, - gfmFootnoteCall: enterFootnoteCall, - gfmFootnoteCallString: enterFootnoteCallString - }, - exit: { - gfmFootnoteDefinition: exitFootnoteDefinition, - gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString, - gfmFootnoteCall: exitFootnoteCall, - gfmFootnoteCallString: exitFootnoteCallString - } - } -} -function gfmFootnoteToMarkdown() { - return { - unsafe: [{character: '[', inConstruct: ['phrasing', 'label', 'reference']}], - handlers: {footnoteDefinition, footnoteReference} - } -} -function enterFootnoteDefinition(token) { - this.enter( - {type: 'footnoteDefinition', identifier: '', label: '', children: []}, - token - ); -} -function enterFootnoteDefinitionLabelString() { - this.buffer(); -} -function exitFootnoteDefinitionLabelString(token) { - const label = this.resume(); - const node = this.stack[this.stack.length - 1]; - ok$1(node.type === 'footnoteDefinition'); - node.label = label; - node.identifier = normalizeIdentifier( - this.sliceSerialize(token) - ).toLowerCase(); -} -function exitFootnoteDefinition(token) { - this.exit(token); -} -function enterFootnoteCall(token) { - this.enter({type: 'footnoteReference', identifier: '', label: ''}, token); -} -function enterFootnoteCallString() { - this.buffer(); -} -function exitFootnoteCallString(token) { - const label = this.resume(); - const node = this.stack[this.stack.length - 1]; - ok$1(node.type === 'footnoteReference'); - node.label = label; - node.identifier = normalizeIdentifier( - this.sliceSerialize(token) - ).toLowerCase(); -} -function exitFootnoteCall(token) { - this.exit(token); -} -function footnoteReference(node, _, state, info) { - const tracker = state.createTracker(info); - let value = tracker.move('[^'); - const exit = state.enter('footnoteReference'); - const subexit = state.enter('reference'); - value += tracker.move( - state.safe(state.associationId(node), { - ...tracker.current(), - before: value, - after: ']' - }) - ); - subexit(); - exit(); - value += tracker.move(']'); - return value -} -function footnoteReferencePeek() { - return '[' -} -function footnoteDefinition(node, _, state, info) { - const tracker = state.createTracker(info); - let value = tracker.move('[^'); - const exit = state.enter('footnoteDefinition'); - const subexit = state.enter('label'); - value += tracker.move( - state.safe(state.associationId(node), { - ...tracker.current(), - before: value, - after: ']' - }) - ); - subexit(); - value += tracker.move( - ']:' + (node.children && node.children.length > 0 ? ' ' : '') - ); - tracker.shift(4); - value += tracker.move( - state.indentLines(state.containerFlow(node, tracker.current()), map$1) - ); - exit(); - return value -} -function map$1(line, index, blank) { - if (index === 0) { - return line - } - return (blank ? '' : ' ') + line -} - -const constructsWithoutStrikethrough = [ - 'autolink', - 'destinationLiteral', - 'destinationRaw', - 'reference', - 'titleQuote', - 'titleApostrophe' -]; -handleDelete.peek = peekDelete; -function gfmStrikethroughFromMarkdown() { - return { - canContainEols: ['delete'], - enter: {strikethrough: enterStrikethrough}, - exit: {strikethrough: exitStrikethrough} - } -} -function gfmStrikethroughToMarkdown() { - return { - unsafe: [ - { - character: '~', - inConstruct: 'phrasing', - notInConstruct: constructsWithoutStrikethrough - } - ], - handlers: {delete: handleDelete} - } -} -function enterStrikethrough(token) { - this.enter({type: 'delete', children: []}, token); -} -function exitStrikethrough(token) { - this.exit(token); -} -function handleDelete(node, _, state, info) { - const tracker = state.createTracker(info); - const exit = state.enter('strikethrough'); - let value = tracker.move('~~'); - value += state.containerPhrasing(node, { - ...tracker.current(), - before: value, - after: '~' - }); - value += tracker.move('~~'); - exit(); - return value -} -function peekDelete() { - return '~' -} - -function markdownTable(table, options = {}) { - const align = (options.align || []).concat(); - const stringLength = options.stringLength || defaultStringLength; - const alignments = []; - const cellMatrix = []; - const sizeMatrix = []; - const longestCellByColumn = []; - let mostCellsPerRow = 0; - let rowIndex = -1; - while (++rowIndex < table.length) { - const row = []; - const sizes = []; - let columnIndex = -1; - if (table[rowIndex].length > mostCellsPerRow) { - mostCellsPerRow = table[rowIndex].length; - } - while (++columnIndex < table[rowIndex].length) { - const cell = serialize(table[rowIndex][columnIndex]); - if (options.alignDelimiters !== false) { - const size = stringLength(cell); - sizes[columnIndex] = size; - if ( - longestCellByColumn[columnIndex] === undefined || - size > longestCellByColumn[columnIndex] - ) { - longestCellByColumn[columnIndex] = size; - } - } - row.push(cell); - } - cellMatrix[rowIndex] = row; - sizeMatrix[rowIndex] = sizes; - } - let columnIndex = -1; - if (typeof align === 'object' && 'length' in align) { - while (++columnIndex < mostCellsPerRow) { - alignments[columnIndex] = toAlignment(align[columnIndex]); - } - } else { - const code = toAlignment(align); - while (++columnIndex < mostCellsPerRow) { - alignments[columnIndex] = code; - } - } - columnIndex = -1; - const row = []; - const sizes = []; - while (++columnIndex < mostCellsPerRow) { - const code = alignments[columnIndex]; - let before = ''; - let after = ''; - if (code === 99 ) { - before = ':'; - after = ':'; - } else if (code === 108 ) { - before = ':'; - } else if (code === 114 ) { - after = ':'; - } - let size = - options.alignDelimiters === false - ? 1 - : Math.max( - 1, - longestCellByColumn[columnIndex] - before.length - after.length - ); - const cell = before + '-'.repeat(size) + after; - if (options.alignDelimiters !== false) { - size = before.length + size + after.length; - if (size > longestCellByColumn[columnIndex]) { - longestCellByColumn[columnIndex] = size; - } - sizes[columnIndex] = size; - } - row[columnIndex] = cell; - } - cellMatrix.splice(1, 0, row); - sizeMatrix.splice(1, 0, sizes); - rowIndex = -1; - const lines = []; - while (++rowIndex < cellMatrix.length) { - const row = cellMatrix[rowIndex]; - const sizes = sizeMatrix[rowIndex]; - columnIndex = -1; - const line = []; - while (++columnIndex < mostCellsPerRow) { - const cell = row[columnIndex] || ''; - let before = ''; - let after = ''; - if (options.alignDelimiters !== false) { - const size = - longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0); - const code = alignments[columnIndex]; - if (code === 114 ) { - before = ' '.repeat(size); - } else if (code === 99 ) { - if (size % 2) { - before = ' '.repeat(size / 2 + 0.5); - after = ' '.repeat(size / 2 - 0.5); - } else { - before = ' '.repeat(size / 2); - after = before; - } - } else { - after = ' '.repeat(size); - } - } - if (options.delimiterStart !== false && !columnIndex) { - line.push('|'); - } - if ( - options.padding !== false && - !(options.alignDelimiters === false && cell === '') && - (options.delimiterStart !== false || columnIndex) - ) { - line.push(' '); - } - if (options.alignDelimiters !== false) { - line.push(before); - } - line.push(cell); - if (options.alignDelimiters !== false) { - line.push(after); - } - if (options.padding !== false) { - line.push(' '); - } - if ( - options.delimiterEnd !== false || - columnIndex !== mostCellsPerRow - 1 - ) { - line.push('|'); - } - } - lines.push( - options.delimiterEnd === false - ? line.join('').replace(/ +$/, '') - : line.join('') - ); - } - return lines.join('\n') -} -function serialize(value) { - return value === null || value === undefined ? '' : String(value) -} -function defaultStringLength(value) { - return value.length -} -function toAlignment(value) { - const code = typeof value === 'string' ? value.codePointAt(0) : 0; - return code === 67 || code === 99 - ? 99 - : code === 76 || code === 108 - ? 108 - : code === 82 || code === 114 - ? 114 - : 0 -} - -function gfmTableFromMarkdown() { - return { - enter: { - table: enterTable, - tableData: enterCell, - tableHeader: enterCell, - tableRow: enterRow - }, - exit: { - codeText: exitCodeText, - table: exitTable, - tableData: exit, - tableHeader: exit, - tableRow: exit - } - } -} -function enterTable(token) { - const align = token._align; - this.enter( - { - type: 'table', - align: align.map(function (d) { - return d === 'none' ? null : d - }), - children: [] - }, - token - ); - this.data.inTable = true; -} -function exitTable(token) { - this.exit(token); - this.data.inTable = undefined; -} -function enterRow(token) { - this.enter({type: 'tableRow', children: []}, token); -} -function exit(token) { - this.exit(token); -} -function enterCell(token) { - this.enter({type: 'tableCell', children: []}, token); -} -function exitCodeText(token) { - let value = this.resume(); - if (this.data.inTable) { - value = value.replace(/\\([\\|])/g, replace); - } - const node = this.stack[this.stack.length - 1]; - ok$1(node.type === 'inlineCode'); - node.value = value; - this.exit(token); -} -function replace($0, $1) { - return $1 === '|' ? $1 : $0 -} -function gfmTableToMarkdown(options) { - const settings = options || {}; - const padding = settings.tableCellPadding; - const alignDelimiters = settings.tablePipeAlign; - const stringLength = settings.stringLength; - const around = padding ? ' ' : '|'; - return { - unsafe: [ - {character: '\r', inConstruct: 'tableCell'}, - {character: '\n', inConstruct: 'tableCell'}, - {atBreak: true, character: '|', after: '[\t :-]'}, - {character: '|', inConstruct: 'tableCell'}, - {atBreak: true, character: ':', after: '-'}, - {atBreak: true, character: '-', after: '[:|-]'} - ], - handlers: { - inlineCode: inlineCodeWithTable, - table: handleTable, - tableCell: handleTableCell, - tableRow: handleTableRow - } - } - function handleTable(node, _, state, info) { - return serializeData(handleTableAsData(node, state, info), node.align) - } - function handleTableRow(node, _, state, info) { - const row = handleTableRowAsData(node, state, info); - const value = serializeData([row]); - return value.slice(0, value.indexOf('\n')) - } - function handleTableCell(node, _, state, info) { - const exit = state.enter('tableCell'); - const subexit = state.enter('phrasing'); - const value = state.containerPhrasing(node, { - ...info, - before: around, - after: around - }); - subexit(); - exit(); - return value - } - function serializeData(matrix, align) { - return markdownTable(matrix, { - align, - alignDelimiters, - padding, - stringLength - }) - } - function handleTableAsData(node, state, info) { - const children = node.children; - let index = -1; - const result = []; - const subexit = state.enter('table'); - while (++index < children.length) { - result[index] = handleTableRowAsData(children[index], state, info); - } - subexit(); - return result - } - function handleTableRowAsData(node, state, info) { - const children = node.children; - let index = -1; - const result = []; - const subexit = state.enter('tableRow'); - while (++index < children.length) { - result[index] = handleTableCell(children[index], node, state, info); - } - subexit(); - return result - } - function inlineCodeWithTable(node, parent, state) { - let value = handle.inlineCode(node, parent, state); - if (state.stack.includes('tableCell')) { - value = value.replace(/\|/g, '\\$&'); - } - return value - } -} - -function gfmTaskListItemFromMarkdown() { - return { - exit: { - taskListCheckValueChecked: exitCheck, - taskListCheckValueUnchecked: exitCheck, - paragraph: exitParagraphWithTaskListItem - } - } -} -function gfmTaskListItemToMarkdown() { - return { - unsafe: [{atBreak: true, character: '-', after: '[:|-]'}], - handlers: {listItem: listItemWithTaskListItem} - } -} -function exitCheck(token) { - const node = this.stack[this.stack.length - 2]; - ok$1(node.type === 'listItem'); - node.checked = token.type === 'taskListCheckValueChecked'; -} -function exitParagraphWithTaskListItem(token) { - const parent = this.stack[this.stack.length - 2]; - if ( - parent && - parent.type === 'listItem' && - typeof parent.checked === 'boolean' - ) { - const node = this.stack[this.stack.length - 1]; - ok$1(node.type === 'paragraph'); - const head = node.children[0]; - if (head && head.type === 'text') { - const siblings = parent.children; - let index = -1; - let firstParaghraph; - while (++index < siblings.length) { - const sibling = siblings[index]; - if (sibling.type === 'paragraph') { - firstParaghraph = sibling; - break - } - } - if (firstParaghraph === node) { - head.value = head.value.slice(1); - if (head.value.length === 0) { - node.children.shift(); - } else if ( - node.position && - head.position && - typeof head.position.start.offset === 'number' - ) { - head.position.start.column++; - head.position.start.offset++; - node.position.start = Object.assign({}, head.position.start); - } - } - } - } - this.exit(token); -} -function listItemWithTaskListItem(node, parent, state, info) { - const head = node.children[0]; - const checkable = - typeof node.checked === 'boolean' && head && head.type === 'paragraph'; - const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '; - const tracker = state.createTracker(info); - if (checkable) { - tracker.move(checkbox); - } - let value = handle.listItem(node, parent, state, { - ...info, - ...tracker.current() - }); - if (checkable) { - value = value.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/, check); - } - return value - function check($0) { - return $0 + checkbox - } -} - -function gfmFromMarkdown() { - return [ - gfmAutolinkLiteralFromMarkdown(), - gfmFootnoteFromMarkdown(), - gfmStrikethroughFromMarkdown(), - gfmTableFromMarkdown(), - gfmTaskListItemFromMarkdown() - ] -} -function gfmToMarkdown(options) { - return { - extensions: [ - gfmAutolinkLiteralToMarkdown(), - gfmFootnoteToMarkdown(), - gfmStrikethroughToMarkdown(), - gfmTableToMarkdown(options), - gfmTaskListItemToMarkdown() - ] - } -} - -const wwwPrefix = { - tokenize: tokenizeWwwPrefix, - partial: true -}; -const domain = { - tokenize: tokenizeDomain, - partial: true -}; -const path = { - tokenize: tokenizePath, - partial: true -}; -const trail = { - tokenize: tokenizeTrail, - partial: true -}; -const emailDomainDotTrail = { - tokenize: tokenizeEmailDomainDotTrail, - partial: true -}; -const wwwAutolink = { - name: 'wwwAutolink', - tokenize: tokenizeWwwAutolink, - previous: previousWww -}; -const protocolAutolink = { - name: 'protocolAutolink', - tokenize: tokenizeProtocolAutolink, - previous: previousProtocol -}; -const emailAutolink = { - name: 'emailAutolink', - tokenize: tokenizeEmailAutolink, - previous: previousEmail -}; -const text = {}; -function gfmAutolinkLiteral() { - return { - text - }; -} -let code = 48; -while (code < 123) { - text[code] = emailAutolink; - code++; - if (code === 58) code = 65;else if (code === 91) code = 97; -} -text[43] = emailAutolink; -text[45] = emailAutolink; -text[46] = emailAutolink; -text[95] = emailAutolink; -text[72] = [emailAutolink, protocolAutolink]; -text[104] = [emailAutolink, protocolAutolink]; -text[87] = [emailAutolink, wwwAutolink]; -text[119] = [emailAutolink, wwwAutolink]; -function tokenizeEmailAutolink(effects, ok, nok) { - const self = this; - let dot; - let data; - return start; - function start(code) { - if (!gfmAtext(code) || !previousEmail.call(self, self.previous) || previousUnbalanced(self.events)) { - return nok(code); - } - effects.enter('literalAutolink'); - effects.enter('literalAutolinkEmail'); - return atext(code); - } - function atext(code) { - if (gfmAtext(code)) { - effects.consume(code); - return atext; - } - if (code === 64) { - effects.consume(code); - return emailDomain; - } - return nok(code); - } - function emailDomain(code) { - if (code === 46) { - return effects.check(emailDomainDotTrail, emailDomainAfter, emailDomainDot)(code); - } - if (code === 45 || code === 95 || asciiAlphanumeric(code)) { - data = true; - effects.consume(code); - return emailDomain; - } - return emailDomainAfter(code); - } - function emailDomainDot(code) { - effects.consume(code); - dot = true; - return emailDomain; - } - function emailDomainAfter(code) { - if (data && dot && asciiAlpha(self.previous)) { - effects.exit('literalAutolinkEmail'); - effects.exit('literalAutolink'); - return ok(code); - } - return nok(code); - } -} -function tokenizeWwwAutolink(effects, ok, nok) { - const self = this; - return wwwStart; - function wwwStart(code) { - if (code !== 87 && code !== 119 || !previousWww.call(self, self.previous) || previousUnbalanced(self.events)) { - return nok(code); - } - effects.enter('literalAutolink'); - effects.enter('literalAutolinkWww'); - return effects.check(wwwPrefix, effects.attempt(domain, effects.attempt(path, wwwAfter), nok), nok)(code); - } - function wwwAfter(code) { - effects.exit('literalAutolinkWww'); - effects.exit('literalAutolink'); - return ok(code); - } -} -function tokenizeProtocolAutolink(effects, ok, nok) { - const self = this; - let buffer = ''; - let seen = false; - return protocolStart; - function protocolStart(code) { - if ((code === 72 || code === 104) && previousProtocol.call(self, self.previous) && !previousUnbalanced(self.events)) { - effects.enter('literalAutolink'); - effects.enter('literalAutolinkHttp'); - buffer += String.fromCodePoint(code); - effects.consume(code); - return protocolPrefixInside; - } - return nok(code); - } - function protocolPrefixInside(code) { - if (asciiAlpha(code) && buffer.length < 5) { - buffer += String.fromCodePoint(code); - effects.consume(code); - return protocolPrefixInside; - } - if (code === 58) { - const protocol = buffer.toLowerCase(); - if (protocol === 'http' || protocol === 'https') { - effects.consume(code); - return protocolSlashesInside; - } - } - return nok(code); - } - function protocolSlashesInside(code) { - if (code === 47) { - effects.consume(code); - if (seen) { - return afterProtocol; - } - seen = true; - return protocolSlashesInside; - } - return nok(code); - } - function afterProtocol(code) { - return code === null || asciiControl(code) || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || unicodePunctuation(code) ? nok(code) : effects.attempt(domain, effects.attempt(path, protocolAfter), nok)(code); - } - function protocolAfter(code) { - effects.exit('literalAutolinkHttp'); - effects.exit('literalAutolink'); - return ok(code); - } -} -function tokenizeWwwPrefix(effects, ok, nok) { - let size = 0; - return wwwPrefixInside; - function wwwPrefixInside(code) { - if ((code === 87 || code === 119) && size < 3) { - size++; - effects.consume(code); - return wwwPrefixInside; - } - if (code === 46 && size === 3) { - effects.consume(code); - return wwwPrefixAfter; - } - return nok(code); - } - function wwwPrefixAfter(code) { - return code === null ? nok(code) : ok(code); - } -} -function tokenizeDomain(effects, ok, nok) { - let underscoreInLastSegment; - let underscoreInLastLastSegment; - let seen; - return domainInside; - function domainInside(code) { - if (code === 46 || code === 95) { - return effects.check(trail, domainAfter, domainAtPunctuation)(code); - } - if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || code !== 45 && unicodePunctuation(code)) { - return domainAfter(code); - } - seen = true; - effects.consume(code); - return domainInside; - } - function domainAtPunctuation(code) { - if (code === 95) { - underscoreInLastSegment = true; - } - else { - underscoreInLastLastSegment = underscoreInLastSegment; - underscoreInLastSegment = undefined; - } - effects.consume(code); - return domainInside; - } - function domainAfter(code) { - if (underscoreInLastLastSegment || underscoreInLastSegment || !seen) { - return nok(code); - } - return ok(code); - } -} -function tokenizePath(effects, ok) { - let sizeOpen = 0; - let sizeClose = 0; - return pathInside; - function pathInside(code) { - if (code === 40) { - sizeOpen++; - effects.consume(code); - return pathInside; - } - if (code === 41 && sizeClose < sizeOpen) { - return pathAtPunctuation(code); - } - if (code === 33 || code === 34 || code === 38 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 60 || code === 63 || code === 93 || code === 95 || code === 126) { - return effects.check(trail, ok, pathAtPunctuation)(code); - } - if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) { - return ok(code); - } - effects.consume(code); - return pathInside; - } - function pathAtPunctuation(code) { - if (code === 41) { - sizeClose++; - } - effects.consume(code); - return pathInside; - } -} -function tokenizeTrail(effects, ok, nok) { - return trail; - function trail(code) { - if (code === 33 || code === 34 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 63 || code === 95 || code === 126) { - effects.consume(code); - return trail; - } - if (code === 38) { - effects.consume(code); - return trailCharacterReferenceStart; - } - if (code === 93) { - effects.consume(code); - return trailBracketAfter; - } - if ( - code === 60 || - code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) { - return ok(code); - } - return nok(code); - } - function trailBracketAfter(code) { - if (code === null || code === 40 || code === 91 || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) { - return ok(code); - } - return trail(code); - } - function trailCharacterReferenceStart(code) { - return asciiAlpha(code) ? trailCharacterReferenceInside(code) : nok(code); - } - function trailCharacterReferenceInside(code) { - if (code === 59) { - effects.consume(code); - return trail; - } - if (asciiAlpha(code)) { - effects.consume(code); - return trailCharacterReferenceInside; - } - return nok(code); - } -} -function tokenizeEmailDomainDotTrail(effects, ok, nok) { - return start; - function start(code) { - effects.consume(code); - return after; - } - function after(code) { - return asciiAlphanumeric(code) ? nok(code) : ok(code); - } -} -function previousWww(code) { - return code === null || code === 40 || code === 42 || code === 95 || code === 91 || code === 93 || code === 126 || markdownLineEndingOrSpace(code); -} -function previousProtocol(code) { - return !asciiAlpha(code); -} -function previousEmail(code) { - return !(code === 47 || gfmAtext(code)); -} -function gfmAtext(code) { - return code === 43 || code === 45 || code === 46 || code === 95 || asciiAlphanumeric(code); -} -function previousUnbalanced(events) { - let index = events.length; - let result = false; - while (index--) { - const token = events[index][1]; - if ((token.type === 'labelLink' || token.type === 'labelImage') && !token._balanced) { - result = true; - break; - } - if (token._gfmAutolinkLiteralWalkedInto) { - result = false; - break; - } - } - if (events.length > 0 && !result) { - events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true; - } - return result; -} - -const indent = { - tokenize: tokenizeIndent, - partial: true -}; -function gfmFootnote() { - return { - document: { - [91]: { - name: 'gfmFootnoteDefinition', - tokenize: tokenizeDefinitionStart, - continuation: { - tokenize: tokenizeDefinitionContinuation - }, - exit: gfmFootnoteDefinitionEnd - } - }, - text: { - [91]: { - name: 'gfmFootnoteCall', - tokenize: tokenizeGfmFootnoteCall - }, - [93]: { - name: 'gfmPotentialFootnoteCall', - add: 'after', - tokenize: tokenizePotentialGfmFootnoteCall, - resolveTo: resolveToPotentialGfmFootnoteCall - } - } - }; -} -function tokenizePotentialGfmFootnoteCall(effects, ok, nok) { - const self = this; - let index = self.events.length; - const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []); - let labelStart; - while (index--) { - const token = self.events[index][1]; - if (token.type === "labelImage") { - labelStart = token; - break; - } - if (token.type === 'gfmFootnoteCall' || token.type === "labelLink" || token.type === "label" || token.type === "image" || token.type === "link") { - break; - } - } - return start; - function start(code) { - if (!labelStart || !labelStart._balanced) { - return nok(code); - } - const id = normalizeIdentifier(self.sliceSerialize({ - start: labelStart.end, - end: self.now() - })); - if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) { - return nok(code); - } - effects.enter('gfmFootnoteCallLabelMarker'); - effects.consume(code); - effects.exit('gfmFootnoteCallLabelMarker'); - return ok(code); - } -} -function resolveToPotentialGfmFootnoteCall(events, context) { - let index = events.length; - while (index--) { - if (events[index][1].type === "labelImage" && events[index][0] === 'enter') { - events[index][1]; - break; - } - } - events[index + 1][1].type = "data"; - events[index + 3][1].type = 'gfmFootnoteCallLabelMarker'; - const call = { - type: 'gfmFootnoteCall', - start: Object.assign({}, events[index + 3][1].start), - end: Object.assign({}, events[events.length - 1][1].end) - }; - const marker = { - type: 'gfmFootnoteCallMarker', - start: Object.assign({}, events[index + 3][1].end), - end: Object.assign({}, events[index + 3][1].end) - }; - marker.end.column++; - marker.end.offset++; - marker.end._bufferIndex++; - const string = { - type: 'gfmFootnoteCallString', - start: Object.assign({}, marker.end), - end: Object.assign({}, events[events.length - 1][1].start) - }; - const chunk = { - type: "chunkString", - contentType: 'string', - start: Object.assign({}, string.start), - end: Object.assign({}, string.end) - }; - const replacement = [ - events[index + 1], events[index + 2], ['enter', call, context], - events[index + 3], events[index + 4], - ['enter', marker, context], ['exit', marker, context], - ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context], - events[events.length - 2], events[events.length - 1], ['exit', call, context]]; - events.splice(index, events.length - index + 1, ...replacement); - return events; -} -function tokenizeGfmFootnoteCall(effects, ok, nok) { - const self = this; - const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []); - let size = 0; - let data; - return start; - function start(code) { - effects.enter('gfmFootnoteCall'); - effects.enter('gfmFootnoteCallLabelMarker'); - effects.consume(code); - effects.exit('gfmFootnoteCallLabelMarker'); - return callStart; - } - function callStart(code) { - if (code !== 94) return nok(code); - effects.enter('gfmFootnoteCallMarker'); - effects.consume(code); - effects.exit('gfmFootnoteCallMarker'); - effects.enter('gfmFootnoteCallString'); - effects.enter('chunkString').contentType = 'string'; - return callData; - } - function callData(code) { - if ( - size > 999 || - code === 93 && !data || - code === null || code === 91 || markdownLineEndingOrSpace(code)) { - return nok(code); - } - if (code === 93) { - effects.exit('chunkString'); - const token = effects.exit('gfmFootnoteCallString'); - if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) { - return nok(code); - } - effects.enter('gfmFootnoteCallLabelMarker'); - effects.consume(code); - effects.exit('gfmFootnoteCallLabelMarker'); - effects.exit('gfmFootnoteCall'); - return ok; - } - if (!markdownLineEndingOrSpace(code)) { - data = true; - } - size++; - effects.consume(code); - return code === 92 ? callEscape : callData; - } - function callEscape(code) { - if (code === 91 || code === 92 || code === 93) { - effects.consume(code); - size++; - return callData; - } - return callData(code); - } -} -function tokenizeDefinitionStart(effects, ok, nok) { - const self = this; - const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []); - let identifier; - let size = 0; - let data; - return start; - function start(code) { - effects.enter('gfmFootnoteDefinition')._container = true; - effects.enter('gfmFootnoteDefinitionLabel'); - effects.enter('gfmFootnoteDefinitionLabelMarker'); - effects.consume(code); - effects.exit('gfmFootnoteDefinitionLabelMarker'); - return labelAtMarker; - } - function labelAtMarker(code) { - if (code === 94) { - effects.enter('gfmFootnoteDefinitionMarker'); - effects.consume(code); - effects.exit('gfmFootnoteDefinitionMarker'); - effects.enter('gfmFootnoteDefinitionLabelString'); - effects.enter('chunkString').contentType = 'string'; - return labelInside; - } - return nok(code); - } - function labelInside(code) { - if ( - size > 999 || - code === 93 && !data || - code === null || code === 91 || markdownLineEndingOrSpace(code)) { - return nok(code); - } - if (code === 93) { - effects.exit('chunkString'); - const token = effects.exit('gfmFootnoteDefinitionLabelString'); - identifier = normalizeIdentifier(self.sliceSerialize(token)); - effects.enter('gfmFootnoteDefinitionLabelMarker'); - effects.consume(code); - effects.exit('gfmFootnoteDefinitionLabelMarker'); - effects.exit('gfmFootnoteDefinitionLabel'); - return labelAfter; - } - if (!markdownLineEndingOrSpace(code)) { - data = true; - } - size++; - effects.consume(code); - return code === 92 ? labelEscape : labelInside; - } - function labelEscape(code) { - if (code === 91 || code === 92 || code === 93) { - effects.consume(code); - size++; - return labelInside; - } - return labelInside(code); - } - function labelAfter(code) { - if (code === 58) { - effects.enter('definitionMarker'); - effects.consume(code); - effects.exit('definitionMarker'); - if (!defined.includes(identifier)) { - defined.push(identifier); - } - return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace'); - } - return nok(code); - } - function whitespaceAfter(code) { - return ok(code); - } -} -function tokenizeDefinitionContinuation(effects, ok, nok) { - return effects.check(blankLine, ok, effects.attempt(indent, ok, nok)); -} -function gfmFootnoteDefinitionEnd(effects) { - effects.exit('gfmFootnoteDefinition'); -} -function tokenizeIndent(effects, ok, nok) { - const self = this; - return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1); - function afterPrefix(code) { - const tail = self.events[self.events.length - 1]; - return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code); - } -} - -function gfmStrikethrough(options) { - const options_ = options || {}; - let single = options_.singleTilde; - const tokenizer = { - name: 'strikethrough', - tokenize: tokenizeStrikethrough, - resolveAll: resolveAllStrikethrough - }; - if (single === null || single === undefined) { - single = true; - } - return { - text: { - [126]: tokenizer - }, - insideSpan: { - null: [tokenizer] - }, - attentionMarkers: { - null: [126] - } - }; - function resolveAllStrikethrough(events, context) { - let index = -1; - while (++index < events.length) { - if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) { - let open = index; - while (open--) { - if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open && - events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) { - events[index][1].type = 'strikethroughSequence'; - events[open][1].type = 'strikethroughSequence'; - const strikethrough = { - type: 'strikethrough', - start: Object.assign({}, events[open][1].start), - end: Object.assign({}, events[index][1].end) - }; - const text = { - type: 'strikethroughText', - start: Object.assign({}, events[open][1].end), - end: Object.assign({}, events[index][1].start) - }; - const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]]; - const insideSpan = context.parser.constructs.insideSpan.null; - if (insideSpan) { - splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context)); - } - splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]); - splice(events, open - 1, index - open + 3, nextEvents); - index = open + nextEvents.length - 2; - break; - } - } - } - } - index = -1; - while (++index < events.length) { - if (events[index][1].type === 'strikethroughSequenceTemporary') { - events[index][1].type = "data"; - } - } - return events; - } - function tokenizeStrikethrough(effects, ok, nok) { - const previous = this.previous; - const events = this.events; - let size = 0; - return start; - function start(code) { - if (previous === 126 && events[events.length - 1][1].type !== "characterEscape") { - return nok(code); - } - effects.enter('strikethroughSequenceTemporary'); - return more(code); - } - function more(code) { - const before = classifyCharacter(previous); - if (code === 126) { - if (size > 1) return nok(code); - effects.consume(code); - size++; - return more; - } - if (size < 2 && !single) return nok(code); - const token = effects.exit('strikethroughSequenceTemporary'); - const after = classifyCharacter(code); - token._open = !after || after === 2 && Boolean(before); - token._close = !before || before === 2 && Boolean(after); - return ok(code); - } - } -} - -class EditMap { - constructor() { - this.map = []; - } - add(index, remove, add) { - addImplementation(this, index, remove, add); - } - consume(events) { - this.map.sort(function (a, b) { - return a[0] - b[0]; - }); - if (this.map.length === 0) { - return; - } - let index = this.map.length; - const vecs = []; - while (index > 0) { - index -= 1; - vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]); - events.length = this.map[index][0]; - } - vecs.push([...events]); - events.length = 0; - let slice = vecs.pop(); - while (slice) { - events.push(...slice); - slice = vecs.pop(); - } - this.map.length = 0; - } -} -function addImplementation(editMap, at, remove, add) { - let index = 0; - if (remove === 0 && add.length === 0) { - return; - } - while (index < editMap.map.length) { - if (editMap.map[index][0] === at) { - editMap.map[index][1] += remove; - editMap.map[index][2].push(...add); - return; - } - index += 1; - } - editMap.map.push([at, remove, add]); -} - -function gfmTableAlign(events, index) { - let inDelimiterRow = false; - const align = []; - while (index < events.length) { - const event = events[index]; - if (inDelimiterRow) { - if (event[0] === 'enter') { - if (event[1].type === 'tableContent') { - align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none'); - } - } - else if (event[1].type === 'tableContent') { - if (events[index - 1][1].type === 'tableDelimiterMarker') { - const alignIndex = align.length - 1; - align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right'; - } - } - else if (event[1].type === 'tableDelimiterRow') { - break; - } - } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') { - inDelimiterRow = true; - } - index += 1; - } - return align; -} - -function gfmTable() { - return { - flow: { - null: { - name: 'table', - tokenize: tokenizeTable, - resolveAll: resolveTable - } - } - }; -} -function tokenizeTable(effects, ok, nok) { - const self = this; - let size = 0; - let sizeB = 0; - let seen; - return start; - function start(code) { - let index = self.events.length - 1; - while (index > -1) { - const type = self.events[index][1].type; - if (type === "lineEnding" || - type === "linePrefix") index--;else break; - } - const tail = index > -1 ? self.events[index][1].type : null; - const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore; - if (next === bodyRowStart && self.parser.lazy[self.now().line]) { - return nok(code); - } - return next(code); - } - function headRowBefore(code) { - effects.enter('tableHead'); - effects.enter('tableRow'); - return headRowStart(code); - } - function headRowStart(code) { - if (code === 124) { - return headRowBreak(code); - } - seen = true; - sizeB += 1; - return headRowBreak(code); - } - function headRowBreak(code) { - if (code === null) { - return nok(code); - } - if (markdownLineEnding(code)) { - if (sizeB > 1) { - sizeB = 0; - self.interrupt = true; - effects.exit('tableRow'); - effects.enter("lineEnding"); - effects.consume(code); - effects.exit("lineEnding"); - return headDelimiterStart; - } - return nok(code); - } - if (markdownSpace(code)) { - return factorySpace(effects, headRowBreak, "whitespace")(code); - } - sizeB += 1; - if (seen) { - seen = false; - size += 1; - } - if (code === 124) { - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - seen = true; - return headRowBreak; - } - effects.enter("data"); - return headRowData(code); - } - function headRowData(code) { - if (code === null || code === 124 || markdownLineEndingOrSpace(code)) { - effects.exit("data"); - return headRowBreak(code); - } - effects.consume(code); - return code === 92 ? headRowEscape : headRowData; - } - function headRowEscape(code) { - if (code === 92 || code === 124) { - effects.consume(code); - return headRowData; - } - return headRowData(code); - } - function headDelimiterStart(code) { - self.interrupt = false; - if (self.parser.lazy[self.now().line]) { - return nok(code); - } - effects.enter('tableDelimiterRow'); - seen = false; - if (markdownSpace(code)) { - return factorySpace(effects, headDelimiterBefore, "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code); - } - return headDelimiterBefore(code); - } - function headDelimiterBefore(code) { - if (code === 45 || code === 58) { - return headDelimiterValueBefore(code); - } - if (code === 124) { - seen = true; - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - return headDelimiterCellBefore; - } - return headDelimiterNok(code); - } - function headDelimiterCellBefore(code) { - if (markdownSpace(code)) { - return factorySpace(effects, headDelimiterValueBefore, "whitespace")(code); - } - return headDelimiterValueBefore(code); - } - function headDelimiterValueBefore(code) { - if (code === 58) { - sizeB += 1; - seen = true; - effects.enter('tableDelimiterMarker'); - effects.consume(code); - effects.exit('tableDelimiterMarker'); - return headDelimiterLeftAlignmentAfter; - } - if (code === 45) { - sizeB += 1; - return headDelimiterLeftAlignmentAfter(code); - } - if (code === null || markdownLineEnding(code)) { - return headDelimiterCellAfter(code); - } - return headDelimiterNok(code); - } - function headDelimiterLeftAlignmentAfter(code) { - if (code === 45) { - effects.enter('tableDelimiterFiller'); - return headDelimiterFiller(code); - } - return headDelimiterNok(code); - } - function headDelimiterFiller(code) { - if (code === 45) { - effects.consume(code); - return headDelimiterFiller; - } - if (code === 58) { - seen = true; - effects.exit('tableDelimiterFiller'); - effects.enter('tableDelimiterMarker'); - effects.consume(code); - effects.exit('tableDelimiterMarker'); - return headDelimiterRightAlignmentAfter; - } - effects.exit('tableDelimiterFiller'); - return headDelimiterRightAlignmentAfter(code); - } - function headDelimiterRightAlignmentAfter(code) { - if (markdownSpace(code)) { - return factorySpace(effects, headDelimiterCellAfter, "whitespace")(code); - } - return headDelimiterCellAfter(code); - } - function headDelimiterCellAfter(code) { - if (code === 124) { - return headDelimiterBefore(code); - } - if (code === null || markdownLineEnding(code)) { - if (!seen || size !== sizeB) { - return headDelimiterNok(code); - } - effects.exit('tableDelimiterRow'); - effects.exit('tableHead'); - return ok(code); - } - return headDelimiterNok(code); - } - function headDelimiterNok(code) { - return nok(code); - } - function bodyRowStart(code) { - effects.enter('tableRow'); - return bodyRowBreak(code); - } - function bodyRowBreak(code) { - if (code === 124) { - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - return bodyRowBreak; - } - if (code === null || markdownLineEnding(code)) { - effects.exit('tableRow'); - return ok(code); - } - if (markdownSpace(code)) { - return factorySpace(effects, bodyRowBreak, "whitespace")(code); - } - effects.enter("data"); - return bodyRowData(code); - } - function bodyRowData(code) { - if (code === null || code === 124 || markdownLineEndingOrSpace(code)) { - effects.exit("data"); - return bodyRowBreak(code); - } - effects.consume(code); - return code === 92 ? bodyRowEscape : bodyRowData; - } - function bodyRowEscape(code) { - if (code === 92 || code === 124) { - effects.consume(code); - return bodyRowData; - } - return bodyRowData(code); - } -} -function resolveTable(events, context) { - let index = -1; - let inFirstCellAwaitingPipe = true; - let rowKind = 0; - let lastCell = [0, 0, 0, 0]; - let cell = [0, 0, 0, 0]; - let afterHeadAwaitingFirstBodyRow = false; - let lastTableEnd = 0; - let currentTable; - let currentBody; - let currentCell; - const map = new EditMap(); - while (++index < events.length) { - const event = events[index]; - const token = event[1]; - if (event[0] === 'enter') { - if (token.type === 'tableHead') { - afterHeadAwaitingFirstBodyRow = false; - if (lastTableEnd !== 0) { - flushTableEnd(map, context, lastTableEnd, currentTable, currentBody); - currentBody = undefined; - lastTableEnd = 0; - } - currentTable = { - type: 'table', - start: Object.assign({}, token.start), - end: Object.assign({}, token.end) - }; - map.add(index, 0, [['enter', currentTable, context]]); - } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') { - inFirstCellAwaitingPipe = true; - currentCell = undefined; - lastCell = [0, 0, 0, 0]; - cell = [0, index + 1, 0, 0]; - if (afterHeadAwaitingFirstBodyRow) { - afterHeadAwaitingFirstBodyRow = false; - currentBody = { - type: 'tableBody', - start: Object.assign({}, token.start), - end: Object.assign({}, token.end) - }; - map.add(index, 0, [['enter', currentBody, context]]); - } - rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1; - } - else if (rowKind && (token.type === "data" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) { - inFirstCellAwaitingPipe = false; - if (cell[2] === 0) { - if (lastCell[1] !== 0) { - cell[0] = cell[1]; - currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell); - lastCell = [0, 0, 0, 0]; - } - cell[2] = index; - } - } else if (token.type === 'tableCellDivider') { - if (inFirstCellAwaitingPipe) { - inFirstCellAwaitingPipe = false; - } else { - if (lastCell[1] !== 0) { - cell[0] = cell[1]; - currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell); - } - lastCell = cell; - cell = [lastCell[1], index, 0, 0]; - } - } - } - else if (token.type === 'tableHead') { - afterHeadAwaitingFirstBodyRow = true; - lastTableEnd = index; - } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') { - lastTableEnd = index; - if (lastCell[1] !== 0) { - cell[0] = cell[1]; - currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell); - } else if (cell[1] !== 0) { - currentCell = flushCell(map, context, cell, rowKind, index, currentCell); - } - rowKind = 0; - } else if (rowKind && (token.type === "data" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) { - cell[3] = index; - } - } - if (lastTableEnd !== 0) { - flushTableEnd(map, context, lastTableEnd, currentTable, currentBody); - } - map.consume(context.events); - index = -1; - while (++index < context.events.length) { - const event = context.events[index]; - if (event[0] === 'enter' && event[1].type === 'table') { - event[1]._align = gfmTableAlign(context.events, index); - } - } - return events; -} -function flushCell(map, context, range, rowKind, rowEnd, previousCell) { - const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData'; - const valueName = 'tableContent'; - if (range[0] !== 0) { - previousCell.end = Object.assign({}, getPoint(context.events, range[0])); - map.add(range[0], 0, [['exit', previousCell, context]]); - } - const now = getPoint(context.events, range[1]); - previousCell = { - type: groupName, - start: Object.assign({}, now), - end: Object.assign({}, now) - }; - map.add(range[1], 0, [['enter', previousCell, context]]); - if (range[2] !== 0) { - const relatedStart = getPoint(context.events, range[2]); - const relatedEnd = getPoint(context.events, range[3]); - const valueToken = { - type: valueName, - start: Object.assign({}, relatedStart), - end: Object.assign({}, relatedEnd) - }; - map.add(range[2], 0, [['enter', valueToken, context]]); - if (rowKind !== 2) { - const start = context.events[range[2]]; - const end = context.events[range[3]]; - start[1].end = Object.assign({}, end[1].end); - start[1].type = "chunkText"; - start[1].contentType = "text"; - if (range[3] > range[2] + 1) { - const a = range[2] + 1; - const b = range[3] - range[2] - 1; - map.add(a, b, []); - } - } - map.add(range[3] + 1, 0, [['exit', valueToken, context]]); - } - if (rowEnd !== undefined) { - previousCell.end = Object.assign({}, getPoint(context.events, rowEnd)); - map.add(rowEnd, 0, [['exit', previousCell, context]]); - previousCell = undefined; - } - return previousCell; -} -function flushTableEnd(map, context, index, table, tableBody) { - const exits = []; - const related = getPoint(context.events, index); - if (tableBody) { - tableBody.end = Object.assign({}, related); - exits.push(['exit', tableBody, context]); - } - table.end = Object.assign({}, related); - exits.push(['exit', table, context]); - map.add(index + 1, 0, exits); -} -function getPoint(events, index) { - const event = events[index]; - const side = event[0] === 'enter' ? 'start' : 'end'; - return event[1][side]; -} - -const tasklistCheck = { - name: 'tasklistCheck', - tokenize: tokenizeTasklistCheck -}; -function gfmTaskListItem() { - return { - text: { - [91]: tasklistCheck - } - }; -} -function tokenizeTasklistCheck(effects, ok, nok) { - const self = this; - return open; - function open(code) { - if ( - self.previous !== null || - !self._gfmTasklistFirstContentOfListItem) { - return nok(code); - } - effects.enter('taskListCheck'); - effects.enter('taskListCheckMarker'); - effects.consume(code); - effects.exit('taskListCheckMarker'); - return inside; - } - function inside(code) { - if (markdownLineEndingOrSpace(code)) { - effects.enter('taskListCheckValueUnchecked'); - effects.consume(code); - effects.exit('taskListCheckValueUnchecked'); - return close; - } - if (code === 88 || code === 120) { - effects.enter('taskListCheckValueChecked'); - effects.consume(code); - effects.exit('taskListCheckValueChecked'); - return close; - } - return nok(code); - } - function close(code) { - if (code === 93) { - effects.enter('taskListCheckMarker'); - effects.consume(code); - effects.exit('taskListCheckMarker'); - effects.exit('taskListCheck'); - return after; - } - return nok(code); - } - function after(code) { - if (markdownLineEnding(code)) { - return ok(code); - } - if (markdownSpace(code)) { - return effects.check({ - tokenize: spaceThenNonSpace - }, ok, nok)(code); - } - return nok(code); - } -} -function spaceThenNonSpace(effects, ok, nok) { - return factorySpace(effects, after, "whitespace"); - function after(code) { - return code === null ? nok(code) : ok(code); - } -} - -function gfm(options) { - return combineExtensions([ - gfmAutolinkLiteral(), - gfmFootnote(), - gfmStrikethrough(options), - gfmTable(), - gfmTaskListItem() - ]) -} - -const emptyOptions$1 = {}; -function remarkGfm(options) { - const self = (this); - const settings = options || emptyOptions$1; - const data = self.data(); - const micromarkExtensions = - data.micromarkExtensions || (data.micromarkExtensions = []); - const fromMarkdownExtensions = - data.fromMarkdownExtensions || (data.fromMarkdownExtensions = []); - const toMarkdownExtensions = - data.toMarkdownExtensions || (data.toMarkdownExtensions = []); - micromarkExtensions.push(gfm(settings)); - fromMarkdownExtensions.push(gfmFromMarkdown()); - toMarkdownExtensions.push(gfmToMarkdown(settings)); -} - -const commentExpression = /\s*([a-zA-Z\d-]+)(\s+([\s\S]*))?\s*/; -const esCommentExpression = new RegExp( - '(\\s*\\/\\*' + commentExpression.source + '\\*\\/\\s*)' -); -const markerExpression = new RegExp( - '(\\s*\\s*)' -); -function commentMarker(value) { - if ( - isNode(value) && - (value.type === 'html' || - value.type === 'mdxFlowExpression' || - value.type === 'mdxTextExpression') - ) { - const match = value.value.match( - value.type === 'html' ? markerExpression : esCommentExpression - ); - if (match && match[0].length === value.value.length) { - const parameters = parseParameters(match[3] || ''); - if (parameters) { - return { - name: match[2], - attributes: (match[4] || '').trim(), - parameters, - node: value - } - } - } - } -} -function parseParameters(value) { - const parameters = {}; - return value - .replace( - /\s+([-\w]+)(?:=(?:"((?:\\[\s\S]|[^"])*)"|'((?:\\[\s\S]|[^'])*)'|((?:\\[\s\S]|[^"'\s])+)))?/gi, - replacer - ) - .replace(/\s+/g, '') - ? undefined - : parameters - function replacer(_, $1, $2, $3, $4) { - let value = $2 === undefined ? ($3 === undefined ? $4 : $3) : $2; - const number = Number(value); - if (value === 'true' || value === undefined) { - value = true; - } else if (value === 'false') { - value = false; - } else if (value.trim() && !Number.isNaN(number)) { - value = number; - } - parameters[$1] = value; - return '' - } -} -function isNode(value) { - return Boolean(value && typeof value === 'object' && 'type' in value) -} - -function parse(value) { - const input = String(value || '').trim(); - return input ? input.split(/[ \t\n\r\f]+/g) : [] -} - -function location(file) { - const value = String(file); - const indices = []; - return {toOffset, toPoint} - function toPoint(offset) { - if (typeof offset === 'number' && offset > -1 && offset <= value.length) { - let index = 0; - while (true) { - let end = indices[index]; - if (end === undefined) { - const eol = next(value, indices[index - 1]); - end = eol === -1 ? value.length + 1 : eol + 1; - indices[index] = end; - } - if (end > offset) { - return { - line: index + 1, - column: offset - (index > 0 ? indices[index - 1] : 0) + 1, - offset - } - } - index++; - } - } - } - function toOffset(point) { - if ( - point && - typeof point.line === 'number' && - typeof point.column === 'number' && - !Number.isNaN(point.line) && - !Number.isNaN(point.column) - ) { - while (indices.length < point.line) { - const from = indices[indices.length - 1]; - const eol = next(value, from); - const end = eol === -1 ? value.length + 1 : eol + 1; - if (from === end) break - indices.push(end); - } - const offset = - (point.line > 1 ? indices[point.line - 2] : 0) + point.column - 1; - if (offset < indices[point.line - 1]) return offset - } - } -} -function next(value, from) { - const cr = value.indexOf('\r', from); - const lf = value.indexOf('\n', from); - if (lf === -1) return cr - if (cr === -1 || cr + 1 === lf) return lf - return cr < lf ? cr : lf -} - -const own = {}.hasOwnProperty; -function messageControl(tree, options) { - if (!options || typeof options !== 'object') { - throw new Error('Expected `options`') - } - const {file, marker, name, test} = options; - let {enable, disable, known, reset, source} = options; - if (!enable) enable = []; - if (!disable) disable = []; - if (!file) { - throw new Error('Expected `file` in `options`') - } - if (!marker) { - throw new Error('Expected `marker` in `options`') - } - if (!name) { - throw new Error('Expected `name` in `options`') - } - const sources = typeof source === 'string' ? [source] : source || [name]; - const toOffset = location(file).toOffset; - const initial = !reset; - const gaps = detectGaps(tree); - const scope = {}; - const globals = []; - visit(tree, test, visitor); - file.messages = file.messages.filter(function (m) { - return filter(m) - }); - function visitor(node, position, parent) { - const point = node.position && node.position.start; - const mark = marker(node); - if (!point || !mark || mark.name !== name) { - return - } - const ruleIds = parse(mark.attributes); - const verb = ruleIds.shift(); - const fn = - verb === 'enable' - ? doEnable - : verb === 'disable' - ? doDisable - : verb === 'ignore' - ? doIgnore - : undefined; - if (!fn) { - file.fail( - 'Unknown keyword `' + - verb + - '`: expected ' + - "`'enable'`, `'disable'`, or `'ignore'`", - node - ); - } - const next = - (parent && position !== undefined && parent.children[position + 1]) || - undefined; - const tail = next && next.position && next.position.end; - if (ruleIds.length === 0) { - fn(point, undefined, tail); - } else { - let index = -1; - while (++index < ruleIds.length) { - const ruleId = ruleIds[index]; - if (isKnown(ruleId, verb, node)) { - fn(point, ruleId, tail); - } - } - } - } - function doIgnore(point, ruleId, tail) { - if (tail) { - toggle(point, false, ruleId); - toggle(tail, true, ruleId); - } - } - function doDisable(point, ruleId) { - toggle(point, false, ruleId); - if (!ruleId) reset = true; - } - function doEnable(point, ruleId) { - toggle(point, true, ruleId); - if (!ruleId) reset = false; - } - function filter(message) { - let gapIndex = gaps.length; - if (!message.source || !sources.includes(message.source)) { - return true - } - if (!message.line) message.line = 1; - if (!message.column) message.column = 1; - const offset = toOffset(message); - while (gapIndex--) { - if (gaps[gapIndex][0] <= offset && gaps[gapIndex][1] > offset) { - return false - } - } - return ( - (!message.ruleId || check(message, scope[message.ruleId], true)) && - check(message, globals, false) - ) - } - function isKnown(ruleId, verb, node) { - const result = known ? known.includes(ruleId) : true; - if (!result) { - file.message('Cannot ' + verb + " `'" + ruleId + "'`, it’s not known", { - ancestors: [node], - place: node.position, - ruleId: 'known', - source: 'unified-message-control' - }); - } - return result - } - function getState(ruleId) { - const ranges = ruleId ? scope[ruleId] : globals; - if (ranges && ranges.length > 0) { - return ranges[ranges.length - 1].state - } - return ruleId - ? reset - ? enable.includes(ruleId) - : !disable.includes(ruleId) - : !reset - } - function toggle(point, state, ruleId) { - const markers = ruleId ? scope[ruleId] || (scope[ruleId] = []) : globals; - const current = getState(ruleId); - if (current !== state) { - markers.push({state, point}); - } - if (!ruleId) { - for (ruleId in scope) { - if (own.call(scope, ruleId)) { - toggle(point, state, ruleId); - } - } - } - } - function check(message, marks, local) { - if (message.line && message.column && marks && marks.length > 0) { - let index = marks.length; - while (index--) { - const mark = marks[index]; - if ( - mark.point && - (mark.point.line < message.line || - (mark.point.line === message.line && - mark.point.column <= message.column)) - ) { - return mark.state === true - } - } - } - if (local) { - ok$1(message.ruleId); - return reset - ? enable.includes(message.ruleId) - : !disable.includes(message.ruleId) - } - return Boolean(initial || reset) - } -} -function detectGaps(tree) { - const end = - tree && tree.position && tree.position.end && tree.position.end.offset; - let offset = 0; - let gap = false; - const gaps = []; - visit(tree, one); - if (typeof end === 'number' && offset !== end) { - update(); - update(end); - } - return gaps - function one(node) { - update(node.position && node.position.start && node.position.start.offset); - if (!('children' in node)) { - update(node.position && node.position.end && node.position.end.offset); - } - } - function update(latest) { - if (latest === null || latest === undefined) { - gap = true; - } else if (offset < latest) { - if (gap) { - gaps.push([offset, latest]); - gap = false; - } - offset = latest; - } - } -} - -const test = [ - 'comment', - 'html', - 'mdxFlowExpression', - 'mdxTextExpression' -]; -function remarkMessageControl(options) { - return function (tree, file) { - messageControl(tree, {...options, file, marker: commentMarker, test}); - } -} - -function remarkLint() { - this.use(lintMessageControl); -} -function lintMessageControl() { - return remarkMessageControl({name: 'lint', source: 'remark-lint'}) -} - -function lintRule$1(meta, rule) { - const id = typeof meta === 'string' ? meta : meta.origin; - const url = typeof meta === 'string' ? undefined : meta.url; - const parts = id.split(':'); - const source = parts[1] ? parts[0] : undefined; - const ruleId = parts[1]; - Object.defineProperty(plugin, 'name', {value: id}); - return plugin - function plugin(config) { - const [severity, options] = coerce$1(ruleId, config); - const fatal = severity === 2; - if (!severity) return - return function (tree, file, next) { - let index = file.messages.length - 1; - wrap(rule, function (error) { - const messages = file.messages; - if (error && !messages.includes(error)) { - try { - file.fail(error); - } catch {} - } - while (++index < messages.length) { - Object.assign(messages[index], {fatal, ruleId, source, url}); - } - next(); - })(tree, file, options); - } - } -} -function coerce$1(name, config) { - if (!Array.isArray(config)) { - return [1, config] - } - const [severity, ...options] = config; - switch (severity) { - case false: - case 0: - case 'off': { - return [0, ...options] - } - case true: - case 1: - case 'on': - case 'warn': { - return [1, ...options] - } - case 2: - case 'error': { - return [2, ...options] - } - default: { - if (typeof severity !== 'number') { - return [1, config] - } - throw new Error( - 'Incorrect severity `' + - severity + - '` for `' + - name + - '`, ' + - 'expected 0, 1, or 2' - ) - } - } -} - -/** - * remark-lint rule to warn when a final line ending is missing. - * - * ## What is this? - * - * This package checks the final line ending. - * - * ## When should I use this? - * - * You can use this package to check final line endings. - * - * ## API - * - * ### `unified().use(remarkLintFinalNewline)` - * - * Warn when a final line ending is missing. - * - * ###### Parameters - * - * There are no options. - * - * ###### Returns - * - * Transform ([`Transformer` from `unified`][github-unified-transformer]). - * - * ## Recommendation - * - * Turn this rule on. - * See [StackExchange][] for more info. - * - * ## Fix - * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) - * always adds final line endings. - * - * [api-remark-lint-final-newline]: #unifieduseremarklintfinalnewline - * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify - * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer - * [stackexchange]: https://unix.stackexchange.com/questions/18743 - * - * ## Examples - * - * ##### `ok.md` - * - * ###### In - * - * ```markdown - * Mercury␊ - * ``` - * - * ###### Out - * - * No messages. - * - * ##### `not-ok.md` - * - * ###### In - * - * ```markdown - * Mercury␀ - * ``` - * - * ###### Out - * - * ```text - * 1:8: Unexpected missing final newline character, expected line feed (`\n`) at end of file - * ``` - * - * @module final-newline - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - */ -const remarkLintFinalNewline = lintRule$1( - { - origin: 'remark-lint:final-newline', - url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-final-newline#readme' - }, - function (_, file) { - const value = String(file); - const end = location(file).toPoint(value.length); - const last = value.length - 1; - if ( - last !== -1 && - value.charAt(last) !== '\n' - ) { - file.message( - 'Unexpected missing final newline character, expected line feed (`\\n`) at end of file', - end - ); - } - } -); - -const pointEnd = point('end'); -const pointStart = point('start'); -function point(type) { - return point - function point(node) { - const point = (node && node.position && node.position[type]) || {}; - if ( - typeof point.line === 'number' && - point.line > 0 && - typeof point.column === 'number' && - point.column > 0 - ) { - return { - line: point.line, - column: point.column, - offset: - typeof point.offset === 'number' && point.offset > -1 - ? point.offset - : undefined - } - } - } -} -function position(node) { - const start = pointStart(node); - const end = pointEnd(node); - if (start && end) { - return {start, end} - } -} - -/** - * remark-lint rule to warn when more spaces are used than needed - * for hard breaks. - * - * ## What is this? - * - * This package checks the whitespace of hard breaks. - * - * ## When should I use this? - * - * You can use this package to check that the number of spaces in hard breaks - * are consistent. - * - * ## API - * - * ### `unified().use(remarkLintHardBreakSpaces)` - * - * Warn when more spaces are used than needed for hard breaks. - * - * ###### Parameters - * - * There are no options. - * - * ###### Returns - * - * Transform ([`Transformer` from `unified`][github-unified-transformer]). - * - * ## Recommendation - * - * Less than two spaces do not create a hard breaks and more than two spaces - * have no effect. - * Due to this, it’s recommended to turn this rule on. - * - * [api-remark-lint-hard-break-spaces]: #unifieduseremarklinthardbreakspaces - * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer - * - * @module hard-break-spaces - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @example - * {"name": "ok.md"} - * - * **Mercury** is the first planet from the Sun␠␠ - * and the smallest in the Solar System. - * - * @example - * {"label": "input", "name": "not-ok.md"} - * - * **Mercury** is the first planet from the Sun␠␠␠ - * and the smallest in the Solar System. - * @example - * {"label": "output", "name": "not-ok.md"} - * - * 1:45-2:1: Unexpected `3` spaces for hard break, expected `2` spaces - * - * @example - * {"gfm": true, "label": "input", "name": "containers.md"} - * - * [^mercury]: - * > * > * **Mercury** is the first planet from the Sun␠␠␠ - * > > and the smallest in the Solar System. - * @example - * {"gfm": true, "label": "output", "name": "containers.md"} - * - * 2:57-3:1: Unexpected `3` spaces for hard break, expected `2` spaces - */ -const remarkLintHardBreakSpaces = lintRule$1( - { - origin: 'remark-lint:hard-break-spaces', - url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-hard-break-spaces#readme' - }, - function (tree, file) { - const value = String(file); - visit(tree, 'break', function (node) { - const end = pointEnd(node); - const start = pointStart(node); - if ( - end && - start && - typeof end.offset === 'number' && - typeof start.offset === 'number' - ) { - const slice = value.slice(start.offset, end.offset); - let actual = 0; - while (slice.charCodeAt(actual) === 32) actual++; - if (actual > 2) { - file.message( - 'Unexpected `' + - actual + - '` spaces for hard break, expected `2` spaces', - node - ); - } - } - }); - } -); - -function commonjsRequire(path) { - throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); -} - -var pluralize$2 = {exports: {}}; - -var pluralize$1 = pluralize$2.exports; -var hasRequiredPluralize; -function requirePluralize () { - if (hasRequiredPluralize) return pluralize$2.exports; - hasRequiredPluralize = 1; - (function (module, exports) { - (function (root, pluralize) { - if (typeof commonjsRequire === 'function' && 'object' === 'object' && 'object' === 'object') { - module.exports = pluralize(); - } else { - root.pluralize = pluralize(); - } - })(pluralize$1, function () { - var pluralRules = []; - var singularRules = []; - var uncountables = {}; - var irregularPlurals = {}; - var irregularSingles = {}; - function sanitizeRule (rule) { - if (typeof rule === 'string') { - return new RegExp('^' + rule + '$', 'i'); - } - return rule; - } - function restoreCase (word, token) { - if (word === token) return token; - if (word === word.toLowerCase()) return token.toLowerCase(); - if (word === word.toUpperCase()) return token.toUpperCase(); - if (word[0] === word[0].toUpperCase()) { - return token.charAt(0).toUpperCase() + token.substr(1).toLowerCase(); - } - return token.toLowerCase(); - } - function interpolate (str, args) { - return str.replace(/\$(\d{1,2})/g, function (match, index) { - return args[index] || ''; - }); - } - function replace (word, rule) { - return word.replace(rule[0], function (match, index) { - var result = interpolate(rule[1], arguments); - if (match === '') { - return restoreCase(word[index - 1], result); - } - return restoreCase(match, result); - }); - } - function sanitizeWord (token, word, rules) { - if (!token.length || uncountables.hasOwnProperty(token)) { - return word; - } - var len = rules.length; - while (len--) { - var rule = rules[len]; - if (rule[0].test(word)) return replace(word, rule); - } - return word; - } - function replaceWord (replaceMap, keepMap, rules) { - return function (word) { - var token = word.toLowerCase(); - if (keepMap.hasOwnProperty(token)) { - return restoreCase(word, token); - } - if (replaceMap.hasOwnProperty(token)) { - return restoreCase(word, replaceMap[token]); - } - return sanitizeWord(token, word, rules); - }; - } - function checkWord (replaceMap, keepMap, rules, bool) { - return function (word) { - var token = word.toLowerCase(); - if (keepMap.hasOwnProperty(token)) return true; - if (replaceMap.hasOwnProperty(token)) return false; - return sanitizeWord(token, token, rules) === token; - }; - } - function pluralize (word, count, inclusive) { - var pluralized = count === 1 - ? pluralize.singular(word) : pluralize.plural(word); - return (inclusive ? count + ' ' : '') + pluralized; - } - pluralize.plural = replaceWord( - irregularSingles, irregularPlurals, pluralRules - ); - pluralize.isPlural = checkWord( - irregularSingles, irregularPlurals, pluralRules - ); - pluralize.singular = replaceWord( - irregularPlurals, irregularSingles, singularRules - ); - pluralize.isSingular = checkWord( - irregularPlurals, irregularSingles, singularRules - ); - pluralize.addPluralRule = function (rule, replacement) { - pluralRules.push([sanitizeRule(rule), replacement]); - }; - pluralize.addSingularRule = function (rule, replacement) { - singularRules.push([sanitizeRule(rule), replacement]); - }; - pluralize.addUncountableRule = function (word) { - if (typeof word === 'string') { - uncountables[word.toLowerCase()] = true; - return; - } - pluralize.addPluralRule(word, '$0'); - pluralize.addSingularRule(word, '$0'); - }; - pluralize.addIrregularRule = function (single, plural) { - plural = plural.toLowerCase(); - single = single.toLowerCase(); - irregularSingles[single] = plural; - irregularPlurals[plural] = single; - }; - [ - ['I', 'we'], - ['me', 'us'], - ['he', 'they'], - ['she', 'they'], - ['them', 'them'], - ['myself', 'ourselves'], - ['yourself', 'yourselves'], - ['itself', 'themselves'], - ['herself', 'themselves'], - ['himself', 'themselves'], - ['themself', 'themselves'], - ['is', 'are'], - ['was', 'were'], - ['has', 'have'], - ['this', 'these'], - ['that', 'those'], - ['echo', 'echoes'], - ['dingo', 'dingoes'], - ['volcano', 'volcanoes'], - ['tornado', 'tornadoes'], - ['torpedo', 'torpedoes'], - ['genus', 'genera'], - ['viscus', 'viscera'], - ['stigma', 'stigmata'], - ['stoma', 'stomata'], - ['dogma', 'dogmata'], - ['lemma', 'lemmata'], - ['schema', 'schemata'], - ['anathema', 'anathemata'], - ['ox', 'oxen'], - ['axe', 'axes'], - ['die', 'dice'], - ['yes', 'yeses'], - ['foot', 'feet'], - ['eave', 'eaves'], - ['goose', 'geese'], - ['tooth', 'teeth'], - ['quiz', 'quizzes'], - ['human', 'humans'], - ['proof', 'proofs'], - ['carve', 'carves'], - ['valve', 'valves'], - ['looey', 'looies'], - ['thief', 'thieves'], - ['groove', 'grooves'], - ['pickaxe', 'pickaxes'], - ['passerby', 'passersby'] - ].forEach(function (rule) { - return pluralize.addIrregularRule(rule[0], rule[1]); - }); - [ - [/s?$/i, 's'], - [/[^\u0000-\u007F]$/i, '$0'], - [/([^aeiou]ese)$/i, '$1'], - [/(ax|test)is$/i, '$1es'], - [/(alias|[^aou]us|t[lm]as|gas|ris)$/i, '$1es'], - [/(e[mn]u)s?$/i, '$1s'], - [/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i, '$1'], - [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1i'], - [/(alumn|alg|vertebr)(?:a|ae)$/i, '$1ae'], - [/(seraph|cherub)(?:im)?$/i, '$1im'], - [/(her|at|gr)o$/i, '$1oes'], - [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i, '$1a'], - [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i, '$1a'], - [/sis$/i, 'ses'], - [/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, '$1$2ves'], - [/([^aeiouy]|qu)y$/i, '$1ies'], - [/([^ch][ieo][ln])ey$/i, '$1ies'], - [/(x|ch|ss|sh|zz)$/i, '$1es'], - [/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, '$1ices'], - [/\b((?:tit)?m|l)(?:ice|ouse)$/i, '$1ice'], - [/(pe)(?:rson|ople)$/i, '$1ople'], - [/(child)(?:ren)?$/i, '$1ren'], - [/eaux$/i, '$0'], - [/m[ae]n$/i, 'men'], - ['thou', 'you'] - ].forEach(function (rule) { - return pluralize.addPluralRule(rule[0], rule[1]); - }); - [ - [/s$/i, ''], - [/(ss)$/i, '$1'], - [/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i, '$1fe'], - [/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, '$1f'], - [/ies$/i, 'y'], - [/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i, '$1ie'], - [/\b(mon|smil)ies$/i, '$1ey'], - [/\b((?:tit)?m|l)ice$/i, '$1ouse'], - [/(seraph|cherub)im$/i, '$1'], - [/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i, '$1'], - [/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i, '$1sis'], - [/(movie|twelve|abuse|e[mn]u)s$/i, '$1'], - [/(test)(?:is|es)$/i, '$1is'], - [/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1us'], - [/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i, '$1um'], - [/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i, '$1on'], - [/(alumn|alg|vertebr)ae$/i, '$1a'], - [/(cod|mur|sil|vert|ind)ices$/i, '$1ex'], - [/(matr|append)ices$/i, '$1ix'], - [/(pe)(rson|ople)$/i, '$1rson'], - [/(child)ren$/i, '$1'], - [/(eau)x?$/i, '$1'], - [/men$/i, 'man'] - ].forEach(function (rule) { - return pluralize.addSingularRule(rule[0], rule[1]); - }); - [ - 'adulthood', - 'advice', - 'agenda', - 'aid', - 'aircraft', - 'alcohol', - 'ammo', - 'analytics', - 'anime', - 'athletics', - 'audio', - 'bison', - 'blood', - 'bream', - 'buffalo', - 'butter', - 'carp', - 'cash', - 'chassis', - 'chess', - 'clothing', - 'cod', - 'commerce', - 'cooperation', - 'corps', - 'debris', - 'diabetes', - 'digestion', - 'elk', - 'energy', - 'equipment', - 'excretion', - 'expertise', - 'firmware', - 'flounder', - 'fun', - 'gallows', - 'garbage', - 'graffiti', - 'hardware', - 'headquarters', - 'health', - 'herpes', - 'highjinks', - 'homework', - 'housework', - 'information', - 'jeans', - 'justice', - 'kudos', - 'labour', - 'literature', - 'machinery', - 'mackerel', - 'mail', - 'media', - 'mews', - 'moose', - 'music', - 'mud', - 'manga', - 'news', - 'only', - 'personnel', - 'pike', - 'plankton', - 'pliers', - 'police', - 'pollution', - 'premises', - 'rain', - 'research', - 'rice', - 'salmon', - 'scissors', - 'series', - 'sewage', - 'shambles', - 'shrimp', - 'software', - 'species', - 'staff', - 'swine', - 'tennis', - 'traffic', - 'transportation', - 'trout', - 'tuna', - 'wealth', - 'welfare', - 'whiting', - 'wildebeest', - 'wildlife', - 'you', - /pok[eé]mon$/i, - /[^aeiou]ese$/i, - /deer$/i, - /fish$/i, - /measles$/i, - /o[iu]s$/i, - /pox$/i, - /sheep$/i - ].forEach(pluralize.addUncountableRule); - return pluralize; - }); - } (pluralize$2)); - return pluralize$2.exports; -} - -var pluralizeExports = requirePluralize(); -var pluralize = /*@__PURE__*/getDefaultExportFromCjs(pluralizeExports); - -/** - * remark-lint rule to warn when list item markers are indented. - * - * ## What is this? - * - * This package checks indentation before list item markers. - * - * ## When should I use this? - * - * You can use this package to check that the style of list items is - * consistent. - * - * ## API - * - * ### `unified().use(remarkLintListItemBulletIndent)` - * - * Warn when list item markers are indented. - * - * ###### Parameters - * - * There are no options. - * - * ###### Returns - * - * Transform ([`Transformer` from `unified`][github-unified-transformer]). - * - * ## Recommendation - * - * There is no specific handling of indented list items in markdown. - * While it is possible to use an indent to align ordered lists on their marker: - * - * ```markdown - * 1. Mercury - * 10. Venus - * 100. Earth - * ``` - * - * …such a style is uncommon and hard to maintain as adding a 10th item - * means 9 other items have to change (more arduous while unlikely would be - * the 100th item). - * So it is recommended to not indent items and to turn this rule on. - * - * ## Fix - * - * [`remark-stringify`][github-remark-stringify] formats all items without - * indent. - * - * [api-remark-lint-list-item-bullet-indent]: #unifieduseremarklintlistitembulletindent - * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify - * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer - * - * @module list-item-bullet-indent - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @example - * {"name": "ok.md"} - * - * Mercury. - * - * * Venus. - * * Earth. - * - * @example - * {"label": "input", "name": "not-ok.md"} - * - * Mercury. - * - * ␠* Venus. - * ␠* Earth. - * - * @example - * {"label": "output", "name": "not-ok.md"} - * - * 3:2: Unexpected `1` space before list item, expected `0` spaces, remove them - * 4:2: Unexpected `1` space before list item, expected `0` spaces, remove them - */ -const remarkLintListItemBulletIndent = lintRule$1( - { - origin: 'remark-lint:list-item-bullet-indent', - url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-bullet-indent#readme' - }, - function (tree, file) { - const treeStart = pointStart(tree); - if (!tree || tree.type !== 'root' || !treeStart) return - for (const child of tree.children) { - if (child.type !== 'list') continue - const list = child; - for (const item of list.children) { - const place = pointStart(item); - if (!place) continue - const actual = place.column - treeStart.column; - if (actual) { - file.message( - 'Unexpected `' + - actual + - '` ' + - pluralize('space', actual) + - ' before list item, expected `0` spaces, remove them', - {ancestors: [tree, list, item], place} - ); - } - } - } - } -); - -/** - * remark-lint rule to warn when the whitespace after list item markers violate - * a given style. - * - * ## What is this? - * - * This package checks the style of whitespace after list item markers. - * - * ## When should I use this? - * - * You can use this package to check that the style of whitespace after list - * item markers and before content is consistent. - * - * ## API - * - * ### `unified().use(remarkLintListItemIndent[, options])` - * - * Warn when the whitespace after list item markers violate a given style. - * - * ###### Parameters - * - * * `options` ([`Options`][api-options], default: `'one'`) - * — preferred style - * - * ###### Returns - * - * Transform ([`Transformer` from `unified`][github-unified-transformer]). - * - * ### `Options` - * - * Configuration (TypeScript type). - * - * * `'mixed'` - * — prefer `'one'` for tight lists and `'tab'` for loose lists - * * `'one'` - * — prefer the size of the bullet and a single space - * * `'tab'` - * — prefer the size of the bullet and a single space to the next tab stop - * - * ###### Type - * - * ```ts - * type Options = 'mixed' | 'one' | 'tab' - * ``` - * - * ## Recommendation - * - * First some background. - * The number of spaces that occur after list markers (`*`, `-`, and `+` for - * unordered lists and `.` and `)` for unordered lists) and before the content - * on the first line, - * defines how much indentation can be used for further lines. - * At least one space is required and up to 4 spaces are allowed. - * If there is no further content after the marker then it’s a blank line which - * is handled as if there was one space. - * If there are 5 or more spaces and then content then it’s also seen as one - * space and the rest is seen as indented code. - * - * Regardless of ordered and unordered, - * there are two kinds of lists in markdown, - * tight and loose. - * Lists are tight by default but if there is a blank line between two list - * items or between two blocks inside an item, - * that turns the whole list into a loose list. - * When turning markdown into HTML, - * paragraphs in tight lists are not wrapped in `
` tags.
- *
- * How indentation of lists works in markdown has historically been a mess,
- * especially with how they interact with indented code.
- * CommonMark made that a *lot* better,
- * but there remain (documented but complex) edge cases and some behavior
- * intuitive.
- * Due to this, `'tab'` works the best in most markdown parsers *and* in
- * CommonMark.
- * Currently the situation between markdown parsers is better,
- * so the default `'one'`,
- * which seems to be the most common style used by authors,
- * is okay.
- *
- * ## Fix
- *
- * [`remark-stringify`][github-remark-stringify] uses `listItemIndent: 'one'`
- * by default.
- * `listItemIndent: 'mixed'` or `listItemIndent: 'tab'` is also supported.
- *
- * [api-options]: #options
- * [api-remark-lint-list-item-indent]: #unifieduseremarklintlistitemindent-options
- * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify
- * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer
- *
- * @module list-item-indent
- * @author Titus Wormer
- * @copyright 2015 Titus Wormer
- * @license MIT
- *
- * @example
- * {"name": "ok.md"}
- *
- * *␠Mercury.
- * *␠Venus.
- *
- * 111.␠Earth
- * ␠␠␠␠␠and Mars.
- *
- * *␠**Jupiter**.
- *
- * ␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠System.
- *
- * *␠Saturn.
- *
- * ␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- *
- * @example
- * {"config": "mixed", "name": "ok.md"}
- *
- * *␠Mercury.
- * *␠Venus.
- *
- * 111.␠Earth
- * ␠␠␠␠␠and Mars.
- *
- * *␠␠␠**Jupiter**.
- *
- * ␠␠␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠␠␠System.
- *
- * *␠␠␠Saturn.
- *
- * ␠␠␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- *
- * @example
- * {"config": "mixed", "label": "input", "name": "not-ok.md"}
- *
- * *␠␠␠Mercury.
- * *␠␠␠Venus.
- *
- * 111.␠␠␠␠Earth
- * ␠␠␠␠␠␠␠␠and Mars.
- *
- * *␠**Jupiter**.
- *
- * ␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠System.
- *
- * *␠Saturn.
- *
- * ␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- * @example
- * {"config": "mixed", "label": "output", "name": "not-ok.md"}
- *
- * 1:5: Unexpected `3` spaces between list item marker and content in tight list, expected `1` space, remove `2` spaces
- * 2:5: Unexpected `3` spaces between list item marker and content in tight list, expected `1` space, remove `2` spaces
- * 4:9: Unexpected `4` spaces between list item marker and content in tight list, expected `1` space, remove `3` spaces
- * 7:3: Unexpected `1` space between list item marker and content in loose list, expected `3` spaces, add `2` spaces
- * 12:3: Unexpected `1` space between list item marker and content in loose list, expected `3` spaces, add `2` spaces
- *
- * @example
- * {"config": "one", "name": "ok.md"}
- *
- * *␠Mercury.
- * *␠Venus.
- *
- * 111.␠Earth
- * ␠␠␠␠␠and Mars.
- *
- * *␠**Jupiter**.
- *
- * ␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠System.
- *
- * *␠Saturn.
- *
- * ␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- *
- * @example
- * {"config": "one", "label": "input", "name": "not-ok.md"}
- *
- * *␠␠␠Mercury.
- * *␠␠␠Venus.
- *
- * 111.␠␠␠␠Earth
- * ␠␠␠␠␠␠␠␠and Mars.
- *
- * *␠␠␠**Jupiter**.
- *
- * ␠␠␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠␠␠System.
- *
- * *␠␠␠Saturn.
- *
- * ␠␠␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- * @example
- * {"config": "one", "label": "output", "name": "not-ok.md"}
- *
- * 1:5: Unexpected `3` spaces between list item marker and content, expected `1` space, remove `2` spaces
- * 2:5: Unexpected `3` spaces between list item marker and content, expected `1` space, remove `2` spaces
- * 4:9: Unexpected `4` spaces between list item marker and content, expected `1` space, remove `3` spaces
- * 7:5: Unexpected `3` spaces between list item marker and content, expected `1` space, remove `2` spaces
- * 12:5: Unexpected `3` spaces between list item marker and content, expected `1` space, remove `2` spaces
- *
- * @example
- * {"config": "tab", "name": "ok.md"}
- *
- * *␠␠␠Mercury.
- * *␠␠␠Venus.
- *
- * 111.␠␠␠␠Earth
- * ␠␠␠␠␠␠␠␠and Mars.
- *
- * *␠␠␠**Jupiter**.
- *
- * ␠␠␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠␠␠System.
- *
- * *␠␠␠Saturn.
- *
- * ␠␠␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- *
- * @example
- * {"config": "tab", "label": "input", "name": "not-ok.md"}
- *
- * *␠Mercury.
- * *␠Venus.
- *
- * 111.␠Earth
- * ␠␠␠␠␠and Mars.
- *
- * *␠**Jupiter**.
- *
- * ␠␠Jupiter is the fifth planet from the Sun and the largest in the Solar
- * ␠␠System.
- *
- * *␠Saturn.
- *
- * ␠␠Saturn is the sixth planet from the Sun and the second-largest in the Solar System, after Jupiter.
- * @example
- * {"config": "tab", "label": "output", "name": "not-ok.md"}
- *
- * 1:3: Unexpected `1` space between list item marker and content, expected `3` spaces, add `2` spaces
- * 2:3: Unexpected `1` space between list item marker and content, expected `3` spaces, add `2` spaces
- * 4:6: Unexpected `1` space between list item marker and content, expected `4` spaces, add `3` spaces
- * 7:3: Unexpected `1` space between list item marker and content, expected `3` spaces, add `2` spaces
- * 12:3: Unexpected `1` space between list item marker and content, expected `3` spaces, add `2` spaces
- *
- * @example
- * {"config": "🌍", "label": "output", "name": "not-ok.md", "positionless": true}
- *
- * 1:1: Unexpected value `🌍` for `options`, expected `'mixed'`, `'one'`, or `'tab'`
- *
- * @example
- * {"config": "mixed", "gfm": true, "label": "input", "name": "gfm.md"}
- *
- * *␠[x] Mercury.
- *
- * 1.␠␠[ ] Venus.
- *
- * 2.␠␠[ ] Earth.
- *
- * @example
- * {"config": "one", "gfm": true, "name": "gfm.md"}
- *
- * *␠[x] Mercury.
- *
- * 1.␠[ ] Venus.
- *
- * 2.␠[ ] Earth.
- *
- * @example
- * {"config": "tab", "gfm": true, "name": "gfm.md"}
- *
- * *␠␠␠[x] Mercury.
- *
- * 1.␠␠[ ] Venus.
- *
- * 2.␠␠[ ] Earth.
- *
- * @example
- * {"config": "mixed", "name": "loose-tight.md"}
- *
- * Loose lists have blank lines between items:
- *
- * *␠␠␠Mercury.
- *
- * *␠␠␠Venus.
- *
- * …or between children of items:
- *
- * 1.␠␠Earth.
- *
- * ␠␠␠␠Earth is the third planet from the Sun and the only astronomical
- * ␠␠␠␠object known to harbor life.
- */
-const remarkLintListItemIndent = lintRule$1(
- {
- origin: 'remark-lint:list-item-indent',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-indent#readme'
- },
- function (tree, file, options) {
- const value = String(file);
- let expected;
- if (options === null || options === undefined) {
- expected = 'one';
- } else if (options === 'space') {
- file.fail(
- 'Unexpected value `' + options + "` for `options`, expected `'one'`"
- );
- } else if (options === 'tab-size') {
- file.fail(
- 'Unexpected value `' + options + "` for `options`, expected `'tab'`"
- );
- } else if (options === 'mixed' || options === 'one' || options === 'tab') {
- expected = options;
- } else {
- file.fail(
- 'Unexpected value `' +
- options +
- "` for `options`, expected `'mixed'`, `'one'`, or `'tab'`"
- );
- }
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- if (node.type !== 'list') return
- let loose = node.spread;
- if (!loose) {
- for (const child of node.children) {
- if (child.spread) {
- loose = true;
- break
- }
- }
- }
- for (const child of node.children) {
- const head = child.children[0];
- const itemStart = pointStart(child);
- const headStart = pointStart(head);
- if (
- itemStart &&
- headStart &&
- typeof itemStart.offset === 'number' &&
- typeof headStart.offset === 'number'
- ) {
- let slice = value.slice(itemStart.offset, headStart.offset);
- const checkboxIndex = slice.indexOf('[');
- if (checkboxIndex !== -1) slice = slice.slice(0, checkboxIndex);
- const actualIndent = slice.length;
- let end = actualIndent;
- let previous = slice.charCodeAt(end - 1);
- while (previous === 9 || previous === 32) {
- end--;
- previous = slice.charCodeAt(end - 1);
- }
- let expectedIndent = end + 1;
- if (expected === 'tab' || (expected === 'mixed' && loose)) {
- expectedIndent = Math.ceil(expectedIndent / 4) * 4;
- }
- const expectedSpaces = expectedIndent - end;
- const actualSpaces = actualIndent - end;
- if (actualSpaces !== expectedSpaces) {
- const difference = expectedSpaces - actualSpaces;
- const differenceAbsolute = Math.abs(difference);
- file.message(
- 'Unexpected `' +
- actualSpaces +
- '` ' +
- pluralize('space', actualSpaces) +
- ' between list item marker and content' +
- (expected === 'mixed'
- ? ' in ' + (loose ? 'loose' : 'tight') + ' list'
- : '') +
- ', expected `' +
- expectedSpaces +
- '` ' +
- pluralize('space', expectedSpaces) +
- ', ' +
- (difference > 0 ? 'add' : 'remove') +
- ' `' +
- differenceAbsolute +
- '` ' +
- pluralize('space', differenceAbsolute),
- {ancestors: [...parents, node, child], place: headStart}
- );
- }
- }
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn for lazy lines in block quotes.
- *
- * ## What is this?
- *
- * This package checks the style of block quotes.
- *
- * ## When should I use this?
- *
- * You can use this package to check that the style of block quotes is
- * consistent.
- *
- * ## API
- *
- * ### `unified().use(remarkLintNoBlockquoteWithoutMarker)`
- *
- * Warn for lazy lines in block quotes.
- *
- * ###### Parameters
- *
- * There are no options.
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ## Recommendation
- *
- * Rules around lazy lines are not straightforward and visually confusing,
- * so it’s recommended to start each line with a `>`.
- *
- * ## Fix
- *
- * [`remark-stringify`][github-remark-stringify] adds `>` markers to every line
- * in a block quote.
- *
- * [api-remark-lint-no-blockquote-without-marker]: #unifieduseremarklintnoblockquotewithoutmarker
- * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify
- * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer
- *
- * @module no-blockquote-without-marker
- * @author Titus Wormer
- * @copyright 2015 Titus Wormer
- * @license MIT
- * @example
- * {"name": "ok.md"}
- *
- * > Mercury,
- * > Venus,
- * > and Earth.
- *
- * Mars.
- *
- * @example
- * {"name": "ok-tabs.md"}
- *
- * >␉Mercury,
- * >␉Venus,
- * >␉and Earth.
- *
- * @example
- * {"label": "input", "name": "not-ok.md"}
- *
- * > Mercury,
- * Venus,
- * > and Earth.
- * @example
- * {"label": "output", "name": "not-ok.md"}
- *
- * 2:1: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- *
- * @example
- * {"label": "input", "name": "not-ok-tabs.md"}
- *
- * >␉Mercury,
- * ␉Venus,
- * and Earth.
- * @example
- * {"label": "output", "name": "not-ok-tabs.md"}
- *
- * 2:2: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- * 3:1: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- *
- * @example
- * {"label": "input", "name": "containers.md"}
- *
- * * > Mercury and
- * Venus.
- *
- * > * Mercury and
- * Venus.
- *
- * * > * Mercury and
- * Venus.
- *
- * > * > Mercury and
- * Venus.
- *
- * ***
- *
- * > * > Mercury and
- * > Venus.
- * @example
- * {"label": "output", "name": "containers.md"}
- *
- * 2:1: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- * 5:3: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- * 8:5: Unexpected `0` block quote markers before paragraph line, expected `1` marker, add `1` marker
- * 11:7: Unexpected `0` block quote markers before paragraph line, expected `2` markers, add `2` markers
- * 16:7: Unexpected `1` block quote marker before paragraph line, expected `2` markers, add `1` marker
- */
-const remarkLintNoBlockquoteWithoutMarker = lintRule$1(
- {
- origin: 'remark-lint:no-blockquote-without-marker',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-blockquote-without-marker#readme'
- },
- function (tree, file) {
- const value = String(file);
- const loc = location(file);
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- if (node.type !== 'paragraph') return
- let expected = 0;
- for (const parent of parents) {
- if (parent.type === 'blockquote') {
- expected++;
- }
- else if (
- parent.type === 'containerDirective' ||
- parent.type === 'footnoteDefinition' ||
- parent.type === 'list' ||
- parent.type === 'listItem' ||
- parent.type === 'root'
- ) ; else {
- return SKIP
- }
- }
- if (!expected) return SKIP
- const end = pointEnd(node);
- const start = pointStart(node);
- if (!end || !start) return SKIP
- let line = start.line;
- while (++line <= end.line) {
- const lineStart = loc.toOffset({line, column: 1});
- let actual = 0;
- let index = lineStart;
- while (index < value.length) {
- const code = value.charCodeAt(index);
- if (code === 9 || code === 32) ; else if (code === 62 ) {
- actual++;
- } else {
- break
- }
- index++;
- }
- const point = loc.toPoint(index);
- const difference = expected - actual;
- if (difference) {
- file.message(
- 'Unexpected `' +
- actual +
- '` block quote ' +
- pluralize('marker', actual) +
- ' before paragraph line, expected `' +
- expected +
- '` ' +
- pluralize('marker', expected) +
- ', add `' +
- difference +
- '` ' +
- pluralize('marker', difference),
- {ancestors: [...parents, node], place: point}
- );
- }
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn when identifiers are defined multiple times.
- *
- * ## What is this?
- *
- * This package checks that defined identifiers are unique.
- *
- * ## When should I use this?
- *
- * You can use this package to check that definitions are useful.
- *
- * ## API
- *
- * ### `unified().use(remarkLintNoDuplicateDefinitions)`
- *
- * Warn when identifiers are defined multiple times.
- *
- * ###### Parameters
- *
- * There are no options.
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ## Recommendation
- *
- * It’s a mistake when the same identifier is defined multiple times.
- *
- * [api-remark-lint-no-duplicate-definitions]: #unifieduseremarklintnoduplicatedefinitions
- * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer
- *
- * @module no-duplicate-definitions
- * @author Titus Wormer
- * @copyright 2015 Titus Wormer
- * @license MIT
- *
- * @example
- * {"name": "ok.md"}
- *
- * [mercury]: https://example.com/mercury/
- * [venus]: https://example.com/venus/
- *
- * @example
- * {"label": "input", "name": "not-ok.md"}
- *
- * [mercury]: https://example.com/mercury/
- * [mercury]: https://example.com/venus/
- * @example
- * {"label": "output", "name": "not-ok.md"}
- *
- * 2:1-2:38: Unexpected definition with an already defined identifier (`mercury`), expected unique identifiers
- *
- * @example
- * {"gfm": true, "label": "input", "name": "gfm.md"}
- *
- * Mercury[^mercury].
- *
- * [^mercury]:
- * Mercury is the first planet from the Sun and the smallest in the Solar
- * System.
- *
- * [^mercury]:
- * Venus is the second planet from the Sun.
- *
- * @example
- * {"gfm": true, "label": "output", "name": "gfm.md"}
- *
- * 7:1-7:12: Unexpected footnote definition with an already defined identifier (`mercury`), expected unique identifiers
- */
-const empty = [];
-const remarkLintNoDuplicateDefinitions = lintRule$1(
- {
- origin: 'remark-lint:no-duplicate-definitions',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-definitions#readme'
- },
- function (tree, file) {
- const definitions = new Map();
- const footnoteDefinitions = new Map();
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- const [map, identifier] =
- node.type === 'definition'
- ? [definitions, node.identifier]
- : node.type === 'footnoteDefinition'
- ? [footnoteDefinitions, node.identifier]
- : empty;
- if (map && identifier && node.position) {
- const ancestors = [...parents, node];
- const duplicateAncestors = map.get(identifier);
- if (duplicateAncestors) {
- const duplicate = duplicateAncestors.at(-1);
- file.message(
- 'Unexpected ' +
- (node.type === 'footnoteDefinition' ? 'footnote ' : '') +
- 'definition with an already defined identifier (`' +
- identifier +
- '`), expected unique identifiers',
- {
- ancestors,
- cause: new VFileMessage('Identifier already defined here', {
- ancestors: duplicateAncestors,
- place: duplicate.position,
- source: 'remark-lint',
- ruleId: 'no-duplicate-definitions'
- }),
- place: node.position
- }
- );
- }
- map.set(identifier, ancestors);
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn when extra whitespace is used between hashes and
- * content in headings.
- *
- * ## What is this?
- *
- * This package checks whitespace between hashes and content.
- *
- * ## When should I use this?
- *
- * You can use this package to check that headings are consistent.
- *
- * ## API
- *
- * ### `unified().use(remarkLintNoHeadingContentIndent)`
- *
- * Warn when extra whitespace is used between hashes and content in headings.
- *
- * ###### Parameters
- *
- * There are no options.
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ## Recommendation
- *
- * One space is required and more than one space has no effect.
- * Due to this, it’s recommended to turn this rule on.
- *
- * ## Fix
- *
- * [`remark-stringify`][github-remark-stringify] formats headings with one space.
- *
- * [api-remark-lint-no-heading-content-indent]: #unifieduseremarklintnoheadingcontentindent
- * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify
- * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer
- *
- * @module no-heading-content-indent
- * @author Titus Wormer
- * @copyright 2015 Titus Wormer
- * @license MIT
- *
- * @example
- * {"name": "ok.md"}
- *
- * #␠Mercury
- *
- * ##␠Venus␠##
- *
- * ␠␠##␠Earth
- *
- * Setext headings are not affected:
- *
- * ␠Mars
- * =====
- *
- * ␠Jupiter
- * --------
- *
- * @example
- * {"label": "input", "name": "not-ok.md"}
- *
- * #␠␠Mercury
- *
- * ##␠Venus␠␠##
- *
- * ␠␠##␠␠␠Earth
- * @example
- * {"label": "output", "name": "not-ok.md"}
- *
- * 1:4: Unexpected `2` spaces between hashes and content, expected `1` space, remove `1` space
- * 3:11: Unexpected `2` spaces between content and hashes, expected `1` space, remove `1` space
- * 5:8: Unexpected `3` spaces between hashes and content, expected `1` space, remove `2` spaces
- *
- * @example
- * {"label": "input", "name": "empty-heading.md"}
- *
- * #␠␠
- * @example
- * {"label": "output", "name": "empty-heading.md"}
- *
- * 1:4: Unexpected `2` spaces between hashes and content, expected `1` space, remove `1` space
- */
-const remarkLintNoHeadingContentIndent = lintRule$1(
- {
- origin: 'remark-lint:no-heading-content-indent',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-content-indent#readme'
- },
- function (tree, file) {
- const value = String(file);
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- if (node.type !== 'heading') return
- const start = pointStart(node);
- const end = pointEnd(node);
- if (
- !end ||
- !start ||
- typeof end.offset !== 'number' ||
- typeof start.offset !== 'number'
- ) {
- return
- }
- let index = start.offset;
- let code = value.charCodeAt(index);
- let found = false;
- while (value.charCodeAt(index) === 35 ) {
- index++;
- found = true;
- continue
- }
- const from = index;
- code = value.charCodeAt(index);
- while (code === 9 || code === 32 ) {
- code = value.charCodeAt(++index);
- continue
- }
- const size = index - from;
- if (found && size > 1) {
- file.message(
- 'Unexpected `' +
- size +
- '` ' +
- pluralize('space', size) +
- ' between hashes and content, expected `1` space, remove `' +
- (size - 1) +
- '` ' +
- pluralize('space', size - 1),
- {
- ancestors: [...parents, node],
- place: {
- line: start.line,
- column: start.column + (index - start.offset),
- offset: start.offset + (index - start.offset)
- }
- }
- );
- }
- const contentStart = index;
- index = end.offset;
- code = value.charCodeAt(index - 1);
- while (code === 9 || code === 32 ) {
- index--;
- code = value.charCodeAt(index - 1);
- continue
- }
- let endFound = false;
- while (value.charCodeAt(index - 1) === 35 ) {
- index--;
- endFound = true;
- continue
- }
- const endFrom = index;
- code = value.charCodeAt(index - 1);
- while (code === 9 || code === 32 ) {
- index--;
- code = value.charCodeAt(index - 1);
- continue
- }
- const endSize = endFrom - index;
- if (endFound && index > contentStart && endSize > 1) {
- file.message(
- 'Unexpected `' +
- endSize +
- '` ' +
- pluralize('space', endSize) +
- ' between content and hashes, expected `1` space, remove `' +
- (endSize - 1) +
- '` ' +
- pluralize('space', endSize - 1),
- {
- ancestors: [...parents, node],
- place: {
- line: end.line,
- column: end.column - (end.offset - endFrom),
- offset: end.offset - (end.offset - endFrom)
- }
- }
- );
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn when GFM autolink literals are used.
- *
- * ## What is this?
- *
- * This package checks that regular autolinks or full links are used.
- * Literal autolinks is a GFM feature enabled with
- * [`remark-gfm`][github-remark-gfm].
- *
- * ## When should I use this?
- *
- * You can use this package to check that links are consistent.
- *
- * ## API
- *
- * ### `unified().use(remarkLintNoLiteralUrls)`
- *
- * Warn when GFM autolink literals are used.
- *
- * ###### Parameters
- *
- * There are no options.
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ## Recommendation
- *
- * GFM autolink literals (just a raw URL) are a feature enabled by GFM.
- * They don’t work everywhere.
- * So,
- * it’s recommended to instead use regular autolinks (`Mercury
- * ```
- * @example
- * {"config": ["javascript", "markdown", "mdx", "typescript"], "label": "output", "name": "not-ok-long-array.md"}
- *
- * 1:1-3:4: Unexpected fenced code language flag `html` in info string, expected `javascript`, `markdown`, `mdx`, …
- *
- * @example
- * {"config": "🌍", "label": "output", "name": "not-ok-options.md", "positionless": true}
- *
- * 1:1: Unexpected value `🌍` for `options`, expected array or object
- */
-const fence = /^ {0,3}([~`])\1{2,}/;
-const listFormat$1 = new Intl.ListFormat('en', {type: 'disjunction'});
-const listFormatUnit$1 = new Intl.ListFormat('en', {type: 'unit'});
-const remarkLintFencedCodeFlag = lintRule$1(
- {
- origin: 'remark-lint:fenced-code-flag',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-flag#readme'
- },
- function (tree, file, options) {
- const value = String(file);
- let allowEmpty = false;
- let allowed;
- if (options === null || options === undefined) ; else if (typeof options === 'object') {
- if (Array.isArray(options)) {
- const flags = (options);
- allowed = flags;
- } else {
- const settings = (options);
- allowEmpty = settings.allowEmpty === true;
- if (settings.flags) {
- allowed = settings.flags;
- }
- }
- } else {
- file.fail(
- 'Unexpected value `' +
- options +
- '` for `options`, expected array or object'
- );
- }
- let allowedDisplay;
- if (allowed) {
- allowedDisplay =
- allowed.length > 3
- ? listFormatUnit$1.format([...quotation(allowed.slice(0, 3), '`'), '…'])
- : listFormat$1.format(quotation(allowed, '`'));
- } else {
- allowedDisplay = 'keyword';
- }
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- if (node.type !== 'code') return
- const end = pointEnd(node);
- const start = pointStart(node);
- if (
- end &&
- start &&
- typeof end.offset === 'number' &&
- typeof start.offset === 'number'
- ) {
- if (node.lang) {
- if (allowed && !allowed.includes(node.lang)) {
- file.message(
- 'Unexpected fenced code language flag `' +
- node.lang +
- '` in info string, expected ' +
- allowedDisplay,
- {ancestors: [...parents, node], place: node.position}
- );
- }
- } else if (!allowEmpty) {
- const slice = value.slice(start.offset, end.offset);
- if (fence.test(slice)) {
- file.message(
- 'Unexpected missing fenced code language flag in info string, expected ' +
- allowedDisplay,
- {ancestors: [...parents, node], place: node.position}
- );
- }
- }
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn when fenced code markers are
- * inconsistent.
- *
- * ## What is this?
- *
- * This package checks fenced code block markers.
- *
- * ## When should I use this?
- *
- * You can use this package to check that fenced code block markers are
- * consistent.
- *
- * ## API
- *
- * ### `unified().use(remarkLintFencedCodeMarker[, options])`
- *
- * Warn when fenced code markers are inconsistent.
- *
- * ###### Parameters
- *
- * * `options` ([`Options`][api-options], default: `'consistent'`)
- * — preferred style or whether to detect the first style and warn for
- * further differences
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ### `Marker`
- *
- * Marker (TypeScript type).
- *
- * ###### Type
- *
- * ```ts
- * type Marker = '`' | '~'
- * ```
- *
- * ### `Options`
- *
- * Configuration (TypeScript type).
- *
- * ###### Type
- *
- * ```ts
- * type Options = Marker | 'consistent'
- * ```
- *
- * ## Recommendation
- *
- * Tildes are uncommon.
- * So it’s recommended to configure this rule with ``'`'``.
- *
- * ## Fix
- *
- * [`remark-stringify`][github-remark-stringify] formats fenced code with grave
- * accents by default.
- * Pass `fence: '~'` to always use tildes.
- *
- * [api-marker]: #marker
- * [api-options]: #options
- * [api-remark-lint-fenced-code-marker]: #unifieduseremarklintfencedcodemarker-options
- * [github-remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify
- * [github-unified-transformer]: https://github.com/unifiedjs/unified#transformer
- *
- * @module fenced-code-marker
- * @author Titus Wormer
- * @copyright 2015 Titus Wormer
- * @license MIT
- *
- * @example
- * {"name": "ok-indented.md"}
- *
- * Indented code blocks are not affected by this rule:
- *
- * mercury()
- *
- * @example
- * {"config": "`", "name": "ok-tick.md"}
- *
- * ```javascript
- * mercury()
- * ```
- *
- * ```
- * venus()
- * ```
- *
- * @example
- * {"config": "~", "name": "ok-tilde.md"}
- *
- * ~~~javascript
- * mercury()
- * ~~~
- *
- * ~~~
- * venus()
- * ~~~
- *
- * @example
- * {"label": "input", "name": "not-ok-consistent-tick.md"}
- *
- * ```javascript
- * mercury()
- * ```
- *
- * ~~~
- * venus()
- * ~~~
- * @example
- * {"label": "output", "name": "not-ok-consistent-tick.md"}
- *
- * 5:1-7:4: Unexpected fenced code marker `~`, expected `` ` ``
- *
- * @example
- * {"label": "input", "name": "not-ok-consistent-tilde.md"}
- *
- * ~~~javascript
- * mercury()
- * ~~~
- *
- * ```
- * venus()
- * ```
- * @example
- * {"label": "output", "name": "not-ok-consistent-tilde.md"}
- *
- * 5:1-7:4: Unexpected fenced code marker `` ` ``, expected `~`
- *
- * @example
- * {"config": "🌍", "label": "output", "name": "not-ok-incorrect.md", "positionless": true}
- *
- * 1:1: Unexpected value `🌍` for `options`, expected ``'`'``, `'~'`, or `'consistent'`
- */
-const remarkLintFencedCodeMarker = lintRule$1(
- {
- origin: 'remark-lint:fenced-code-marker',
- url: 'https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-marker#readme'
- },
- function (tree, file, options) {
- const value = String(file);
- let cause;
- let expected;
- if (options === null || options === undefined || options === 'consistent') ; else if (options === '`' || options === '~') {
- expected = options;
- } else {
- file.fail(
- 'Unexpected value `' +
- options +
- "` for `options`, expected ``'`'``, `'~'`, or `'consistent'`"
- );
- }
- visitParents(tree, function (node, parents) {
- if (phrasing(node)) {
- return SKIP
- }
- if (node.type !== 'code') return
- const start = pointStart(node);
- if (start && typeof start.offset === 'number') {
- const actual = value
- .slice(start.offset, start.offset + 4)
- .replace(/^\s+/, '')
- .charAt(0);
- if (actual !== '`' && actual !== '~') return
- if (expected) {
- if (actual !== expected) {
- file.message(
- 'Unexpected fenced code marker ' +
- (actual === '~' ? '`~`' : '`` ` ``') +
- ', expected ' +
- (expected === '~' ? '`~`' : '`` ` ``'),
- {ancestors: [...parents, node], cause, place: node.position}
- );
- }
- } else {
- expected = actual;
- cause = new VFileMessage(
- 'Fenced code marker style ' +
- (actual === '~' ? "`'~'`" : "``'`'``") +
- " first defined for `'consistent'` here",
- {
- ancestors: [...parents, node],
- place: node.position,
- ruleId: 'fenced-code-marker',
- source: 'remark-lint'
- }
- );
- }
- }
- });
- }
-);
-
-/**
- * remark-lint rule to warn for unexpected file extensions.
- *
- * ## What is this?
- *
- * This package checks the file extension.
- *
- * ## When should I use this?
- *
- * You can use this package to check that file extensions are consistent.
- *
- * ## API
- *
- * ### `unified().use(remarkLintFileExtension[, options])`
- *
- * Warn for unexpected extensions.
- *
- * ###### Parameters
- *
- * * `options` ([`Extensions`][api-extensions] or [`Options`][api-options],
- * optional)
- * — configuration
- *
- * ###### Returns
- *
- * Transform ([`Transformer` from `unified`][github-unified-transformer]).
- *
- * ### `Extensions`
- *
- * File extension(s) (TypeScript type).
- *
- * ###### Type
- *
- * ```ts
- * type Extensions = Array