From 5cc40c54b782ffa1dd86519074203c954b1b2a3d Mon Sep 17 00:00:00 2001
From: David Anson
Date: Tue, 1 Oct 2024 22:41:10 -0700
Subject: [PATCH] Enable custom rules to use the micromark parser, export
micromark helpers for reuse.
---
README.md | 57 +-
demo/markdownlint-browser.js | 2 +-
doc/CustomRules.md | 70 +-
helpers/.npmignore | 1 +
helpers/package.json | 5 +-
helpers/test.cjs | 28 +
lib/markdownlint.js | 2 +-
package.json | 2 +-
test/markdownlint-test-custom-rules.js | 112 +-
test/markdownlint-test-micromark.mjs | 19 +-
test/rules/any-blockquote.js | 70 +-
test/rules/rules.js | 2 +-
.../markdownlint-test-custom-rules.js.md | 3520 +++++++++++++++++
.../markdownlint-test-custom-rules.js.snap | Bin 14718 -> 36854 bytes
.../markdownlint-test-micromark.mjs.md | 332 ++
.../markdownlint-test-micromark.mjs.snap | Bin 19368 -> 22390 bytes
16 files changed, 4109 insertions(+), 113 deletions(-)
create mode 100644 helpers/.npmignore
create mode 100644 helpers/test.cjs
diff --git a/README.md b/README.md
index 6572bb60..35c698b5 100644
--- a/README.md
+++ b/README.md
@@ -13,22 +13,31 @@ npm install markdownlint --save-dev
## Overview
-The [Markdown](https://en.wikipedia.org/wiki/Markdown) markup language
-is designed to be easy to read, write, and understand. It succeeds -
-and its flexibility is both a benefit and a drawback. Many styles are
-possible, so formatting can be inconsistent. Some constructs don't
-work well in all parsers and should be avoided. The
-[CommonMark](https://commonmark.org/) specification standardizes
-parsers - but not authors.
+The [Markdown][markdown] markup language is designed to be easy to read, write,
+and understand. It succeeds - and its flexibility is both a benefit and a
+drawback. Many styles are possible, so formatting can be inconsistent; some
+constructs don't work well in all parsers and should be avoided.
-`markdownlint` is a
-[static analysis](https://en.wikipedia.org/wiki/Static_program_analysis)
-tool for [Node.js](https://nodejs.org/) with a library of rules
-to enforce standards and consistency for Markdown files. It was
-inspired by - and heavily influenced by - Mark Harrison's
-[markdownlint](https://github.com/markdownlint/markdownlint) for
-[Ruby](https://www.ruby-lang.org/). The initial rules, rule documentation,
-and test cases came directly from that project.
+`markdownlint` is a [static analysis][static-analysis] tool for
+[Node.js][nodejs] with a library of rules to enforce standards and consistency
+for Markdown files. It was inspired by - and heavily influenced by - Mark
+Harrison's [markdownlint][markdownlint-ruby] for Ruby. The initial rules, rule
+documentation, and test cases came from that project.
+
+`markdownlint` uses the [`micromark`][micromark] parser and honors the
+[CommonMark][commonmark] specification for Markdown. It additionally supports
+popular [GitHub Flavored Markdown (GFM)][gfm] syntax like autolinks and tables
+as well as directives, footnotes, and math syntax - all implemented by
+[`micromark` extensions][micromark-extensions].
+
+[commonmark]: https://commonmark.org/
+[gfm]: https://github.github.com/gfm/
+[markdown]: https://en.wikipedia.org/wiki/Markdown
+[markdownlint-ruby]: https://github.com/markdownlint/markdownlint
+[micromark]: https://github.com/micromark/micromark
+[micromark-extensions]: https://github.com/micromark/micromark?tab=readme-ov-file#list-of-extensions
+[nodejs]: https://nodejs.org/
+[static-analysis]: https://en.wikipedia.org/wiki/Static_program_analysis
### Related
@@ -565,7 +574,7 @@ Type: `Array` of `Array` of `Function` and plugin parameters
Specifies additional [`markdown-it` plugins][markdown-it-plugin] to use when
parsing input. Plugins can be used to support additional syntax and features for
-advanced scenarios.
+advanced scenarios. *Deprecated.*
[markdown-it-plugin]: https://www.npmjs.com/search?q=keywords:markdown-it-plugin
@@ -601,23 +610,20 @@ Specifies which version of the `result` object to return (see the "Usage"
section below for examples).
Passing a `resultVersion` of `0` corresponds to the original, simple format
-where each error is identified by rule name and line number. *This is
-deprecated.*
+where each error is identified by rule name and line number. *Deprecated*
Passing a `resultVersion` of `1` corresponds to a detailed format where each
error includes information about the line number, rule name, alias, description,
-as well as any additional detail or context that is available. *This is
-deprecated.*
+as well as any additional detail or context that is available. *Deprecated*
Passing a `resultVersion` of `2` corresponds to a detailed format where each
error includes information about the line number, rule names, description, as
-well as any additional detail or context that is available. *This is
-deprecated.*
+well as any additional detail or context that is available. *Deprecated*
Passing a `resultVersion` of `3` corresponds to the detailed version `2` format
with additional information about how to fix automatically-fixable errors. In
this mode, all errors that occur on each line are reported (other versions
-report only the first error for each rule). *This is the default.*
+report only the first error for each rule). This is the default behavior.
##### options.strings
@@ -946,10 +952,11 @@ Generate normal and minified scripts with:
npm run build-demo
```
-Then reference `markdown-it` and `markdownlint`:
+Then reference `markdownlint` and `micromark` scripts:
```html
-
+
+
```
diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js
index cab12d80..184a383e 100644
--- a/demo/markdownlint-browser.js
+++ b/demo/markdownlint-browser.js
@@ -1710,7 +1710,7 @@ function validateRuleList(ruleList, synchronous) {
!result &&
(rule.parser !== undefined) &&
(rule.parser !== "markdownit") &&
- !((customIndex < 0) && (rule.parser === "micromark")) &&
+ (rule.parser !== "micromark") &&
(rule.parser !== "none")
) {
result = newError("parser", rule.parser);
diff --git a/doc/CustomRules.md b/doc/CustomRules.md
index f1468c5a..53d641a5 100644
--- a/doc/CustomRules.md
+++ b/doc/CustomRules.md
@@ -14,9 +14,8 @@ built-in rules.
For simple requirements like disallowing certain characters or patterns,
the community-developed
[markdownlint-rule-search-replace][markdownlint-rule-search-replace]
-plug-in can be used.
-This plug-in allows anyone to create a set of simple text-replacement rules in
-JSON without needing to write any code.
+plug-in can be used. This plug-in allows anyone to create a set of simple
+text-replacement rules without needing to write code.
[markdownlint-rule-search-replace]: https://www.npmjs.com/package/markdownlint-rule-search-replace
@@ -27,29 +26,62 @@ to more information, one or more tags, and a function that implements the rule's
behavior. That function is called once for each file/string input and is passed
the parsed input and a function to log any violations.
-A simple rule implementation looks like:
+Custom rules can (should) operate on a structured set of tokens based on the
+[`micromark`][micromark] `parser` (this is preferred). Alternatively, custom
+rules can operate on a structured set of tokens based on the
+[`markdown-it`][markdown-it] `parser` (legacy support). Finally, custom rules
+can operate directly on text with the `none` `parser`.
+
+A simple rule implementation using the `micromark` parser to report a violation
+for any use of blockquotes might look like:
```javascript
/** @type import("markdownlint").Rule */
module.exports = {
- "names": [ "any-blockquote" ],
+ "names": [ "any-blockquote-micromark" ],
+ "description": "Rule that reports an error for any blockquote",
+ "information": new URL("https://example.com/rules/any-blockquote"),
+ "tags": [ "test" ],
+ "parser": "micromark",
+ "function": (params, onError) => {
+ const blockquotes = params.parsers.micromark.tokens
+ .filter(((token) => token.type === "blockQuote"));
+ for (const blockquote of blockquotes) {
+ const lines = blockquote.endLine - blockquote.startLine + 1;
+ onError({
+ "lineNumber": blockquote.startLine,
+ "detail": "Blockquote spans " + lines + " line(s).",
+ "context": params.lines[blockquote.startLine - 1]
+ });
+ }
+ }
+}
+```
+
+That same rule implemented using the `markdown-it` parser might look like:
+
+```javascript
+/** @type import("markdownlint").Rule */
+module.exports = {
+ "names": [ "any-blockquote-markdown-it" ],
"description": "Rule that reports an error for any blockquote",
"information": new URL("https://example.com/rules/any-blockquote"),
"tags": [ "test" ],
"parser": "markdownit",
- "function": function rule(params, onError) {
- params.parsers.markdownit.tokens.filter(function filterToken(token) {
- return token.type === "blockquote_open";
- }).forEach(function forToken(blockquote) {
- var lines = blockquote.map[1] - blockquote.map[0];
+ "function": (params, onError) => {
+ const blockquotes = params.parsers.markdownit.tokens
+ .filter(((token) => token.type === "blockquote_open"));
+ for (const blockquote of blockquotes) {
+ const [ startIndex, endIndex ] = blockquote.map;
+ const lines = endIndex - startIndex;
onError({
"lineNumber": blockquote.lineNumber,
"detail": "Blockquote spans " + lines + " line(s).",
- "context": blockquote.line.substr(0, 7)
+ "context": blockquote.line
});
- });
+ }
}
-};
+}
```
A rule is implemented as an `Object`:
@@ -62,9 +94,8 @@ A rule is implemented as an `Object`:
about the rule.
- `tags` is a required `Array` of `String` values that groups related rules for
easier customization.
-- `parser` is a required `String` value `"markdownit" | "none"` that specifies
- the parser data used via `params.parsers` (see below).
- - Note: The value `"micromark"` is valid but is NOT currently supported.
+- `parser` is a required `String` value `"markdownit" | "micromark" | "none"`
+ that specifies the parser data used via `params.parsers` (see below).
- `asynchronous` is an optional `Boolean` value that indicates whether the rule
returns a `Promise` and runs asynchronously.
- `function` is a required `Function` that implements the rule and is passed two
@@ -79,7 +110,10 @@ A rule is implemented as an `Object`:
- `tokens` is an `Array` of [`markdown-it` `Token`s][markdown-it-token]
with added `line` and `lineNumber` properties. (This property was
previously on the `params` object.)
- - Samples for `tokens` are available via [test snapshots][tokens].
+ - `micromark` is an `Object` that provides access to output from the
+ [`micromark`][micromark] parser.
+ - `tokens` is an `Array` of [`MicromarkToken`][micromark-token] objects.
+ - Samples for both `tokens` are available via [test snapshots][tokens].
- `lines` is an `Array` of `String` values corresponding to the lines of the
input file/string.
- `frontMatterLines` is an `Array` of `String` values corresponding to any
@@ -152,6 +186,8 @@ exception.
[markdown-it]: https://github.com/markdown-it/markdown-it
[markdown-it-token]: https://markdown-it.github.io/markdown-it/#Token
[markdownlint-rule]: https://www.npmjs.com/search?q=keywords:markdownlint-rule
+[micromark]: https://github.com/micromark/micromark
+[micromark-token]: ../lib/markdownlint.d.ts
[rule-helpers]: https://www.npmjs.com/package/markdownlint-rule-helpers
[options-custom-rules]: ../README.md#optionscustomrules
[test-rules]: ../test/rules
diff --git a/helpers/.npmignore b/helpers/.npmignore
new file mode 100644
index 00000000..daa60294
--- /dev/null
+++ b/helpers/.npmignore
@@ -0,0 +1 @@
+test.js
diff --git a/helpers/package.json b/helpers/package.json
index a2aadee5..fca7a97d 100644
--- a/helpers/package.json
+++ b/helpers/package.json
@@ -3,7 +3,10 @@
"version": "0.26.0",
"description": "A collection of markdownlint helper functions for custom rules",
"main": "./helpers.js",
- "exports": "./helpers.js",
+ "exports": {
+ ".": "./helpers.js",
+ "./micromark": "./micromark-helpers.cjs"
+ },
"author": "David Anson (https://dlaa.me/)",
"license": "MIT",
"homepage": "https://github.com/DavidAnson/markdownlint",
diff --git a/helpers/test.cjs b/helpers/test.cjs
new file mode 100644
index 00000000..340ae99d
--- /dev/null
+++ b/helpers/test.cjs
@@ -0,0 +1,28 @@
+// @ts-check
+
+"use strict";
+
+// eslint-disable-next-line n/no-extraneous-require
+const test = require("ava").default;
+const { "exports": packageExports, name } = require("../helpers/package.json");
+
+const exportMappings = new Map([
+ [ ".", "../helpers/helpers.js" ],
+ [ "./micromark", "../helpers/micromark-helpers.cjs" ]
+]);
+
+test("exportMappings", (t) => {
+ t.deepEqual(
+ Object.keys(packageExports),
+ [ ...exportMappings.keys() ]
+ );
+});
+
+for (const [ exportName, exportPath ] of exportMappings) {
+ test(exportName, (t) => {
+ t.is(
+ require(exportName.replace(/^\./u, name)),
+ require(exportPath)
+ );
+ });
+}
diff --git a/lib/markdownlint.js b/lib/markdownlint.js
index cfdf50b8..92f6cb56 100644
--- a/lib/markdownlint.js
+++ b/lib/markdownlint.js
@@ -58,7 +58,7 @@ function validateRuleList(ruleList, synchronous) {
!result &&
(rule.parser !== undefined) &&
(rule.parser !== "markdownit") &&
- !((customIndex < 0) && (rule.parser === "micromark")) &&
+ (rule.parser !== "micromark") &&
(rule.parser !== "none")
) {
result = newError("parser", rule.parser);
diff --git a/package.json b/package.json
index d8b17892..e23f36b1 100644
--- a/package.json
+++ b/package.json
@@ -53,7 +53,7 @@
"lint-test-repos": "ava --timeout=10m test/markdownlint-test-repos-*.js",
"serial-config-docs": "npm run build-config && npm run build-docs",
"serial-declaration-demo": "npm run build-declaration && npm-run-all --continue-on-error --parallel build-demo test-declaration",
- "test": "ava --timeout=30s test/markdownlint-test.js test/markdownlint-test-config.js test/markdownlint-test-custom-rules.js test/markdownlint-test-helpers.js test/markdownlint-test-micromark.mjs test/markdownlint-test-result-object.js test/markdownlint-test-scenarios.js",
+ "test": "ava --timeout=30s test/markdownlint-test.js test/markdownlint-test-config.js test/markdownlint-test-custom-rules.js test/markdownlint-test-helpers.js test/markdownlint-test-micromark.mjs test/markdownlint-test-result-object.js test/markdownlint-test-scenarios.js helpers/test.cjs",
"test-cover": "c8 --100 npm test",
"test-declaration": "cd example/typescript && tsc --module nodenext && tsc --module commonjs && node type-check.js",
"test-extra": "ava --timeout=10m test/markdownlint-test-extra-parse.js test/markdownlint-test-extra-type.js",
diff --git a/test/markdownlint-test-custom-rules.js b/test/markdownlint-test-custom-rules.js
index 8f4a8a20..b9dd54d0 100644
--- a/test/markdownlint-test-custom-rules.js
+++ b/test/markdownlint-test-custom-rules.js
@@ -7,6 +7,7 @@ const test = require("ava").default;
const markdownlint = require("../lib/markdownlint");
const customRules = require("./rules/rules.js");
const { homepage, version } = require("../package.json");
+const { newLineRe } = require("../helpers/helpers.js");
test("customRulesV0", (t) => new Promise((resolve) => {
t.plan(4);
@@ -22,7 +23,8 @@ test("customRulesV0", (t) => new Promise((resolve) => {
t.falsy(err);
const expectedResult = {};
expectedResult[customRulesMd] = {
- "any-blockquote": [ 12 ],
+ "any-blockquote-markdown-it": [ 12 ],
+ "any-blockquote-micromark": [ 12 ],
"every-n-lines": [ 2, 4, 6, 10, 12 ],
"first-line": [ 1 ],
"letters-E-X": [ 3, 7 ]
@@ -31,7 +33,9 @@ test("customRulesV0", (t) => new Promise((resolve) => {
// @ts-ignore
let actualMessage = actualResult.toString();
let expectedMessage =
- "./test/custom-rules.md: 12: any-blockquote" +
+ "./test/custom-rules.md: 12: any-blockquote-markdown-it" +
+ " Rule that reports an error for any blockquote\n" +
+ "./test/custom-rules.md: 12: any-blockquote-micromark" +
" Rule that reports an error for any blockquote\n" +
"./test/custom-rules.md: 2: every-n-lines" +
" Rule that reports an error every N lines\n" +
@@ -53,7 +57,9 @@ test("customRulesV0", (t) => new Promise((resolve) => {
// @ts-ignore
actualMessage = actualResult.toString(true);
expectedMessage =
- "./test/custom-rules.md: 12: any-blockquote" +
+ "./test/custom-rules.md: 12: any-blockquote-markdown-it" +
+ " Rule that reports an error for any blockquote\n" +
+ "./test/custom-rules.md: 12: any-blockquote-micromark" +
" Rule that reports an error for any blockquote\n" +
"./test/custom-rules.md: 2: every-n-lines" +
" Rule that reports an error every N lines\n" +
@@ -91,13 +97,22 @@ test("customRulesV1", (t) => new Promise((resolve) => {
const expectedResult = {};
expectedResult[customRulesMd] = [
{ "lineNumber": 12,
- "ruleName": "any-blockquote",
- "ruleAlias": "any-blockquote",
+ "ruleName": "any-blockquote-markdown-it",
+ "ruleAlias": "any-blockquote-markdown-it",
"ruleDescription": "Rule that reports an error for any blockquote",
"ruleInformation":
`${homepage}/blob/main/test/rules/any-blockquote.js`,
"errorDetail": "Blockquote spans 1 line(s).",
- "errorContext": "> Block",
+ "errorContext": "> Blockquote",
+ "errorRange": null },
+ { "lineNumber": 12,
+ "ruleName": "any-blockquote-micromark",
+ "ruleAlias": "any-blockquote-micromark",
+ "ruleDescription": "Rule that reports an error for any blockquote",
+ "ruleInformation":
+ `${homepage}/blob/main/test/rules/any-blockquote.js`,
+ "errorDetail": "Blockquote spans 1 line(s).",
+ "errorContext": "> Blockquote",
"errorRange": null },
{ "lineNumber": 2,
"ruleName": "every-n-lines",
@@ -170,9 +185,12 @@ test("customRulesV1", (t) => new Promise((resolve) => {
// @ts-ignore
const actualMessage = actualResult.toString();
const expectedMessage =
- "./test/custom-rules.md: 12: any-blockquote/any-blockquote" +
+ "./test/custom-rules.md: 12: any-blockquote-markdown-it/any-blockquote-markdown-it" +
" Rule that reports an error for any blockquote" +
- " [Blockquote spans 1 line(s).] [Context: \"> Block\"]\n" +
+ " [Blockquote spans 1 line(s).] [Context: \"> Blockquote\"]\n" +
+ "./test/custom-rules.md: 12: any-blockquote-micromark/any-blockquote-micromark" +
+ " Rule that reports an error for any blockquote" +
+ " [Blockquote spans 1 line(s).] [Context: \"> Blockquote\"]\n" +
"./test/custom-rules.md: 2: every-n-lines/every-n-lines" +
" Rule that reports an error every N lines [Line number 2]\n" +
"./test/custom-rules.md: 4: every-n-lines/every-n-lines" +
@@ -211,12 +229,20 @@ test("customRulesV2", (t) => new Promise((resolve) => {
const expectedResult = {};
expectedResult[customRulesMd] = [
{ "lineNumber": 12,
- "ruleNames": [ "any-blockquote" ],
+ "ruleNames": [ "any-blockquote-markdown-it" ],
"ruleDescription": "Rule that reports an error for any blockquote",
"ruleInformation":
`${homepage}/blob/main/test/rules/any-blockquote.js`,
"errorDetail": "Blockquote spans 1 line(s).",
- "errorContext": "> Block",
+ "errorContext": "> Blockquote",
+ "errorRange": null },
+ { "lineNumber": 12,
+ "ruleNames": [ "any-blockquote-micromark" ],
+ "ruleDescription": "Rule that reports an error for any blockquote",
+ "ruleInformation":
+ `${homepage}/blob/main/test/rules/any-blockquote.js`,
+ "errorDetail": "Blockquote spans 1 line(s).",
+ "errorContext": "> Blockquote",
"errorRange": null },
{ "lineNumber": 2,
"ruleNames": [ "every-n-lines" ],
@@ -281,9 +307,12 @@ test("customRulesV2", (t) => new Promise((resolve) => {
// @ts-ignore
const actualMessage = actualResult.toString();
const expectedMessage =
- "./test/custom-rules.md: 12: any-blockquote" +
+ "./test/custom-rules.md: 12: any-blockquote-markdown-it" +
" Rule that reports an error for any blockquote" +
- " [Blockquote spans 1 line(s).] [Context: \"> Block\"]\n" +
+ " [Blockquote spans 1 line(s).] [Context: \"> Blockquote\"]\n" +
+ "./test/custom-rules.md: 12: any-blockquote-micromark" +
+ " Rule that reports an error for any blockquote" +
+ " [Blockquote spans 1 line(s).] [Context: \"> Blockquote\"]\n" +
"./test/custom-rules.md: 2: every-n-lines" +
" Rule that reports an error every N lines [Line number 2]\n" +
"./test/custom-rules.md: 4: every-n-lines" +
@@ -328,7 +357,8 @@ test("customRulesConfig", (t) => new Promise((resolve) => {
t.falsy(err);
const expectedResult = {};
expectedResult[customRulesMd] = {
- "any-blockquote": [ 12 ],
+ "any-blockquote-markdown-it": [ 12 ],
+ "any-blockquote-micromark": [ 12 ],
"every-n-lines": [ 3, 6, 12 ],
"first-line": [ 1 ],
"letters-E-X": [ 7 ]
@@ -402,7 +432,7 @@ test("customRulesBadProperty", (t) => {
]) {
const { propertyName, propertyValues } = testCase;
for (const propertyValue of propertyValues) {
- const badRule = { ...customRules.anyBlockquote };
+ const badRule = { ...customRules.firstLine };
badRule[propertyName] = propertyValue;
// eslint-disable-next-line jsdoc/valid-types
/** @type import("../lib/markdownlint").Options */
@@ -592,7 +622,7 @@ test("customRulesParserMarkdownIt", (t) => {
});
test("customRulesParserMicromark", (t) => {
- t.plan(1);
+ t.plan(5);
// eslint-disable-next-line jsdoc/valid-types
/** @type import("../lib/markdownlint").Options */
const options = {
@@ -603,12 +633,12 @@ test("customRulesParserMicromark", (t) => {
"tags": [ "tag" ],
"parser": "micromark",
"function":
- () => {
- // t.false(Object.keys(params).includes("tokens"));
- // t.is(Object.keys(params.parsers).length, 1);
- // t.truthy(params.parsers.micromark);
- // t.is(Object.keys(params.parsers.micromark).length, 1);
- // t.truthy(params.parsers.micromark.tokens);
+ (params) => {
+ t.false(Object.keys(params).includes("tokens"));
+ t.is(Object.keys(params.parsers).length, 1);
+ t.truthy(params.parsers.micromark);
+ t.is(Object.keys(params.parsers.micromark).length, 1);
+ t.truthy(params.parsers.micromark.tokens);
}
}
],
@@ -616,10 +646,7 @@ test("customRulesParserMicromark", (t) => {
"string": "# Heading\n"
}
};
- return markdownlint.promises.markdownlint(options).catch((error) => {
- // parser "micromark" currently unsupported for custom rules
- t.is(error.message, "Property 'parser' of custom rule at index 0 is incorrect: 'micromark'.");
- });
+ return markdownlint.promises.markdownlint(options).then(() => null);
});
test("customRulesMarkdownItParamsTokensSameObject", (t) => {
@@ -664,10 +691,41 @@ test("customRulesMarkdownItTokensSnapshot", (t) => {
}
}
],
- "files": "./test/every-markdown-syntax.md",
"noInlineConfig": true
};
- return markdownlint.promises.markdownlint(options).then(() => null);
+ return fs
+ .readFile("./test/every-markdown-syntax.md", "utf8")
+ .then((content) => {
+ options.strings = { "content": content.split(newLineRe).join("\n") };
+ return markdownlint.promises.markdownlint(options).then(() => null);
+ });
+});
+
+test("customRulesMicromarkTokensSnapshot", (t) => {
+ t.plan(1);
+ // eslint-disable-next-line jsdoc/valid-types
+ /** @type import("../lib/markdownlint").Options */
+ const options = {
+ "customRules": [
+ {
+ "names": [ "name" ],
+ "description": "description",
+ "tags": [ "tag" ],
+ "parser": "micromark",
+ "function":
+ (params) => {
+ t.snapshot(params.parsers.micromark.tokens, "Unexpected tokens");
+ }
+ }
+ ],
+ "noInlineConfig": true
+ };
+ return fs
+ .readFile("./test/every-markdown-syntax.md", "utf8")
+ .then((content) => {
+ options.strings = { "content": content.split(newLineRe).join("\n") };
+ return markdownlint.promises.markdownlint(options).then(() => null);
+ });
});
test("customRulesDefinitionStatic", (t) => new Promise((resolve) => {
diff --git a/test/markdownlint-test-micromark.mjs b/test/markdownlint-test-micromark.mjs
index bdf275ad..8f2a3d38 100644
--- a/test/markdownlint-test-micromark.mjs
+++ b/test/markdownlint-test-micromark.mjs
@@ -17,26 +17,9 @@ const testTokens = new Promise((resolve, reject) => {
testContent.then(parse).then(resolve, reject);
});
-const cloneToken = (token) => {
- for (const child of token.children) {
- const expectedParent = (token.type ? token : null);
- if (child.parent !== expectedParent) {
- throw new Error("Unexpected parent.");
- }
- }
- const clone = { ...token };
- delete clone.parent;
- clone.children = clone.children.map(cloneToken);
- return clone;
-};
-
-const cloneTokens = (tokens) => (
- cloneToken({ "children": tokens }).children
-);
-
test("parse", async(t) => {
t.plan(1);
- t.snapshot(cloneTokens(await testTokens), "Unexpected tokens");
+ t.snapshot(await testTokens, "Unexpected tokens");
});
test("getEvents/filterByPredicate", async(t) => {
diff --git a/test/rules/any-blockquote.js b/test/rules/any-blockquote.js
index cc17a244..d5537169 100644
--- a/test/rules/any-blockquote.js
+++ b/test/rules/any-blockquote.js
@@ -2,26 +2,54 @@
"use strict";
-/** @type import("../../lib/markdownlint").Rule */
-module.exports = {
- "names": [ "any-blockquote" ],
- "description": "Rule that reports an error for any blockquote",
- "information": new URL(
- "https://github.com/DavidAnson/markdownlint" +
- "/blob/main/test/rules/any-blockquote.js"
- ),
- "tags": [ "test" ],
- "parser": "markdownit",
- "function": (params, onError) => {
- const blockquotes = params.parsers.markdownit.tokens
- .filter(((token) => token.type === "blockquote_open"));
- for (const blockquote of blockquotes) {
- const lines = blockquote.map[1] - blockquote.map[0];
- onError({
- "lineNumber": blockquote.lineNumber,
- "detail": "Blockquote spans " + lines + " line(s).",
- "context": blockquote.line.substr(0, 7)
- });
+/** @type import("../../lib/markdownlint").Rule[] */
+module.exports = [
+
+ // micromark parser (preferred)
+ {
+ "names": [ "any-blockquote-micromark" ],
+ "description": "Rule that reports an error for any blockquote",
+ "information": new URL(
+ "https://github.com/DavidAnson/markdownlint/blob/main/test/rules/any-blockquote.js"
+ ),
+ "tags": [ "test" ],
+ "parser": "micromark",
+ "function": (params, onError) => {
+ const blockquotes = params.parsers.micromark.tokens
+ .filter(((token) => token.type === "blockQuote"));
+ for (const blockquote of blockquotes) {
+ const lines = blockquote.endLine - blockquote.startLine + 1;
+ onError({
+ "lineNumber": blockquote.startLine,
+ "detail": "Blockquote spans " + lines + " line(s).",
+ "context": params.lines[blockquote.startLine - 1]
+ });
+ }
+ }
+ },
+
+ // markdown-it parser (legacy)
+ {
+ "names": [ "any-blockquote-markdown-it" ],
+ "description": "Rule that reports an error for any blockquote",
+ "information": new URL(
+ "https://github.com/DavidAnson/markdownlint/blob/main/test/rules/any-blockquote.js"
+ ),
+ "tags": [ "test" ],
+ "parser": "markdownit",
+ "function": (params, onError) => {
+ const blockquotes = params.parsers.markdownit.tokens
+ .filter(((token) => token.type === "blockquote_open"));
+ for (const blockquote of blockquotes) {
+ const [ startIndex, endIndex ] = blockquote.map;
+ const lines = endIndex - startIndex;
+ onError({
+ "lineNumber": blockquote.lineNumber,
+ "detail": "Blockquote spans " + lines + " line(s).",
+ "context": blockquote.line
+ });
+ }
}
}
-};
+
+];
diff --git a/test/rules/rules.js b/test/rules/rules.js
index ee16c96e..083726a7 100644
--- a/test/rules/rules.js
+++ b/test/rules/rules.js
@@ -21,7 +21,7 @@ const validateJson = require("./validate-json");
module.exports.validateJson = validateJson;
module.exports.all = [
- anyBlockquote,
+ ...anyBlockquote,
everyNLines,
firstLine,
lettersEX,
diff --git a/test/snapshots/markdownlint-test-custom-rules.js.md b/test/snapshots/markdownlint-test-custom-rules.js.md
index fb9a6a44..32e2c57c 100644
--- a/test/snapshots/markdownlint-test-custom-rules.js.md
+++ b/test/snapshots/markdownlint-test-custom-rules.js.md
@@ -3065,3 +3065,3523 @@ Generated by [AVA](https://avajs.dev).
type: 'html_block',
},
]
+
+## customRulesMicromarkTokensSnapshot
+
+> Unexpected tokens
+
+ [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 22,
+ endLine: 1,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 1,
+ text: 'Every Markdown Syntax',
+ type: 'data',
+ },
+ ],
+ endColumn: 22,
+ endLine: 1,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 1,
+ text: 'Every Markdown Syntax',
+ type: 'setextHeadingText',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 2,
+ parent: [Circular],
+ startColumn: 22,
+ startLine: 1,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 22,
+ endLine: 2,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 2,
+ text: '=====================',
+ type: 'setextHeadingLineSequence',
+ },
+ ],
+ endColumn: 22,
+ endLine: 2,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 2,
+ text: '=====================',
+ type: 'setextHeadingLine',
+ },
+ ],
+ endColumn: 22,
+ endLine: 2,
+ parent: null,
+ startColumn: 1,
+ startLine: 1,
+ text: `Every Markdown Syntax␊
+ =====================`,
+ type: 'setextHeading',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 3,
+ parent: null,
+ startColumn: 22,
+ startLine: 2,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 4,
+ parent: null,
+ startColumn: 1,
+ startLine: 3,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 4,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 4,
+ text: '##',
+ type: 'atxHeadingSequence',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 4,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 4,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 23,
+ endLine: 4,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 4,
+ text: 'Level 2 ATX Heading',
+ type: 'data',
+ },
+ ],
+ endColumn: 23,
+ endLine: 4,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 4,
+ text: 'Level 2 ATX Heading',
+ type: 'atxHeadingText',
+ },
+ ],
+ endColumn: 23,
+ endLine: 4,
+ parent: null,
+ startColumn: 1,
+ startLine: 4,
+ text: '## Level 2 ATX Heading',
+ type: 'atxHeading',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 5,
+ parent: null,
+ startColumn: 23,
+ startLine: 4,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 6,
+ parent: null,
+ startColumn: 1,
+ startLine: 5,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 6,
+ text: '###',
+ type: 'atxHeadingSequence',
+ },
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 6,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 31,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 6,
+ text: 'Level 3 Closed ATX Heading',
+ type: 'data',
+ },
+ ],
+ endColumn: 31,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 6,
+ text: 'Level 3 Closed ATX Heading',
+ type: 'atxHeadingText',
+ },
+ {
+ children: [],
+ endColumn: 32,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 31,
+ startLine: 6,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [],
+ endColumn: 35,
+ endLine: 6,
+ parent: [Circular],
+ startColumn: 32,
+ startLine: 6,
+ text: '###',
+ type: 'atxHeadingSequence',
+ },
+ ],
+ endColumn: 35,
+ endLine: 6,
+ parent: null,
+ startColumn: 1,
+ startLine: 6,
+ text: '### Level 3 Closed ATX Heading ###',
+ type: 'atxHeading',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 7,
+ parent: null,
+ startColumn: 35,
+ startLine: 6,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 8,
+ parent: null,
+ startColumn: 1,
+ startLine: 7,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 8,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 8,
+ text: '---',
+ type: 'thematicBreakSequence',
+ },
+ ],
+ endColumn: 4,
+ endLine: 8,
+ parent: null,
+ startColumn: 1,
+ startLine: 8,
+ text: '---',
+ type: 'thematicBreak',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 9,
+ parent: null,
+ startColumn: 4,
+ startLine: 8,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 10,
+ parent: null,
+ startColumn: 1,
+ startLine: 9,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 10,
+ text: 'Text ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 10,
+ text: '*',
+ type: 'emphasisSequence',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 17,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 10,
+ text: 'emphasized',
+ type: 'data',
+ },
+ ],
+ endColumn: 17,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 10,
+ text: 'emphasized',
+ type: 'emphasisText',
+ },
+ {
+ children: [],
+ endColumn: 18,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 17,
+ startLine: 10,
+ text: '*',
+ type: 'emphasisSequence',
+ },
+ ],
+ endColumn: 18,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 10,
+ text: '*emphasized*',
+ type: 'emphasis',
+ },
+ {
+ children: [],
+ endColumn: 19,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 18,
+ startLine: 10,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 21,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 19,
+ startLine: 10,
+ text: '**',
+ type: 'strongSequence',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 27,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 21,
+ startLine: 10,
+ text: 'strong',
+ type: 'data',
+ },
+ ],
+ endColumn: 27,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 21,
+ startLine: 10,
+ text: 'strong',
+ type: 'strongText',
+ },
+ {
+ children: [],
+ endColumn: 29,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 27,
+ startLine: 10,
+ text: '**',
+ type: 'strongSequence',
+ },
+ ],
+ endColumn: 29,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 19,
+ startLine: 10,
+ text: '**strong**',
+ type: 'strong',
+ },
+ {
+ children: [],
+ endColumn: 30,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 29,
+ startLine: 10,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 31,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 30,
+ startLine: 10,
+ text: '_',
+ type: 'emphasisSequence',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 33,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 31,
+ startLine: 10,
+ text: '__',
+ type: 'strongSequence',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 50,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 33,
+ startLine: 10,
+ text: 'emphasized+strong',
+ type: 'data',
+ },
+ ],
+ endColumn: 50,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 33,
+ startLine: 10,
+ text: 'emphasized+strong',
+ type: 'strongText',
+ },
+ {
+ children: [],
+ endColumn: 52,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 50,
+ startLine: 10,
+ text: '__',
+ type: 'strongSequence',
+ },
+ ],
+ endColumn: 52,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 31,
+ startLine: 10,
+ text: '__emphasized+strong__',
+ type: 'strong',
+ },
+ ],
+ endColumn: 52,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 31,
+ startLine: 10,
+ text: '__emphasized+strong__',
+ type: 'emphasisText',
+ },
+ {
+ children: [],
+ endColumn: 53,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 52,
+ startLine: 10,
+ text: '_',
+ type: 'emphasisSequence',
+ },
+ ],
+ endColumn: 53,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 30,
+ startLine: 10,
+ text: '___emphasized+strong___',
+ type: 'emphasis',
+ },
+ {
+ children: [],
+ endColumn: 54,
+ endLine: 10,
+ parent: [Circular],
+ startColumn: 53,
+ startLine: 10,
+ text: '.',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 54,
+ startLine: 10,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 11,
+ text: 'Text ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 11,
+ text: '`',
+ type: 'codeTextSequence',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 11,
+ text: 'code',
+ type: 'codeTextData',
+ },
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 11,
+ text: '`',
+ type: 'codeTextSequence',
+ },
+ ],
+ endColumn: 12,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 11,
+ text: '`code`',
+ type: 'codeText',
+ },
+ {
+ children: [],
+ endColumn: 13,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 11,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 21,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 11,
+ text: '',
+ type: 'htmlTextData',
+ },
+ ],
+ endColumn: 21,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 11,
+ text: '',
+ type: 'htmlText',
+ },
+ {
+ children: [],
+ endColumn: 25,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 21,
+ startLine: 11,
+ text: 'html',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 34,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 25,
+ startLine: 11,
+ text: '',
+ type: 'htmlTextData',
+ },
+ ],
+ endColumn: 34,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 25,
+ startLine: 11,
+ text: '',
+ type: 'htmlText',
+ },
+ {
+ children: [],
+ endColumn: 35,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 34,
+ startLine: 11,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 36,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 35,
+ startLine: 11,
+ text: '<',
+ type: 'autolinkMarker',
+ },
+ {
+ children: [],
+ endColumn: 60,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 36,
+ startLine: 11,
+ text: 'https://example.com/page',
+ type: 'autolinkProtocol',
+ },
+ {
+ children: [],
+ endColumn: 61,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 60,
+ startLine: 11,
+ text: '>',
+ type: 'autolinkMarker',
+ },
+ ],
+ endColumn: 61,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 35,
+ startLine: 11,
+ text: '',
+ type: 'autolink',
+ },
+ {
+ children: [],
+ endColumn: 62,
+ endLine: 11,
+ parent: [Circular],
+ startColumn: 61,
+ startLine: 11,
+ text: '.',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 62,
+ startLine: 11,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 12,
+ text: 'Text ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 12,
+ text: '[',
+ type: 'labelMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 12,
+ text: 'link',
+ type: 'data',
+ },
+ ],
+ endColumn: 11,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 12,
+ text: 'link',
+ type: 'labelText',
+ },
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 12,
+ text: ']',
+ type: 'labelMarker',
+ },
+ ],
+ endColumn: 12,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 12,
+ text: '[link]',
+ type: 'label',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 13,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 12,
+ text: '(',
+ type: 'resourceMarker',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 37,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 12,
+ text: 'https://example.com/page',
+ type: 'data',
+ },
+ ],
+ endColumn: 37,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 12,
+ text: 'https://example.com/page',
+ type: 'resourceDestinationString',
+ },
+ ],
+ endColumn: 37,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 12,
+ text: 'https://example.com/page',
+ type: 'resourceDestinationRaw',
+ },
+ ],
+ endColumn: 37,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 12,
+ text: 'https://example.com/page',
+ type: 'resourceDestination',
+ },
+ {
+ children: [],
+ endColumn: 38,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 37,
+ startLine: 12,
+ text: ')',
+ type: 'resourceMarker',
+ },
+ ],
+ endColumn: 38,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 12,
+ text: '(https://example.com/page)',
+ type: 'resource',
+ },
+ ],
+ endColumn: 38,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 12,
+ text: '[link](https://example.com/page)',
+ type: 'link',
+ },
+ {
+ children: [],
+ endColumn: 39,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 38,
+ startLine: 12,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 40,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 39,
+ startLine: 12,
+ text: '[',
+ type: 'labelMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 44,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 40,
+ startLine: 12,
+ text: 'link',
+ type: 'data',
+ },
+ ],
+ endColumn: 44,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 40,
+ startLine: 12,
+ text: 'link',
+ type: 'labelText',
+ },
+ {
+ children: [],
+ endColumn: 45,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 44,
+ startLine: 12,
+ text: ']',
+ type: 'labelMarker',
+ },
+ ],
+ endColumn: 45,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 39,
+ startLine: 12,
+ text: '[link]',
+ type: 'label',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 46,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 45,
+ startLine: 12,
+ text: '[',
+ type: 'referenceMarker',
+ },
+ {
+ children: [],
+ endColumn: 47,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 46,
+ startLine: 12,
+ text: ']',
+ type: 'referenceMarker',
+ },
+ ],
+ endColumn: 47,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 45,
+ startLine: 12,
+ text: '[]',
+ type: 'reference',
+ },
+ ],
+ endColumn: 47,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 39,
+ startLine: 12,
+ text: '[link][]',
+ type: 'link',
+ },
+ {
+ children: [],
+ endColumn: 48,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 47,
+ startLine: 12,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 49,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 48,
+ startLine: 12,
+ text: '[',
+ type: 'labelMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 53,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 49,
+ startLine: 12,
+ text: 'link',
+ type: 'data',
+ },
+ ],
+ endColumn: 53,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 49,
+ startLine: 12,
+ text: 'link',
+ type: 'labelText',
+ },
+ {
+ children: [],
+ endColumn: 54,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 53,
+ startLine: 12,
+ text: ']',
+ type: 'labelMarker',
+ },
+ ],
+ endColumn: 54,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 48,
+ startLine: 12,
+ text: '[link]',
+ type: 'label',
+ },
+ ],
+ endColumn: 54,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 48,
+ startLine: 12,
+ text: '[link]',
+ type: 'link',
+ },
+ {
+ children: [],
+ endColumn: 55,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 54,
+ startLine: 12,
+ text: ' ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 56,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 55,
+ startLine: 12,
+ text: '!',
+ type: 'labelImageMarker',
+ },
+ {
+ children: [],
+ endColumn: 57,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 56,
+ startLine: 12,
+ text: '[',
+ type: 'labelMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 62,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 57,
+ startLine: 12,
+ text: 'image',
+ type: 'data',
+ },
+ ],
+ endColumn: 62,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 57,
+ startLine: 12,
+ text: 'image',
+ type: 'labelText',
+ },
+ {
+ children: [],
+ endColumn: 63,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 62,
+ startLine: 12,
+ text: ']',
+ type: 'labelMarker',
+ },
+ ],
+ endColumn: 63,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 55,
+ startLine: 12,
+ text: '![image]',
+ type: 'label',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 64,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 63,
+ startLine: 12,
+ text: '[',
+ type: 'referenceMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 68,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 64,
+ startLine: 12,
+ text: 'link',
+ type: 'data',
+ },
+ ],
+ endColumn: 68,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 64,
+ startLine: 12,
+ text: 'link',
+ type: 'referenceString',
+ },
+ {
+ children: [],
+ endColumn: 69,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 68,
+ startLine: 12,
+ text: ']',
+ type: 'referenceMarker',
+ },
+ ],
+ endColumn: 69,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 63,
+ startLine: 12,
+ text: '[link]',
+ type: 'reference',
+ },
+ ],
+ endColumn: 69,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 55,
+ startLine: 12,
+ text: '![image][link]',
+ type: 'image',
+ },
+ {
+ children: [],
+ endColumn: 70,
+ endLine: 12,
+ parent: [Circular],
+ startColumn: 69,
+ startLine: 12,
+ text: '.',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 70,
+ startLine: 12,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 13,
+ text: 'Text ',
+ type: 'data',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 30,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 13,
+ text: 'https://example.com/page',
+ type: 'literalAutolinkHttp',
+ },
+ ],
+ endColumn: 30,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 13,
+ text: 'https://example.com/page',
+ type: 'literalAutolink',
+ },
+ {
+ children: [],
+ endColumn: 31,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 30,
+ startLine: 13,
+ text: '.',
+ type: 'data',
+ },
+ ],
+ endColumn: 31,
+ endLine: 13,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 10,
+ text: `Text *emphasized* **strong** ___emphasized+strong___.␊
+ Text \`code\` html .␊
+ Text [link](https://example.com/page) [link][] [link] ![image][link].␊
+ Text https://example.com/page.`,
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 31,
+ endLine: 13,
+ parent: null,
+ startColumn: 1,
+ startLine: 10,
+ text: `Text *emphasized* **strong** ___emphasized+strong___.␊
+ Text \`code\` html .␊
+ Text [link](https://example.com/page) [link][] [link] ![image][link].␊
+ Text https://example.com/page.`,
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 14,
+ parent: null,
+ startColumn: 31,
+ startLine: 13,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 15,
+ parent: null,
+ startColumn: 1,
+ startLine: 14,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 15,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 15,
+ text: 'Hard',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 15,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 15,
+ text: ' ',
+ type: 'hardBreakTrailing',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 16,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 15,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 16,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 16,
+ text: 'line break',
+ type: 'data',
+ },
+ ],
+ endColumn: 11,
+ endLine: 16,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 15,
+ text: `Hard ␊
+ line break`,
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 11,
+ endLine: 16,
+ parent: null,
+ startColumn: 1,
+ startLine: 15,
+ text: `Hard ␊
+ line break`,
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 17,
+ parent: null,
+ startColumn: 11,
+ startLine: 16,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 18,
+ parent: null,
+ startColumn: 1,
+ startLine: 17,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 18,
+ text: '[',
+ type: 'definitionLabelMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 18,
+ text: 'link',
+ type: 'data',
+ },
+ ],
+ endColumn: 6,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 18,
+ text: 'link',
+ type: 'definitionLabelString',
+ },
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 18,
+ text: ']',
+ type: 'definitionLabelMarker',
+ },
+ ],
+ endColumn: 7,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 18,
+ text: '[link]',
+ type: 'definitionLabel',
+ },
+ {
+ children: [],
+ endColumn: 8,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 18,
+ text: ':',
+ type: 'definitionMarker',
+ },
+ {
+ children: [],
+ endColumn: 9,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 8,
+ startLine: 18,
+ text: ' ',
+ type: 'lineSuffix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 33,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 18,
+ text: 'https://example.com/page',
+ type: 'data',
+ },
+ ],
+ endColumn: 33,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 18,
+ text: 'https://example.com/page',
+ type: 'definitionDestinationString',
+ },
+ ],
+ endColumn: 33,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 18,
+ text: 'https://example.com/page',
+ type: 'definitionDestinationRaw',
+ },
+ ],
+ endColumn: 33,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 18,
+ text: 'https://example.com/page',
+ type: 'definitionDestination',
+ },
+ {
+ children: [],
+ endColumn: 34,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 33,
+ startLine: 18,
+ text: ' ',
+ type: 'lineSuffix',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 35,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 34,
+ startLine: 18,
+ text: '"',
+ type: 'definitionTitleMarker',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 40,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 35,
+ startLine: 18,
+ text: 'Title',
+ type: 'data',
+ },
+ ],
+ endColumn: 40,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 35,
+ startLine: 18,
+ text: 'Title',
+ type: 'definitionTitleString',
+ },
+ {
+ children: [],
+ endColumn: 41,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 40,
+ startLine: 18,
+ text: '"',
+ type: 'definitionTitleMarker',
+ },
+ ],
+ endColumn: 41,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 34,
+ startLine: 18,
+ text: '"Title"',
+ type: 'definitionTitle',
+ },
+ ],
+ endColumn: 41,
+ endLine: 18,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 18,
+ text: '[link]: https://example.com/page "Title"',
+ type: 'definition',
+ },
+ ],
+ endColumn: 41,
+ endLine: 18,
+ parent: null,
+ startColumn: 1,
+ startLine: 18,
+ text: '[link]: https://example.com/page "Title"',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 19,
+ parent: null,
+ startColumn: 41,
+ startLine: 18,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 20,
+ parent: null,
+ startColumn: 1,
+ startLine: 19,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 20,
+ text: '>',
+ type: 'blockQuoteMarker',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 20,
+ text: ' ',
+ type: 'blockQuotePrefixWhitespace',
+ },
+ ],
+ endColumn: 3,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 20,
+ text: '> ',
+ type: 'blockQuotePrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 14,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 20,
+ text: 'Block quote',
+ type: 'data',
+ },
+ ],
+ endColumn: 14,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 20,
+ text: 'Block quote',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 14,
+ endLine: 20,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 20,
+ text: 'Block quote',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 14,
+ startLine: 20,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 21,
+ text: '>',
+ type: 'blockQuoteMarker',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 21,
+ text: ' ',
+ type: 'blockQuotePrefixWhitespace',
+ },
+ ],
+ endColumn: 3,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 21,
+ text: '> ',
+ type: 'blockQuotePrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 21,
+ text: '>',
+ type: 'blockQuoteMarker',
+ },
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 21,
+ text: ' ',
+ type: 'blockQuotePrefixWhitespace',
+ },
+ ],
+ endColumn: 5,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 21,
+ text: '> ',
+ type: 'blockQuotePrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 21,
+ text: 'Nested',
+ type: 'data',
+ },
+ ],
+ endColumn: 11,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 21,
+ text: 'Nested',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 11,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 21,
+ text: 'Nested',
+ type: 'content',
+ },
+ ],
+ endColumn: 11,
+ endLine: 21,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 21,
+ text: '',
+ type: 'blockQuote',
+ },
+ ],
+ endColumn: 11,
+ endLine: 21,
+ parent: null,
+ startColumn: 1,
+ startLine: 20,
+ text: '',
+ type: 'blockQuote',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 22,
+ parent: null,
+ startColumn: 11,
+ startLine: 21,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 23,
+ parent: null,
+ startColumn: 1,
+ startLine: 22,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 23,
+ text: '-',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 23,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 3,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 23,
+ text: '- ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 23,
+ text: 'Unordered',
+ type: 'data',
+ },
+ ],
+ endColumn: 12,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 23,
+ text: 'Unordered',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 12,
+ endLine: 23,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 23,
+ text: 'Unordered',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 23,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 24,
+ text: '-',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 24,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 3,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 24,
+ text: '- ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 24,
+ text: 'List',
+ type: 'data',
+ },
+ ],
+ endColumn: 7,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 24,
+ text: 'List',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 7,
+ endLine: 24,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 24,
+ text: 'List',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 24,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 25,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 25,
+ text: '-',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 25,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 5,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 25,
+ text: '- ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 10,
+ endLine: 25,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 25,
+ text: 'Items',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 10,
+ startLine: 25,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 26,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 26,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 13,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 26,
+ text: 'Indented',
+ type: 'data',
+ },
+ ],
+ endColumn: 13,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 25,
+ text: `Items␊
+ Indented`,
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 13,
+ endLine: 26,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 25,
+ text: `Items␊
+ Indented`,
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 27,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 26,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 27,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 28,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 28,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 28,
+ text: 'Content',
+ type: 'data',
+ },
+ ],
+ endColumn: 12,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 28,
+ text: 'Content',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 12,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 28,
+ text: 'Content',
+ type: 'content',
+ },
+ ],
+ endColumn: 12,
+ endLine: 28,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 25,
+ text: '',
+ type: 'listUnordered',
+ },
+ ],
+ endColumn: 12,
+ endLine: 28,
+ parent: null,
+ startColumn: 1,
+ startLine: 23,
+ text: '',
+ type: 'listUnordered',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 29,
+ parent: null,
+ startColumn: 12,
+ startLine: 28,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 30,
+ parent: null,
+ startColumn: 1,
+ startLine: 29,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 30,
+ text: '1',
+ type: 'listItemValue',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 30,
+ text: '.',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 30,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 4,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 30,
+ text: '1. ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 30,
+ text: 'Ordered',
+ type: 'data',
+ },
+ ],
+ endColumn: 11,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 30,
+ text: 'Ordered',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 11,
+ endLine: 30,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 30,
+ text: 'Ordered',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 30,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 31,
+ text: '2',
+ type: 'listItemValue',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 31,
+ text: '.',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 31,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 4,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 31,
+ text: '2. ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 8,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 31,
+ text: 'List',
+ type: 'data',
+ },
+ ],
+ endColumn: 8,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 31,
+ text: 'List',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 8,
+ endLine: 31,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 31,
+ text: 'List',
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 8,
+ startLine: 31,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 32,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 32,
+ text: '1',
+ type: 'listItemValue',
+ },
+ {
+ children: [],
+ endColumn: 6,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 32,
+ text: '.',
+ type: 'listItemMarker',
+ },
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 6,
+ startLine: 32,
+ text: ' ',
+ type: 'listItemPrefixWhitespace',
+ },
+ ],
+ endColumn: 7,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 32,
+ text: '1. ',
+ type: 'listItemPrefix',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 32,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 32,
+ text: 'Items',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 32,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 33,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 33,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 15,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 33,
+ text: 'Indented',
+ type: 'data',
+ },
+ ],
+ endColumn: 15,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 32,
+ text: `Items␊
+ Indented`,
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 15,
+ endLine: 33,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 32,
+ text: `Items␊
+ Indented`,
+ type: 'content',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 34,
+ parent: [Circular],
+ startColumn: 15,
+ startLine: 33,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 34,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 35,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [],
+ endColumn: 7,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 35,
+ text: ' ',
+ type: 'listItemIndent',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 14,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 35,
+ text: 'Content',
+ type: 'data',
+ },
+ ],
+ endColumn: 14,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 35,
+ text: 'Content',
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 14,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 7,
+ startLine: 35,
+ text: 'Content',
+ type: 'content',
+ },
+ ],
+ endColumn: 14,
+ endLine: 35,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 32,
+ text: '',
+ type: 'listOrdered',
+ },
+ ],
+ endColumn: 14,
+ endLine: 35,
+ parent: null,
+ startColumn: 1,
+ startLine: 30,
+ text: '',
+ type: 'listOrdered',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 36,
+ parent: null,
+ startColumn: 14,
+ startLine: 35,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 37,
+ parent: null,
+ startColumn: 1,
+ startLine: 36,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 37,
+ text: '```',
+ type: 'codeFencedFenceSequence',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 12,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 37,
+ text: 'markdown',
+ type: 'data',
+ },
+ ],
+ endColumn: 12,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 37,
+ text: 'markdown',
+ type: 'codeFencedFenceInfo',
+ },
+ {
+ children: [],
+ endColumn: 13,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 12,
+ startLine: 37,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 20,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 37,
+ text: 'options',
+ type: 'data',
+ },
+ ],
+ endColumn: 20,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 13,
+ startLine: 37,
+ text: 'options',
+ type: 'codeFencedFenceMeta',
+ },
+ ],
+ endColumn: 20,
+ endLine: 37,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 37,
+ text: '```markdown options',
+ type: 'codeFencedFence',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 38,
+ parent: [Circular],
+ startColumn: 20,
+ startLine: 37,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 18,
+ endLine: 38,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 38,
+ text: 'Fenced code block',
+ type: 'codeFlowValue',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 39,
+ parent: [Circular],
+ startColumn: 18,
+ startLine: 38,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 39,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 39,
+ text: '```',
+ type: 'codeFencedFenceSequence',
+ },
+ ],
+ endColumn: 4,
+ endLine: 39,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 39,
+ text: '```',
+ type: 'codeFencedFence',
+ },
+ ],
+ endColumn: 4,
+ endLine: 39,
+ parent: null,
+ startColumn: 1,
+ startLine: 37,
+ text: `\`\`\`markdown options␊
+ Fenced code block␊
+ \`\`\``,
+ type: 'codeFenced',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 40,
+ parent: null,
+ startColumn: 4,
+ startLine: 39,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 41,
+ parent: null,
+ startColumn: 1,
+ startLine: 40,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 41,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 41,
+ text: ' ',
+ type: 'linePrefix',
+ },
+ {
+ children: [],
+ endColumn: 24,
+ endLine: 41,
+ parent: [Circular],
+ startColumn: 5,
+ startLine: 41,
+ text: 'Indented code block',
+ type: 'codeFlowValue',
+ },
+ ],
+ endColumn: 24,
+ endLine: 41,
+ parent: null,
+ startColumn: 1,
+ startLine: 41,
+ text: ' Indented code block',
+ type: 'codeIndented',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 42,
+ parent: null,
+ startColumn: 24,
+ startLine: 41,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 43,
+ parent: null,
+ startColumn: 1,
+ startLine: 42,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 4,
+ endLine: 43,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 43,
+ text: '',
+ type: 'htmlTextData',
+ },
+ ],
+ endColumn: 4,
+ endLine: 43,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 43,
+ text: '
',
+ type: 'htmlText',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 44,
+ parent: [Circular],
+ startColumn: 4,
+ startLine: 43,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 44,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 44,
+ text: 'HTML block',
+ type: 'data',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 45,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 44,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 5,
+ endLine: 45,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 45,
+ text: '
',
+ type: 'htmlTextData',
+ },
+ ],
+ endColumn: 5,
+ endLine: 45,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 45,
+ text: '
',
+ type: 'htmlText',
+ },
+ ],
+ endColumn: 5,
+ endLine: 45,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 43,
+ text: `␊
+ HTML block␊
+
`,
+ type: 'paragraph',
+ },
+ ],
+ endColumn: 5,
+ endLine: 45,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 43,
+ text: `␊
+ HTML block␊
+
`,
+ type: 'content',
+ },
+ ],
+ endColumn: 5,
+ endLine: 45,
+ parent: null,
+ startColumn: 1,
+ startLine: 43,
+ text: `␊
+ HTML block␊
+
`,
+ type: 'htmlFlow',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 46,
+ parent: null,
+ startColumn: 5,
+ startLine: 45,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 47,
+ parent: null,
+ startColumn: 1,
+ startLine: 46,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 47,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 47,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 8,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 47,
+ text: 'Table',
+ type: 'data',
+ },
+ ],
+ endColumn: 8,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 47,
+ text: 'Table',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 9,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 8,
+ startLine: 47,
+ text: ' ',
+ type: 'whitespace',
+ },
+ ],
+ endColumn: 9,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 47,
+ text: '| Table ',
+ type: 'tableHeader',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 10,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 47,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 10,
+ startLine: 47,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 18,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 47,
+ text: 'Heading',
+ type: 'data',
+ },
+ ],
+ endColumn: 18,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 47,
+ text: 'Heading',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 19,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 18,
+ startLine: 47,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [],
+ endColumn: 20,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 19,
+ startLine: 47,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ ],
+ endColumn: 20,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 47,
+ text: '| Heading |',
+ type: 'tableHeader',
+ },
+ ],
+ endColumn: 20,
+ endLine: 47,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 47,
+ text: '| Table | Heading |',
+ type: 'tableRow',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 20,
+ startLine: 47,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 48,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 48,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 8,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 48,
+ text: '-----',
+ type: 'tableDelimiterFiller',
+ },
+ ],
+ endColumn: 8,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 48,
+ text: '-----',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 9,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 8,
+ startLine: 48,
+ text: ' ',
+ type: 'whitespace',
+ },
+ ],
+ endColumn: 9,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 48,
+ text: '| ----- ',
+ type: 'tableDelimiter',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 10,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 48,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 10,
+ startLine: 48,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 18,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 48,
+ text: '-------',
+ type: 'tableDelimiterFiller',
+ },
+ ],
+ endColumn: 18,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 48,
+ text: '-------',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 19,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 18,
+ startLine: 48,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [],
+ endColumn: 20,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 19,
+ startLine: 48,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ ],
+ endColumn: 20,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 48,
+ text: '| ------- |',
+ type: 'tableDelimiter',
+ },
+ ],
+ endColumn: 20,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 48,
+ text: '| ----- | ------- |',
+ type: 'tableDelimiterRow',
+ },
+ ],
+ endColumn: 20,
+ endLine: 48,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 47,
+ text: `| Table | Heading |␊
+ | ----- | ------- |`,
+ type: 'tableHead',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 20,
+ startLine: 48,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 2,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 49,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 3,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 2,
+ startLine: 49,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 8,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 49,
+ text: 'Table',
+ type: 'data',
+ },
+ ],
+ endColumn: 8,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 3,
+ startLine: 49,
+ text: 'Table',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 9,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 8,
+ startLine: 49,
+ text: ' ',
+ type: 'whitespace',
+ },
+ ],
+ endColumn: 9,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 49,
+ text: '| Table ',
+ type: 'tableData',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 10,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 49,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ {
+ children: [],
+ endColumn: 11,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 10,
+ startLine: 49,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 15,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 49,
+ text: 'Cell',
+ type: 'data',
+ },
+ ],
+ endColumn: 15,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 11,
+ startLine: 49,
+ text: 'Cell',
+ type: 'tableContent',
+ },
+ {
+ children: [],
+ endColumn: 19,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 15,
+ startLine: 49,
+ text: ' ',
+ type: 'whitespace',
+ },
+ {
+ children: [],
+ endColumn: 20,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 19,
+ startLine: 49,
+ text: '|',
+ type: 'tableCellDivider',
+ },
+ ],
+ endColumn: 20,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 9,
+ startLine: 49,
+ text: '| Cell |',
+ type: 'tableData',
+ },
+ ],
+ endColumn: 20,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 49,
+ text: '| Table | Cell |',
+ type: 'tableRow',
+ },
+ ],
+ endColumn: 20,
+ endLine: 49,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 49,
+ text: '| Table | Cell |',
+ type: 'tableBody',
+ },
+ ],
+ endColumn: 20,
+ endLine: 49,
+ parent: null,
+ startColumn: 1,
+ startLine: 47,
+ text: `| Table | Heading |␊
+ | ----- | ------- |␊
+ | Table | Cell |`,
+ type: 'table',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 50,
+ parent: null,
+ startColumn: 20,
+ startLine: 49,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 51,
+ parent: null,
+ startColumn: 1,
+ startLine: 50,
+ text: `␊
+ `,
+ type: 'lineEndingBlank',
+ },
+ {
+ children: [
+ {
+ children: [],
+ endColumn: 35,
+ endLine: 51,
+ parent: [Circular],
+ startColumn: 1,
+ startLine: 51,
+ text: '',
+ type: 'htmlFlowData',
+ },
+ ],
+ endColumn: 35,
+ endLine: 51,
+ parent: null,
+ startColumn: 1,
+ startLine: 51,
+ text: '',
+ type: 'htmlFlow',
+ },
+ {
+ children: [],
+ endColumn: 1,
+ endLine: 52,
+ parent: null,
+ startColumn: 35,
+ startLine: 51,
+ text: `␊
+ `,
+ type: 'lineEnding',
+ },
+ ]
diff --git a/test/snapshots/markdownlint-test-custom-rules.js.snap b/test/snapshots/markdownlint-test-custom-rules.js.snap
index b0f17cd983ac2754fa08e714d3ab53f64b01f9ce..520c2decd82cea2f29a9896c8791d4d5d4247a35 100644
GIT binary patch
literal 36854
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
Cza<|4
literal 14718
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 |