Skip to content

Commit 5e25b0a

Browse files
committed
add highlight function
1 parent 528223d commit 5e25b0a

File tree

4 files changed

+162
-0
lines changed

4 files changed

+162
-0
lines changed

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
"@rollup/plugin-commonjs": "^17.1.0",
2424
"@rollup/plugin-node-resolve": "^11.2.0",
2525
"@sindresorhus/slugify": "^1.1.0",
26+
"@types/prismjs": "^1.16.4",
2627
"prettier": "^2.2.1",
28+
"prism-svelte": "^0.4.7",
29+
"prismjs": "^1.23.0",
2730
"rollup": "^2.41.2",
2831
"rollup-plugin-terser": "^7.0.2",
2932
"ts-node": "^9.1.1",

pnpm-lock.yaml

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/format/highlight.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { suite } from "uvu";
2+
import * as assert from "uvu/assert";
3+
4+
import { highlight } from "./highlight";
5+
6+
const _highlight = suite("highlight");
7+
8+
_highlight("does not highlight other languages", () => {
9+
const highlighted = highlight("cd ./somedir\ncat file.txt", "bash");
10+
assert.snapshot(
11+
highlighted,
12+
`<pre class='language-bash'><code><span class="token builtin class-name">cd</span> ./somedir
13+
<span class="token function">cat</span> file.txt</code></pre>`
14+
);
15+
});
16+
17+
_highlight("highlights bash", () => {
18+
const highlighted = highlight("cd ./somedir\ncat file.txt", "bash");
19+
assert.snapshot(
20+
highlighted,
21+
`<pre class='language-bash'><code><span class="token builtin class-name">cd</span> ./somedir
22+
<span class="token function">cat</span> file.txt</code></pre>`
23+
);
24+
});
25+
26+
_highlight("highlights html", () => {
27+
const highlighted = highlight(`<div attr="some-attr">hello</div>`, "html");
28+
assert.snapshot(
29+
highlighted,
30+
`<pre class='language-markup'><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">attr</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>some-attr<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>hello<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code></pre>`
31+
);
32+
});
33+
34+
_highlight("highlights svelte", () => {
35+
const highlighted = highlight(
36+
`{#each x as z, i (key)}<p>hi</p>{/each}`,
37+
"sv"
38+
);
39+
assert.snapshot(
40+
highlighted,
41+
`<pre class='language-svelte'><code><span class="token each"><span class="token punctuation">{</span><span class="token keyword">#each</span> <span class="token language-javascript">x </span><span class="token keyword">as</span> <span class="token language-javascript">z<span class="token punctuation">,</span> i </span><span class="token language-javascript"><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span><span class="token punctuation">}</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>hi<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span><span class="token each"><span class="token punctuation">{</span><span class="token keyword">/each</span><span class="token punctuation">}</span></span></code></pre>`
42+
);
43+
});
44+
45+
_highlight("highlights javascript", () => {
46+
const highlighted = highlight(`console.log('boo')`, "js");
47+
assert.snapshot(
48+
highlighted,
49+
`<pre class='language-javascript'><code>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'boo'</span><span class="token punctuation">)</span></code></pre>`
50+
);
51+
});
52+
53+
_highlight("highlights css", () => {
54+
const highlighted = highlight(`.thing { color: pink; }`, "css");
55+
assert.snapshot(
56+
highlighted,
57+
`<pre class='language-css'><code><span class="token selector">.thing</span> <span class="token punctuation">{</span> <span class="token property">color</span><span class="token punctuation">:</span> pink<span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre>`
58+
);
59+
});
60+
61+
_highlight("highlights diff", () => {
62+
const highlighted = highlight(`+ doodaa\notherthing\n- thingy'n`, "diff");
63+
assert.snapshot(
64+
highlighted,
65+
`<pre class='language-diff'><code><span class="token inserted-sign inserted"><span class="token prefix inserted">+</span><span class="token line"> doodaa
66+
</span></span>otherthing
67+
<span class="token deleted-sign deleted"><span class="token prefix deleted">-</span><span class="token line"> thingy'n</span></span></code></pre>`
68+
);
69+
});
70+
71+
_highlight("does not highlight other languages", () => {
72+
const highlighted = highlight("heloooo$_$ boo\nbooboo", "");
73+
assert.snapshot(
74+
highlighted,
75+
`<pre class='language-'><code>heloooo$_$ boo
76+
booboo</code></pre>`
77+
);
78+
});
79+
80+
_highlight.run();

src/format/highlight.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import PrismJS from "prismjs";
2+
import "prismjs/components/prism-bash.js";
3+
import "prismjs/components/prism-diff.js";
4+
import "prism-svelte";
5+
6+
type language = keyof typeof LanguageMap;
7+
8+
enum LanguageMap {
9+
bash = "bash",
10+
html = "markup",
11+
sv = "svelte",
12+
js = "javascript",
13+
css = "css",
14+
diff = "diff",
15+
"" = "",
16+
}
17+
18+
export function highlight(source: string, lang?: language): string {
19+
const plang = lang === "" ? "" : LanguageMap[lang];
20+
const highlighted = plang
21+
? PrismJS.highlight(source, PrismJS.languages[plang], lang)
22+
: source.replace(
23+
/[&<>]/g,
24+
(c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;" }[c])
25+
);
26+
27+
return `<pre class='language-${plang}'><code>${highlighted}</code></pre>`;
28+
}

0 commit comments

Comments
 (0)