@breadstone-tools/markdowner-core 0.0.32 → 0.0.34
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 +11 -7
- package/Index.d.ts.map +1 -1
- package/Index.js +8 -15
- package/Index.js.map +1 -1
- package/Process/MarkdownProcessor.d.ts.map +1 -1
- package/Process/MarkdownProcessor.js +20 -17
- package/Process/MarkdownProcessor.js.map +1 -1
- package/Process/Processors/Abstracts/BaseProcessor.d.ts +11 -6
- package/Process/Processors/Abstracts/BaseProcessor.d.ts.map +1 -1
- package/Process/Processors/Abstracts/BaseProcessor.js +6 -13
- package/Process/Processors/Abstracts/BaseProcessor.js.map +1 -1
- package/Process/Processors/BlockquoteProcessor.Test.js +19 -21
- package/Process/Processors/BlockquoteProcessor.Test.js.map +1 -1
- package/Process/Processors/BlockquoteProcessor.d.ts +13 -7
- package/Process/Processors/BlockquoteProcessor.d.ts.map +1 -1
- package/Process/Processors/BlockquoteProcessor.js +48 -42
- package/Process/Processors/BlockquoteProcessor.js.map +1 -1
- package/Process/Processors/CalloutProcessor.d.ts +23 -4
- package/Process/Processors/CalloutProcessor.d.ts.map +1 -1
- package/Process/Processors/CalloutProcessor.js +60 -36
- package/Process/Processors/CalloutProcessor.js.map +1 -1
- package/Process/Processors/CodeBlockProcessor.d.ts +17 -3
- package/Process/Processors/CodeBlockProcessor.d.ts.map +1 -1
- package/Process/Processors/CodeBlockProcessor.js +54 -35
- package/Process/Processors/CodeBlockProcessor.js.map +1 -1
- package/Process/Processors/Interfaces/IProcessor.d.ts +2 -2
- package/Process/Processors/Interfaces/IProcessor.d.ts.map +1 -1
- package/Process/Processors/Interfaces/IProcessor.js +1 -2
- package/Process/Processors/Interfaces/IProcessor.js.map +1 -1
- package/Process/Processors/SplitProcessor.d.ts +49 -0
- package/Process/Processors/SplitProcessor.d.ts.map +1 -0
- package/Process/Processors/SplitProcessor.js +123 -0
- package/Process/Processors/SplitProcessor.js.map +1 -0
- package/Process/Processors/TabProcessor.d.ts +36 -4
- package/Process/Processors/TabProcessor.d.ts.map +1 -1
- package/Process/Processors/TabProcessor.js +84 -49
- package/Process/Processors/TabProcessor.js.map +1 -1
- package/Process/Processors/Utils.js +2 -5
- package/Process/Processors/Utils.js.map +1 -1
- package/Processing/MarkdownProcessor.d.ts +46 -0
- package/Processing/MarkdownProcessor.d.ts.map +1 -0
- package/Processing/MarkdownProcessor.js +92 -0
- package/Processing/MarkdownProcessor.js.map +1 -0
- package/Processing/Processors/Abstracts/BaseProcessor.d.ts +60 -0
- package/Processing/Processors/Abstracts/BaseProcessor.d.ts.map +1 -0
- package/Processing/Processors/Abstracts/BaseProcessor.js +71 -0
- package/Processing/Processors/Abstracts/BaseProcessor.js.map +1 -0
- package/Processing/Processors/BlockquoteProcessor.Test.d.ts +2 -0
- package/Processing/Processors/BlockquoteProcessor.Test.d.ts.map +1 -0
- package/Processing/Processors/BlockquoteProcessor.Test.js +36 -0
- package/Processing/Processors/BlockquoteProcessor.Test.js.map +1 -0
- package/Processing/Processors/BlockquoteProcessor.d.ts +25 -0
- package/Processing/Processors/BlockquoteProcessor.d.ts.map +1 -0
- package/Processing/Processors/BlockquoteProcessor.js +67 -0
- package/Processing/Processors/BlockquoteProcessor.js.map +1 -0
- package/Processing/Processors/CalloutProcessor.d.ts +29 -0
- package/Processing/Processors/CalloutProcessor.d.ts.map +1 -0
- package/Processing/Processors/CalloutProcessor.js +68 -0
- package/Processing/Processors/CalloutProcessor.js.map +1 -0
- package/Processing/Processors/CodeBlockProcessor.d.ts +24 -0
- package/Processing/Processors/CodeBlockProcessor.d.ts.map +1 -0
- package/Processing/Processors/CodeBlockProcessor.js +65 -0
- package/Processing/Processors/CodeBlockProcessor.js.map +1 -0
- package/Processing/Processors/Interfaces/IProcessor.d.ts +9 -0
- package/Processing/Processors/Interfaces/IProcessor.d.ts.map +1 -0
- package/Processing/Processors/Interfaces/IProcessor.js +3 -0
- package/Processing/Processors/Interfaces/IProcessor.js.map +1 -0
- package/Processing/Processors/SplitProcessor.d.ts +47 -0
- package/Processing/Processors/SplitProcessor.d.ts.map +1 -0
- package/Processing/Processors/SplitProcessor.js +113 -0
- package/Processing/Processors/SplitProcessor.js.map +1 -0
- package/Processing/Processors/TabProcessor.d.ts +43 -0
- package/Processing/Processors/TabProcessor.d.ts.map +1 -0
- package/Processing/Processors/TabProcessor.js +110 -0
- package/Processing/Processors/TabProcessor.js.map +1 -0
- package/Templating/Html.d.ts +2 -0
- package/Templating/Html.d.ts.map +1 -0
- package/Templating/Html.js +11 -0
- package/Templating/Html.js.map +1 -0
- package/package.json +4 -4
|
@@ -1,59 +1,94 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
2
|
+
const KNOWN_VARIANTS = new Set([
|
|
3
|
+
'primary', 'secondary', 'tertiary',
|
|
4
|
+
'info', 'warning', 'danger', 'error',
|
|
5
|
+
'success', 'highlight', 'neutral'
|
|
6
|
+
]);
|
|
5
7
|
/**
|
|
6
|
-
*
|
|
8
|
+
* A processor that transforms `:::tabs` blocks into tabbed layout structures.
|
|
9
|
+
* Each tab may include a title, content, and an optional variant using `[!TYPE]`.
|
|
10
|
+
*
|
|
11
|
+
* Supported variants: `primary`, `secondary`, `tertiary`, `info`, `warning`, `danger`, `error`, `success`, `highlight`, `neutral`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```markdown
|
|
15
|
+
* ::: tabs
|
|
16
|
+
* ::: tab Tab 1
|
|
17
|
+
* [!INFO]
|
|
18
|
+
* Content for the first tab.
|
|
19
|
+
* ::: end-tab
|
|
20
|
+
*
|
|
21
|
+
* ::: tab Tab 2
|
|
22
|
+
* [!WARNING]
|
|
23
|
+
* Content for the second tab.
|
|
24
|
+
* ::: end-tab
|
|
25
|
+
* ::: end-tabs
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @public
|
|
7
29
|
*/
|
|
8
|
-
class TabProcessor extends
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
while ((tabMatch = tabRegex.exec(tabsContent)) !== null) {
|
|
22
|
-
tabs.push({
|
|
23
|
-
title: tabMatch[1].trim(),
|
|
24
|
-
content: tabMatch[2].trim(),
|
|
25
|
-
id: `tab-${index++}`
|
|
26
|
-
});
|
|
30
|
+
export class TabProcessor extends BaseProcessor {
|
|
31
|
+
get extension() {
|
|
32
|
+
return {
|
|
33
|
+
name: 'tabs',
|
|
34
|
+
level: 'block',
|
|
35
|
+
start(src) {
|
|
36
|
+
return (/^::: tabs/).exec(src)?.index;
|
|
37
|
+
},
|
|
38
|
+
tokenizer(src) {
|
|
39
|
+
return TabTokenizer.tokenize(src);
|
|
40
|
+
},
|
|
41
|
+
renderer(token) {
|
|
42
|
+
return TabRenderer.render(token);
|
|
27
43
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
class TabTokenizer {
|
|
48
|
+
static tokenize(src) {
|
|
49
|
+
const match = (/^::: tabs\n([\s\S]+?)\n::: end-tabs/m).exec(src);
|
|
50
|
+
if (!match) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const tabRegex = /^::: tab (.+?)\n([\s\S]+?)\n::: end-tab/gm;
|
|
54
|
+
const tabs = [];
|
|
55
|
+
let tabMatch = null;
|
|
56
|
+
let index = 0;
|
|
57
|
+
while ((tabMatch = tabRegex.exec(match[1])) !== null) {
|
|
58
|
+
const rawLines = tabMatch[2].trim().split('\n');
|
|
59
|
+
let variant = undefined;
|
|
60
|
+
const variantMatch = (/^\[\!(\w+)\]/).exec(rawLines[0]);
|
|
61
|
+
if (variantMatch) {
|
|
62
|
+
const v = variantMatch[1].toLowerCase();
|
|
63
|
+
if (KNOWN_VARIANTS.has(v)) {
|
|
64
|
+
variant = v;
|
|
65
|
+
rawLines.shift(); // Remove variant line
|
|
32
66
|
}
|
|
67
|
+
}
|
|
68
|
+
const content = rawLines.join('\n').trim();
|
|
69
|
+
tabs.push({
|
|
70
|
+
id: `tab-${index++}`,
|
|
71
|
+
title: tabMatch[1].trim(),
|
|
72
|
+
content,
|
|
73
|
+
variant
|
|
33
74
|
});
|
|
34
|
-
token.tokens?.splice(0, token.tokens.length); // Clear the token's children
|
|
35
75
|
}
|
|
76
|
+
return {
|
|
77
|
+
type: 'tabs',
|
|
78
|
+
raw: match[0],
|
|
79
|
+
tabs
|
|
80
|
+
};
|
|
36
81
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.map((tab, index) => `<div class="tab-content" id="tab-${index}">${tab.content}</div>`)
|
|
48
|
-
.join('');
|
|
49
|
-
return `<div class="tabs">
|
|
50
|
-
<ul class="tab-list">${tabList}</ul>
|
|
51
|
-
${tabContents}
|
|
52
|
-
</div>`;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
];
|
|
82
|
+
}
|
|
83
|
+
class TabRenderer {
|
|
84
|
+
static render(token) {
|
|
85
|
+
const headers = token.tabs
|
|
86
|
+
.map((tab) => `<li class="tab-item${tab.variant ? ` ${tab.variant}` : ''}" data-tab="${tab.id}">${tab.title}</li>`)
|
|
87
|
+
.join('');
|
|
88
|
+
const bodies = token.tabs
|
|
89
|
+
.map((tab) => `<div class="tab-content${tab.variant ? ` ${tab.variant}` : ''}" id="${tab.id}">${tab.content}</div>`)
|
|
90
|
+
.join('');
|
|
91
|
+
return `<div class="tabs"><ul class="tab-list">${headers}</ul>${bodies}</div>`;
|
|
56
92
|
}
|
|
57
93
|
}
|
|
58
|
-
exports.TabProcessor = TabProcessor;
|
|
59
94
|
//# sourceMappingURL=TabProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabProcessor.js","sourceRoot":"","sources":["../../../src/Process/Processors/TabProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TabProcessor.js","sourceRoot":"","sources":["../../../src/Process/Processors/TabProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// #region Imports
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.TokenUtils = void 0;
|
|
5
2
|
// #endregion
|
|
6
|
-
var TokenUtils;
|
|
3
|
+
export var TokenUtils;
|
|
7
4
|
(function (TokenUtils) {
|
|
8
5
|
function setTokenMeta(token, meta) {
|
|
9
6
|
Object.assign(token, { meta });
|
|
@@ -13,5 +10,5 @@ var TokenUtils;
|
|
|
13
10
|
return token.meta;
|
|
14
11
|
}
|
|
15
12
|
TokenUtils.getTokenMeta = getTokenMeta;
|
|
16
|
-
})(TokenUtils || (
|
|
13
|
+
})(TokenUtils || (TokenUtils = {}));
|
|
17
14
|
//# sourceMappingURL=Utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../src/Process/Processors/Utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../src/Process/Processors/Utils.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAIlB,aAAa;AAEb,MAAM,KAAW,UAAU,CAU1B;AAVD,WAAiB,UAAU;IAEvB,SAAgB,YAAY,CAAI,KAAqB,EAAE,IAAO;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAFe,uBAAY,eAE3B,CAAA;IAED,SAAgB,YAAY,CAAI,KAAqB;QACjD,OAAO,KAAK,CAAC,IAAS,CAAC;IAC3B,CAAC;IAFe,uBAAY,eAE3B,CAAA;AAEL,CAAC,EAVgB,UAAU,KAAV,UAAU,QAU1B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type MarkedOptions } from 'marked';
|
|
2
|
+
import type { IProcessor } from './Processors/Interfaces/IProcessor.js';
|
|
3
|
+
/**
|
|
4
|
+
* Main processor for Markdown content.
|
|
5
|
+
* Orchestrates processors and integrates them with `marked`.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare class MarkdownProcessor {
|
|
10
|
+
private _processors;
|
|
11
|
+
/**
|
|
12
|
+
* Constructs a new MarkdownProcessor.
|
|
13
|
+
*/
|
|
14
|
+
constructor(processors?: Array<IProcessor>);
|
|
15
|
+
/**
|
|
16
|
+
* Adds a custom processor to the manager.
|
|
17
|
+
*
|
|
18
|
+
* @public
|
|
19
|
+
* @param processor - The processor to add.
|
|
20
|
+
*/
|
|
21
|
+
addProcessor(processor: IProcessor): void;
|
|
22
|
+
/**
|
|
23
|
+
* Removes a custom processor from the manager.
|
|
24
|
+
*
|
|
25
|
+
* @public
|
|
26
|
+
* @param processor - The processor to remove.
|
|
27
|
+
*/
|
|
28
|
+
removeProcessor(processor: IProcessor): void;
|
|
29
|
+
/**
|
|
30
|
+
* Processes Markdown content into HTML.
|
|
31
|
+
*
|
|
32
|
+
* @public
|
|
33
|
+
* @param markdown - The Markdown content to process.
|
|
34
|
+
* @returns The resulting HTML string.
|
|
35
|
+
*/
|
|
36
|
+
process(markdown: string, options?: Omit<MarkedOptions, 'async'>): string;
|
|
37
|
+
/**
|
|
38
|
+
* Processes Markdown content into HTML asynchronously.
|
|
39
|
+
*
|
|
40
|
+
* @public
|
|
41
|
+
* @param markdown - The Markdown content to process.
|
|
42
|
+
* @returns A promise that resolves to the resulting HTML string.
|
|
43
|
+
*/
|
|
44
|
+
processAsync(markdown: string, options?: Omit<MarkedOptions, 'async'>): Promise<string>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=MarkdownProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownProcessor.d.ts","sourceRoot":"","sources":["../../src/Processing/MarkdownProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAK1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAKxE;;;;;GAKG;AACH,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,WAAW,CAAyB;IAM5C;;OAEG;gBACgB,UAAU,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC;IAkBjD;;;;;OAKG;IACI,YAAY,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAIhD;;;;;OAKG;IACI,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAInD;;;;;;OAMG;IACI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM;IAiBhF;;;;;;OAMG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAajG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// #region Imports
|
|
2
|
+
import { Marked } from 'marked';
|
|
3
|
+
import { BlockquoteProcessor } from './Processors/BlockquoteProcessor.js';
|
|
4
|
+
import { CodeBlockProcessor } from './Processors/CodeBlockProcessor.js';
|
|
5
|
+
import { TabProcessor } from './Processors/TabProcessor.js';
|
|
6
|
+
import { CalloutProcessor } from './Processors/CalloutProcessor.js';
|
|
7
|
+
import { SplitProcessor } from './Processors/SplitProcessor.js';
|
|
8
|
+
// #endregion
|
|
9
|
+
/**
|
|
10
|
+
* Main processor for Markdown content.
|
|
11
|
+
* Orchestrates processors and integrates them with `marked`.
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export class MarkdownProcessor {
|
|
16
|
+
// #region Fields
|
|
17
|
+
_processors = [];
|
|
18
|
+
// #endregion
|
|
19
|
+
// #region Ctor
|
|
20
|
+
/**
|
|
21
|
+
* Constructs a new MarkdownProcessor.
|
|
22
|
+
*/
|
|
23
|
+
constructor(processors) {
|
|
24
|
+
this._processors = [];
|
|
25
|
+
if (!processors?.length) {
|
|
26
|
+
this._processors.push(new BlockquoteProcessor());
|
|
27
|
+
this._processors.push(new CalloutProcessor());
|
|
28
|
+
this._processors.push(new CodeBlockProcessor());
|
|
29
|
+
this._processors.push(new TabProcessor());
|
|
30
|
+
this._processors.push(new SplitProcessor());
|
|
31
|
+
}
|
|
32
|
+
this._processors.push(...processors ?? []);
|
|
33
|
+
}
|
|
34
|
+
// #endregion
|
|
35
|
+
// #region Methods
|
|
36
|
+
/**
|
|
37
|
+
* Adds a custom processor to the manager.
|
|
38
|
+
*
|
|
39
|
+
* @public
|
|
40
|
+
* @param processor - The processor to add.
|
|
41
|
+
*/
|
|
42
|
+
addProcessor(processor) {
|
|
43
|
+
this._processors.push(processor);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Removes a custom processor from the manager.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
* @param processor - The processor to remove.
|
|
50
|
+
*/
|
|
51
|
+
removeProcessor(processor) {
|
|
52
|
+
this._processors = this._processors.filter((p) => p !== processor);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Processes Markdown content into HTML.
|
|
56
|
+
*
|
|
57
|
+
* @public
|
|
58
|
+
* @param markdown - The Markdown content to process.
|
|
59
|
+
* @returns The resulting HTML string.
|
|
60
|
+
*/
|
|
61
|
+
process(markdown, options) {
|
|
62
|
+
const extensions = this._processors.map((p) => ({
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
64
|
+
walkTokens: p.walkTokens,
|
|
65
|
+
extensions: [p.extension]
|
|
66
|
+
}));
|
|
67
|
+
const html = new Marked()
|
|
68
|
+
.use(...extensions)
|
|
69
|
+
.parse(markdown, {
|
|
70
|
+
async: false,
|
|
71
|
+
...options
|
|
72
|
+
});
|
|
73
|
+
return html;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Processes Markdown content into HTML asynchronously.
|
|
77
|
+
*
|
|
78
|
+
* @public
|
|
79
|
+
* @param markdown - The Markdown content to process.
|
|
80
|
+
* @returns A promise that resolves to the resulting HTML string.
|
|
81
|
+
*/
|
|
82
|
+
processAsync(markdown, options) {
|
|
83
|
+
const html = new Marked()
|
|
84
|
+
.use(...this._processors)
|
|
85
|
+
.parse(markdown, {
|
|
86
|
+
async: true,
|
|
87
|
+
...options
|
|
88
|
+
});
|
|
89
|
+
return html;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=MarkdownProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownProcessor.js","sourceRoot":"","sources":["../../src/Processing/MarkdownProcessor.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,MAAM,EAA4C,MAAM,QAAQ,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,aAAa;AAEb;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IAE1B,iBAAiB;IAET,WAAW,GAAsB,EAAE,CAAC;IAE5C,aAAa;IAEb,eAAe;IAEf;;OAEG;IACH,YAAmB,UAA8B;QAC7C,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QAEtB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;;OAKG;IACI,YAAY,CAAC,SAAqB;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,SAAqB;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;OAMG;IACI,OAAO,CAAC,QAAgB,EAAE,OAAsC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAkB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,6DAA6D;YAC7D,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC5B,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,IAAI,MAAM,EAAE;aACpB,GAAG,CAAC,GAAG,UAAU,CAAC;aAClB,KAAK,CAAC,QAAQ,EAAE;YACb,KAAK,EAAE,KAAK;YACZ,GAAG,OAAO;SACb,CAAC,CAAC;QAEP,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,QAAgB,EAAE,OAAsC;QACxE,MAAM,IAAI,GAAG,IAAI,MAAM,EAAE;aACpB,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;aACxB,KAAK,CAAC,QAAQ,EAAE;YACb,KAAK,EAAE,IAAI;YACX,GAAG,OAAO;SACb,CAAC,CAAC;QAEP,OAAO,IAAI,CAAC;IAChB,CAAC;CAIJ"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { IProcessor } from '../Interfaces/IProcessor.js';
|
|
2
|
+
import type { MarkedExtension, TokenizerAndRendererExtension, Tokens } from 'marked';
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for custom Markdown processors.
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class BaseProcessor implements MarkedExtension, IProcessor {
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
* @abstract
|
|
10
|
+
* @readonly
|
|
11
|
+
*/
|
|
12
|
+
abstract get extension(): TokenizerAndRendererExtension;
|
|
13
|
+
/**
|
|
14
|
+
* Override this method to provide custom hooks for processing tokens.
|
|
15
|
+
*
|
|
16
|
+
* @public
|
|
17
|
+
* @readonly
|
|
18
|
+
* @returns An object containing hooks for processing tokens.
|
|
19
|
+
*/
|
|
20
|
+
get hooks(): MarkedExtension['hooks'];
|
|
21
|
+
/**
|
|
22
|
+
* Preprocesses the Markdown content before rendering.
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
* @param markdown - The Markdown content to preprocess.
|
|
26
|
+
* @returns The preprocessed Markdown content.
|
|
27
|
+
*/
|
|
28
|
+
preprocess(markdown: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Postprocessing the HTML content after rendering.
|
|
31
|
+
*
|
|
32
|
+
* @public
|
|
33
|
+
* @param html - The HTML content to postprocess.
|
|
34
|
+
* @returns The postprocessed HTML content.
|
|
35
|
+
*/
|
|
36
|
+
postprocess(html: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Processes all tokens.
|
|
39
|
+
*
|
|
40
|
+
* @public
|
|
41
|
+
* @param tokens - The tokens to process.
|
|
42
|
+
* @returns The processed tokens.
|
|
43
|
+
*/
|
|
44
|
+
processAllTokens(tokens: Array<Tokens.Generic>): Array<Tokens.Generic>;
|
|
45
|
+
/**
|
|
46
|
+
* Override this method to process tokens.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
* @param token - The token to process.
|
|
50
|
+
*/
|
|
51
|
+
walkTokens?(_token: Tokens.Generic): void;
|
|
52
|
+
/**
|
|
53
|
+
* Minifies HTML by removing all newlines and unnecessary whitespaces.
|
|
54
|
+
*
|
|
55
|
+
* @param html - The raw HTML string to minify.
|
|
56
|
+
* @returns A minified HTML string.
|
|
57
|
+
*/
|
|
58
|
+
protected minifyHTML(html: string): string;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=BaseProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseProcessor.d.ts","sourceRoot":"","sources":["../../../../src/Processing/Processors/Abstracts/BaseProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrF;;GAEG;AACH,8BAAsB,aAAc,YAAW,eAAe,EAAE,UAAU;IAItE;;;;OAIG;IACH,aAAoB,SAAS,IAAI,6BAA6B,CAAC;IAE/D;;;;;;OAMG;IACH,IAAW,KAAK,IAAI,eAAe,CAAC,OAAO,CAAC,CAM3C;IAMD;;;;;;OAMG;IACI,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI3C;;;;;;OAMG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIxC;;;;;;OAMG;IACI,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;IAI7E;;;;;OAKG;IACI,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;IAIhD;;;;;OAKG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAM7C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// #region Imports
|
|
2
|
+
// #endregion
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for custom Markdown processors.
|
|
5
|
+
*/
|
|
6
|
+
export class BaseProcessor {
|
|
7
|
+
/**
|
|
8
|
+
* Override this method to provide custom hooks for processing tokens.
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
* @readonly
|
|
12
|
+
* @returns An object containing hooks for processing tokens.
|
|
13
|
+
*/
|
|
14
|
+
get hooks() {
|
|
15
|
+
return {
|
|
16
|
+
processAllTokens: (tokens) => this.processAllTokens(tokens),
|
|
17
|
+
preprocess: (markdown) => this.preprocess(markdown),
|
|
18
|
+
postprocess: (html) => this.postprocess(html)
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// #endregion
|
|
22
|
+
// #region Methods
|
|
23
|
+
/**
|
|
24
|
+
* Preprocesses the Markdown content before rendering.
|
|
25
|
+
*
|
|
26
|
+
* @public
|
|
27
|
+
* @param markdown - The Markdown content to preprocess.
|
|
28
|
+
* @returns The preprocessed Markdown content.
|
|
29
|
+
*/
|
|
30
|
+
preprocess(markdown) {
|
|
31
|
+
return markdown;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Postprocessing the HTML content after rendering.
|
|
35
|
+
*
|
|
36
|
+
* @public
|
|
37
|
+
* @param html - The HTML content to postprocess.
|
|
38
|
+
* @returns The postprocessed HTML content.
|
|
39
|
+
*/
|
|
40
|
+
postprocess(html) {
|
|
41
|
+
return html;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Processes all tokens.
|
|
45
|
+
*
|
|
46
|
+
* @public
|
|
47
|
+
* @param tokens - The tokens to process.
|
|
48
|
+
* @returns The processed tokens.
|
|
49
|
+
*/
|
|
50
|
+
processAllTokens(tokens) {
|
|
51
|
+
return tokens;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Override this method to process tokens.
|
|
55
|
+
*
|
|
56
|
+
* @public
|
|
57
|
+
* @param token - The token to process.
|
|
58
|
+
*/
|
|
59
|
+
walkTokens(_token) {
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Minifies HTML by removing all newlines and unnecessary whitespaces.
|
|
63
|
+
*
|
|
64
|
+
* @param html - The raw HTML string to minify.
|
|
65
|
+
* @returns A minified HTML string.
|
|
66
|
+
*/
|
|
67
|
+
minifyHTML(html) {
|
|
68
|
+
return html.replace(/\s+/g, ' ').trim();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=BaseProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseProcessor.js","sourceRoot":"","sources":["../../../../src/Processing/Processors/Abstracts/BaseProcessor.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAKlB,aAAa;AAEb;;GAEG;AACH,MAAM,OAAgB,aAAa;IAW/B;;;;;;OAMG;IACH,IAAW,KAAK;QACZ,OAAO;YACH,gBAAgB,EAAE,CAAC,MAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAClF,UAAU,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC3D,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;SACxD,CAAC;IACN,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;;;;;OAMG;IACI,UAAU,CAAC,QAAgB;QAC9B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,MAA6B;QACjD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAE,MAAsB;IAEzC,CAAC;IAED;;;;;OAKG;IACO,UAAU,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;CAIJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockquoteProcessor.Test.d.ts","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.Test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { BlockquoteProcessor } from './BlockquoteProcessor';
|
|
3
|
+
import { MarkdownProcessor } from '../MarkdownProcessor';
|
|
4
|
+
describe('BlockquoteProcessor', () => {
|
|
5
|
+
it('should render a blockquote with [!INFO] syntax', () => {
|
|
6
|
+
const markdown = '> [!INFO]\n> Highlights information that users should take into account.';
|
|
7
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
8
|
+
expect(html)
|
|
9
|
+
.toBe('<blockquote class="blockquote-info"><strong>Info:</strong>Highlights information that users should take into account.</blockquote>');
|
|
10
|
+
});
|
|
11
|
+
it('should render a blockquote with [!WARNING] syntax', () => {
|
|
12
|
+
const markdown = '> [!WARNING]\n> Critical content demanding immediate user attention.';
|
|
13
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
14
|
+
expect(html)
|
|
15
|
+
.toBe('<blockquote class="blockquote-warning"><strong>Warning:</strong>Critical content demanding immediate user attention.</blockquote>');
|
|
16
|
+
});
|
|
17
|
+
it('should render a blockquote with [!DANGER] syntax', () => {
|
|
18
|
+
const markdown = '> [!DANGER]\n> Severe warnings for users.';
|
|
19
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
20
|
+
expect(html)
|
|
21
|
+
.toBe('<blockquote class="blockquote-danger"><strong>Danger:</strong>Severe warnings for users.</blockquote>');
|
|
22
|
+
});
|
|
23
|
+
it('should render a blockquote with [!SUCCESS] syntax', () => {
|
|
24
|
+
const markdown = '> [!SUCCESS]\n> Optional information for successful actions.';
|
|
25
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
26
|
+
expect(html)
|
|
27
|
+
.toBe('<blockquote class="blockquote-success"><strong>Success:</strong>Optional information for successful actions.</blockquote>');
|
|
28
|
+
});
|
|
29
|
+
it('should render a default blockquote when no type is specified', () => {
|
|
30
|
+
const markdown = '> This is a default blockquote with no headline.';
|
|
31
|
+
const html = new MarkdownProcessor([new BlockquoteProcessor()]).process(markdown);
|
|
32
|
+
expect(html)
|
|
33
|
+
.toBe('<blockquote>This is a default blockquote with no headline.</blockquote>');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=BlockquoteProcessor.Test.js.map
|
|
@@ -0,0 +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,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,0EAA0E,CAAC;QAC5F,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAElF,MAAM,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,oIAAoI,CAAC,CAAC;IACpJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,sEAAsE,CAAC;QACxF,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAElF,MAAM,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,mIAAmI,CAAC,CAAC;IACnJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,2CAA2C,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAElF,MAAM,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,uGAAuG,CAAC,CAAC;IACvH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,8DAA8D,CAAC;QAChF,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAElF,MAAM,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,2HAA2H,CAAC,CAAC;IAC3I,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACpE,MAAM,QAAQ,GAAG,kDAAkD,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAElF,MAAM,CAAC,IAAI,CAAC;aACP,IAAI,CAAC,yEAAyE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
2
|
+
import type { Tokens, TokenizerAndRendererExtension } from 'marked';
|
|
3
|
+
/**
|
|
4
|
+
* A processor that transforms blockquotes using the `[!TYPE]` syntax into styled callouts.
|
|
5
|
+
*
|
|
6
|
+
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `default`.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```markdown
|
|
10
|
+
* > [!INFO]
|
|
11
|
+
* > This is an informational message.
|
|
12
|
+
*
|
|
13
|
+
* > [!WARNING] Pay attention!
|
|
14
|
+
* > Critical instructions follow.
|
|
15
|
+
*
|
|
16
|
+
* > Just a normal blockquote.
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare class BlockquoteProcessor extends BaseProcessor {
|
|
22
|
+
get extension(): TokenizerAndRendererExtension;
|
|
23
|
+
walkTokens(token: Tokens.Generic): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=BlockquoteProcessor.d.ts.map
|
|
@@ -0,0 +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;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAgB,6BAA6B,EAAE,MAAM,QAAQ,CAAC;AAgBlF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,IAAoB,SAAS,IAAI,6BAA6B,CAQ7D;IAEe,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;CAQ1D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { BaseProcessor } from './Abstracts/BaseProcessor.js';
|
|
2
|
+
const KNOWN_VARIANTS = new Set([
|
|
3
|
+
'primary', 'secondary', 'tertiary', 'info', 'warning', 'danger', 'error', 'success', 'highlight', 'neutral'
|
|
4
|
+
]);
|
|
5
|
+
/**
|
|
6
|
+
* A processor that transforms blockquotes using the `[!TYPE]` syntax into styled callouts.
|
|
7
|
+
*
|
|
8
|
+
* Supported types: `info`, `warning`, `danger`, `success`. Fallback: `default`.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```markdown
|
|
12
|
+
* > [!INFO]
|
|
13
|
+
* > This is an informational message.
|
|
14
|
+
*
|
|
15
|
+
* > [!WARNING] Pay attention!
|
|
16
|
+
* > Critical instructions follow.
|
|
17
|
+
*
|
|
18
|
+
* > Just a normal blockquote.
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export class BlockquoteProcessor extends BaseProcessor {
|
|
24
|
+
get extension() {
|
|
25
|
+
return {
|
|
26
|
+
name: 'blockquote',
|
|
27
|
+
level: 'block',
|
|
28
|
+
renderer(token) {
|
|
29
|
+
return BlockquoteRenderer.render(token);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
walkTokens(token) {
|
|
34
|
+
if (token.type !== 'blockquote') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
BlockquoteTokenizer.enrich(token);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
class BlockquoteTokenizer {
|
|
41
|
+
static enrich(token) {
|
|
42
|
+
const text = token.text.trim();
|
|
43
|
+
const match = (/^\[!(PRIMARY|SECONDARY|TERTIARY|INFO|WARNING|DANGER|ERROR|SUCCESS|HIGHLIGHT|NEUTRAL)\]\s*(.*)$/i).exec(text);
|
|
44
|
+
if (match) {
|
|
45
|
+
const variant = match[1].toLowerCase();
|
|
46
|
+
const content = match[2].trim();
|
|
47
|
+
token.variant = KNOWN_VARIANTS.has(variant)
|
|
48
|
+
? variant
|
|
49
|
+
: 'neutral';
|
|
50
|
+
token.content = content;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
token.variant = 'neutral';
|
|
54
|
+
token.content = text;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class BlockquoteRenderer {
|
|
59
|
+
static render(token) {
|
|
60
|
+
const variantClass = `class="blockquote ${token.variant}"`;
|
|
61
|
+
const label = token.variant !== 'neutral'
|
|
62
|
+
? `<strong>${token.variant.charAt(0).toUpperCase() + token.variant.slice(1)}:</strong> `
|
|
63
|
+
: '';
|
|
64
|
+
return `<blockquote${variantClass}>${label}${token.content}</blockquote>`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=BlockquoteProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockquoteProcessor.js","sourceRoot":"","sources":["../../../src/Processing/Processors/BlockquoteProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAK7D,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,iGAAiG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7H,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,MAAM,YAAY,GAAG,qBAAqB,KAAK,CAAC,OAAO,GAAG,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS;YACrC,CAAC,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;YACxF,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,cAAc,YAAY,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC;IAC9E,CAAC;CAEJ"}
|