2023-01-12 21:20:54 -08:00
|
|
|
// @ts-check
|
|
|
|
|
2023-01-09 21:59:54 -08:00
|
|
|
import fs from "node:fs/promises";
|
|
|
|
import test from "ava";
|
2023-01-12 21:20:54 -08:00
|
|
|
import { newLineRe } from "../helpers/helpers.js";
|
2024-09-28 16:26:38 -07:00
|
|
|
import { filterByPredicate, filterByTypes } from "../helpers/micromark-helpers.cjs";
|
|
|
|
import { getEvents, parse } from "../helpers/micromark-parse.cjs";
|
2023-01-09 21:59:54 -08:00
|
|
|
|
2023-03-20 22:05:05 -07:00
|
|
|
const testContent = new Promise((resolve, reject) => {
|
|
|
|
fs
|
|
|
|
.readFile("./test/every-markdown-syntax.md", "utf8")
|
|
|
|
.then((content) => content.split(newLineRe).join("\n"))
|
|
|
|
.then(resolve, reject);
|
|
|
|
});
|
|
|
|
|
|
|
|
const testTokens = new Promise((resolve, reject) => {
|
|
|
|
testContent.then(parse).then(resolve, reject);
|
|
|
|
});
|
|
|
|
|
2023-01-09 21:59:54 -08:00
|
|
|
test("parse", async(t) => {
|
|
|
|
t.plan(1);
|
2024-10-01 22:41:10 -07:00
|
|
|
t.snapshot(await testTokens, "Unexpected tokens");
|
2023-01-09 21:59:54 -08:00
|
|
|
});
|
2023-02-10 20:37:32 -08:00
|
|
|
|
2024-09-28 16:26:38 -07:00
|
|
|
test("getEvents/filterByPredicate", async(t) => {
|
2023-02-10 20:37:32 -08:00
|
|
|
t.plan(1);
|
2023-03-20 22:05:05 -07:00
|
|
|
const content = await testContent;
|
2024-09-28 16:26:38 -07:00
|
|
|
const events = getEvents(content);
|
2023-09-02 12:07:14 -07:00
|
|
|
let inHtmlFlow = false;
|
2023-02-10 20:37:32 -08:00
|
|
|
const eventTypes = events
|
2023-09-02 12:07:14 -07:00
|
|
|
.filter((event) => {
|
|
|
|
const result = !inHtmlFlow && (event[0] === "enter");
|
|
|
|
if (event[1].type === "htmlFlow") {
|
|
|
|
inHtmlFlow = !inHtmlFlow;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
})
|
2023-02-10 20:37:32 -08:00
|
|
|
.map((event) => event[1].type);
|
2023-03-20 22:05:05 -07:00
|
|
|
const tokens = parse(content);
|
2023-09-02 12:07:14 -07:00
|
|
|
const filtered = filterByPredicate(
|
|
|
|
tokens,
|
|
|
|
() => true,
|
|
|
|
(token) => ((token.type === "htmlFlow") ? [] : token.children)
|
|
|
|
);
|
2023-03-20 22:05:05 -07:00
|
|
|
const tokenTypes = filtered.map((token) => token.type);
|
2023-02-10 20:37:32 -08:00
|
|
|
t.deepEqual(tokenTypes, eventTypes);
|
|
|
|
});
|
|
|
|
|
2024-06-09 17:09:03 -07:00
|
|
|
test("filterByTypes, htmlFlow false", async(t) => {
|
|
|
|
t.plan(7);
|
|
|
|
const tokens = await testTokens;
|
|
|
|
// eslint-disable-next-line jsdoc/valid-types
|
|
|
|
/** @type import("../micromark/micromark.cjs").TokenType[] */
|
|
|
|
const types = [ "atxHeadingText", "codeText", "htmlText", "setextHeadingText" ];
|
|
|
|
const filtered = filterByTypes(tokens, types);
|
|
|
|
// Using flat tokens
|
|
|
|
for (const token of filtered) {
|
|
|
|
t.true(token.type.endsWith("Text"));
|
|
|
|
}
|
|
|
|
// Not using flat tokens
|
|
|
|
t.deepEqual(
|
|
|
|
filtered,
|
2024-09-01 16:16:05 -07:00
|
|
|
filterByTypes([ ...tokens ], types)
|
|
|
|
);
|
2024-06-09 17:09:03 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
test("filterByTypes, htmlFlow true", async(t) => {
|
|
|
|
t.plan(9);
|
|
|
|
const tokens = await testTokens;
|
|
|
|
// eslint-disable-next-line jsdoc/valid-types
|
|
|
|
/** @type import("../micromark/micromark.cjs").TokenType[] */
|
|
|
|
const types = [ "atxHeadingText", "codeText", "htmlText", "setextHeadingText" ];
|
|
|
|
// Using flat tokens
|
|
|
|
const filtered = filterByTypes(tokens, types, true);
|
2023-03-20 22:05:05 -07:00
|
|
|
for (const token of filtered) {
|
2023-02-10 20:37:32 -08:00
|
|
|
t.true(token.type.endsWith("Text"));
|
|
|
|
}
|
2024-06-09 17:09:03 -07:00
|
|
|
// Not using flat tokens
|
|
|
|
t.deepEqual(
|
|
|
|
filtered,
|
2024-09-01 16:16:05 -07:00
|
|
|
filterByTypes([ ...tokens ], types, true)
|
|
|
|
);
|
2023-02-10 20:37:32 -08:00
|
|
|
});
|
2023-08-30 22:34:21 -07:00
|
|
|
|
|
|
|
test("filterByPredicate/filterByTypes", async(t) => {
|
|
|
|
t.plan(1);
|
|
|
|
const tokens = await testTokens;
|
|
|
|
const byPredicate = filterByPredicate(tokens, () => true);
|
2024-10-06 21:03:07 -07:00
|
|
|
const allTypes = new Set(byPredicate.map((token) => token.type));
|
2024-06-09 17:09:03 -07:00
|
|
|
const byTypes = filterByTypes(tokens, [ ...allTypes.values() ], true);
|
2023-08-30 22:34:21 -07:00
|
|
|
t.deepEqual(byPredicate, byTypes);
|
|
|
|
});
|