@breadstone-tools/markdowner-core 0.0.231 → 0.0.232
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/Index.d.ts +16 -6
- package/Index.d.ts.map +1 -1
- package/Index.js +6 -2
- package/Index.js.map +1 -1
- package/Processing/Processors/BlockquoteProcessor.Test.js +87 -2
- package/Processing/Processors/BlockquoteProcessor.Test.js.map +1 -1
- package/Processing/Processors/BlockquoteProcessor.d.ts +11 -2
- package/Processing/Processors/BlockquoteProcessor.d.ts.map +1 -1
- package/Processing/Processors/BlockquoteProcessor.js +7 -7
- package/Processing/Processors/BlockquoteProcessor.js.map +1 -1
- package/Processing/Processors/ButtonProcessor.Test.d.ts +2 -0
- package/Processing/Processors/ButtonProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/ButtonProcessor.Test.js +59 -0
- package/Processing/Processors/ButtonProcessor.Test.js.map +1 -0
- package/Processing/Processors/ButtonProcessor.d.ts +37 -0
- package/Processing/Processors/ButtonProcessor.d.ts.map +1 -0
- package/Processing/Processors/ButtonProcessor.js +80 -0
- package/Processing/Processors/ButtonProcessor.js.map +1 -0
- package/Processing/Processors/CalloutProcessor.Test.d.ts +2 -0
- package/Processing/Processors/CalloutProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/CalloutProcessor.Test.js +90 -0
- package/Processing/Processors/CalloutProcessor.Test.js.map +1 -0
- package/Processing/Processors/CalloutProcessor.d.ts +1 -1
- package/Processing/Processors/CalloutProcessor.d.ts.map +1 -1
- package/Processing/Processors/CalloutProcessor.js +5 -5
- package/Processing/Processors/CalloutProcessor.js.map +1 -1
- package/Processing/Processors/CardProcessor.Test.d.ts +2 -0
- package/Processing/Processors/CardProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/CardProcessor.Test.js +73 -0
- package/Processing/Processors/CardProcessor.Test.js.map +1 -0
- package/Processing/Processors/CardProcessor.d.ts +39 -0
- package/Processing/Processors/CardProcessor.d.ts.map +1 -0
- package/Processing/Processors/CardProcessor.js +96 -0
- package/Processing/Processors/CardProcessor.js.map +1 -0
- package/Processing/Processors/CodeBlockProcessor.Test.d.ts +2 -0
- package/Processing/Processors/CodeBlockProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/CodeBlockProcessor.Test.js +114 -0
- package/Processing/Processors/CodeBlockProcessor.Test.js.map +1 -0
- package/Processing/Processors/CodeBlockProcessor.d.ts +12 -1
- package/Processing/Processors/CodeBlockProcessor.d.ts.map +1 -1
- package/Processing/Processors/CodeBlockProcessor.js +17 -4
- package/Processing/Processors/CodeBlockProcessor.js.map +1 -1
- package/Processing/Processors/DetailsProcessor.Test.d.ts +2 -0
- package/Processing/Processors/DetailsProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/DetailsProcessor.Test.js +57 -0
- package/Processing/Processors/DetailsProcessor.Test.js.map +1 -0
- package/Processing/Processors/DetailsProcessor.d.ts +27 -0
- package/Processing/Processors/DetailsProcessor.d.ts.map +1 -0
- package/Processing/Processors/DetailsProcessor.js +69 -0
- package/Processing/Processors/DetailsProcessor.js.map +1 -0
- package/Processing/Processors/SplitProcessor.Test.d.ts +2 -0
- package/Processing/Processors/SplitProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/SplitProcessor.Test.js +82 -0
- package/Processing/Processors/SplitProcessor.Test.js.map +1 -0
- package/Processing/Processors/SplitProcessor.d.ts +1 -1
- package/Processing/Processors/SplitProcessor.d.ts.map +1 -1
- package/Processing/Processors/SplitProcessor.js +8 -6
- package/Processing/Processors/SplitProcessor.js.map +1 -1
- package/Processing/Processors/StepsProcessor.Test.d.ts +2 -0
- package/Processing/Processors/StepsProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/StepsProcessor.Test.js +77 -0
- package/Processing/Processors/StepsProcessor.Test.js.map +1 -0
- package/Processing/Processors/StepsProcessor.d.ts +43 -0
- package/Processing/Processors/StepsProcessor.d.ts.map +1 -0
- package/Processing/Processors/StepsProcessor.js +102 -0
- package/Processing/Processors/StepsProcessor.js.map +1 -0
- package/Processing/Processors/TabProcessor.Test.d.ts +2 -0
- package/Processing/Processors/TabProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/TabProcessor.Test.js +130 -0
- package/Processing/Processors/TabProcessor.Test.js.map +1 -0
- package/Processing/Processors/TabProcessor.d.ts +1 -1
- package/Processing/Processors/TabProcessor.d.ts.map +1 -1
- package/Processing/Processors/TabProcessor.js +6 -4
- package/Processing/Processors/TabProcessor.js.map +1 -1
- package/Templating/Html.js +1 -1
- package/Templating/Html.js.map +1 -1
- package/package.json +2 -3
package/Index.d.ts
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
export { MarkdownProcessor } from './Processing/MarkdownProcessor.js';
|
|
2
|
-
export type { IProcessor } from './Processing/Processors/Interfaces/IProcessor.js';
|
|
3
2
|
export { BaseProcessor } from './Processing/Processors/Abstracts/BaseProcessor.js';
|
|
3
|
+
export type { IProcessor } from './Processing/Processors/Interfaces/IProcessor.js';
|
|
4
4
|
export { BlockquoteProcessor } from './Processing/Processors/BlockquoteProcessor.js';
|
|
5
|
-
export {
|
|
6
|
-
export
|
|
7
|
-
export {
|
|
8
|
-
export type { ICalloutToken } from './Processing/Processors/CalloutProcessor.js';
|
|
5
|
+
export type { IBlockquoteToken } from './Processing/Processors/BlockquoteProcessor.js';
|
|
6
|
+
export { ButtonProcessor } from './Processing/Processors/ButtonProcessor.js';
|
|
7
|
+
export type { IButtonToken } from './Processing/Processors/ButtonProcessor.js';
|
|
9
8
|
export { CalloutProcessor } from './Processing/Processors/CalloutProcessor.js';
|
|
10
|
-
export type {
|
|
9
|
+
export type { ICalloutToken } from './Processing/Processors/CalloutProcessor.js';
|
|
10
|
+
export { CardProcessor } from './Processing/Processors/CardProcessor.js';
|
|
11
|
+
export type { ICardToken } from './Processing/Processors/CardProcessor.js';
|
|
12
|
+
export { CodeBlockProcessor } from './Processing/Processors/CodeBlockProcessor.js';
|
|
13
|
+
export type { ICodeBlockToken } from './Processing/Processors/CodeBlockProcessor.js';
|
|
14
|
+
export { DetailsProcessor } from './Processing/Processors/DetailsProcessor.js';
|
|
15
|
+
export type { IDetailsToken } from './Processing/Processors/DetailsProcessor.js';
|
|
11
16
|
export { SplitProcessor } from './Processing/Processors/SplitProcessor.js';
|
|
17
|
+
export type { ISplitsToken, ISplitToken } from './Processing/Processors/SplitProcessor.js';
|
|
18
|
+
export { StepsProcessor } from './Processing/Processors/StepsProcessor.js';
|
|
19
|
+
export type { IStepsToken, IStepToken } from './Processing/Processors/StepsProcessor.js';
|
|
20
|
+
export { TabProcessor } from './Processing/Processors/TabProcessor.js';
|
|
21
|
+
export type { ITabsToken, ITabToken } from './Processing/Processors/TabProcessor.js';
|
|
12
22
|
//# sourceMappingURL=Index.d.ts.map
|
package/Index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.d.ts","sourceRoot":"","sources":["../src/Index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,
|
|
1
|
+
{"version":3,"file":"Index.d.ts","sourceRoot":"","sources":["../src/Index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAC;AACnF,YAAY,EAAE,UAAU,EAAE,MAAM,kDAAkD,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACnF,YAAY,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC"}
|
package/Index.js
CHANGED
|
@@ -2,8 +2,12 @@ export { MarkdownProcessor } from './Processing/MarkdownProcessor.js';
|
|
|
2
2
|
export { BaseProcessor } from './Processing/Processors/Abstracts/BaseProcessor.js';
|
|
3
3
|
// Processors
|
|
4
4
|
export { BlockquoteProcessor } from './Processing/Processors/BlockquoteProcessor.js';
|
|
5
|
-
export {
|
|
6
|
-
export { TabProcessor } from './Processing/Processors/TabProcessor.js';
|
|
5
|
+
export { ButtonProcessor } from './Processing/Processors/ButtonProcessor.js';
|
|
7
6
|
export { CalloutProcessor } from './Processing/Processors/CalloutProcessor.js';
|
|
7
|
+
export { CardProcessor } from './Processing/Processors/CardProcessor.js';
|
|
8
|
+
export { CodeBlockProcessor } from './Processing/Processors/CodeBlockProcessor.js';
|
|
9
|
+
export { DetailsProcessor } from './Processing/Processors/DetailsProcessor.js';
|
|
8
10
|
export { SplitProcessor } from './Processing/Processors/SplitProcessor.js';
|
|
11
|
+
export { StepsProcessor } from './Processing/Processors/StepsProcessor.js';
|
|
12
|
+
export { TabProcessor } from './Processing/Processors/TabProcessor.js';
|
|
9
13
|
//# sourceMappingURL=Index.js.map
|
package/Index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../src/Index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../src/Index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAC;AAGnF,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAE3E,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { describe,
|
|
2
|
-
import { BlockquoteProcessor } from './BlockquoteProcessor';
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
3
2
|
import { MarkdownProcessor } from '../MarkdownProcessor';
|
|
3
|
+
import { BlockquoteProcessor } from './BlockquoteProcessor';
|
|
4
|
+
import { SplitProcessor } from './SplitProcessor';
|
|
5
|
+
import { TabProcessor } from './TabProcessor';
|
|
4
6
|
describe('BlockquoteProcessor', () => {
|
|
5
7
|
it('should render a blockquote with [!INFO] syntax', () => {
|
|
6
8
|
const markdown = '> [!INFO]\n> Highlights information that users should take into account.';
|
|
@@ -32,5 +34,88 @@ describe('BlockquoteProcessor', () => {
|
|
|
32
34
|
expect(html)
|
|
33
35
|
.toBe('<blockquote>This is a default blockquote with no headline.</blockquote>');
|
|
34
36
|
});
|
|
37
|
+
it('should render all supported variant types', () => {
|
|
38
|
+
const variants = ['primary', 'secondary', 'tertiary', 'info', 'warning', 'danger', 'error', 'success', 'highlight'];
|
|
39
|
+
for (const variant of variants) {
|
|
40
|
+
const markdown = `> [!${variant.toUpperCase()}]\n> Content.`;
|
|
41
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
42
|
+
const capitalized = variant.charAt(0).toUpperCase() + variant.slice(1);
|
|
43
|
+
expect(html).toBe(`<blockquote class="blockquote-${variant}"><strong>${capitalized}:</strong>Content.</blockquote>`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
it('should handle multi-line blockquote content', () => {
|
|
47
|
+
const markdown = '> [!INFO]\n> Line one.\n> Line two.';
|
|
48
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
49
|
+
expect(html).toContain('blockquote-info');
|
|
50
|
+
expect(html).toContain('Line one.');
|
|
51
|
+
});
|
|
52
|
+
it('should render neutral variant without class for plain blockquotes', () => {
|
|
53
|
+
const markdown = '> Just text.';
|
|
54
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
55
|
+
expect(html).not.toContain('class=');
|
|
56
|
+
expect(html).toContain('<blockquote>');
|
|
57
|
+
});
|
|
58
|
+
describe('Nesting', () => {
|
|
59
|
+
it('should render a blockquote with variant inside a tab', () => {
|
|
60
|
+
const markdown = [
|
|
61
|
+
'::: tabs',
|
|
62
|
+
'::: tab Tab 1',
|
|
63
|
+
'> [!WARNING]',
|
|
64
|
+
'> This is a warning inside a tab.',
|
|
65
|
+
'::: end-tab',
|
|
66
|
+
'::: end-tabs'
|
|
67
|
+
].join('\n');
|
|
68
|
+
const html = new MarkdownProcessor([
|
|
69
|
+
new TabProcessor(),
|
|
70
|
+
new BlockquoteProcessor()
|
|
71
|
+
]).process(markdown);
|
|
72
|
+
expect(html).toContain('class="tabs"');
|
|
73
|
+
expect(html).toContain('class="blockquote-warning"');
|
|
74
|
+
expect(html).toContain('<strong>Warning:</strong>');
|
|
75
|
+
expect(html).toContain('This is a warning inside a tab.');
|
|
76
|
+
});
|
|
77
|
+
it('should render a plain blockquote inside a tab', () => {
|
|
78
|
+
const markdown = [
|
|
79
|
+
'::: tabs',
|
|
80
|
+
'::: tab Quote Tab',
|
|
81
|
+
'> Just a plain blockquote.',
|
|
82
|
+
'::: end-tab',
|
|
83
|
+
'::: end-tabs'
|
|
84
|
+
].join('\n');
|
|
85
|
+
const html = new MarkdownProcessor([
|
|
86
|
+
new TabProcessor(),
|
|
87
|
+
new BlockquoteProcessor()
|
|
88
|
+
]).process(markdown);
|
|
89
|
+
expect(html).toContain('class="tabs"');
|
|
90
|
+
expect(html).toContain('<blockquote>');
|
|
91
|
+
expect(html).toContain('Just a plain blockquote.');
|
|
92
|
+
});
|
|
93
|
+
it('should render blockquotes with different variants in separate splits', () => {
|
|
94
|
+
const markdown = [
|
|
95
|
+
'::: splits',
|
|
96
|
+
'::: split Do',
|
|
97
|
+
'[!SUCCESS]',
|
|
98
|
+
'> [!SUCCESS]',
|
|
99
|
+
'> This is correct.',
|
|
100
|
+
'::: end-split',
|
|
101
|
+
'',
|
|
102
|
+
'::: split Dont',
|
|
103
|
+
'[!DANGER]',
|
|
104
|
+
'> [!DANGER]',
|
|
105
|
+
'> This is wrong.',
|
|
106
|
+
'::: end-split',
|
|
107
|
+
'::: end-splits'
|
|
108
|
+
].join('\n');
|
|
109
|
+
const html = new MarkdownProcessor([
|
|
110
|
+
new SplitProcessor(),
|
|
111
|
+
new BlockquoteProcessor()
|
|
112
|
+
]).process(markdown);
|
|
113
|
+
expect(html).toContain('class="splits"');
|
|
114
|
+
expect(html).toContain('class="blockquote-success"');
|
|
115
|
+
expect(html).toContain('class="blockquote-danger"');
|
|
116
|
+
expect(html).toContain('This is correct.');
|
|
117
|
+
expect(html).toContain('This is wrong.');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
35
120
|
});
|
|
36
121
|
//# sourceMappingURL=BlockquoteProcessor.Test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockquoteProcessor.Test.js","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.Test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"BlockquoteProcessor.Test.js","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.Test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import type { TokenizerAndRendererExtension, Tokens } from 'marked';
|
|
1
2
|
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
2
|
-
|
|
3
|
+
type BlockquoteVariant = 'primary' | 'secondary' | 'tertiary' | 'info' | 'warning' | 'danger' | 'error' | 'success' | 'highlight' | 'neutral';
|
|
4
|
+
export interface IBlockquoteToken extends Tokens.Generic {
|
|
5
|
+
type: 'blockquote';
|
|
6
|
+
raw: string;
|
|
7
|
+
text: string;
|
|
8
|
+
variant: BlockquoteVariant;
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* A processor that transforms blockquotes using the `[!TYPE]` syntax into styled callouts.
|
|
5
13
|
*
|
|
6
|
-
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `
|
|
14
|
+
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `neutral`.
|
|
7
15
|
*
|
|
8
16
|
* @example
|
|
9
17
|
* ```markdown
|
|
@@ -22,4 +30,5 @@ export declare class BlockquoteProcessor extends BaseProcessor {
|
|
|
22
30
|
get extension(): TokenizerAndRendererExtension;
|
|
23
31
|
walkTokens(token: Tokens.Generic): void;
|
|
24
32
|
}
|
|
33
|
+
export {};
|
|
25
34
|
//# sourceMappingURL=BlockquoteProcessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockquoteProcessor.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"BlockquoteProcessor.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,6BAA6B,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,KAAK,iBAAiB,GAAK,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAMhJ,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,OAAO;IACpD,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,IAAoB,SAAS,IAAI,6BAA6B,CAQ7D;IAEe,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;CAQ1D"}
|
|
@@ -5,7 +5,7 @@ const KNOWN_VARIANTS = new Set([
|
|
|
5
5
|
/**
|
|
6
6
|
* A processor that transforms blockquotes using the `[!TYPE]` syntax into styled callouts.
|
|
7
7
|
*
|
|
8
|
-
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `
|
|
8
|
+
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `neutral`.
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
11
|
* ```markdown
|
|
@@ -40,7 +40,7 @@ export class BlockquoteProcessor extends BaseProcessor {
|
|
|
40
40
|
class BlockquoteTokenizer {
|
|
41
41
|
static enrich(token) {
|
|
42
42
|
const text = token.text.trim();
|
|
43
|
-
const match = (/^\[!(PRIMARY|SECONDARY|TERTIARY|INFO|WARNING|DANGER|ERROR|SUCCESS|HIGHLIGHT|NEUTRAL)\]\s*
|
|
43
|
+
const match = (/^\[!(PRIMARY|SECONDARY|TERTIARY|INFO|WARNING|DANGER|ERROR|SUCCESS|HIGHLIGHT|NEUTRAL)\][ \t]*([\s\S]*)$/im).exec(text);
|
|
44
44
|
if (match) {
|
|
45
45
|
const variant = match[1].toLowerCase();
|
|
46
46
|
const content = match[2].trim();
|
|
@@ -57,11 +57,11 @@ class BlockquoteTokenizer {
|
|
|
57
57
|
}
|
|
58
58
|
class BlockquoteRenderer {
|
|
59
59
|
static render(token) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return `<blockquote
|
|
60
|
+
if (token.variant === 'neutral') {
|
|
61
|
+
return `<blockquote>${token.content}</blockquote>`;
|
|
62
|
+
}
|
|
63
|
+
const label = `<strong>${token.variant.charAt(0).toUpperCase() + token.variant.slice(1)}:</strong>`;
|
|
64
|
+
return `<blockquote class="blockquote-${token.variant}">${label}${token.content}</blockquote>`;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
//# sourceMappingURL=BlockquoteProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockquoteProcessor.js","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BlockquoteProcessor.js","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAoB;IAC9C,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;CAC9G,CAAC,CAAC;AAUH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAElD,IAAoB,SAAS;QACzB,OAAO;YACH,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,OAAO;YACd,QAAQ,CAAqB,KAAqB;gBAC9C,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAyB,CAAC,CAAC;YAChE,CAAC;SACJ,CAAC;IACN,CAAC;IAEe,UAAU,CAAC,KAAqB;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,mBAAmB,CAAC,MAAM,CAAC,KAAyB,CAAC,CAAC;IAC1D,CAAC;CAEJ;AAED,MAAM,mBAAmB;IAEd,MAAM,CAAC,MAAM,CAAC,KAAuB;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,0GAA0G,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtI,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAuB,CAAC;YAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEhC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;gBACvC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,CAAC;YAChB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;IACL,CAAC;CAEJ;AAED,MAAM,kBAAkB;IAEb,MAAM,CAAC,MAAM,CAAC,KAAuB;QACxC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,eAAe,KAAK,CAAC,OAAO,eAAe,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;QAEpG,OAAO,iCAAiC,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC;IACnG,CAAC;CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonProcessor.Test.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/ButtonProcessor.Test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { marked } from 'marked';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { ButtonProcessor } from './ButtonProcessor';
|
|
4
|
+
describe('ButtonProcessor', () => {
|
|
5
|
+
function parse(md) {
|
|
6
|
+
const processor = new ButtonProcessor();
|
|
7
|
+
marked.use({ extensions: [processor.extension] });
|
|
8
|
+
return marked.parse(md).trim();
|
|
9
|
+
}
|
|
10
|
+
it('should parse a button with label only', () => {
|
|
11
|
+
const md = `::: button Click me
|
|
12
|
+
:::`;
|
|
13
|
+
const result = parse(md);
|
|
14
|
+
expect(result).toContain('class="md-button primary solid"');
|
|
15
|
+
expect(result).toContain('href="#"');
|
|
16
|
+
expect(result).toContain('Click me');
|
|
17
|
+
});
|
|
18
|
+
it('should parse a button with label and href', () => {
|
|
19
|
+
const md = `::: button Get Started | /getStarted
|
|
20
|
+
:::`;
|
|
21
|
+
const result = parse(md);
|
|
22
|
+
expect(result).toContain('href="/getStarted"');
|
|
23
|
+
expect(result).toContain('Get Started');
|
|
24
|
+
});
|
|
25
|
+
it('should parse a button with label, href, and variant', () => {
|
|
26
|
+
const md = `::: button Danger Zone | /danger | danger
|
|
27
|
+
:::`;
|
|
28
|
+
const result = parse(md);
|
|
29
|
+
expect(result).toContain('class="md-button danger solid"');
|
|
30
|
+
expect(result).toContain('href="/danger"');
|
|
31
|
+
expect(result).toContain('Danger Zone');
|
|
32
|
+
});
|
|
33
|
+
it('should parse a button with all properties', () => {
|
|
34
|
+
const md = `::: button Learn More | /docs | secondary | soft
|
|
35
|
+
:::`;
|
|
36
|
+
const result = parse(md);
|
|
37
|
+
expect(result).toContain('class="md-button secondary soft"');
|
|
38
|
+
expect(result).toContain('href="/docs"');
|
|
39
|
+
expect(result).toContain('Learn More');
|
|
40
|
+
});
|
|
41
|
+
it('should default unknown variant to primary', () => {
|
|
42
|
+
const md = `::: button Test | # | unknown
|
|
43
|
+
:::`;
|
|
44
|
+
const result = parse(md);
|
|
45
|
+
expect(result).toContain('class="md-button primary solid"');
|
|
46
|
+
});
|
|
47
|
+
it('should default unknown appearance to solid', () => {
|
|
48
|
+
const md = `::: button Test | # | primary | ghost
|
|
49
|
+
:::`;
|
|
50
|
+
const result = parse(md);
|
|
51
|
+
expect(result).toContain('class="md-button primary solid"');
|
|
52
|
+
});
|
|
53
|
+
it('should not match non-button syntax', () => {
|
|
54
|
+
const md = 'Just a paragraph.';
|
|
55
|
+
const result = parse(md);
|
|
56
|
+
expect(result).not.toContain('md-button');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=ButtonProcessor.Test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonProcessor.Test.js","sourceRoot":"","sources":["../../../src/Processing/Processors/ButtonProcessor.Test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { TokenizerAndRendererExtension, Tokens } from 'marked';
|
|
2
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
3
|
+
type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'info' | 'warning' | 'danger' | 'error' | 'success' | 'highlight' | 'neutral';
|
|
4
|
+
type ButtonAppearance = 'solid' | 'soft' | 'plain';
|
|
5
|
+
export interface IButtonToken extends Tokens.Generic {
|
|
6
|
+
type: 'md_button';
|
|
7
|
+
raw: string;
|
|
8
|
+
label: string;
|
|
9
|
+
href: string;
|
|
10
|
+
variant: ButtonVariant;
|
|
11
|
+
appearance: ButtonAppearance;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A processor that transforms `:::button` blocks into clickable button elements.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```markdown
|
|
18
|
+
* ::: button Get Started | /getStarted | primary | soft
|
|
19
|
+
* :::
|
|
20
|
+
*
|
|
21
|
+
* ::: button Learn More | /docs
|
|
22
|
+
* :::
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* Format: `::: button Label | href | variant | appearance`
|
|
26
|
+
* - `Label` (required): The button text
|
|
27
|
+
* - `href` (optional): The link target, defaults to `#`
|
|
28
|
+
* - `variant` (optional): One of the known variants, defaults to `primary`
|
|
29
|
+
* - `appearance` (optional): One of `solid`, `soft`, `plain`, defaults to `solid`
|
|
30
|
+
*
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare class ButtonProcessor extends BaseProcessor {
|
|
34
|
+
get extension(): TokenizerAndRendererExtension;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=ButtonProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonProcessor.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/ButtonProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,6BAA6B,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,KAAK,aAAa,GAAK,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAQ5I,KAAK,gBAAgB,GAAK,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAMrD,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,OAAO;IAChD,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAE9C,IAAoB,SAAS,IAAI,6BAA6B,CAc7D;CAEJ"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// #region Imports
|
|
2
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
3
|
+
const KNOWN_VARIANTS = new Set([
|
|
4
|
+
'primary', 'secondary', 'tertiary',
|
|
5
|
+
'info', 'warning', 'danger', 'error',
|
|
6
|
+
'success', 'highlight', 'neutral'
|
|
7
|
+
]);
|
|
8
|
+
const KNOWN_APPEARANCES = new Set([
|
|
9
|
+
'solid', 'soft', 'plain'
|
|
10
|
+
]);
|
|
11
|
+
/**
|
|
12
|
+
* A processor that transforms `:::button` blocks into clickable button elements.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```markdown
|
|
16
|
+
* ::: button Get Started | /getStarted | primary | soft
|
|
17
|
+
* :::
|
|
18
|
+
*
|
|
19
|
+
* ::: button Learn More | /docs
|
|
20
|
+
* :::
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Format: `::: button Label | href | variant | appearance`
|
|
24
|
+
* - `Label` (required): The button text
|
|
25
|
+
* - `href` (optional): The link target, defaults to `#`
|
|
26
|
+
* - `variant` (optional): One of the known variants, defaults to `primary`
|
|
27
|
+
* - `appearance` (optional): One of `solid`, `soft`, `plain`, defaults to `solid`
|
|
28
|
+
*
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
export class ButtonProcessor extends BaseProcessor {
|
|
32
|
+
get extension() {
|
|
33
|
+
return {
|
|
34
|
+
name: 'md_button',
|
|
35
|
+
level: 'block',
|
|
36
|
+
start(src) {
|
|
37
|
+
return (/^::: button /).exec(src)?.index;
|
|
38
|
+
},
|
|
39
|
+
tokenizer(src) {
|
|
40
|
+
return ButtonTokenizer.tokenize(src);
|
|
41
|
+
},
|
|
42
|
+
renderer(token) {
|
|
43
|
+
return ButtonRenderer.render(token);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
class ButtonTokenizer {
|
|
52
|
+
static tokenize(src) {
|
|
53
|
+
const match = (/^::: button (.+?)\n:::/).exec(src);
|
|
54
|
+
if (!match) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const parts = match[1].split('|').map((s) => s.trim());
|
|
58
|
+
const label = parts[0] ?? 'Button';
|
|
59
|
+
const href = parts[1] ?? '#';
|
|
60
|
+
const rawVariant = (parts[2] ?? 'primary').toLowerCase();
|
|
61
|
+
const rawAppearance = (parts[3] ?? 'solid').toLowerCase();
|
|
62
|
+
return {
|
|
63
|
+
type: 'md_button',
|
|
64
|
+
raw: match[0],
|
|
65
|
+
label,
|
|
66
|
+
href,
|
|
67
|
+
variant: KNOWN_VARIANTS.has(rawVariant) ? rawVariant : 'primary',
|
|
68
|
+
appearance: KNOWN_APPEARANCES.has(rawAppearance) ? rawAppearance : 'solid'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @private
|
|
74
|
+
*/
|
|
75
|
+
class ButtonRenderer {
|
|
76
|
+
static render(token) {
|
|
77
|
+
return `<a class="md-button ${token.variant} ${token.appearance}" href="${token.href}">${token.label}</a>`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=ButtonProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonProcessor.js","sourceRoot":"","sources":["../../../src/Processing/Processors/ButtonProcessor.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAGlB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAM7D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAgB;IAC1C,SAAS,EAAE,WAAW,EAAE,UAAU;IAClC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;IACpC,SAAS,EAAE,WAAW,EAAE,SAAS;CACpC,CAAC,CAAC;AAIH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAmB;IAChD,OAAO,EAAE,MAAM,EAAE,OAAO;CAC3B,CAAC,CAAC;AAWH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAE9C,IAAoB,SAAS;QACzB,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,OAAO;YACd,KAAK,CAAC,GAAW;gBACb,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;YAC7C,CAAC;YACD,SAAS,CAAsB,GAAW;gBACtC,OAAO,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,QAAQ,CAAqB,KAAqB;gBAC9C,OAAO,cAAc,CAAC,MAAM,CAAC,KAAqB,CAAC,CAAC;YACxD,CAAC;SACJ,CAAC;IACN,CAAC;CAEJ;AAED;;GAEG;AACH,MAAM,eAAe;IAEV,MAAM,CAAC,QAAQ,CAAC,GAAW;QAC9B,MAAM,KAAK,GAAG,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAAmB,CAAC;QAC1E,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,EAAsB,CAAC;QAE9E,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,KAAK;YACL,IAAI;YACJ,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAChE,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO;SAC7E,CAAC;IACN,CAAC;CAEJ;AAED;;GAEG;AACH,MAAM,cAAc;IAET,MAAM,CAAC,MAAM,CAAC,KAAmB;QACpC,OAAO,uBAAuB,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,MAAM,CAAC;IAC/G,CAAC;CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalloutProcessor.Test.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/CalloutProcessor.Test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { MarkdownProcessor } from '../MarkdownProcessor';
|
|
3
|
+
import { CalloutProcessor } from './CalloutProcessor';
|
|
4
|
+
import { SplitProcessor } from './SplitProcessor';
|
|
5
|
+
import { TabProcessor } from './TabProcessor';
|
|
6
|
+
describe('CalloutProcessor', () => {
|
|
7
|
+
it('should render a callout with variant and title', () => {
|
|
8
|
+
const markdown = '::: warning Be cautious!\nThis is a warning box.\n:::';
|
|
9
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
10
|
+
expect(html).toContain('class="callout warning"');
|
|
11
|
+
expect(html).toContain('<div class="callout-title">Be cautious!</div>');
|
|
12
|
+
expect(html).toContain('This is a warning box.');
|
|
13
|
+
});
|
|
14
|
+
it('should render a callout without title', () => {
|
|
15
|
+
const markdown = '::: info\nSome information here.\n:::';
|
|
16
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
17
|
+
expect(html).toContain('class="callout info"');
|
|
18
|
+
expect(html).not.toContain('callout-title');
|
|
19
|
+
expect(html).toContain('Some information here.');
|
|
20
|
+
});
|
|
21
|
+
it('should render all supported variants', () => {
|
|
22
|
+
const variants = ['primary', 'secondary', 'tertiary', 'info', 'warning', 'danger', 'success', 'highlight', 'neutral'];
|
|
23
|
+
for (const variant of variants) {
|
|
24
|
+
const markdown = `::: ${variant} Title\nContent.\n:::`;
|
|
25
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
26
|
+
expect(html).toContain(`class="callout ${variant}"`);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
it('should not match unknown variants', () => {
|
|
30
|
+
const markdown = '::: unknown Title\nContent.\n:::';
|
|
31
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
32
|
+
expect(html).not.toContain('class="callout unknown"');
|
|
33
|
+
});
|
|
34
|
+
it('should parse inline markdown in content', () => {
|
|
35
|
+
const markdown = '::: info Note\nThis has **bold** text.\n:::';
|
|
36
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
37
|
+
expect(html).toContain('<strong>bold</strong>');
|
|
38
|
+
});
|
|
39
|
+
it('should handle callout after other content', () => {
|
|
40
|
+
const markdown = 'Some paragraph.\n\n::: danger Alert\nDangerous content.\n:::';
|
|
41
|
+
const html = new MarkdownProcessor([new CalloutProcessor()]).process(markdown);
|
|
42
|
+
expect(html).toContain('<p>Some paragraph.</p>');
|
|
43
|
+
expect(html).toContain('class="callout danger"');
|
|
44
|
+
});
|
|
45
|
+
describe('Nesting', () => {
|
|
46
|
+
it('should render a callout inside a tab', () => {
|
|
47
|
+
const markdown = [
|
|
48
|
+
'::: tabs',
|
|
49
|
+
'::: tab Info Tab',
|
|
50
|
+
'::: info Important',
|
|
51
|
+
'This is important information.',
|
|
52
|
+
':::',
|
|
53
|
+
'::: end-tab',
|
|
54
|
+
'::: end-tabs'
|
|
55
|
+
].join('\n');
|
|
56
|
+
const html = new MarkdownProcessor([
|
|
57
|
+
new TabProcessor(),
|
|
58
|
+
new CalloutProcessor()
|
|
59
|
+
]).process(markdown);
|
|
60
|
+
expect(html).toContain('class="tabs"');
|
|
61
|
+
expect(html).toContain('class="callout info"');
|
|
62
|
+
expect(html).toContain('This is important information.');
|
|
63
|
+
});
|
|
64
|
+
it('should render callouts in different splits', () => {
|
|
65
|
+
const markdown = [
|
|
66
|
+
'::: splits',
|
|
67
|
+
'::: split Left',
|
|
68
|
+
'::: warning Heads up',
|
|
69
|
+
'Warning content here.',
|
|
70
|
+
':::',
|
|
71
|
+
'::: end-split',
|
|
72
|
+
'',
|
|
73
|
+
'::: split Right',
|
|
74
|
+
'::: success Done',
|
|
75
|
+
'Success content here.',
|
|
76
|
+
':::',
|
|
77
|
+
'::: end-split',
|
|
78
|
+
'::: end-splits'
|
|
79
|
+
].join('\n');
|
|
80
|
+
const html = new MarkdownProcessor([
|
|
81
|
+
new SplitProcessor(),
|
|
82
|
+
new CalloutProcessor()
|
|
83
|
+
]).process(markdown);
|
|
84
|
+
expect(html).toContain('class="splits"');
|
|
85
|
+
expect(html).toContain('class="callout warning"');
|
|
86
|
+
expect(html).toContain('class="callout success"');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=CalloutProcessor.Test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalloutProcessor.Test.js","sourceRoot":"","sources":["../../../src/Processing/Processors/CalloutProcessor.Test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
2
1
|
import type { TokenizerAndRendererExtension, Tokens } from 'marked';
|
|
2
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
3
3
|
type CalloutVariant = 'primary' | 'secondary' | 'tertiary' | 'info' | 'warning' | 'danger' | 'success' | 'highlight' | 'neutral';
|
|
4
4
|
export interface ICalloutToken extends Tokens.Generic {
|
|
5
5
|
type: 'callout';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalloutProcessor.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/CalloutProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CalloutProcessor.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/CalloutProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,6BAA6B,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,KAAK,cAAc,GAAK,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAMnI,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,OAAO;IACjD,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,SAAQ,aAAa;IAE/C,IAAoB,SAAS,IAAI,6BAA6B,CAc7D;CAEJ"}
|
|
@@ -22,7 +22,7 @@ export class CalloutProcessor extends BaseProcessor {
|
|
|
22
22
|
name: 'callout',
|
|
23
23
|
level: 'block',
|
|
24
24
|
start(src) {
|
|
25
|
-
return (/^:::
|
|
25
|
+
return (/^::: \w+/).exec(src)?.index;
|
|
26
26
|
},
|
|
27
27
|
tokenizer(src) {
|
|
28
28
|
return CalloutTokenizer.tokenize(src, this.lexer);
|
|
@@ -35,7 +35,7 @@ export class CalloutProcessor extends BaseProcessor {
|
|
|
35
35
|
}
|
|
36
36
|
class CalloutTokenizer {
|
|
37
37
|
static tokenize(src, lexer) {
|
|
38
|
-
const match = (/^::: (\w+)(?:\s+([^\n]+))?\n([\s\S]+?)\n:::/
|
|
38
|
+
const match = (/^::: (\w+)(?:\s+([^\n]+))?\n([\s\S]+?)\n:::/).exec(src);
|
|
39
39
|
if (!match) {
|
|
40
40
|
return undefined;
|
|
41
41
|
}
|
|
@@ -43,9 +43,9 @@ class CalloutTokenizer {
|
|
|
43
43
|
if (!KNOWN_VARIANTS.has(variant)) {
|
|
44
44
|
return undefined;
|
|
45
45
|
}
|
|
46
|
-
const title = match[2]
|
|
46
|
+
const title = match[2]?.trim();
|
|
47
47
|
const content = match[3].trim();
|
|
48
|
-
const contentTokens = lexer.
|
|
48
|
+
const contentTokens = lexer.blockTokens(content);
|
|
49
49
|
return {
|
|
50
50
|
type: 'callout',
|
|
51
51
|
raw: match[0],
|
|
@@ -61,7 +61,7 @@ class CalloutRenderer {
|
|
|
61
61
|
const title = token.title
|
|
62
62
|
? `<div class="callout-title">${token.title}</div>`
|
|
63
63
|
: '';
|
|
64
|
-
const body = renderer.parser.parse(token.tokens);
|
|
64
|
+
const body = renderer.parser.parse(token.tokens ?? []);
|
|
65
65
|
return `<div class="${classes.join(' ')}">${title}${body}</div>`;
|
|
66
66
|
}
|
|
67
67
|
}
|