-
Notifications
You must be signed in to change notification settings - Fork 3
/
plugin.test.ts
114 lines (100 loc) · 3.63 KB
/
plugin.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { it, expect, describe } from "vitest";
import { remark } from "remark";
import remarkMdx from "remark-mdx";
import remarkSmartypants from "./plugin.ts";
const compiler = remark().use(remarkSmartypants);
const process = compiler.process.bind(compiler);
it("implements SmartyPants", async () => {
const file = await process('# "Hello World!"');
expect(String(file.toString())).toMatchInlineSnapshot(`
"# “Hello World!”
"`);
});
it("handles quotes around links", async () => {
const file = await process(
`"wow". go to '[single](/foo)' today "[double](/bar)". . .`,
);
expect(file.toString()).toMatchInlineSnapshot(`
"“wow”. go to ‘[single](/foo)’ today “[double](/bar)”…
"`);
});
it("handles quotes around bold text", async () => {
const file = await process(
`foo '**Bolded -- \`\`part** of --- this quote' bar`,
);
expect(file.toString()).toMatchInlineSnapshot(`
"foo ‘**Bolded — “part** of --- this quote’ bar
"`);
});
describe("handles quotes around inline code", async () => {
it("around inline code", async () => {
const file = await process('"`code`"');
expect(file.toString()).toMatchInlineSnapshot(`
"“\`code\`”
"`);
});
it("around inline code and text", async () => {
const file = await process(`"\`single 'quote'. . .\` baz"`);
expect(file.toString()).toMatchInlineSnapshot(`
"“\`single 'quote'. . .\` baz”
"`);
});
it("around inline code with single quote", async () => {
const file = await process("'`singles'`'");
expect(file.toString()).toMatchInlineSnapshot(`
"‘\`singles'\`’
"`);
});
it("around inline code with double quote", async () => {
const file = await process('"`double"`"');
expect(file.toString()).toMatchInlineSnapshot(`
"“\`double"\`”
"`);
});
});
describe("handles quotes at the edges of a paragraph", () => {
it("at start after another paragraph", async () => {
const file = await process('paragraph\n\n"after paragraph"');
expect(file.toString()).toMatchInlineSnapshot(`
"paragraph\n\n“after paragraph”
"`);
});
it("at start after a blockquote", async () => {
const file = await process('> blockquote\n\n"after blockquote"');
expect(file.toString()).toMatchInlineSnapshot(`
"> blockquote\n\n“after blockquote”
"`);
});
it("at start within a blockquote", async () => {
const file = await process('> blockquote\n>\n> "within blockquote"');
expect(file.toString()).toMatchInlineSnapshot(`
"> blockquote\n>\n> “within blockquote”
"`);
});
it("at end before another paragraph", async () => {
const file = await process('"before paragraph"\n\nparagraph');
expect(file.toString()).toMatchInlineSnapshot(`
"“before paragraph”\n\nparagraph
"`);
});
it("at end before a blockquote", async () => {
const file = await process('"before blockquote"\n\n> blockquote');
expect(file.toString()).toMatchInlineSnapshot(`
"“before blockquote”\n\n> blockquote
"`);
});
});
describe("should ignore parent nodes", () => {
const mdxCompiler = remark().use(remarkMdx).use(remarkSmartypants);
const process = mdxCompiler.process.bind(mdxCompiler);
it("<style>", async () => {
const mdxContent = `<style>html:after \\{ content: '""' }</style>`;
const file = await process(mdxContent);
expect(file.toString().trimEnd()).toBe(mdxContent);
});
it("<script>", async () => {
const mdxContent = '<script>console.log("foo")</script>';
const file = await process(mdxContent);
expect(file.toString().trimEnd()).toBe(mdxContent);
});
});