nuartz 0.1.2 → 0.1.3

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.
Files changed (114) hide show
  1. package/dist/__tests__/backlinks.test.d.ts +2 -0
  2. package/dist/__tests__/backlinks.test.d.ts.map +1 -0
  3. package/dist/__tests__/backlinks.test.js +132 -0
  4. package/dist/__tests__/backlinks.test.js.map +1 -0
  5. package/dist/__tests__/fs.test.d.ts +2 -0
  6. package/dist/__tests__/fs.test.d.ts.map +1 -0
  7. package/dist/__tests__/fs.test.js +153 -0
  8. package/dist/__tests__/fs.test.js.map +1 -0
  9. package/dist/__tests__/markdown.test.d.ts +2 -0
  10. package/dist/__tests__/markdown.test.d.ts.map +1 -0
  11. package/dist/__tests__/markdown.test.js +102 -0
  12. package/dist/__tests__/markdown.test.js.map +1 -0
  13. package/dist/__tests__/search.test.d.ts +2 -0
  14. package/dist/__tests__/search.test.d.ts.map +1 -0
  15. package/dist/__tests__/search.test.js +147 -0
  16. package/dist/__tests__/search.test.js.map +1 -0
  17. package/dist/backlinks.d.ts +25 -0
  18. package/dist/backlinks.d.ts.map +1 -0
  19. package/dist/backlinks.js +37 -0
  20. package/dist/backlinks.js.map +1 -0
  21. package/dist/config.d.ts +46 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +23 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/fs.d.ts +33 -0
  26. package/dist/fs.d.ts.map +1 -0
  27. package/dist/fs.js +145 -0
  28. package/dist/fs.js.map +1 -0
  29. package/dist/index.d.ts +17 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +29 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/markdown.d.ts +3 -0
  34. package/dist/markdown.d.ts.map +1 -0
  35. package/dist/markdown.js +119 -0
  36. package/dist/markdown.js.map +1 -0
  37. package/dist/plugins/arrows.d.ts +4 -0
  38. package/dist/plugins/arrows.d.ts.map +1 -0
  39. package/dist/plugins/arrows.js +16 -0
  40. package/dist/plugins/arrows.js.map +1 -0
  41. package/dist/plugins/callout.d.ts +4 -0
  42. package/dist/plugins/callout.d.ts.map +1 -0
  43. package/dist/plugins/callout.js +75 -0
  44. package/dist/plugins/callout.js.map +1 -0
  45. package/dist/plugins/callout.test.d.ts +2 -0
  46. package/dist/plugins/callout.test.d.ts.map +1 -0
  47. package/dist/plugins/callout.test.js +75 -0
  48. package/dist/plugins/callout.test.js.map +1 -0
  49. package/dist/plugins/comment.d.ts +4 -0
  50. package/dist/plugins/comment.d.ts.map +1 -0
  51. package/dist/plugins/comment.js +36 -0
  52. package/dist/plugins/comment.js.map +1 -0
  53. package/dist/plugins/comment.test.d.ts +2 -0
  54. package/dist/plugins/comment.test.d.ts.map +1 -0
  55. package/dist/plugins/comment.test.js +55 -0
  56. package/dist/plugins/comment.test.js.map +1 -0
  57. package/dist/plugins/highlight.d.ts +4 -0
  58. package/dist/plugins/highlight.d.ts.map +1 -0
  59. package/dist/plugins/highlight.js +33 -0
  60. package/dist/plugins/highlight.js.map +1 -0
  61. package/dist/plugins/highlight.test.d.ts +2 -0
  62. package/dist/plugins/highlight.test.d.ts.map +1 -0
  63. package/dist/plugins/highlight.test.js +51 -0
  64. package/dist/plugins/highlight.test.js.map +1 -0
  65. package/dist/plugins/tag.d.ts +11 -0
  66. package/dist/plugins/tag.d.ts.map +1 -0
  67. package/dist/plugins/tag.js +47 -0
  68. package/dist/plugins/tag.js.map +1 -0
  69. package/dist/plugins/tag.test.d.ts +2 -0
  70. package/dist/plugins/tag.test.d.ts.map +1 -0
  71. package/dist/plugins/tag.test.js +75 -0
  72. package/dist/plugins/tag.test.js.map +1 -0
  73. package/dist/plugins/wikilink.d.ts +12 -0
  74. package/dist/plugins/wikilink.d.ts.map +1 -0
  75. package/dist/plugins/wikilink.js +85 -0
  76. package/dist/plugins/wikilink.js.map +1 -0
  77. package/dist/plugins/wikilink.test.d.ts +2 -0
  78. package/dist/plugins/wikilink.test.d.ts.map +1 -0
  79. package/dist/plugins/wikilink.test.js +99 -0
  80. package/dist/plugins/wikilink.test.js.map +1 -0
  81. package/dist/search.d.ts +14 -0
  82. package/dist/search.d.ts.map +1 -0
  83. package/dist/search.js +35 -0
  84. package/dist/search.js.map +1 -0
  85. package/dist/types.d.ts +33 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +3 -0
  88. package/dist/types.js.map +1 -0
  89. package/package.json +3 -1
  90. package/src/__fixtures__/basic.md +0 -20
  91. package/src/__tests__/backlinks.test.ts +0 -156
  92. package/src/__tests__/fs.test.ts +0 -179
  93. package/src/__tests__/markdown.test.ts +0 -113
  94. package/src/__tests__/search.test.ts +0 -167
  95. package/src/backlinks.ts +0 -52
  96. package/src/config.ts +0 -63
  97. package/src/fs.ts +0 -171
  98. package/src/index.ts +0 -16
  99. package/src/markdown.ts +0 -131
  100. package/src/plugins/arrows.ts +0 -14
  101. package/src/plugins/callout.test.ts +0 -80
  102. package/src/plugins/callout.ts +0 -78
  103. package/src/plugins/comment.test.ts +0 -56
  104. package/src/plugins/comment.ts +0 -35
  105. package/src/plugins/highlight.test.ts +0 -52
  106. package/src/plugins/highlight.ts +0 -32
  107. package/src/plugins/tag.test.ts +0 -80
  108. package/src/plugins/tag.ts +0 -58
  109. package/src/plugins/wikilink.test.ts +0 -109
  110. package/src/plugins/wikilink.ts +0 -107
  111. package/src/search.ts +0 -42
  112. package/src/types.ts +0 -35
  113. package/tsconfig.json +0 -17
  114. package/vitest.config.ts +0 -20
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remarkCallout = void 0;
4
+ const unist_util_visit_1 = require("unist-util-visit");
5
+ // All supported callout types (Obsidian-compatible)
6
+ const CALLOUT_TYPES = new Set([
7
+ "note", "abstract", "summary", "tldr",
8
+ "info", "todo", "tip", "hint", "important",
9
+ "success", "check", "done",
10
+ "question", "help", "faq",
11
+ "warning", "caution", "attention",
12
+ "failure", "fail", "missing",
13
+ "danger", "error", "bug",
14
+ "example", "quote", "cite",
15
+ ]);
16
+ // [!type] or [!type]+ or [!type]- optionally followed by title
17
+ const CALLOUT_REGEX = /^\[!(\w+)\]([+-]?)([ \t].*)?$/i;
18
+ const remarkCallout = () => {
19
+ return (tree) => {
20
+ (0, unist_util_visit_1.visit)(tree, "blockquote", (node) => {
21
+ const firstChild = node.children[0];
22
+ if (firstChild?.type !== "paragraph")
23
+ return;
24
+ const firstInline = firstChild.children[0];
25
+ if (firstInline?.type !== "text")
26
+ return;
27
+ const firstLine = firstInline.value.split("\n")[0];
28
+ const match = firstLine.match(CALLOUT_REGEX);
29
+ if (!match)
30
+ return;
31
+ const [, rawType, fold, titleText] = match;
32
+ const type = rawType.toLowerCase();
33
+ if (!CALLOUT_TYPES.has(type))
34
+ return;
35
+ // Trim [!type] line from the paragraph
36
+ const remainder = firstInline.value.slice(firstLine.length).trimStart();
37
+ if (remainder) {
38
+ firstInline.value = remainder;
39
+ }
40
+ else {
41
+ firstChild.children.shift();
42
+ // remarkBreaks runs before this plugin and converts the line break after
43
+ // [!type] into a break node — remove any leading break nodes
44
+ while (firstChild.children.length > 0 && firstChild.children[0].type === "break") {
45
+ firstChild.children.shift();
46
+ }
47
+ }
48
+ // If the first paragraph is now empty, remove it entirely
49
+ if (firstChild.children.length === 0) {
50
+ node.children.shift();
51
+ }
52
+ const title = titleText?.trim() ?? type.charAt(0).toUpperCase() + type.slice(1);
53
+ const titleParagraph = {
54
+ type: "paragraph",
55
+ data: {
56
+ hName: "div",
57
+ hProperties: { className: "callout-title" },
58
+ },
59
+ children: [{ type: "text", value: title }],
60
+ };
61
+ node.children.unshift(titleParagraph);
62
+ node.data = {
63
+ ...node.data,
64
+ hName: "div",
65
+ hProperties: {
66
+ className: `callout callout-${type}`,
67
+ "data-callout": type,
68
+ "data-callout-fold": fold || null,
69
+ },
70
+ };
71
+ });
72
+ };
73
+ };
74
+ exports.remarkCallout = remarkCallout;
75
+ //# sourceMappingURL=callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout.js","sourceRoot":"","sources":["../../src/plugins/callout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=callout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout.test.d.ts","sourceRoot":"","sources":["../../src/plugins/callout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const unified_1 = require("unified");
8
+ const remark_parse_1 = __importDefault(require("remark-parse"));
9
+ const remark_rehype_1 = __importDefault(require("remark-rehype"));
10
+ const rehype_stringify_1 = __importDefault(require("rehype-stringify"));
11
+ const callout_js_1 = require("./callout.js");
12
+ async function process(md) {
13
+ const result = await (0, unified_1.unified)()
14
+ .use(remark_parse_1.default)
15
+ .use(callout_js_1.remarkCallout)
16
+ .use(remark_rehype_1.default)
17
+ .use(rehype_stringify_1.default)
18
+ .process(md);
19
+ return String(result);
20
+ }
21
+ (0, vitest_1.describe)("remarkCallout", () => {
22
+ (0, vitest_1.it)("transforms a basic note callout", async () => {
23
+ const html = await process("> [!note] My Title\n> Some content here");
24
+ (0, vitest_1.expect)(html).toContain('class="callout callout-note"');
25
+ (0, vitest_1.expect)(html).toContain('data-callout="note"');
26
+ (0, vitest_1.expect)(html).toContain('<div class="callout-title">My Title</div>');
27
+ (0, vitest_1.expect)(html).toContain("Some content here");
28
+ });
29
+ vitest_1.it.each([
30
+ "note", "warning", "tip", "info", "success", "danger", "question",
31
+ "abstract", "todo", "hint", "important", "check", "done",
32
+ "help", "faq", "caution", "attention", "failure", "fail",
33
+ "missing", "error", "bug", "example", "quote", "cite",
34
+ ])("supports callout type: %s", async (type) => {
35
+ const html = await process(`> [!${type}]\n> Content`);
36
+ (0, vitest_1.expect)(html).toContain(`callout-${type}`);
37
+ (0, vitest_1.expect)(html).toContain(`data-callout="${type}"`);
38
+ });
39
+ (0, vitest_1.it)("handles fold '+' (expanded)", async () => {
40
+ const html = await process("> [!note]+ Expandable\n> Content");
41
+ (0, vitest_1.expect)(html).toContain('data-callout-fold="+"');
42
+ });
43
+ (0, vitest_1.it)("handles fold '-' (collapsed)", async () => {
44
+ const html = await process("> [!tip]- Collapsed\n> Content");
45
+ (0, vitest_1.expect)(html).toContain('data-callout-fold="-"');
46
+ });
47
+ (0, vitest_1.it)("uses capitalized type as default title when no title given", async () => {
48
+ const html = await process("> [!warning]\n> Content");
49
+ (0, vitest_1.expect)(html).toContain('<div class="callout-title">Warning</div>');
50
+ });
51
+ (0, vitest_1.it)("uses custom title text", async () => {
52
+ const html = await process("> [!note] Custom Title Here\n> Content");
53
+ (0, vitest_1.expect)(html).toContain('<div class="callout-title">Custom Title Here</div>');
54
+ });
55
+ (0, vitest_1.it)("does not transform a regular blockquote", async () => {
56
+ const html = await process("> This is just a regular blockquote");
57
+ (0, vitest_1.expect)(html).not.toContain("callout");
58
+ (0, vitest_1.expect)(html).toContain("<blockquote>");
59
+ });
60
+ (0, vitest_1.it)("does not transform an unsupported callout type", async () => {
61
+ const html = await process("> [!unsupported]\n> Content");
62
+ (0, vitest_1.expect)(html).not.toContain("callout");
63
+ (0, vitest_1.expect)(html).toContain("<blockquote>");
64
+ });
65
+ (0, vitest_1.it)("is case-insensitive for callout type", async () => {
66
+ const html = await process("> [!NOTE] Title\n> Content");
67
+ (0, vitest_1.expect)(html).toContain('data-callout="note"');
68
+ });
69
+ (0, vitest_1.it)("preserves remaining content after the callout marker line", async () => {
70
+ const html = await process("> [!tip] Title\n> Line one\n> Line two");
71
+ (0, vitest_1.expect)(html).toContain("Line one");
72
+ (0, vitest_1.expect)(html).toContain("Line two");
73
+ });
74
+ });
75
+ //# sourceMappingURL=callout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout.test.js","sourceRoot":"","sources":["../../src/plugins/callout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Root } from "mdast";
2
+ import type { Plugin } from "unified";
3
+ export declare const remarkObsidianComment: Plugin<[], Root>;
4
+ //# sourceMappingURL=comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/plugins/comment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,OAAO,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAKrC,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CA2BlD,CAAA"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remarkObsidianComment = void 0;
4
+ const unist_util_visit_1 = require("unist-util-visit");
5
+ // matches %%...%% including across newlines within a paragraph node
6
+ const COMMENT_REGEX = /%%[\s\S]*?%%/g;
7
+ const remarkObsidianComment = () => {
8
+ return (tree) => {
9
+ (0, unist_util_visit_1.visit)(tree, "text", (node, index, parent) => {
10
+ if (!parent || index === undefined)
11
+ return;
12
+ if (!node.value.includes("%%"))
13
+ return;
14
+ const matches = [...node.value.matchAll(COMMENT_REGEX)];
15
+ if (!matches.length)
16
+ return;
17
+ const nodes = [];
18
+ let lastIndex = 0;
19
+ for (const match of matches) {
20
+ const [full] = match;
21
+ const matchIndex = match.index;
22
+ if (matchIndex > lastIndex) {
23
+ nodes.push({ type: "text", value: node.value.slice(lastIndex, matchIndex) });
24
+ }
25
+ // strip the comment - push nothing
26
+ lastIndex = matchIndex + full.length;
27
+ }
28
+ if (lastIndex < node.value.length) {
29
+ nodes.push({ type: "text", value: node.value.slice(lastIndex) });
30
+ }
31
+ parent.children.splice(index, 1, ...nodes);
32
+ });
33
+ };
34
+ };
35
+ exports.remarkObsidianComment = remarkObsidianComment;
36
+ //# sourceMappingURL=comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/plugins/comment.ts"],"names":[],"mappings":";;;AAAA,uDAAwC;AAIxC,oEAAoE;AACpE,MAAM,aAAa,GAAG,eAAe,CAAA;AAE9B,MAAM,qBAAqB,GAAqB,GAAG,EAAE;IAC1D,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAA,wBAAK,EAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAM;YAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAM;YAEtC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;YACvD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAM;YAE3B,MAAM,KAAK,GAA2B,EAAE,CAAA;YACxC,IAAI,SAAS,GAAG,CAAC,CAAA;YAEjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;gBACpB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAM,CAAA;gBAC/B,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC9E,CAAC;gBACD,mCAAmC;gBACnC,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;YACtC,CAAC;YACD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAI,KAAa,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC,CAAA;AA3BY,QAAA,qBAAqB,yBA2BjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=comment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.test.d.ts","sourceRoot":"","sources":["../../src/plugins/comment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const unified_1 = require("unified");
8
+ const remark_parse_1 = __importDefault(require("remark-parse"));
9
+ const remark_rehype_1 = __importDefault(require("remark-rehype"));
10
+ const rehype_stringify_1 = __importDefault(require("rehype-stringify"));
11
+ const comment_js_1 = require("./comment.js");
12
+ async function process(md) {
13
+ const result = await (0, unified_1.unified)()
14
+ .use(remark_parse_1.default)
15
+ .use(comment_js_1.remarkObsidianComment)
16
+ .use(remark_rehype_1.default)
17
+ .use(rehype_stringify_1.default)
18
+ .process(md);
19
+ return String(result);
20
+ }
21
+ (0, vitest_1.describe)("remarkObsidianComment", () => {
22
+ (0, vitest_1.it)("strips %%comment%% from output", async () => {
23
+ const html = await process("visible %%hidden%% text");
24
+ (0, vitest_1.expect)(html).not.toContain("hidden");
25
+ (0, vitest_1.expect)(html).toContain("visible");
26
+ (0, vitest_1.expect)(html).toContain("text");
27
+ });
28
+ (0, vitest_1.it)("strips multiple comments", async () => {
29
+ const html = await process("a %%one%% b %%two%% c");
30
+ (0, vitest_1.expect)(html).not.toContain("one");
31
+ (0, vitest_1.expect)(html).not.toContain("two");
32
+ (0, vitest_1.expect)(html).toContain("a");
33
+ (0, vitest_1.expect)(html).toContain("b");
34
+ (0, vitest_1.expect)(html).toContain("c");
35
+ });
36
+ (0, vitest_1.it)("leaves text without comments unchanged", async () => {
37
+ const html = await process("No comments here");
38
+ (0, vitest_1.expect)(html).toContain("No comments here");
39
+ });
40
+ (0, vitest_1.it)("handles comment at start of text", async () => {
41
+ const html = await process("%%removed%%visible");
42
+ (0, vitest_1.expect)(html).not.toContain("removed");
43
+ (0, vitest_1.expect)(html).toContain("visible");
44
+ });
45
+ (0, vitest_1.it)("handles comment at end of text", async () => {
46
+ const html = await process("visible%%removed%%");
47
+ (0, vitest_1.expect)(html).not.toContain("removed");
48
+ (0, vitest_1.expect)(html).toContain("visible");
49
+ });
50
+ (0, vitest_1.it)("does not match single %", async () => {
51
+ const html = await process("100% done");
52
+ (0, vitest_1.expect)(html).toContain("100% done");
53
+ });
54
+ });
55
+ //# sourceMappingURL=comment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.test.js","sourceRoot":"","sources":["../../src/plugins/comment.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Root } from "mdast";
2
+ import type { Plugin } from "unified";
3
+ export declare const remarkHighlight: Plugin<[], Root>;
4
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../src/plugins/highlight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,OAAO,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAIrC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAyB5C,CAAA"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remarkHighlight = void 0;
4
+ const unist_util_visit_1 = require("unist-util-visit");
5
+ const HIGHLIGHT_REGEX = /==([^=\n]+)==/g;
6
+ const remarkHighlight = () => {
7
+ return (tree) => {
8
+ (0, unist_util_visit_1.visit)(tree, "text", (node, index, parent) => {
9
+ if (!parent || index === undefined)
10
+ return;
11
+ const matches = [...node.value.matchAll(HIGHLIGHT_REGEX)];
12
+ if (!matches.length)
13
+ return;
14
+ const nodes = [];
15
+ let lastIndex = 0;
16
+ for (const match of matches) {
17
+ const [full, content] = match;
18
+ const matchIndex = match.index;
19
+ if (matchIndex > lastIndex) {
20
+ nodes.push({ type: "text", value: node.value.slice(lastIndex, matchIndex) });
21
+ }
22
+ nodes.push({ type: "html", value: `<mark>${content}</mark>` });
23
+ lastIndex = matchIndex + full.length;
24
+ }
25
+ if (lastIndex < node.value.length) {
26
+ nodes.push({ type: "text", value: node.value.slice(lastIndex) });
27
+ }
28
+ parent.children.splice(index, 1, ...nodes);
29
+ });
30
+ };
31
+ };
32
+ exports.remarkHighlight = remarkHighlight;
33
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../src/plugins/highlight.ts"],"names":[],"mappings":";;;AAAA,uDAAwC;AAIxC,MAAM,eAAe,GAAG,gBAAgB,CAAA;AAEjC,MAAM,eAAe,GAAqB,GAAG,EAAE;IACpD,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAA,wBAAK,EAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAM;YAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAA;YACzD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAM;YAE3B,MAAM,KAAK,GAA2B,EAAE,CAAA;YACxC,IAAI,SAAS,GAAG,CAAC,CAAA;YAEjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAA;gBAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAM,CAAA;gBAC/B,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC9E,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,OAAO,SAAS,EAAE,CAAC,CAAA;gBAC9D,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;YACtC,CAAC;YACD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAI,KAAa,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC,CAAA;AAzBY,QAAA,eAAe,mBAyB3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=highlight.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.test.d.ts","sourceRoot":"","sources":["../../src/plugins/highlight.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const unified_1 = require("unified");
8
+ const remark_parse_1 = __importDefault(require("remark-parse"));
9
+ const remark_rehype_1 = __importDefault(require("remark-rehype"));
10
+ const rehype_stringify_1 = __importDefault(require("rehype-stringify"));
11
+ const highlight_js_1 = require("./highlight.js");
12
+ async function process(md) {
13
+ const result = await (0, unified_1.unified)()
14
+ .use(remark_parse_1.default)
15
+ .use(highlight_js_1.remarkHighlight)
16
+ .use(remark_rehype_1.default, { allowDangerousHtml: true })
17
+ .use(rehype_stringify_1.default, { allowDangerousHtml: true })
18
+ .process(md);
19
+ return String(result);
20
+ }
21
+ (0, vitest_1.describe)("remarkHighlight", () => {
22
+ (0, vitest_1.it)("wraps ==text== in <mark> tags", async () => {
23
+ const html = await process("This is ==highlighted== text");
24
+ (0, vitest_1.expect)(html).toContain("<mark>highlighted</mark>");
25
+ });
26
+ (0, vitest_1.it)("handles multiple highlights in one line", async () => {
27
+ const html = await process("==first== and ==second==");
28
+ (0, vitest_1.expect)(html).toContain("<mark>first</mark>");
29
+ (0, vitest_1.expect)(html).toContain("<mark>second</mark>");
30
+ });
31
+ (0, vitest_1.it)("preserves surrounding text", async () => {
32
+ const html = await process("before ==middle== after");
33
+ (0, vitest_1.expect)(html).toContain("before ");
34
+ (0, vitest_1.expect)(html).toContain("<mark>middle</mark>");
35
+ (0, vitest_1.expect)(html).toContain(" after");
36
+ });
37
+ (0, vitest_1.it)("does not match single = signs", async () => {
38
+ const html = await process("a = b");
39
+ (0, vitest_1.expect)(html).not.toContain("<mark>");
40
+ });
41
+ (0, vitest_1.it)("does not match across newlines", async () => {
42
+ const html = await process("==start\nend==");
43
+ (0, vitest_1.expect)(html).not.toContain("<mark>");
44
+ });
45
+ (0, vitest_1.it)("leaves text without highlights unchanged", async () => {
46
+ const html = await process("No highlights here");
47
+ (0, vitest_1.expect)(html).not.toContain("<mark>");
48
+ (0, vitest_1.expect)(html).toContain("No highlights here");
49
+ });
50
+ });
51
+ //# sourceMappingURL=highlight.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.test.js","sourceRoot":"","sources":["../../src/plugins/highlight.test.ts"],"names":[],"mappings":";;;;;AAAA,mCAA6C;AAC7C,qCAAiC;AACjC,gEAAsC;AACtC,kEAAwC;AACxC,wEAA8C;AAC9C,iDAAgD;AAEhD,KAAK,UAAU,OAAO,CAAC,EAAU;IAC/B,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,GAAE;SAC3B,GAAG,CAAC,sBAAW,CAAC;SAChB,GAAG,CAAC,8BAAe,CAAC;SACpB,GAAG,CAAC,uBAAY,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAC/C,GAAG,CAAC,0BAAe,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAClD,OAAO,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC;AAED,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;QAC1D,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;QACtD,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC5C,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,CAAA;QACrD,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACjC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QAC7C,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC5C,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAA;QAChD,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Root } from "mdast";
2
+ import type { Plugin } from "unified";
3
+ export interface TagPluginResult {
4
+ tags: string[];
5
+ }
6
+ /**
7
+ * Transforms inline #tags into links.
8
+ * Collected tags are stored on the vfile data: `file.data.tags`
9
+ */
10
+ export declare const remarkTag: Plugin<[], Root>;
11
+ //# sourceMappingURL=tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/plugins/tag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAyB,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAKrC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CA0CtC,CAAA"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remarkTag = void 0;
4
+ const unist_util_visit_1 = require("unist-util-visit");
5
+ // #tag — must start with letter, can contain letters, digits, -, _
6
+ const TAG_REGEX = /#([a-zA-Z][a-zA-Z0-9_-]*)/g;
7
+ /**
8
+ * Transforms inline #tags into links.
9
+ * Collected tags are stored on the vfile data: `file.data.tags`
10
+ */
11
+ const remarkTag = () => {
12
+ return (tree, file) => {
13
+ const collected = [];
14
+ (0, unist_util_visit_1.visit)(tree, "text", (node, index, parent) => {
15
+ if (!parent || index === undefined)
16
+ return;
17
+ const matches = [...node.value.matchAll(TAG_REGEX)];
18
+ if (!matches.length)
19
+ return;
20
+ const nodes = [];
21
+ let lastIndex = 0;
22
+ for (const match of matches) {
23
+ const [full, tag] = match;
24
+ const matchIndex = match.index;
25
+ if (matchIndex > lastIndex) {
26
+ nodes.push({ type: "text", value: node.value.slice(lastIndex, matchIndex) });
27
+ }
28
+ collected.push(tag);
29
+ nodes.push({
30
+ type: "link",
31
+ url: `/tags/${tag}`,
32
+ data: { hProperties: { className: "tag", "data-tag": tag } },
33
+ children: [{ type: "text", value: `#${tag}` }],
34
+ });
35
+ lastIndex = matchIndex + full.length;
36
+ }
37
+ if (lastIndex < node.value.length) {
38
+ nodes.push({ type: "text", value: node.value.slice(lastIndex) });
39
+ }
40
+ parent.children.splice(index, 1, ...nodes);
41
+ });
42
+ const existing = file.data.tags ?? [];
43
+ file.data.tags = [...new Set([...existing, ...collected])];
44
+ };
45
+ };
46
+ exports.remarkTag = remarkTag;
47
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/plugins/tag.ts"],"names":[],"mappings":";;;AAAA,uDAAwC;AAIxC,mEAAmE;AACnE,MAAM,SAAS,GAAG,4BAA4B,CAAA;AAM9C;;;GAGG;AACI,MAAM,SAAS,GAAqB,GAAG,EAAE;IAC9C,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACpB,MAAM,SAAS,GAAa,EAAE,CAAA;QAE9B,IAAA,wBAAK,EAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAM;YAE1C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;YACnD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAM;YAE3B,MAAM,KAAK,GAAsB,EAAE,CAAA;YACnC,IAAI,SAAS,GAAG,CAAC,CAAA;YAEjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAA;gBACzB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAM,CAAA;gBAE/B,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC9E,CAAC;gBAED,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACnB,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,SAAS,GAAG,EAAE;oBACnB,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;oBAC5D,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;iBAC/C,CAAC,CAAA;gBAEF,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;YACtC,CAAC;YAED,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YAClE,CAAC;YAED,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAI,IAAI,CAAC,IAAI,CAAC,IAA6B,IAAI,EAAE,CAAA;QAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC,CAAA;AACH,CAAC,CAAA;AA1CY,QAAA,SAAS,aA0CrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tag.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.test.d.ts","sourceRoot":"","sources":["../../src/plugins/tag.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const unified_1 = require("unified");
8
+ const remark_parse_1 = __importDefault(require("remark-parse"));
9
+ const remark_rehype_1 = __importDefault(require("remark-rehype"));
10
+ const rehype_stringify_1 = __importDefault(require("rehype-stringify"));
11
+ const tag_js_1 = require("./tag.js");
12
+ async function process(md) {
13
+ const result = await (0, unified_1.unified)()
14
+ .use(remark_parse_1.default)
15
+ .use(tag_js_1.remarkTag)
16
+ .use(remark_rehype_1.default)
17
+ .use(rehype_stringify_1.default)
18
+ .process(md);
19
+ return String(result);
20
+ }
21
+ async function processWithData(md) {
22
+ const file = await (0, unified_1.unified)()
23
+ .use(remark_parse_1.default)
24
+ .use(tag_js_1.remarkTag)
25
+ .use(remark_rehype_1.default)
26
+ .use(rehype_stringify_1.default)
27
+ .process(md);
28
+ return { html: String(file), tags: file.data.tags ?? [] };
29
+ }
30
+ (0, vitest_1.describe)("remarkTag", () => {
31
+ (0, vitest_1.it)("transforms #mytag into a tag link", async () => {
32
+ const html = await process("Hello #mytag world");
33
+ (0, vitest_1.expect)(html).toContain('href="/tags/mytag"');
34
+ (0, vitest_1.expect)(html).toContain('class="tag"');
35
+ (0, vitest_1.expect)(html).toContain("#mytag");
36
+ });
37
+ (0, vitest_1.it)("does not transform #123invalid (starts with number)", async () => {
38
+ const html = await process("Hello #123invalid world");
39
+ (0, vitest_1.expect)(html).not.toContain('class="tag"');
40
+ (0, vitest_1.expect)(html).toContain("#123invalid");
41
+ });
42
+ (0, vitest_1.it)("transforms #tag-with-hyphen", async () => {
43
+ const html = await process("A #tag-with-hyphen here");
44
+ (0, vitest_1.expect)(html).toContain('href="/tags/tag-with-hyphen"');
45
+ (0, vitest_1.expect)(html).toContain('class="tag"');
46
+ });
47
+ (0, vitest_1.it)("transforms #tag_with_underscore", async () => {
48
+ const html = await process("A #tag_with_underscore here");
49
+ (0, vitest_1.expect)(html).toContain('href="/tags/tag_with_underscore"');
50
+ });
51
+ (0, vitest_1.it)("handles multiple tags in one paragraph", async () => {
52
+ const html = await process("Tags: #first and #second");
53
+ (0, vitest_1.expect)(html).toContain('href="/tags/first"');
54
+ (0, vitest_1.expect)(html).toContain('href="/tags/second"');
55
+ });
56
+ (0, vitest_1.it)("collects tags into file.data.tags", async () => {
57
+ const { tags } = await processWithData("Hello #alpha and #beta");
58
+ (0, vitest_1.expect)(tags).toContain("alpha");
59
+ (0, vitest_1.expect)(tags).toContain("beta");
60
+ });
61
+ (0, vitest_1.it)("deduplicates collected tags", async () => {
62
+ const { tags } = await processWithData("#same #same #same");
63
+ (0, vitest_1.expect)(tags).toEqual(["same"]);
64
+ });
65
+ (0, vitest_1.it)("preserves surrounding text", async () => {
66
+ const html = await process("before #tag after");
67
+ (0, vitest_1.expect)(html).toContain("before ");
68
+ (0, vitest_1.expect)(html).toContain(" after");
69
+ });
70
+ (0, vitest_1.it)("sets data-tag attribute", async () => {
71
+ const html = await process("#example");
72
+ (0, vitest_1.expect)(html).toContain('data-tag="example"');
73
+ });
74
+ });
75
+ //# sourceMappingURL=tag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.test.js","sourceRoot":"","sources":["../../src/plugins/tag.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Root } from "mdast";
2
+ import type { Plugin } from "unified";
3
+ export interface WikilinkOptions {
4
+ /** Base URL prepended to all wikilink hrefs. Default: '/' */
5
+ baseUrl?: string;
6
+ /** Custom resolver: transforms raw target string into a URL path */
7
+ resolve?: (target: string, heading?: string) => string;
8
+ /** Known slugs for dead-link detection. If provided, unresolved targets get class "broken". */
9
+ knownSlugs?: Set<string>;
10
+ }
11
+ export declare const remarkWikilink: Plugin<[WikilinkOptions?], Root>;
12
+ //# sourceMappingURL=wikilink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wikilink.d.ts","sourceRoot":"","sources":["../../src/plugins/wikilink.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAyB,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAYrC,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACtD,+FAA+F;IAC/F,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAmF3D,CAAA"}