@king-design/vue 3.7.0 → 3.8.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/__snapshots__/Vue Next Demos.md +399 -0
- package/components/bubble/bubble.d.ts +61 -0
- package/components/bubble/bubble.js +81 -0
- package/components/bubble/bubble.vdt.js +85 -0
- package/components/bubble/index.d.ts +1 -0
- package/components/bubble/index.js +1 -0
- package/components/bubble/index.spec.d.ts +1 -0
- package/components/bubble/index.spec.js +771 -0
- package/components/bubble/styles.d.ts +5 -0
- package/components/bubble/styles.js +53 -0
- package/components/bubble/useBubbleDisplay.d.ts +18 -0
- package/components/bubble/useBubbleDisplay.js +300 -0
- package/components/bubbleList/bubbleList.d.ts +87 -0
- package/components/bubbleList/bubbleList.js +75 -0
- package/components/bubbleList/bubbleList.vdt.js +143 -0
- package/components/bubbleList/index.d.ts +1 -0
- package/components/bubbleList/index.js +1 -0
- package/components/bubbleList/index.spec.d.ts +1 -0
- package/components/bubbleList/index.spec.js +1268 -0
- package/components/bubbleList/item.d.ts +16 -0
- package/components/bubbleList/item.js +27 -0
- package/components/bubbleList/item.vdt.js +36 -0
- package/components/bubbleList/styles.d.ts +5 -0
- package/components/bubbleList/styles.js +33 -0
- package/components/bubbleList/useBubbleList.d.ts +28 -0
- package/components/bubbleList/useBubbleList.js +455 -0
- package/components/checkbox/index.d.ts +3 -3
- package/components/fileCard/fileCard.d.ts +65 -0
- package/components/fileCard/fileCard.js +72 -0
- package/components/fileCard/fileCard.vdt.js +161 -0
- package/components/fileCard/fileCardAssets.d.ts +1 -0
- package/components/fileCard/fileCardAssets.js +54 -0
- package/components/fileCard/fileCardUtils.d.ts +14 -0
- package/components/fileCard/fileCardUtils.js +94 -0
- package/components/fileCard/index.d.ts +2 -0
- package/components/fileCard/index.js +2 -0
- package/components/fileCard/index.spec.d.ts +1 -0
- package/components/fileCard/index.spec.js +1096 -0
- package/components/fileCard/list.d.ts +29 -0
- package/components/fileCard/list.js +46 -0
- package/components/fileCard/list.vdt.js +71 -0
- package/components/fileCard/styles.d.ts +5 -0
- package/components/fileCard/styles.js +83 -0
- package/components/fileCard/useFileCard.d.ts +45 -0
- package/components/fileCard/useFileCard.js +330 -0
- package/components/fileCard/useFileCardList.d.ts +14 -0
- package/components/fileCard/useFileCardList.js +49 -0
- package/components/form/form.js +2 -1
- package/components/media/context.d.ts +6 -0
- package/components/media/context.js +2 -0
- package/components/media/group.d.ts +12 -0
- package/components/media/group.js +32 -0
- package/components/media/group.vdt.js +50 -0
- package/components/media/index.d.ts +2 -0
- package/components/media/index.js +2 -0
- package/components/media/index.spec.d.ts +1 -0
- package/components/media/index.spec.js +1691 -0
- package/components/media/media.d.ts +37 -0
- package/components/media/media.js +67 -0
- package/components/media/media.vdt.js +202 -0
- package/components/media/mediaAssets.d.ts +4 -0
- package/components/media/mediaAssets.js +9 -0
- package/components/media/mediaUtils.d.ts +6 -0
- package/components/media/mediaUtils.js +66 -0
- package/components/media/styles.d.ts +13 -0
- package/components/media/styles.js +52 -0
- package/components/media/types.d.ts +37 -0
- package/components/media/types.js +1 -0
- package/components/media/useMedia.d.ts +70 -0
- package/components/media/useMedia.js +471 -0
- package/components/media/useMediaGroup.d.ts +15 -0
- package/components/media/useMediaGroup.js +136 -0
- package/components/media/useMediaViewer.d.ts +14 -0
- package/components/media/useMediaViewer.js +129 -0
- package/components/media/viewer.d.ts +24 -0
- package/components/media/viewer.js +54 -0
- package/components/media/viewer.vdt.js +100 -0
- package/components/radio/index.d.ts +3 -3
- package/components/sender/icons.d.ts +3 -0
- package/components/sender/icons.js +17 -0
- package/components/sender/index.d.ts +1 -0
- package/components/sender/index.js +1 -0
- package/components/sender/index.spec.d.ts +1 -0
- package/components/sender/index.spec.js +1597 -0
- package/components/sender/sender.d.ts +104 -0
- package/components/sender/sender.js +111 -0
- package/components/sender/sender.vdt.js +230 -0
- package/components/sender/styles.d.ts +5 -0
- package/components/sender/styles.js +56 -0
- package/components/sender/useAutoResize.d.ts +4 -0
- package/components/sender/useAutoResize.js +99 -0
- package/components/sender/useSenderDrag.d.ts +6 -0
- package/components/sender/useSenderDrag.js +320 -0
- package/components/sender/useSenderInput.d.ts +16 -0
- package/components/sender/useSenderInput.js +101 -0
- package/components/sender/useSenderPaste.d.ts +5 -0
- package/components/sender/useSenderPaste.js +36 -0
- package/components/sender/useSenderUpload.d.ts +11 -0
- package/components/sender/useSenderUpload.js +395 -0
- package/components/skeleton/skeleton.d.ts +2 -1
- package/components/skeleton/skeleton.js +1 -1
- package/components/think/index.d.ts +1 -0
- package/components/think/index.js +1 -0
- package/components/think/index.spec.d.ts +1 -0
- package/components/think/index.spec.js +345 -0
- package/components/think/index.vdt.js +82 -0
- package/components/think/styles.d.ts +5 -0
- package/components/think/styles.js +25 -0
- package/components/think/think.d.ts +28 -0
- package/components/think/think.js +48 -0
- package/components/think/useThinkExpand.d.ts +10 -0
- package/components/think/useThinkExpand.js +56 -0
- package/components/types.d.ts +4 -2
- package/components/upload/ajaxUploader.d.ts +1 -0
- package/components/upload/ajaxUploader.js +6 -0
- package/components/xmarkdown/index.d.ts +2 -0
- package/components/xmarkdown/index.js +1 -0
- package/components/xmarkdown/index.spec.d.ts +1 -0
- package/components/xmarkdown/index.spec.js +1666 -0
- package/components/xmarkdown/markdown/codeBlockRenderer.d.ts +8 -0
- package/components/xmarkdown/markdown/codeBlockRenderer.js +52 -0
- package/components/xmarkdown/markdown/codeblock.d.ts +8 -0
- package/components/xmarkdown/markdown/codeblock.js +74 -0
- package/components/xmarkdown/markdown/highlight.d.ts +17 -0
- package/components/xmarkdown/markdown/highlight.js +83 -0
- package/components/xmarkdown/markdown/index.d.ts +14 -0
- package/components/xmarkdown/markdown/index.js +14 -0
- package/components/xmarkdown/markdown/mermaid.d.ts +8 -0
- package/components/xmarkdown/markdown/mermaid.js +104 -0
- package/components/xmarkdown/markdown/renderTree.d.ts +54 -0
- package/components/xmarkdown/markdown/renderTree.js +386 -0
- package/components/xmarkdown/markdown/renderer.d.ts +18 -0
- package/components/xmarkdown/markdown/renderer.js +461 -0
- package/components/xmarkdown/markdown/streaming.d.ts +24 -0
- package/components/xmarkdown/markdown/streaming.js +513 -0
- package/components/xmarkdown/markdown/types.d.ts +124 -0
- package/components/xmarkdown/markdown/types.js +6 -0
- package/components/xmarkdown/markdown/utils.d.ts +7 -0
- package/components/xmarkdown/markdown/utils.js +9 -0
- package/components/xmarkdown/markdown.d.ts +1 -0
- package/components/xmarkdown/markdown.js +1 -0
- package/components/xmarkdown/styles.d.ts +5 -0
- package/components/xmarkdown/styles.js +50 -0
- package/components/xmarkdown/useMermaid.d.ts +27 -0
- package/components/xmarkdown/useMermaid.js +745 -0
- package/components/xmarkdown/useXMarkdownContent.d.ts +14 -0
- package/components/xmarkdown/useXMarkdownContent.js +218 -0
- package/components/xmarkdown/useXMarkdownDisplay.d.ts +26 -0
- package/components/xmarkdown/useXMarkdownDisplay.js +569 -0
- package/components/xmarkdown/xmarkdown.d.ts +61 -0
- package/components/xmarkdown/xmarkdown.js +109 -0
- package/components/xmarkdown/xmarkdown.vdt.js +43 -0
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/i18n/en-US.js +29 -1
- package/dist/i18n/en-US.js.map +1 -1
- package/dist/i18n/en-US.min.js +1 -1
- package/dist/index.js +100506 -37457
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1569 -1
- package/dist/kpc.css +4 -0
- package/dist/ksyun.css +4 -0
- package/i18n/en-US.d.ts +27 -0
- package/i18n/en-US.js +29 -1
- package/index.d.ts +9 -2
- package/index.js +9 -2
- package/package.json +8 -2
- package/styles/global.js +12 -6
- package/yarn-error.log +0 -1012
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码块自定义渲染
|
|
3
|
+
*/
|
|
4
|
+
import type { XMarkdownRenderOptions, XMarkdownRenderedBlockType } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* 使用自定义代码块渲染器
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderCustomCodeBlock(source: string, info: string, blockType: XMarkdownRenderedBlockType, options: XMarkdownRenderOptions): import("./renderTree").XMarkdownRenderTreeIslandNode | null;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
|
|
2
|
+
/**
|
|
3
|
+
* 代码块自定义渲染
|
|
4
|
+
*/
|
|
5
|
+
import { normalizeLanguage } from './highlight';
|
|
6
|
+
import { createIslandNode } from './renderTree';
|
|
7
|
+
/**
|
|
8
|
+
* 使用自定义代码块渲染器
|
|
9
|
+
*/
|
|
10
|
+
export function renderCustomCodeBlock(source, info, blockType, options) {
|
|
11
|
+
var context = createCodeBlockRenderContext(source, info, blockType, options);
|
|
12
|
+
var renderer = resolveCodeBlockRenderer(context, options.codeBlockRenderers);
|
|
13
|
+
if (!renderer) return null;
|
|
14
|
+
var rendered = renderer(context);
|
|
15
|
+
if (rendered === undefined) return null;
|
|
16
|
+
return createIslandNode(rendered, true);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 创建代码块渲染上下文
|
|
20
|
+
*/
|
|
21
|
+
function createCodeBlockRenderContext(source, info, blockType, options) {
|
|
22
|
+
var language = extractCodeBlockLanguage(info);
|
|
23
|
+
return {
|
|
24
|
+
source: source,
|
|
25
|
+
info: info,
|
|
26
|
+
language: language,
|
|
27
|
+
normalizedLanguage: normalizeLanguage(language),
|
|
28
|
+
blockType: blockType,
|
|
29
|
+
prefixCls: options.prefixCls || 'k',
|
|
30
|
+
streaming: !!options.streaming,
|
|
31
|
+
typing: !!options.typing
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 按 fenced code 语言匹配自定义渲染器
|
|
36
|
+
*/
|
|
37
|
+
function resolveCodeBlockRenderer(context, renderers) {
|
|
38
|
+
if (!renderers) return;
|
|
39
|
+
if (context.language && renderers[context.language]) {
|
|
40
|
+
return renderers[context.language];
|
|
41
|
+
}
|
|
42
|
+
if (context.normalizedLanguage && renderers[context.normalizedLanguage]) {
|
|
43
|
+
return renderers[context.normalizedLanguage];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 提取 fenced code 的语言标记
|
|
48
|
+
*/
|
|
49
|
+
function extractCodeBlockLanguage(info) {
|
|
50
|
+
var _context;
|
|
51
|
+
return info ? _trimInstanceProperty(_context = info.split(/\s+/, 1)[0]).call(_context).toLowerCase() : '';
|
|
52
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码块渲染
|
|
3
|
+
*/
|
|
4
|
+
import type { XMarkdownRenderOptions } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* 渲染代码块
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderCodeBlock(source: string, info: string, options: XMarkdownRenderOptions, env?: any): import("./renderTree").XMarkdownRenderTreeElementNode | import("./renderTree").XMarkdownRenderTreeIslandNode;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
|
|
2
|
+
/**
|
|
3
|
+
* 代码块渲染
|
|
4
|
+
*/
|
|
5
|
+
import { _$ } from '../../../i18n';
|
|
6
|
+
import { highlightCode, normalizeLanguage } from './highlight';
|
|
7
|
+
import { renderCustomCodeBlock } from './codeBlockRenderer';
|
|
8
|
+
import { createElementNode, createKeyGenerator, parseHtmlFragment } from './renderTree';
|
|
9
|
+
var COPY_LABEL = _$('复制代码');
|
|
10
|
+
/**
|
|
11
|
+
* 渲染代码块
|
|
12
|
+
*/
|
|
13
|
+
export function renderCodeBlock(source, info, options, env) {
|
|
14
|
+
var _context;
|
|
15
|
+
var customBlock = renderCustomCodeBlock(source, info, 'code', options);
|
|
16
|
+
if (customBlock) return customBlock;
|
|
17
|
+
var rawLanguage = info ? _trimInstanceProperty(_context = info.split(/\s+/, 1)[0]).call(_context).toLowerCase() : '';
|
|
18
|
+
var normalizedLanguage = normalizeLanguage(rawLanguage);
|
|
19
|
+
var label = rawLanguage || _$('纯文本');
|
|
20
|
+
var shouldShowToolbar = options.showCodeHeader !== false;
|
|
21
|
+
var prefixCls = options.prefixCls || 'k';
|
|
22
|
+
var blockId = registerRenderedBlock(env, 'code', source, label);
|
|
23
|
+
var nextKey = createKeyGenerator("xmarkdown-code-" + (blockId || 'tail'));
|
|
24
|
+
var bodyChildren = parseHtmlFragment(highlightCode(source, normalizedLanguage), nextKey);
|
|
25
|
+
var children = shouldShowToolbar ? [createElementNode('div', {
|
|
26
|
+
className: prefixCls + "-xmarkdown-code-toolbar"
|
|
27
|
+
}, [createElementNode('span', {
|
|
28
|
+
className: prefixCls + "-xmarkdown-code-language"
|
|
29
|
+
}, [], nextKey('code-language')), createElementNode('div', {
|
|
30
|
+
className: prefixCls + "-xmarkdown-code-actions"
|
|
31
|
+
}, [createElementNode('button', {
|
|
32
|
+
className: prefixCls + "-xmarkdown-toolbar-icon-button",
|
|
33
|
+
type: 'button',
|
|
34
|
+
title: COPY_LABEL,
|
|
35
|
+
'aria-label': COPY_LABEL,
|
|
36
|
+
'data-kpc-action': 'copy-code',
|
|
37
|
+
'data-kpc-feedback-mode': 'icon',
|
|
38
|
+
'data-kpc-default-title': COPY_LABEL,
|
|
39
|
+
'data-kpc-default-icon': prefixCls + "-icon-clone",
|
|
40
|
+
'data-kpc-feedback-icon': prefixCls + "-icon-check-outline"
|
|
41
|
+
}, [createElementNode('i', {
|
|
42
|
+
className: prefixCls + "-xmarkdown-toolbar-icon " + prefixCls + "-icon " + prefixCls + "-icon-clone",
|
|
43
|
+
'data-kpc-icon': 'true'
|
|
44
|
+
}, [], nextKey('copy-icon'))], nextKey('copy-button'))], nextKey('code-actions'))], nextKey('code-toolbar')), createElementNode('div', {
|
|
45
|
+
className: prefixCls + "-xmarkdown-code-body"
|
|
46
|
+
}, bodyChildren, nextKey('code-body'))] : bodyChildren;
|
|
47
|
+
if (shouldShowToolbar) {
|
|
48
|
+
children[0].children[0].children.push(createTextNode(label));
|
|
49
|
+
}
|
|
50
|
+
return createElementNode('div', {
|
|
51
|
+
className: prefixCls + "-xmarkdown-code-block",
|
|
52
|
+
'data-kpc-code-block': 'true',
|
|
53
|
+
'data-kpc-language': label,
|
|
54
|
+
'data-kpc-block-id': blockId
|
|
55
|
+
}, children, nextKey('code-block'));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 注册渲染后的代码块信息
|
|
59
|
+
*/
|
|
60
|
+
function registerRenderedBlock(env, type, source, language) {
|
|
61
|
+
if (env && typeof env.registerBlock === 'function') {
|
|
62
|
+
return env.registerBlock(type, source, language);
|
|
63
|
+
}
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 创建文本节点
|
|
68
|
+
*/
|
|
69
|
+
function createTextNode(content) {
|
|
70
|
+
return {
|
|
71
|
+
type: 'text',
|
|
72
|
+
content: content
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码高亮
|
|
3
|
+
*
|
|
4
|
+
* 基于 highlight.js 实现代码块语法高亮。
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 注册支持的语法高亮语言
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerHighlightLanguages(): void;
|
|
10
|
+
/**
|
|
11
|
+
* 标准化语言名称(处理别名)
|
|
12
|
+
*/
|
|
13
|
+
export declare function normalizeLanguage(info: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* 代码高亮
|
|
16
|
+
*/
|
|
17
|
+
export declare function highlightCode(code: string, language: string): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
|
|
2
|
+
/**
|
|
3
|
+
* 代码高亮
|
|
4
|
+
*
|
|
5
|
+
* 基于 highlight.js 实现代码块语法高亮。
|
|
6
|
+
*/
|
|
7
|
+
import hljs from 'highlight.js/lib/core';
|
|
8
|
+
import bash from 'highlight.js/lib/languages/bash';
|
|
9
|
+
import css from 'highlight.js/lib/languages/css';
|
|
10
|
+
import diff from 'highlight.js/lib/languages/diff';
|
|
11
|
+
import go from 'highlight.js/lib/languages/go';
|
|
12
|
+
import java from 'highlight.js/lib/languages/java';
|
|
13
|
+
import javascript from 'highlight.js/lib/languages/javascript';
|
|
14
|
+
import json from 'highlight.js/lib/languages/json';
|
|
15
|
+
import markdown from 'highlight.js/lib/languages/markdown';
|
|
16
|
+
import python from 'highlight.js/lib/languages/python';
|
|
17
|
+
import sql from 'highlight.js/lib/languages/sql';
|
|
18
|
+
import typescript from 'highlight.js/lib/languages/typescript';
|
|
19
|
+
import xml from 'highlight.js/lib/languages/xml';
|
|
20
|
+
import yaml from 'highlight.js/lib/languages/yaml';
|
|
21
|
+
/** 语言别名映射 */
|
|
22
|
+
var LANGUAGE_ALIAS_MAP = {
|
|
23
|
+
html: 'xml',
|
|
24
|
+
js: 'javascript',
|
|
25
|
+
md: 'markdown',
|
|
26
|
+
py: 'python',
|
|
27
|
+
shell: 'bash',
|
|
28
|
+
sh: 'bash',
|
|
29
|
+
ts: 'typescript',
|
|
30
|
+
yml: 'yaml',
|
|
31
|
+
zsh: 'bash'
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 注册支持的语法高亮语言
|
|
35
|
+
*/
|
|
36
|
+
export function registerHighlightLanguages() {
|
|
37
|
+
hljs.registerLanguage('bash', bash);
|
|
38
|
+
hljs.registerLanguage('css', css);
|
|
39
|
+
hljs.registerLanguage('diff', diff);
|
|
40
|
+
hljs.registerLanguage('go', go);
|
|
41
|
+
hljs.registerLanguage('java', java);
|
|
42
|
+
hljs.registerLanguage('javascript', javascript);
|
|
43
|
+
hljs.registerLanguage('json', json);
|
|
44
|
+
hljs.registerLanguage('markdown', markdown);
|
|
45
|
+
hljs.registerLanguage('python', python);
|
|
46
|
+
hljs.registerLanguage('sql', sql);
|
|
47
|
+
hljs.registerLanguage('typescript', typescript);
|
|
48
|
+
hljs.registerLanguage('xml', xml);
|
|
49
|
+
hljs.registerLanguage('yaml', yaml);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 标准化语言名称(处理别名)
|
|
53
|
+
*/
|
|
54
|
+
export function normalizeLanguage(info) {
|
|
55
|
+
var _context;
|
|
56
|
+
var language = info ? _trimInstanceProperty(_context = info.split(/\s+/, 1)[0]).call(_context).toLowerCase() : '';
|
|
57
|
+
return LANGUAGE_ALIAS_MAP[language] || language;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 代码高亮
|
|
61
|
+
*/
|
|
62
|
+
export function highlightCode(code, language) {
|
|
63
|
+
var normalizedLanguage = language && hljs.getLanguage(language) ? language : '';
|
|
64
|
+
try {
|
|
65
|
+
if (!normalizedLanguage) {
|
|
66
|
+
return "<pre class=\"hljs\"><code class=\"hljs\">" + escapeHtml(code) + "</code></pre>";
|
|
67
|
+
}
|
|
68
|
+
var highlighted = hljs.highlight(code, {
|
|
69
|
+
language: normalizedLanguage,
|
|
70
|
+
ignoreIllegals: true
|
|
71
|
+
});
|
|
72
|
+
var languageClass = highlighted.language ? " language-" + highlighted.language : '';
|
|
73
|
+
return "<pre class=\"hljs\"><code class=\"hljs" + languageClass + "\">" + highlighted.value + "</code></pre>";
|
|
74
|
+
} catch (e) {
|
|
75
|
+
return "<pre class=\"hljs\"><code class=\"hljs\">" + escapeHtml(code) + "</code></pre>";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 转义 HTML 特殊字符
|
|
80
|
+
*/
|
|
81
|
+
function escapeHtml(text) {
|
|
82
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
83
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 渲染模块
|
|
3
|
+
*
|
|
4
|
+
* 提供可配置的 Markdown 渲染功能,支持:
|
|
5
|
+
* - 代码语法高亮
|
|
6
|
+
* - 数学公式(KaTeX)
|
|
7
|
+
* - Mermaid 图表
|
|
8
|
+
* - 流式渲染优化
|
|
9
|
+
* - 自定义标签渲染器
|
|
10
|
+
*/
|
|
11
|
+
export type { XMarkdownFormulaDelimiter, XMarkdownRenderOptions, XMarkdownRenderResult, XMarkdownFormulaRuntime, XMarkdownPlugin, XMarkdownRenderTreeTransform, XMarkdownRenderTreeTransformContext, XMarkdownTagAttrs, XMarkdownTagAttrsGetter, XMarkdownTagRenderers, XMarkdownTagAttrsContext, XMarkdownTagRenderContext, XMarkdownCodeBlockRenderContext, XMarkdownCodeBlockRenderer, XMarkdownCodeBlockRenderers, XMarkdownRenderedIsland, XMarkdownRenderedBlock, XMarkdownRenderedBlockType, XMarkdownRenderedStableBlock, XMarkdownRegisterRenderedBlock, XMarkdownSourceBlock, StreamingMarkdownSegments, OpenFenceInfo, XMarkdownStreamingTailCache, } from './types';
|
|
12
|
+
export type { XMarkdownRenderTreeNode, XMarkdownRenderTreeElementNode, XMarkdownRenderTreeIslandNode, XMarkdownRenderTreeTextNode, } from './renderTree';
|
|
13
|
+
export { createMarkdownRenderer } from './renderer';
|
|
14
|
+
export { containsFormulaSyntax, createStreamingTailCache, splitMarkdownForStreaming, renderMarkdownTail, escapeMarkdownHtml, } from './streaming';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 渲染模块
|
|
3
|
+
*
|
|
4
|
+
* 提供可配置的 Markdown 渲染功能,支持:
|
|
5
|
+
* - 代码语法高亮
|
|
6
|
+
* - 数学公式(KaTeX)
|
|
7
|
+
* - Mermaid 图表
|
|
8
|
+
* - 流式渲染优化
|
|
9
|
+
* - 自定义标签渲染器
|
|
10
|
+
*/
|
|
11
|
+
// 渲染器
|
|
12
|
+
export { createMarkdownRenderer } from './renderer';
|
|
13
|
+
// 流式渲染
|
|
14
|
+
export { containsFormulaSyntax, createStreamingTailCache, splitMarkdownForStreaming, renderMarkdownTail, escapeMarkdownHtml } from './streaming';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid 图表渲染
|
|
3
|
+
*/
|
|
4
|
+
import type { XMarkdownRenderOptions } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* 渲染 Mermaid 代码块
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderMermaidBlock(source: string, info: string, options: XMarkdownRenderOptions, env?: any): import("./renderTree").XMarkdownRenderTreeElementNode | import("./renderTree").XMarkdownRenderTreeIslandNode;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid 图表渲染
|
|
3
|
+
*/
|
|
4
|
+
import { _$ } from '../../../i18n';
|
|
5
|
+
import { normalizeLanguage } from './highlight';
|
|
6
|
+
import { renderCustomCodeBlock } from './codeBlockRenderer';
|
|
7
|
+
import { createElementNode, createKeyGenerator, createTextNode } from './renderTree';
|
|
8
|
+
var COPY_SOURCE_LABEL = _$('复制源码');
|
|
9
|
+
var VIEW_SOURCE_LABEL = _$('源码');
|
|
10
|
+
var VIEW_DIAGRAM_LABEL = _$('图表');
|
|
11
|
+
var ZOOM_OUT_LABEL = _$('缩小');
|
|
12
|
+
var ZOOM_IN_LABEL = _$('放大');
|
|
13
|
+
var RESET_ZOOM_LABEL = _$('重置缩放');
|
|
14
|
+
var DOWNLOAD_IMAGE_LABEL = _$('下载图片');
|
|
15
|
+
var MERMAID_CANVAS_LABEL = _$('Mermaid 图表');
|
|
16
|
+
/**
|
|
17
|
+
* 渲染 Mermaid 代码块
|
|
18
|
+
*/
|
|
19
|
+
export function renderMermaidBlock(source, info, options, env) {
|
|
20
|
+
var customBlock = renderCustomCodeBlock(source, info, 'mermaid', options);
|
|
21
|
+
if (customBlock) return customBlock;
|
|
22
|
+
var label = normalizeLanguage(info) || 'mermaid';
|
|
23
|
+
var prefixCls = options.prefixCls || 'k';
|
|
24
|
+
var blockId = registerRenderedBlock(env, 'mermaid', source, label);
|
|
25
|
+
var nextKey = createKeyGenerator("xmarkdown-mermaid-" + (blockId || 'tail'));
|
|
26
|
+
return createElementNode('div', {
|
|
27
|
+
className: prefixCls + "-xmarkdown-mermaid-block",
|
|
28
|
+
'data-kpc-mermaid': 'true',
|
|
29
|
+
'data-kpc-render-state': 'idle',
|
|
30
|
+
'data-kpc-view': 'diagram',
|
|
31
|
+
'data-kpc-language': label,
|
|
32
|
+
'data-kpc-block-id': blockId,
|
|
33
|
+
'data-kpc-scale': '1'
|
|
34
|
+
}, [createElementNode('div', {
|
|
35
|
+
className: prefixCls + "-xmarkdown-code-toolbar"
|
|
36
|
+
}, [createElementNode('span', {
|
|
37
|
+
className: prefixCls + "-xmarkdown-code-language"
|
|
38
|
+
}, [createTextNode('Mermaid')], nextKey('language')), createElementNode('div', {
|
|
39
|
+
className: prefixCls + "-xmarkdown-code-actions"
|
|
40
|
+
}, [createElementNode('div', {
|
|
41
|
+
className: prefixCls + "-xmarkdown-toolbar-toggle-group"
|
|
42
|
+
}, [createToggleButton(prefixCls, 'set-mermaid-view-diagram', VIEW_DIAGRAM_LABEL, true, nextKey('toggle-diagram')), createToggleButton(prefixCls, 'set-mermaid-view-source', VIEW_SOURCE_LABEL, false, nextKey('toggle-source'))], nextKey('toggle-group')), createElementNode('div', {
|
|
43
|
+
className: prefixCls + "-xmarkdown-toolbar-action-group"
|
|
44
|
+
}, [createIconButton(prefixCls, 'zoom-mermaid-out', ZOOM_OUT_LABEL, 'zoom-out', undefined, nextKey('zoom-out')), createIconButton(prefixCls, 'reset-mermaid-zoom', RESET_ZOOM_LABEL, 'refresh', undefined, nextKey('reset')), createIconButton(prefixCls, 'zoom-mermaid-in', ZOOM_IN_LABEL, 'zoom-in', undefined, nextKey('zoom-in')), createIconButton(prefixCls, 'download-mermaid', DOWNLOAD_IMAGE_LABEL, 'download', 'check-outline', nextKey('download')), createIconButton(prefixCls, 'copy-mermaid', COPY_SOURCE_LABEL, 'clone', 'check-outline', nextKey('copy'))], nextKey('action-group'))], nextKey('actions'))], nextKey('toolbar')), createElementNode('div', {
|
|
45
|
+
className: prefixCls + "-xmarkdown-mermaid-body"
|
|
46
|
+
}, [createElementNode('div', {
|
|
47
|
+
className: prefixCls + "-xmarkdown-mermaid-canvas",
|
|
48
|
+
'data-kpc-mermaid-canvas': 'true'
|
|
49
|
+
}, [createElementNode('div', {
|
|
50
|
+
className: prefixCls + "-xmarkdown-mermaid-viewport",
|
|
51
|
+
'data-kpc-mermaid-viewport': 'true',
|
|
52
|
+
title: MERMAID_CANVAS_LABEL
|
|
53
|
+
}, [createElementNode('div', {
|
|
54
|
+
className: prefixCls + "-xmarkdown-mermaid-stage",
|
|
55
|
+
'data-kpc-mermaid-stage': 'true'
|
|
56
|
+
}, [createTextNode(_$('Mermaid 渲染中...'))], nextKey('stage'))], nextKey('viewport'))], nextKey('canvas')), createElementNode('pre', {
|
|
57
|
+
className: prefixCls + "-xmarkdown-mermaid-source"
|
|
58
|
+
}, [createElementNode('code', {
|
|
59
|
+
className: 'hljs language-mermaid'
|
|
60
|
+
}, [createTextNode(source)], nextKey('source-code'))], nextKey('source'))], nextKey('body'))], nextKey('block'));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 创建视图切换按钮
|
|
64
|
+
*/
|
|
65
|
+
function createToggleButton(prefixCls, action, label, selected, key) {
|
|
66
|
+
return createElementNode('button', {
|
|
67
|
+
className: prefixCls + "-xmarkdown-toolbar-toggle",
|
|
68
|
+
type: 'button',
|
|
69
|
+
'aria-label': label,
|
|
70
|
+
'aria-pressed': String(selected),
|
|
71
|
+
'data-kpc-action': action,
|
|
72
|
+
'data-kpc-selected': String(selected)
|
|
73
|
+
}, [createTextNode(label)], key);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 创建工具栏图标按钮
|
|
77
|
+
*/
|
|
78
|
+
function createIconButton(prefixCls, action, label, icon, feedbackIcon, key) {
|
|
79
|
+
var defaultIconClass = prefixCls + "-icon-" + icon;
|
|
80
|
+
var feedbackIconClass = feedbackIcon ? prefixCls + "-icon-" + feedbackIcon : defaultIconClass;
|
|
81
|
+
return createElementNode('button', {
|
|
82
|
+
className: prefixCls + "-xmarkdown-toolbar-icon-button",
|
|
83
|
+
type: 'button',
|
|
84
|
+
title: label,
|
|
85
|
+
'aria-label': label,
|
|
86
|
+
'data-kpc-action': action,
|
|
87
|
+
'data-kpc-feedback-mode': 'icon',
|
|
88
|
+
'data-kpc-default-title': label,
|
|
89
|
+
'data-kpc-default-icon': defaultIconClass,
|
|
90
|
+
'data-kpc-feedback-icon': feedbackIconClass
|
|
91
|
+
}, [createElementNode('i', {
|
|
92
|
+
className: prefixCls + "-xmarkdown-toolbar-icon " + prefixCls + "-icon " + defaultIconClass,
|
|
93
|
+
'data-kpc-icon': 'true'
|
|
94
|
+
}, [], key + "-icon")], key);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 注册渲染后的 Mermaid 块信息
|
|
98
|
+
*/
|
|
99
|
+
function registerRenderedBlock(env, type, source, language) {
|
|
100
|
+
if (env && typeof env.registerBlock === 'function') {
|
|
101
|
+
return env.registerBlock(type, source, language);
|
|
102
|
+
}
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { XMarkdownRenderOptions } from './types';
|
|
2
|
+
export interface XMarkdownRenderTreeTextNode {
|
|
3
|
+
type: 'text';
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface XMarkdownRenderTreeElementNode {
|
|
7
|
+
type: 'element';
|
|
8
|
+
tag: string;
|
|
9
|
+
attrs: Record<string, any>;
|
|
10
|
+
children: XMarkdownRenderTreeNode[];
|
|
11
|
+
key?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface XMarkdownRenderTreeIslandNode {
|
|
14
|
+
type: 'island';
|
|
15
|
+
value: any;
|
|
16
|
+
block: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type XMarkdownRenderTreeNode = XMarkdownRenderTreeTextNode | XMarkdownRenderTreeElementNode | XMarkdownRenderTreeIslandNode;
|
|
19
|
+
/**
|
|
20
|
+
* 创建节点 key 生成器
|
|
21
|
+
*/
|
|
22
|
+
export declare function createKeyGenerator(prefix?: string): (scope?: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* 创建文本节点
|
|
25
|
+
*/
|
|
26
|
+
export declare function createTextNode(content: string): XMarkdownRenderTreeTextNode;
|
|
27
|
+
/**
|
|
28
|
+
* 创建元素节点
|
|
29
|
+
*/
|
|
30
|
+
export declare function createElementNode(tag: string, attrs?: Record<string, any>, children?: XMarkdownRenderTreeNode[], key?: string): XMarkdownRenderTreeElementNode;
|
|
31
|
+
/**
|
|
32
|
+
* 创建自定义渲染节点
|
|
33
|
+
*/
|
|
34
|
+
export declare function createIslandNode(value: any, block?: boolean): XMarkdownRenderTreeIslandNode;
|
|
35
|
+
/**
|
|
36
|
+
* 清洗并解析 HTML 片段
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseSanitizedHtmlFragment(html: string, options: XMarkdownRenderOptions, nextKey: (scope?: string) => string): XMarkdownRenderTreeNode[];
|
|
39
|
+
/**
|
|
40
|
+
* 解析 HTML 片段为渲染树节点
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseHtmlFragment(html: string, nextKey: (scope?: string) => string): XMarkdownRenderTreeNode[];
|
|
43
|
+
/**
|
|
44
|
+
* 将渲染树节点转换为 VNode
|
|
45
|
+
*/
|
|
46
|
+
export declare function renderTreeNodes(nodes: XMarkdownRenderTreeNode[], options: XMarkdownRenderOptions): any[];
|
|
47
|
+
/**
|
|
48
|
+
* 序列化渲染树节点
|
|
49
|
+
*/
|
|
50
|
+
export declare function serializeRenderTreeNodes(nodes: XMarkdownRenderTreeNode[]): string;
|
|
51
|
+
/**
|
|
52
|
+
* 获取渲染树的纯文本内容
|
|
53
|
+
*/
|
|
54
|
+
export declare function getTextContent(nodes: XMarkdownRenderTreeNode[]): string;
|