@scalar/code-highlight 0.0.28 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/code/highlight.js +37 -59
- package/dist/code/highlight.js.map +7 -0
- package/dist/code/highlight.test.js +64 -0
- package/dist/code/highlight.test.js.map +7 -0
- package/dist/code/index.js +5 -1
- package/dist/code/index.js.map +7 -0
- package/dist/code/line-numbers.js +54 -75
- package/dist/code/line-numbers.js.map +7 -0
- package/dist/constants.js +11 -11
- package/dist/constants.js.map +7 -0
- package/dist/index.js +12 -7
- package/dist/index.js.map +7 -0
- package/dist/languages/basic.js +31 -30
- package/dist/languages/basic.js.map +7 -0
- package/dist/languages/index.js +9 -3
- package/dist/languages/index.js.map +7 -0
- package/dist/languages/json-yaml.js +10 -9
- package/dist/languages/json-yaml.js.map +7 -0
- package/dist/languages/standard.js +77 -76
- package/dist/languages/standard.js.map +7 -0
- package/dist/markdown/getHeadings.test.js +45 -0
- package/dist/markdown/getHeadings.test.js.map +7 -0
- package/dist/markdown/htmlFromMarkdown.test.js +41 -0
- package/dist/markdown/htmlFromMarkdown.test.js.map +7 -0
- package/dist/markdown/index.js +2 -1
- package/dist/markdown/index.js.map +7 -0
- package/dist/markdown/markdown.js +94 -142
- package/dist/markdown/markdown.js.map +7 -0
- package/dist/markdown/splitContent.test.js +17 -0
- package/dist/markdown/splitContent.test.js.map +7 -0
- package/dist/rehype-alert/index.js +5 -1
- package/dist/rehype-alert/index.js.map +7 -0
- package/dist/rehype-alert/rehype-alert.js +84 -95
- package/dist/rehype-alert/rehype-alert.js.map +7 -0
- package/dist/rehype-alert/rehype-alert.test.js +74 -0
- package/dist/rehype-alert/rehype-alert.test.js.map +7 -0
- package/dist/rehype-highlight/index.js +5 -1
- package/dist/rehype-highlight/index.js.map +7 -0
- package/dist/rehype-highlight/rehype-highlight.js +84 -95
- package/dist/rehype-highlight/rehype-highlight.js.map +7 -0
- package/package.json +6 -6
|
@@ -1,78 +1,79 @@
|
|
|
1
|
-
import bash from
|
|
2
|
-
import c from
|
|
3
|
-
import clojure from
|
|
4
|
-
import cpp from
|
|
5
|
-
import csharp from
|
|
6
|
-
import css from
|
|
7
|
-
import dart from
|
|
8
|
-
import elixir from
|
|
9
|
-
import go from
|
|
10
|
-
import graphql from
|
|
11
|
-
import java from
|
|
12
|
-
import javascript from
|
|
13
|
-
import json from
|
|
14
|
-
import kotlin from
|
|
15
|
-
import less from
|
|
16
|
-
import makefile from
|
|
17
|
-
import markdown from
|
|
18
|
-
import matlab from
|
|
19
|
-
import nginx from
|
|
20
|
-
import objectivec from
|
|
21
|
-
import ocaml from
|
|
22
|
-
import php from
|
|
23
|
-
import plaintext from
|
|
24
|
-
import powershell from
|
|
25
|
-
import python from
|
|
26
|
-
import r from
|
|
27
|
-
import ruby from
|
|
28
|
-
import rust from
|
|
29
|
-
import scss from
|
|
30
|
-
import shell from
|
|
31
|
-
import sql from
|
|
32
|
-
import swift from
|
|
33
|
-
import typescript from
|
|
34
|
-
import xml from
|
|
35
|
-
import yaml from
|
|
36
|
-
import curl from
|
|
37
|
-
|
|
1
|
+
import bash from "highlight.js/lib/languages/bash";
|
|
2
|
+
import c from "highlight.js/lib/languages/c";
|
|
3
|
+
import clojure from "highlight.js/lib/languages/clojure";
|
|
4
|
+
import cpp from "highlight.js/lib/languages/cpp";
|
|
5
|
+
import csharp from "highlight.js/lib/languages/csharp";
|
|
6
|
+
import css from "highlight.js/lib/languages/css";
|
|
7
|
+
import dart from "highlight.js/lib/languages/dart";
|
|
8
|
+
import elixir from "highlight.js/lib/languages/elixir";
|
|
9
|
+
import go from "highlight.js/lib/languages/go";
|
|
10
|
+
import graphql from "highlight.js/lib/languages/graphql";
|
|
11
|
+
import java from "highlight.js/lib/languages/java";
|
|
12
|
+
import javascript from "highlight.js/lib/languages/javascript";
|
|
13
|
+
import json from "highlight.js/lib/languages/json";
|
|
14
|
+
import kotlin from "highlight.js/lib/languages/kotlin";
|
|
15
|
+
import less from "highlight.js/lib/languages/less";
|
|
16
|
+
import makefile from "highlight.js/lib/languages/makefile";
|
|
17
|
+
import markdown from "highlight.js/lib/languages/markdown";
|
|
18
|
+
import matlab from "highlight.js/lib/languages/matlab";
|
|
19
|
+
import nginx from "highlight.js/lib/languages/nginx";
|
|
20
|
+
import objectivec from "highlight.js/lib/languages/objectivec";
|
|
21
|
+
import ocaml from "highlight.js/lib/languages/ocaml";
|
|
22
|
+
import php from "highlight.js/lib/languages/php";
|
|
23
|
+
import plaintext from "highlight.js/lib/languages/plaintext";
|
|
24
|
+
import powershell from "highlight.js/lib/languages/powershell";
|
|
25
|
+
import python from "highlight.js/lib/languages/python";
|
|
26
|
+
import r from "highlight.js/lib/languages/r";
|
|
27
|
+
import ruby from "highlight.js/lib/languages/ruby";
|
|
28
|
+
import rust from "highlight.js/lib/languages/rust";
|
|
29
|
+
import scss from "highlight.js/lib/languages/scss";
|
|
30
|
+
import shell from "highlight.js/lib/languages/shell";
|
|
31
|
+
import sql from "highlight.js/lib/languages/sql";
|
|
32
|
+
import swift from "highlight.js/lib/languages/swift";
|
|
33
|
+
import typescript from "highlight.js/lib/languages/typescript";
|
|
34
|
+
import xml from "highlight.js/lib/languages/xml";
|
|
35
|
+
import yaml from "highlight.js/lib/languages/yaml";
|
|
36
|
+
import curl from "highlightjs-curl";
|
|
38
37
|
const standardLanguages = {
|
|
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
|
-
|
|
38
|
+
bash,
|
|
39
|
+
c,
|
|
40
|
+
clojure,
|
|
41
|
+
cpp,
|
|
42
|
+
csharp,
|
|
43
|
+
css,
|
|
44
|
+
curl,
|
|
45
|
+
dart,
|
|
46
|
+
elixir,
|
|
47
|
+
go,
|
|
48
|
+
graphql,
|
|
49
|
+
html: xml,
|
|
50
|
+
java,
|
|
51
|
+
javascript,
|
|
52
|
+
json,
|
|
53
|
+
kotlin,
|
|
54
|
+
less,
|
|
55
|
+
makefile,
|
|
56
|
+
markdown,
|
|
57
|
+
matlab,
|
|
58
|
+
nginx,
|
|
59
|
+
objectivec,
|
|
60
|
+
ocaml,
|
|
61
|
+
php,
|
|
62
|
+
plaintext,
|
|
63
|
+
powershell,
|
|
64
|
+
python,
|
|
65
|
+
r,
|
|
66
|
+
ruby,
|
|
67
|
+
rust,
|
|
68
|
+
scss,
|
|
69
|
+
shell,
|
|
70
|
+
sql,
|
|
71
|
+
swift,
|
|
72
|
+
typescript,
|
|
73
|
+
xml,
|
|
74
|
+
yaml
|
|
76
75
|
};
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
export {
|
|
77
|
+
standardLanguages
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=standard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/languages/standard.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LanguageFn } from 'highlight.js'\nimport bash from 'highlight.js/lib/languages/bash'\nimport c from 'highlight.js/lib/languages/c'\nimport clojure from 'highlight.js/lib/languages/clojure'\nimport cpp from 'highlight.js/lib/languages/cpp'\nimport csharp from 'highlight.js/lib/languages/csharp'\nimport css from 'highlight.js/lib/languages/css'\nimport dart from 'highlight.js/lib/languages/dart'\nimport elixir from 'highlight.js/lib/languages/elixir'\nimport go from 'highlight.js/lib/languages/go'\nimport graphql from 'highlight.js/lib/languages/graphql'\nimport java from 'highlight.js/lib/languages/java'\nimport javascript from 'highlight.js/lib/languages/javascript'\nimport json from 'highlight.js/lib/languages/json'\nimport kotlin from 'highlight.js/lib/languages/kotlin'\nimport less from 'highlight.js/lib/languages/less'\nimport makefile from 'highlight.js/lib/languages/makefile'\nimport markdown from 'highlight.js/lib/languages/markdown'\nimport matlab from 'highlight.js/lib/languages/matlab'\nimport nginx from 'highlight.js/lib/languages/nginx'\nimport objectivec from 'highlight.js/lib/languages/objectivec'\nimport ocaml from 'highlight.js/lib/languages/ocaml'\nimport php from 'highlight.js/lib/languages/php'\nimport plaintext from 'highlight.js/lib/languages/plaintext'\nimport powershell from 'highlight.js/lib/languages/powershell'\nimport python from 'highlight.js/lib/languages/python'\nimport r from 'highlight.js/lib/languages/r'\nimport ruby from 'highlight.js/lib/languages/ruby'\nimport rust from 'highlight.js/lib/languages/rust'\nimport scss from 'highlight.js/lib/languages/scss'\nimport shell from 'highlight.js/lib/languages/shell'\nimport sql from 'highlight.js/lib/languages/sql'\nimport swift from 'highlight.js/lib/languages/swift'\nimport typescript from 'highlight.js/lib/languages/typescript'\nimport xml from 'highlight.js/lib/languages/xml'\nimport yaml from 'highlight.js/lib/languages/yaml'\n// @ts-expect-error No types available\nimport curl from 'highlightjs-curl'\n\nconst standardLanguages: Record<string, LanguageFn> = {\n bash,\n c,\n clojure,\n cpp,\n csharp,\n css,\n curl,\n dart,\n elixir,\n go,\n graphql,\n html: xml,\n java,\n javascript,\n json,\n kotlin,\n less,\n makefile,\n markdown,\n matlab,\n nginx,\n objectivec,\n ocaml,\n php,\n plaintext,\n powershell,\n python,\n r,\n ruby,\n rust,\n scss,\n shell,\n sql,\n swift,\n typescript,\n xml,\n yaml,\n}\n\nexport { standardLanguages }\n"],
|
|
5
|
+
"mappings": "AACA,OAAO,UAAU;AACjB,OAAO,OAAO;AACd,OAAO,aAAa;AACpB,OAAO,SAAS;AAChB,OAAO,YAAY;AACnB,OAAO,SAAS;AAChB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,gBAAgB;AACvB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,OAAO,cAAc;AACrB,OAAO,YAAY;AACnB,OAAO,WAAW;AAClB,OAAO,gBAAgB;AACvB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,YAAY;AACnB,OAAO,OAAO;AACd,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,OAAO,gBAAgB;AACvB,OAAO,SAAS;AAChB,OAAO,UAAU;AAEjB,OAAO,UAAU;AAEjB,MAAM,oBAAgD;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getHeadings } from "./markdown.js";
|
|
3
|
+
describe("getHeadings", () => {
|
|
4
|
+
it("gets a heading", () => {
|
|
5
|
+
const markdown = "# Example Heading";
|
|
6
|
+
const headings = getHeadings(markdown);
|
|
7
|
+
expect(headings).toStrictEqual([{ depth: 1, value: "Example Heading" }]);
|
|
8
|
+
});
|
|
9
|
+
it("gets nested headings", () => {
|
|
10
|
+
const markdown = `
|
|
11
|
+
# Example Heading
|
|
12
|
+
|
|
13
|
+
## Nested Heading
|
|
14
|
+
`;
|
|
15
|
+
const headings = getHeadings(markdown);
|
|
16
|
+
expect(headings).toStrictEqual([
|
|
17
|
+
{ depth: 1, value: "Example Heading" },
|
|
18
|
+
{ depth: 2, value: "Nested Heading" }
|
|
19
|
+
]);
|
|
20
|
+
});
|
|
21
|
+
it("ignores Markdown in code blocks", () => {
|
|
22
|
+
const markdown = `
|
|
23
|
+
# Example Heading
|
|
24
|
+
|
|
25
|
+
## Not a heading
|
|
26
|
+
|
|
27
|
+
## Nested Heading
|
|
28
|
+
|
|
29
|
+
\`\`\`
|
|
30
|
+
## Not a heading
|
|
31
|
+
\`\`\`
|
|
32
|
+
`;
|
|
33
|
+
const headings = getHeadings(markdown);
|
|
34
|
+
expect(headings).toStrictEqual([
|
|
35
|
+
{ depth: 1, value: "Example Heading" },
|
|
36
|
+
{ depth: 2, value: "Nested Heading" }
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it("works with links in headings", () => {
|
|
40
|
+
const markdown = "# [Example Heading](#example-heading)";
|
|
41
|
+
const headings = getHeadings(markdown);
|
|
42
|
+
expect(headings).toStrictEqual([{ depth: 1, value: "Example Heading" }]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=getHeadings.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/markdown/getHeadings.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { getHeadings } from './markdown'\n\ndescribe('getHeadings', () => {\n it('gets a heading', () => {\n const markdown = '# Example Heading'\n\n const headings = getHeadings(markdown)\n\n expect(headings).toStrictEqual([{ depth: 1, value: 'Example Heading' }])\n })\n\n it('gets nested headings', () => {\n const markdown = `\n# Example Heading\n\n## Nested Heading\n`\n\n const headings = getHeadings(markdown)\n\n expect(headings).toStrictEqual([\n { depth: 1, value: 'Example Heading' },\n { depth: 2, value: 'Nested Heading' },\n ])\n })\n\n it('ignores Markdown in code blocks', () => {\n const markdown = `\n# Example Heading\n\n ## Not a heading\n\n## Nested Heading\n\n\\`\\`\\`\n## Not a heading\n\\`\\`\\`\n`\n\n const headings = getHeadings(markdown)\n\n expect(headings).toStrictEqual([\n { depth: 1, value: 'Example Heading' },\n { depth: 2, value: 'Nested Heading' },\n ])\n })\n\n it('works with links in headings', () => {\n const markdown = '# [Example Heading](#example-heading)'\n\n const headings = getHeadings(markdown)\n\n expect(headings).toStrictEqual([{ depth: 1, value: 'Example Heading' }])\n })\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,mBAAmB;AAE5B,SAAS,eAAe,MAAM;AAC5B,KAAG,kBAAkB,MAAM;AACzB,UAAM,WAAW;AAEjB,UAAM,WAAW,YAAY,QAAQ;AAErC,WAAO,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,kBAAkB,CAAC,CAAC;AAAA,EACzE,CAAC;AAED,KAAG,wBAAwB,MAAM;AAC/B,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAMjB,UAAM,WAAW,YAAY,QAAQ;AAErC,WAAO,QAAQ,EAAE,cAAc;AAAA,MAC7B,EAAE,OAAO,GAAG,OAAO,kBAAkB;AAAA,MACrC,EAAE,OAAO,GAAG,OAAO,iBAAiB;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AAED,KAAG,mCAAmC,MAAM;AAC1C,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYjB,UAAM,WAAW,YAAY,QAAQ;AAErC,WAAO,QAAQ,EAAE,cAAc;AAAA,MAC7B,EAAE,OAAO,GAAG,OAAO,kBAAkB;AAAA,MACrC,EAAE,OAAO,GAAG,OAAO,iBAAiB;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AAED,KAAG,gCAAgC,MAAM;AACvC,UAAM,WAAW;AAEjB,UAAM,WAAW,YAAY,QAAQ;AAErC,WAAO,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,kBAAkB,CAAC,CAAC;AAAA,EACzE,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { htmlFromMarkdown } from "./markdown.js";
|
|
3
|
+
describe("htmlFromMarkdown", () => {
|
|
4
|
+
it("returns HTML", () => {
|
|
5
|
+
const html = htmlFromMarkdown("# Example Heading");
|
|
6
|
+
expect(html.trim()).toEqual("<h1>Example Heading</h1>");
|
|
7
|
+
});
|
|
8
|
+
it("removes tags", () => {
|
|
9
|
+
const html = htmlFromMarkdown("# <i>Example</i> <em>Heading</em>", {
|
|
10
|
+
removeTags: ["i"]
|
|
11
|
+
});
|
|
12
|
+
expect(html.trim()).toEqual("<h1>Example <em>Heading</em></h1>");
|
|
13
|
+
});
|
|
14
|
+
it("removes script tags", () => {
|
|
15
|
+
const html = htmlFromMarkdown(`# Example Heading<script>alert('foobar');<\/script>`);
|
|
16
|
+
expect(html.trim()).toEqual("<h1>Example Heading</h1>");
|
|
17
|
+
});
|
|
18
|
+
it("allows given tags", () => {
|
|
19
|
+
const html = htmlFromMarkdown(`# Example Heading<script>alert('foobar');<\/script>`, {
|
|
20
|
+
allowTags: ["script"]
|
|
21
|
+
});
|
|
22
|
+
expect(html.trim()).toEqual(`<h1>Example Heading
|
|
23
|
+
<script>alert('foobar');<\/script>
|
|
24
|
+
</h1>`);
|
|
25
|
+
});
|
|
26
|
+
it("allows to add ids", () => {
|
|
27
|
+
const html = htmlFromMarkdown("# Example Heading", {
|
|
28
|
+
transformType: "heading",
|
|
29
|
+
transform: (node) => {
|
|
30
|
+
node.data = {
|
|
31
|
+
hProperties: {
|
|
32
|
+
id: "example-heading"
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
expect(html.trim()).toEqual('<h1 id="example-heading">Example Heading</h1>');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=htmlFromMarkdown.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/markdown/htmlFromMarkdown.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { htmlFromMarkdown } from './markdown'\n\ndescribe('htmlFromMarkdown', () => {\n it('returns HTML', () => {\n const html = htmlFromMarkdown('# Example Heading')\n\n expect(html.trim()).toEqual('<h1>Example Heading</h1>')\n })\n\n it('removes tags', () => {\n const html = htmlFromMarkdown('# <i>Example</i> <em>Heading</em>', {\n removeTags: ['i'],\n })\n\n expect(html.trim()).toEqual('<h1>Example <em>Heading</em></h1>')\n })\n\n it('removes script tags', () => {\n const html = htmlFromMarkdown(`# Example Heading<script>alert('foobar');</script>`)\n\n expect(html.trim()).toEqual('<h1>Example Heading</h1>')\n })\n\n it('allows given tags', () => {\n const html = htmlFromMarkdown(`# Example Heading<script>alert('foobar');</script>`, {\n allowTags: ['script'],\n })\n\n expect(html.trim()).toEqual(`<h1>Example Heading\\n <script>alert('foobar');</script>\\n</h1>`)\n })\n\n it('allows to add ids', () => {\n const html = htmlFromMarkdown('# Example Heading', {\n transformType: 'heading',\n transform: (node) => {\n node.data = {\n hProperties: {\n id: 'example-heading',\n },\n }\n\n return node\n },\n })\n\n expect(html.trim()).toEqual('<h1 id=\"example-heading\">Example Heading</h1>')\n })\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB,MAAM;AACjC,KAAG,gBAAgB,MAAM;AACvB,UAAM,OAAO,iBAAiB,mBAAmB;AAEjD,WAAO,KAAK,KAAK,CAAC,EAAE,QAAQ,0BAA0B;AAAA,EACxD,CAAC;AAED,KAAG,gBAAgB,MAAM;AACvB,UAAM,OAAO,iBAAiB,qCAAqC;AAAA,MACjE,YAAY,CAAC,GAAG;AAAA,IAClB,CAAC;AAED,WAAO,KAAK,KAAK,CAAC,EAAE,QAAQ,mCAAmC;AAAA,EACjE,CAAC;AAED,KAAG,uBAAuB,MAAM;AAC9B,UAAM,OAAO,iBAAiB,qDAAoD;AAElF,WAAO,KAAK,KAAK,CAAC,EAAE,QAAQ,0BAA0B;AAAA,EACxD,CAAC;AAED,KAAG,qBAAqB,MAAM;AAC5B,UAAM,OAAO,iBAAiB,uDAAsD;AAAA,MAClF,WAAW,CAAC,QAAQ;AAAA,IACtB,CAAC;AAED,WAAO,KAAK,KAAK,CAAC,EAAE,QAAQ;AAAA;AAAA,MAAiE;AAAA,EAC/F,CAAC;AAED,KAAG,qBAAqB,MAAM;AAC5B,UAAM,OAAO,iBAAiB,qBAAqB;AAAA,MACjD,eAAe;AAAA,MACf,WAAW,CAAC,SAAS;AACnB,aAAK,OAAO;AAAA,UACV,aAAa;AAAA,YACX,IAAI;AAAA,UACN;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,WAAO,KAAK,KAAK,CAAC,EAAE,QAAQ,+CAA+C;AAAA,EAC7E,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/markdown/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./markdown.js";
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,160 +1,112 @@
|
|
|
1
|
-
import rehypeExternalLinks from
|
|
2
|
-
import rehypeFormat from
|
|
3
|
-
import rehypeRaw from
|
|
4
|
-
import rehypeSanitize, { defaultSchema } from
|
|
5
|
-
import rehypeStringify from
|
|
6
|
-
import remarkGfm from
|
|
7
|
-
import remarkParse from
|
|
8
|
-
import remarkRehype from
|
|
9
|
-
import remarkStringify from
|
|
10
|
-
import { unified } from
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { rehypeHighlight } from
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Plugin to transform nodes in a Markdown AST
|
|
18
|
-
*/
|
|
1
|
+
import rehypeExternalLinks from "rehype-external-links";
|
|
2
|
+
import rehypeFormat from "rehype-format";
|
|
3
|
+
import rehypeRaw from "rehype-raw";
|
|
4
|
+
import rehypeSanitize, { defaultSchema } from "rehype-sanitize";
|
|
5
|
+
import rehypeStringify from "rehype-stringify";
|
|
6
|
+
import remarkGfm from "remark-gfm";
|
|
7
|
+
import remarkParse from "remark-parse";
|
|
8
|
+
import remarkRehype from "remark-rehype";
|
|
9
|
+
import remarkStringify from "remark-stringify";
|
|
10
|
+
import { unified } from "unified";
|
|
11
|
+
import { SKIP, visit } from "unist-util-visit";
|
|
12
|
+
import { standardLanguages } from "../languages/index.js";
|
|
13
|
+
import { rehypeHighlight } from "../rehype-highlight/index.js";
|
|
14
|
+
import { rehypeAlert } from "../rehype-alert/index.js";
|
|
19
15
|
const transformNodes = (options, ..._ignored) => (tree) => {
|
|
20
|
-
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
visit(tree, options?.type, (node) => {
|
|
24
|
-
options?.transform ? options?.transform(node) : node;
|
|
25
|
-
return SKIP;
|
|
26
|
-
});
|
|
16
|
+
if (!options?.transform || !options?.type) {
|
|
27
17
|
return;
|
|
18
|
+
}
|
|
19
|
+
visit(tree, options?.type, (node) => {
|
|
20
|
+
options?.transform ? options?.transform(node) : node;
|
|
21
|
+
return SKIP;
|
|
22
|
+
});
|
|
23
|
+
return;
|
|
28
24
|
};
|
|
29
|
-
/**
|
|
30
|
-
* Take a Markdown string and generate HTML from it
|
|
31
|
-
*/
|
|
32
25
|
function htmlFromMarkdown(markdown, options) {
|
|
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
|
-
attributes: {
|
|
59
|
-
...defaultSchema.attributes,
|
|
60
|
-
abbr: ['title'],
|
|
61
|
-
// Allow alert classes
|
|
62
|
-
div: ['class', ['className', /^markdown-alert(-.*)?$/]],
|
|
63
|
-
},
|
|
64
|
-
})
|
|
65
|
-
// Syntax highlighting
|
|
66
|
-
.use(rehypeHighlight, {
|
|
67
|
-
languages: standardLanguages,
|
|
68
|
-
// Enable auto detection
|
|
69
|
-
detect: true,
|
|
70
|
-
})
|
|
71
|
-
// Adds target="_blank" to external links
|
|
72
|
-
.use(rehypeExternalLinks, { target: '_blank' })
|
|
73
|
-
// Formats the HTML
|
|
74
|
-
.use(rehypeFormat)
|
|
75
|
-
// Converts the HTML AST to a string
|
|
76
|
-
.use(rehypeStringify)
|
|
77
|
-
// Run the pipeline
|
|
78
|
-
.processSync(markdown);
|
|
79
|
-
return html.toString();
|
|
26
|
+
const removeTags = options?.removeTags ?? [];
|
|
27
|
+
const tagNames = [...defaultSchema.tagNames ?? [], ...options?.allowTags ?? []].filter(
|
|
28
|
+
(t) => !removeTags.includes(t)
|
|
29
|
+
);
|
|
30
|
+
const html = unified().use(remarkParse).use(remarkGfm).use(transformNodes, {
|
|
31
|
+
transform: options?.transform,
|
|
32
|
+
type: options?.transformType
|
|
33
|
+
}).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeAlert).use(rehypeRaw).use(rehypeSanitize, {
|
|
34
|
+
...defaultSchema,
|
|
35
|
+
// Don’t prefix the heading ids
|
|
36
|
+
clobberPrefix: "",
|
|
37
|
+
// Makes it even more strict
|
|
38
|
+
tagNames,
|
|
39
|
+
attributes: {
|
|
40
|
+
...defaultSchema.attributes,
|
|
41
|
+
abbr: ["title"],
|
|
42
|
+
// Allow alert classes
|
|
43
|
+
div: ["class", ["className", /^markdown-alert(-.*)?$/]]
|
|
44
|
+
}
|
|
45
|
+
}).use(rehypeHighlight, {
|
|
46
|
+
languages: standardLanguages,
|
|
47
|
+
// Enable auto detection
|
|
48
|
+
detect: true
|
|
49
|
+
}).use(rehypeExternalLinks, { target: "_blank" }).use(rehypeFormat).use(rehypeStringify).processSync(markdown);
|
|
50
|
+
return html.toString();
|
|
80
51
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Create a Markdown AST from a string.
|
|
83
|
-
*/
|
|
84
52
|
function getMarkdownAst(markdown) {
|
|
85
|
-
|
|
53
|
+
return unified().use(remarkParse).use(remarkGfm).parse(markdown);
|
|
86
54
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Find all headings of a specific type in a Markdown AST.
|
|
89
|
-
*/
|
|
90
55
|
function getHeadings(markdown, depth = 1) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
56
|
+
const tree = getMarkdownAst(markdown);
|
|
57
|
+
const nodes = [];
|
|
58
|
+
visit(tree, "heading", (node) => {
|
|
59
|
+
const text = findTextInHeading(node);
|
|
60
|
+
if (text) {
|
|
61
|
+
nodes.push({ depth: node.depth ?? depth, value: text.value });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return nodes;
|
|
100
65
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Find the text in a Markdown node (recursively).
|
|
103
|
-
*/
|
|
104
66
|
function findTextInHeading(node) {
|
|
105
|
-
|
|
106
|
-
|
|
67
|
+
if (node.type === "text") {
|
|
68
|
+
return node;
|
|
69
|
+
}
|
|
70
|
+
if ("children" in node && node.children) {
|
|
71
|
+
for (const child of node.children) {
|
|
72
|
+
const text = findTextInHeading(child);
|
|
73
|
+
if (text) {
|
|
74
|
+
return text;
|
|
75
|
+
}
|
|
107
76
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const text = findTextInHeading(child);
|
|
111
|
-
if (text) {
|
|
112
|
-
return text;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return null;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
117
79
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Return multiple Markdown documents. Every heading should be its own document.
|
|
120
|
-
*/
|
|
121
80
|
function splitContent(markdown) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
// If the node is a heading, start a new section
|
|
129
|
-
if (node.type === 'heading') {
|
|
130
|
-
if (nodes.length) {
|
|
131
|
-
sections.push(nodes);
|
|
132
|
-
}
|
|
133
|
-
sections.push([node]);
|
|
134
|
-
nodes = [];
|
|
135
|
-
}
|
|
136
|
-
// Otherwise, add the node to the current section
|
|
137
|
-
else {
|
|
138
|
-
nodes.push(node);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
// Add any remaining nodes
|
|
142
|
-
if (nodes.length) {
|
|
81
|
+
const tree = getMarkdownAst(markdown);
|
|
82
|
+
const sections = [];
|
|
83
|
+
let nodes = [];
|
|
84
|
+
tree.children?.forEach((node) => {
|
|
85
|
+
if (node.type === "heading") {
|
|
86
|
+
if (nodes.length) {
|
|
143
87
|
sections.push(nodes);
|
|
88
|
+
}
|
|
89
|
+
sections.push([node]);
|
|
90
|
+
nodes = [];
|
|
91
|
+
} else {
|
|
92
|
+
nodes.push(node);
|
|
144
93
|
}
|
|
145
|
-
|
|
94
|
+
});
|
|
95
|
+
if (nodes.length) {
|
|
96
|
+
sections.push(nodes);
|
|
97
|
+
}
|
|
98
|
+
return sections.map((section) => createDocument(section));
|
|
146
99
|
}
|
|
147
|
-
/**
|
|
148
|
-
* Use remark to create a Markdown document from a list of nodes.
|
|
149
|
-
*/
|
|
150
100
|
function createDocument(nodes) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
// Remove the whitespace
|
|
157
|
-
return markdown.trim();
|
|
101
|
+
const markdown = unified().use(remarkStringify).use(remarkGfm).stringify({
|
|
102
|
+
type: "root",
|
|
103
|
+
children: nodes
|
|
104
|
+
});
|
|
105
|
+
return markdown.trim();
|
|
158
106
|
}
|
|
159
|
-
|
|
160
|
-
|
|
107
|
+
export {
|
|
108
|
+
getHeadings,
|
|
109
|
+
htmlFromMarkdown,
|
|
110
|
+
splitContent
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/markdown/markdown.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Heading, PhrasingContent, Root, RootContent, Text } from 'mdast'\nimport rehypeExternalLinks from 'rehype-external-links'\nimport rehypeFormat from 'rehype-format'\nimport rehypeRaw from 'rehype-raw'\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize'\nimport rehypeStringify from 'rehype-stringify'\nimport remarkGfm from 'remark-gfm'\nimport remarkParse from 'remark-parse'\nimport remarkRehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\nimport { unified } from 'unified'\nimport type { Node } from 'unist'\nimport { SKIP, visit } from 'unist-util-visit'\n\nimport { standardLanguages } from '@/languages'\nimport { rehypeHighlight } from '@/rehype-highlight'\nimport { rehypeAlert } from '@/rehype-alert'\ntype Options = {\n transform?: (node: Record<string, any>) => Record<string, any>\n type?: string\n}\n\n/**\n * Plugin to transform nodes in a Markdown AST\n */\nconst transformNodes =\n (options?: Readonly<Options> | null | undefined, ..._ignored: any[]) =>\n (tree: Node) => {\n if (!options?.transform || !options?.type) {\n return\n }\n\n visit(tree, options?.type, (node) => {\n options?.transform ? options?.transform(node) : node\n\n return SKIP\n })\n\n return\n }\n\n/**\n * Take a Markdown string and generate HTML from it\n */\nexport function htmlFromMarkdown(\n markdown: string,\n options?: {\n removeTags?: string[]\n allowTags?: string[]\n transform?: (node: Record<string, any>) => Record<string, any>\n transformType?: string\n },\n) {\n // Add permitted tags and remove stripped ones\n const removeTags = options?.removeTags ?? []\n const tagNames = [...(defaultSchema.tagNames ?? []), ...(options?.allowTags ?? [])].filter(\n (t) => !removeTags.includes(t),\n )\n\n const html = unified()\n // Parses markdown\n .use(remarkParse)\n // Support autolink literals, footnotes, strikethrough, tables and tasklists\n .use(remarkGfm)\n .use(transformNodes, {\n transform: options?.transform,\n type: options?.transformType,\n })\n // Allows any HTML tags\n .use(remarkRehype, { allowDangerousHtml: true })\n // Adds GitHub alerts\n .use(rehypeAlert)\n // Creates a HTML AST\n .use(rehypeRaw)\n // Removes disallowed tags\n .use(rehypeSanitize, {\n ...defaultSchema,\n // Don\u2019t prefix the heading ids\n clobberPrefix: '',\n // Makes it even more strict\n tagNames,\n attributes: {\n ...defaultSchema.attributes,\n abbr: ['title'],\n // Allow alert classes\n div: ['class', ['className', /^markdown-alert(-.*)?$/]],\n },\n })\n // Syntax highlighting\n .use(rehypeHighlight, {\n languages: standardLanguages,\n // Enable auto detection\n detect: true,\n })\n // Adds target=\"_blank\" to external links\n .use(rehypeExternalLinks, { target: '_blank' })\n // Formats the HTML\n .use(rehypeFormat)\n // Converts the HTML AST to a string\n .use(rehypeStringify)\n // Run the pipeline\n .processSync(markdown)\n\n return html.toString()\n}\n\n/**\n * Create a Markdown AST from a string.\n */\nfunction getMarkdownAst(markdown: string): Root {\n return unified().use(remarkParse).use(remarkGfm).parse(markdown)\n}\n\n/**\n * Find all headings of a specific type in a Markdown AST.\n */\nexport function getHeadings(\n markdown: string,\n depth: number = 1,\n): {\n depth: number\n value: string\n}[] {\n const tree = getMarkdownAst(markdown)\n\n const nodes: {\n depth: number\n value: string\n }[] = []\n\n visit(tree, 'heading', (node) => {\n const text = findTextInHeading(node)\n\n if (text) {\n nodes.push({ depth: node.depth ?? depth, value: text.value })\n }\n })\n\n return nodes\n}\n\n/**\n * Find the text in a Markdown node (recursively).\n */\nfunction findTextInHeading(node: Heading | PhrasingContent): Text | null {\n if (node.type === 'text') {\n return node as Text\n }\n\n if ('children' in node && node.children) {\n for (const child of node.children) {\n const text = findTextInHeading(child)\n\n if (text) {\n return text\n }\n }\n }\n\n return null\n}\n\n/**\n * Return multiple Markdown documents. Every heading should be its own document.\n */\nexport function splitContent(markdown: string) {\n const tree = getMarkdownAst(markdown)\n\n /** Sections */\n const sections: RootContent[][] = []\n\n /** Nodes inside a section */\n let nodes: RootContent[] = []\n\n tree.children?.forEach((node) => {\n // If the node is a heading, start a new section\n if (node.type === 'heading') {\n if (nodes.length) {\n sections.push(nodes)\n }\n\n sections.push([node])\n\n nodes = []\n }\n // Otherwise, add the node to the current section\n else {\n nodes.push(node)\n }\n })\n\n // Add any remaining nodes\n if (nodes.length) {\n sections.push(nodes)\n }\n\n return sections.map((section) => createDocument(section))\n}\n\n/**\n * Use remark to create a Markdown document from a list of nodes.\n */\nfunction createDocument(nodes: RootContent[]) {\n // Create the Markdown string\n const markdown = unified().use(remarkStringify).use(remarkGfm).stringify({\n type: 'root',\n children: nodes,\n })\n\n // Remove the whitespace\n return markdown.trim()\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { splitContent } from "./markdown.js";
|
|
3
|
+
describe("splitContent", () => {
|
|
4
|
+
it("returns a single document if there\u2019s no heading", () => {
|
|
5
|
+
const sections = splitContent("Foobar");
|
|
6
|
+
expect(sections).toMatchObject(["Foobar"]);
|
|
7
|
+
});
|
|
8
|
+
it("splits the markdown document", () => {
|
|
9
|
+
const sections = splitContent("# Example Heading\n\nFoobar");
|
|
10
|
+
expect(sections).toMatchObject(["# Example Heading", "Foobar"]);
|
|
11
|
+
});
|
|
12
|
+
it("splits multiple headings", () => {
|
|
13
|
+
const sections = splitContent("# Example Heading\n\n## Other Heading\n\nFoobar");
|
|
14
|
+
expect(sections).toMatchObject(["# Example Heading", "## Other Heading", "Foobar"]);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=splitContent.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/markdown/splitContent.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { splitContent } from './markdown'\n\ndescribe('splitContent', () => {\n it('returns a single document if there\u2019s no heading', () => {\n const sections = splitContent('Foobar')\n\n expect(sections).toMatchObject(['Foobar'])\n })\n\n it('splits the markdown document', () => {\n const sections = splitContent('# Example Heading\\n\\nFoobar')\n\n expect(sections).toMatchObject(['# Example Heading', 'Foobar'])\n })\n\n it('splits multiple headings', () => {\n const sections = splitContent('# Example Heading\\n\\n## Other Heading\\n\\nFoobar')\n\n expect(sections).toMatchObject(['# Example Heading', '## Other Heading', 'Foobar'])\n })\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,oBAAoB;AAE7B,SAAS,gBAAgB,MAAM;AAC7B,KAAG,wDAAmD,MAAM;AAC1D,UAAM,WAAW,aAAa,QAAQ;AAEtC,WAAO,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;AAAA,EAC3C,CAAC;AAED,KAAG,gCAAgC,MAAM;AACvC,UAAM,WAAW,aAAa,6BAA6B;AAE3D,WAAO,QAAQ,EAAE,cAAc,CAAC,qBAAqB,QAAQ,CAAC;AAAA,EAChE,CAAC;AAED,KAAG,4BAA4B,MAAM;AACnC,UAAM,WAAW,aAAa,iDAAiD;AAE/E,WAAO,QAAQ,EAAE,cAAc,CAAC,qBAAqB,oBAAoB,QAAQ,CAAC;AAAA,EACpF,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|