import { module, test } from "qunit";
import toMarkdown from "discourse/lib/to-markdown";
module("Unit | Utility | to-markdown", function () {
test("converts styles between normal words", function (assert) {
const html = `Line with styles between words.`;
const markdown = `Line with ~~styles~~ ***between*** words.`;
assert.strictEqual(toMarkdown(html), markdown);
assert.strictEqual(toMarkdown("A bold word"), "A **bold** word");
assert.strictEqual(toMarkdown("A bold, word"), "A **bold**, word");
});
test("converts inline nested styles", function (assert) {
let html = `Italicised line with some random bold words.`;
let markdown = `*Italicised line with **some random** **bold** words.*`;
assert.strictEqual(toMarkdown(html), markdown);
html = `Italicised line
with some
random bold words.`;
markdown = `Italicised line with some\nrandom ~~bold~~ words.`;
assert.strictEqual(toMarkdown(html), markdown);
// eslint-disable-next-line no-irregular-whitespace
html = `this is bold statement`;
markdown = `this is **bold** statement`;
assert.strictEqual(toMarkdown(html), markdown);
});
test("converts a link", function (assert) {
let html = `Discourse`;
let markdown = `[Discourse](https://discourse.org)`;
assert.strictEqual(toMarkdown(html), markdown);
html = `Disc\n\n\nour\n\nse`;
markdown = `[Disc our se](https://discourse.org)`;
assert.strictEqual(toMarkdown(html), markdown);
});
test("converts a link which is an attachment", function (assert) {
let html = `stuff.pdf`;
let markdown = `[stuff.pdf|attachment](https://discourse.org/pdfs/stuff.pdf)`;
assert.strictEqual(toMarkdown(html), markdown);
});
test("put raw URL instead of converting the link", function (assert) {
let url = "https://discourse.org";
const html = () => `${url}`;
assert.strictEqual(toMarkdown(html()), url);
url = "discourse.org/t/topic-slug/1";
assert.strictEqual(toMarkdown(html()), url);
});
test("skip empty link", function (assert) {
assert.strictEqual(toMarkdown(``), "");
});
test("converts heading tags", function (assert) {
const html = `
Sub Item 2
Bullets at level 1
Bullets at level 1
Bullets at level 2
Bullets at level 2
Bullets at level 3
Bullets at level 2
Bullets at level 1
Lorem ipsum dolor sit amet, consectetur elit.
Ut minim veniam, laboris
| Heading 1 | Head 2 |
|---|---|
| Lorem | ipsum |
| dolor | sit amet |
| Heading 1 | Head 2 |
|---|---|
| ipsum |
| Headi ng 1 | Head 2 |
|---|---|
| Lorem | ipsum |
![]() | sit amet |
| Heading 1 |
|---|
| Lorem |
| sit amet |
| Lorem | sit amet |
var helloWorld = () => {
alert(' hello \t\t world ');
return;
}
helloWorld();
consectetur.`;
let output = `Lorem ipsum dolor sit amet,\n\n\`\`\`\nvar helloWorld = () => {\n alert(' hello \t\t world ');\n return;\n}\nhelloWorld();\n\`\`\`\n\nconsectetur.`;
assert.strictEqual(toMarkdown(html), output);
html = `Lorem ipsum dolor sit amet, var helloWorld = () => {
alert(' hello \t\t world ');
return;
}
helloWorld();consectetur.`;
output = `Lorem ipsum dolor sit amet, \`var helloWorld = () => {\n alert(' hello \t\t world ');\n return;\n}\nhelloWorld();\`consectetur.`;
assert.strictEqual(toMarkdown(html), output);
});
test("converts blockquote tag", function (assert) {
let html = "Lorem ipsum"; let output = "> Lorem ipsum"; assert.strictEqual(toMarkdown(html), output); html = "
Lorem ipsum
"; output = "> Lorem ipsum\n\n> dolor sit amet"; assert.strictEqual(toMarkdown(html), output); html = "dolor sit amet
\nLorem ipsum\n"; output = "> Lorem ipsum\n> > dolor\n> > > sit\n> > amet"; assert.strictEqual(toMarkdown(html), output); }); test("converts ol list tag", function (assert) { const html = `Testingdolor
sitamet
·
Item 1
·
Item 2
· Item 3
· Item 4
List`; const markdown = `Sample\n\n* **Item 1**\n * *Item 2*\n * Item 3\n* Item 4\n\nList`; assert.strictEqual(toMarkdown(html), markdown); }); test("keeps mention/hash class", function (assert) { const html = `User mention: @discourse
Group mention: @discourse-group
Category link: #foo
Sub-category link: #foo:bar
`; const markdown = `User mention: @discourse\n\nGroup mention: @discourse-group\n\nCategory link: #foo\n\nSub-category link: #foo:bar`; assert.strictEqual(toMarkdown(html), markdown); }); test("keeps emoji and removes click count", function (assert) { const html = `
A link1 with click count
and
emoji.
`;
let markdown = ``;
assert.strictEqual(toMarkdown(html), markdown);
html = `
`;
assert.strictEqual(toMarkdown(html), markdown);
html = `
`;
markdown = ``;
assert.strictEqual(toMarkdown(html), markdown);
});
test("converts quotes to markdown", function (assert) {
let html = `
there is a quote below
there is a quote above
`; let markdown = ` there is a quote below [quote="foo, post:1, topic:2"] this is a quote [/quote] there is a quote above `; assert.strictEqual(toMarkdown(html), markdown.trim()); }); test("strips base64 image URLs", function (assert) { const html = '