Files
hopdown/test/hopdown.macro.test.js
T
2026-10-17 13:28:47 -07:00

111 lines
2.9 KiB
JavaScript

import { expect, test, suite, describe } from 'vitest'
import { HopDown } from '../dist';
import { Macro, TagCollection } from "../dist/tags";
import dedent from "dedent";
var hopdown = new HopDown();
var jsonMacro = {
name: 'json',
template: dedent(`
::: json
: indent=2
{
"Foo": "BAR",
"one": 1
}
:::
`),
renderer: (macro) => {
var src = macro.data.trim();
return JSON.stringify(JSON.parse(src), null, parseInt(macro.params.indent));
}
};
var errorMacro = {
name: 'error',
template: dedent(`
::: error
: message=I AM ERROR
:::
`),
renderer: (macro) => {
return (
'<h1>An Error Occurred</h1>'
+ `<strong>${macro.params.message}</strong>`
);
}
};
hopdown.macros.register(jsonMacro);
hopdown.macros.register(errorMacro);
suite('Markdown <=> HTML Roundtrips', () => {
function assert(name, input, output, expected = undefined) {
return test(name, () => {
const html = hopdown.toHTML(input);
const markdown = hopdown.toMarkdown(html);
expect(html).toBe(output);
expect(markdown).toBe(expected || input);
});
}
describe('JSON', () => {
var html = (
'<p><ribbit-macro name="json" data-indent="2" ' +
'data-macro-source="eyJwYXJhbXMiOnsiaW5kZW50IjoiMiJ9LCJkYXRhIjoiXG57XG4gICAgXCJGb29cIjogXCJCQVJcIixcbiAgICBcIm9uZVwiOiAxXG59XG4ifQ==">'
+ '\n'
+ '{\n'
+ ' "Foo": "BAR",\n'
+ ' "one": 1\n'
+ '}\n'
+ '</ribbit-macro></p>'
);
assert('macro', jsonMacro.template, html);
});
describe('Messages', () => {
var html = (
'<p><ribbit-macro name="error" data-message="I AM ERROR" '
+ 'data-macro-source="eyJwYXJhbXMiOnsibWVzc2FnZSI6IkkgQU0gRVJST1IifSwiZGF0YSI6IlxuXG4ifQ==">'
+ '\n'
+ "<h1>An Error Occurred</h1><strong>I AM ERROR</strong>\n"
+ "</ribbit-macro></p>"
);
assert('Error', errorMacro.template, html);
});
});
suite('Markdown <=> Editor Node Roundtrips', () => {
function assertBlock(name, input, output) {
return test(name, () => {
const div = document.createElement('div');
div.appendChild(hopdown.toEditorNode(input));
expect(div.innerHTML).toStrictEqual(output);
});
}
describe('json', () => {
var html = (
'<ribbit-macro name="json" data-indent="2" '
+ 'data-macro-source="eyJwYXJhbXMiOnsiaW5kZW50IjoiMiJ9LCJkYXRhIjoiXG57XG4gICAgXCJGb29cIjogXCJCQVJcIixcbiAgICBcIm9uZVwiOiAxXG59XG4ifQ==">'
+ '\n'
+ '{\n'
+ ' "Foo": "BAR",\n'
+ ' "one": 1\n'
+ '}\n'
+ '</ribbit-macro>'
);
assertBlock('Macro', jsonMacro.template, html);
});
});