@next-bricks/markdown 1.15.1 → 1.15.2
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/dist/chunks/2587.6b482a20.js.map +1 -1
- package/dist/chunks/eo-markdown-display.2f79ccbd.js.map +1 -1
- package/dist/chunks/eo-markdown-editor.308379bd.js.map +1 -1
- package/dist/examples.json +2 -2
- package/dist/manifest.json +7 -4
- package/dist-types/markdown-display/index.d.ts +3 -0
- package/dist-types/markdown-editor/index.d.ts +7 -0
- package/docs/eo-markdown-display.md +42 -3
- package/docs/eo-markdown-display.react.md +87 -0
- package/docs/eo-markdown-editor.md +41 -2
- package/docs/eo-markdown-editor.react.md +97 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/2587.6b482a20.js","mappings":"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","sources":["webpack:///./src/markdown-display/host-context.css","webpack:///./src/markdown-display/styles.shadow.css","webpack:///./src/markdown-editor/index.tsx","webpack:///../../src/index.ts","webpack:///../../src/utils.ts","webpack:///../../src/rehypeMermaid.ts","webpack:///../../src/MarkdownComponent.tsx","webpack:///./src/markdown-display/host-context.css?6555","webpack:///./src/markdown-display/index.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--eo-markdown-display-code-color:#b30056;--eo-markdown-display-code-background:#ffe6ec;--eo-markdown-display-blockquote-border-color:#bcc0c5}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--eo-markdown-display-code-color:#f3679a;--eo-markdown-display-code-background:var(--color-fill-bg-base-1)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block}:host([hidden]){display:none}:not(pre) > code{color:var(--eo-markdown-display-code-color);background:var(--eo-markdown-display-code-background);margin:0 2px;padding:1px 6px;white-space:nowrap;border-radius:3px}blockquote{border-left:6px solid var(--eo-markdown-display-blockquote-border-color);padding:0 1em}:not(blockquote) > blockquote{margin-left:0;margin-right:0}a{color:var(--antd-btn-link-color);-webkit-text-decoration:none;text-decoration:none}a:hover{color:var(--antd-btn-link-hover-color)}.external-link-icon{margin-left:3px;color:var(--text-color-disabled)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import React, { FC, useEffect, useMemo, useState } from \"react\";\nimport { createDecorators, type EventEmitter } from \"@next-core/element\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport \"@next-core/theme\";\nimport styleText from \"./markdown-editor.shadow.css\";\nimport { ObjectStoreApi_putObject } from \"@next-api-sdk/object-store-sdk\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { CmdKey } from \"@milkdown/core\";\nimport {\n defaultValueCtx,\n Editor,\n editorViewOptionsCtx,\n rootCtx,\n} from \"@milkdown/core\";\nimport { Milkdown, MilkdownProvider, useEditor } from \"@milkdown/react\";\nimport {\n commonmark,\n toggleStrongCommand,\n toggleEmphasisCommand,\n wrapInBulletListCommand,\n wrapInOrderedListCommand,\n wrapInBlockquoteCommand,\n codeBlockSchema,\n} from \"@milkdown/preset-commonmark\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { nord } from \"@milkdown/theme-nord\";\nimport { history, redoCommand, undoCommand } from \"@milkdown/plugin-history\";\nimport { upload, uploadConfig, Uploader } from \"@milkdown/plugin-upload\";\nimport { callCommand, $view, replaceAll } from \"@milkdown/utils\";\nimport type { Node } from \"@milkdown/prose/model\";\nimport { listener, listenerCtx } from \"@milkdown/plugin-listener\";\nimport {\n gfm,\n toggleStrikethroughCommand,\n insertTableCommand,\n} from \"@milkdown/preset-gfm\";\nimport { indent } from \"@milkdown/plugin-indent\";\nimport { Ctx, MilkdownPlugin } from \"@milkdown/ctx\";\nimport { prism, prismConfig } from \"@milkdown/plugin-prism\";\nimport {\n usePluginViewFactory,\n ProsemirrorAdapterProvider,\n useWidgetViewFactory,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { refractor } from \"refractor/lib/common\";\nimport {\n tableSelectorPlugin,\n TableTooltip,\n tableTooltip,\n tableTooltipCtx,\n} from \"./components/TableWidget.js\";\nimport { CodeBlock } from \"./components/CodeBlock.js\";\nimport type { FormItem, FormItemProps } from \"@next-bricks/form/form-item\";\nimport { FormItemElementBase, pickFormItemProps } from \"@next-shared/form\";\nimport classNames from \"classnames\";\n\nconst WrappedFormItem = wrapBrick<FormItem, FormItemProps>(\"eo-form-item\");\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst MenuButton: FC<MenuButtonProps> = ({ icon, onClick, tooltip }) => {\n return (\n <div\n className=\"menu-btn-box\"\n onMouseDown={(e) => {\n onClick?.();\n e.preventDefault();\n }}\n >\n <WrappedIcon style={{ verticalAlign: \"middle\" }} {...icon} />\n {tooltip && <div className=\"menuIconTooltip\">{tooltip}</div>}\n </div>\n );\n};\n\nexport interface MenuButtonProps {\n icon: GeneralIconProps;\n onClick?: () => void;\n tooltip?: string;\n}\n\nexport interface MarkdownEditorProps extends FormItemProps {\n value?: string;\n bucketName?: string;\n containerStyle?: React.CSSProperties;\n readonly?: boolean;\n onUploadImage?: (value: ImageInfo) => void;\n onMarkdownValueChange?: (value: string) => void;\n}\n\nexport interface MarkdownEditorEventsMap {\n \"image.upload\": CustomEvent<ImageInfo>;\n \"markdown.value.change\": CustomEvent<string>;\n}\n\nexport interface MarkdownEditorEventsMapping {\n onImageUpload: \"image.upload\";\n onMarkdownValueChange: \"markdown.value.change\";\n}\n\nexport interface ImageInfo {\n name: string;\n src: string;\n}\n\nconst { defineElement, property, event } = createDecorators();\n\n@defineElement(\"eo-markdown-editor\", {\n styleTexts: [styleText],\n alias: [\"markdown.markdown-editor\"],\n})\n\n/**\n * markdown编辑器\n * @docKind brick\n * @author kehua\n * @noInheritDoc\n * @category form-input-advanced\n */\nclass MarkdownEditor extends FormItemElementBase {\n /**\n * 字段名称\n */\n @property() accessor name: string | undefined;\n\n /**\n * 标签文字\n */\n @property() accessor label: string | undefined;\n\n /**\n * 是否必填\n */\n @property({ type: Boolean })\n accessor required: boolean | undefined;\n\n /**\n * 初始值\n * @group basic\n */\n @property() accessor value: string | undefined;\n\n /**\n * 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片\n * @group advanced\n */\n @property() accessor bucketName: string | undefined;\n\n /**\n * 只读模式\n */\n @property({\n type: Boolean,\n })\n accessor readonly: boolean | undefined;\n\n /**\n * 外层容器样式\n */\n @property({\n attribute: false,\n })\n accessor containerStyle: React.CSSProperties | undefined;\n\n /**\n * 上传图片时触发的事件\n * @detail\n */\n @event({ type: \"image.upload\" })\n accessor #uploadImage!: EventEmitter<ImageInfo>;\n\n private handleUploadImage = (value: ImageInfo): void => {\n this.#uploadImage.emit(value);\n };\n\n /**\n * 编辑markdown触发的变化事件\n * @detail\n */\n @event({ type: \"markdown.value.change\" })\n accessor #markdownValueChange!: EventEmitter<string>;\n\n handleMarkdownValueChange = (value: string): void => {\n this.getFormElement()?.formStore.onChange(this.name!, value);\n this.value = value;\n this.#markdownValueChange.emit(value);\n };\n\n render() {\n return (\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownEditorComponent\n formElement={this.getFormElement()}\n name={this.name}\n label={this.label}\n required={this.required}\n curElement={this}\n bucketName={this.bucketName}\n value={this.value}\n readonly={this.readonly}\n containerStyle={this.containerStyle}\n onUploadImage={this.handleUploadImage}\n onMarkdownValueChange={this.handleMarkdownValueChange}\n />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n );\n }\n}\n\nexport { MarkdownEditor };\n\nexport function MarkdownEditorComponent(props: MarkdownEditorProps) {\n const {\n bucketName,\n containerStyle,\n value,\n formElement,\n readonly,\n onUploadImage,\n onMarkdownValueChange,\n } = props;\n\n const [isFocus, setIsFocus] = useState(false);\n\n const transformResponseToUrl = (objectName: string): string => {\n return `/next/api/gateway/object_store.object_store.GetObject/api/v1/objectStore/bucket/${props.bucketName}/object/${objectName}`;\n };\n\n const uploader: Uploader = async (files: FileList, schema: any) => {\n const images: File[] = [];\n let nodes: Node[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n if (!file) {\n continue;\n }\n\n // Only handle image\n if (!file.type.includes(\"image\")) {\n continue;\n }\n\n images.push(file);\n }\n\n // upload file\n try {\n nodes = await Promise.all(\n images.map(async (image) => {\n const response: any = await ObjectStoreApi_putObject(\n bucketName as string,\n {\n file: image,\n width: 0,\n height: 0,\n }\n );\n const src = transformResponseToUrl(response?.objectName as string);\n const alt = image.name;\n onUploadImage && onUploadImage({ name: alt, src });\n return schema.nodes.image.createAndFill({\n src,\n alt,\n }) as Node;\n })\n );\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"upload failed:\", err);\n }\n\n return nodes;\n };\n\n const pluginViewFactory = usePluginViewFactory();\n const widgetViewFactory = useWidgetViewFactory();\n const nodeViewFactory = useNodeViewFactory();\n\n const gfmPlugins: MilkdownPlugin[] = useMemo(() => {\n return readonly\n ? []\n : [\n gfm,\n tableTooltip,\n tableTooltipCtx,\n (ctx: Ctx) => async () => {\n ctx.set(tableTooltip.key, {\n view: pluginViewFactory({\n component: TableTooltip,\n }),\n });\n },\n tableSelectorPlugin(widgetViewFactory),\n ].flat();\n }, [readonly, pluginViewFactory, widgetViewFactory]);\n\n const { get } = useEditor((root: any) => {\n return Editor.make()\n .config((ctx: any) => {\n // 配置root\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => !readonly,\n }));\n // 配置默认值\n value && ctx.set(defaultValueCtx, value);\n // 配置事件监听\n ctx\n .get(listenerCtx)\n .markdownUpdated(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (ctx: any, markdown: string, prevMarkdown: string) => {\n onMarkdownValueChange && onMarkdownValueChange(markdown);\n }\n )\n .focus(() => {\n setIsFocus(true);\n })\n .blur(() => {\n setIsFocus(false);\n });\n // 配置文件上传,不传bucketName则默认把图片转为base64格式\n bucketName &&\n ctx.update(uploadConfig.key, (prev: any) => ({\n ...prev,\n uploader,\n }));\n // 支持code代码高亮\n ctx.update(prismConfig.key, (prev: any) => ({\n ...prev,\n configureRefractor: () => refractor,\n }));\n })\n .config(nord)\n .use(listener)\n .use(commonmark)\n .use(history)\n .use(gfm)\n .use(indent)\n .use(upload)\n .use(gfmPlugins)\n .use(prism)\n .use(\n readonly\n ? []\n : $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n // 当编辑器没有处在focus状态,即初始化或者通过其他构件重置值时,才允许调用replaceAll修改其值\n // 防止与用户输入动作起冲突\n if (formElement && value !== undefined && !isFocus) {\n get()?.action(replaceAll(value));\n }\n }, [get(), value]);\n\n function call<T>(command: CmdKey<T>, payload?: T) {\n return get()?.action(callCommand(command, payload));\n }\n\n const MenuBtnData: MenuButtonProps[] = [\n {\n icon: { lib: \"antd\", icon: \"undo\" },\n onClick: () => call(undoCommand.key),\n tooltip: \"撤销\",\n },\n {\n icon: { lib: \"antd\", icon: \"redo\" },\n onClick: () => call(redoCommand.key),\n tooltip: \"重做\",\n },\n {\n icon: { lib: \"antd\", icon: \"bold\" },\n onClick: () => call(toggleStrongCommand.key),\n tooltip: \"粗体\",\n },\n {\n icon: { lib: \"antd\", icon: \"italic\" },\n onClick: () => call(toggleEmphasisCommand.key),\n tooltip: \"斜体\",\n },\n {\n icon: { lib: \"antd\", icon: \"strikethrough\" },\n onClick: () => call(toggleStrikethroughCommand.key),\n tooltip: \"删除线\",\n },\n {\n icon: { lib: \"antd\", icon: \"table\" },\n onClick: () => call(insertTableCommand.key),\n tooltip: \"表格\",\n },\n {\n icon: { lib: \"antd\", icon: \"unordered-list\" },\n onClick: () => call(wrapInBulletListCommand.key),\n tooltip: \"无序列表\",\n },\n {\n icon: { lib: \"antd\", icon: \"ordered-list\" },\n onClick: () => call(wrapInOrderedListCommand.key),\n tooltip: \"有序列表\",\n },\n {\n icon: { lib: \"fa\", icon: \"quote-right\" },\n onClick: () => call(wrapInBlockquoteCommand.key),\n tooltip: \"块引用\",\n },\n ];\n\n return (\n <WrappedFormItem exportparts=\"message\" {...pickFormItemProps(props)}>\n <div\n className={classNames(\"markdown-container\", {\n readonly,\n })}\n style={containerStyle}\n >\n {!readonly && (\n <div className=\"menu-container-outter\">\n <div className=\"menu-container-inner prose\">\n {MenuBtnData.map((item) => (\n <MenuButton {...item} key={JSON.stringify(item.icon)} />\n ))}\n </div>\n </div>\n )}\n <div className=\"editor-container\">\n <Milkdown />\n </div>\n </div>\n </WrappedFormItem>\n );\n}\n","// istanbul ignore file\n\n/*\nnpx shiki-codegen \\\n --langs json,javascript,typescript,html,html-derivative,xml,css,markdown,mermaid,jsx,tsx,shellscript,python,go,sql \\\n --themes light-plus,dark-plus \\\n --engine oniguruma \\\n ./shared/shiki/src/bundle.ts\n*/\n\nimport lightPlus from \"@shikijs/themes/light-plus\";\nimport darkPlus from \"@shikijs/themes/dark-plus\";\n\n/* Generate by @shikijs/codegen */\nimport type {\n DynamicImportLanguageRegistration,\n HighlighterGeneric,\n ThemeInput,\n} from \"@shikijs/types\";\nimport {\n createSingletonShorthands,\n createdBundledHighlighter,\n} from \"@shikijs/core\";\nimport { createOnigurumaEngine } from \"@shikijs/engine-oniguruma\";\n\ntype BundledLanguage =\n | \"json\"\n | \"javascript\"\n | \"js\"\n | \"typescript\"\n | \"ts\"\n | \"html\"\n | \"html-derivative\"\n | \"xml\"\n | \"css\"\n | \"markdown\"\n | \"md\"\n | \"mermaid\"\n | \"mmd\"\n | \"jsx\"\n | \"tsx\"\n | \"shellscript\"\n | \"bash\"\n | \"sh\"\n | \"shell\"\n | \"zsh\"\n | \"python\"\n | \"py\"\n | \"go\"\n | \"sql\"\n | \"yaml\";\ntype BundledTheme = \"light-plus\" | \"dark-plus\";\ntype Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>;\n\nconst bundledLanguages = {\n json: () => import(\"@shikijs/langs/json\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n js: () => import(\"@shikijs/langs/javascript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n ts: () => import(\"@shikijs/langs/typescript\"),\n html: () => import(\"@shikijs/langs/html\"),\n \"html-derivative\": () => import(\"@shikijs/langs/html-derivative\"),\n xml: () => import(\"@shikijs/langs/xml\"),\n css: () => import(\"@shikijs/langs/css\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n md: () => import(\"@shikijs/langs/markdown\"),\n mermaid: () => import(\"@shikijs/langs/mermaid\"),\n mmd: () => import(\"@shikijs/langs/mermaid\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n shellscript: () => import(\"@shikijs/langs/shellscript\"),\n bash: () => import(\"@shikijs/langs/shellscript\"),\n sh: () => import(\"@shikijs/langs/shellscript\"),\n shell: () => import(\"@shikijs/langs/shellscript\"),\n zsh: () => import(\"@shikijs/langs/shellscript\"),\n python: () => import(\"@shikijs/langs/python\"),\n py: () => import(\"@shikijs/langs/python\"),\n go: () => import(\"@shikijs/langs/go\"),\n sql: () => import(\"@shikijs/langs/sql\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n} as Record<BundledLanguage, DynamicImportLanguageRegistration>;\n\nconst bundledThemes = {\n \"light-plus\": lightPlus,\n \"dark-plus\": darkPlus,\n} as Record<BundledTheme, ThemeInput>;\n\nconst createHighlighter = /* @__PURE__ */ createdBundledHighlighter<\n BundledLanguage,\n BundledTheme\n>({\n langs: bundledLanguages,\n themes: bundledThemes,\n engine: () => createOnigurumaEngine(import(\"shiki/wasm\")),\n});\n\nconst {\n codeToHtml,\n codeToHast,\n codeToTokensBase,\n codeToTokens,\n codeToTokensWithThemes,\n getSingletonHighlighter,\n getLastGrammarState,\n} = /* @__PURE__ */ createSingletonShorthands<BundledLanguage, BundledTheme>(\n createHighlighter,\n {\n guessEmbeddedLanguages(code, lang) {\n if (lang === \"markdown\" || lang === \"md\") {\n return [\"mermaid\"];\n }\n },\n }\n);\n\nexport {\n bundledLanguages,\n bundledThemes,\n codeToHast,\n codeToHtml,\n codeToTokens,\n codeToTokensBase,\n codeToTokensWithThemes,\n getLastGrammarState,\n getSingletonHighlighter,\n};\nexport type { BundledLanguage, BundledTheme, Highlighter };\n","import type { Element } from \"hast\";\n\nexport function getCodeLanguage(node: Element) {\n const className = (node.properties.className as string[]) || [];\n\n for (const classListItem of className) {\n if (classListItem.slice(0, 9) === \"language-\") {\n return classListItem.slice(9).toLowerCase();\n }\n }\n\n return null;\n}\n","import { visit } from \"unist-util-visit\";\nimport { toString } from \"hast-util-to-string\";\nimport type { Element } from \"hast\";\nimport type Mermaid from \"mermaid\";\nimport { fromHtmlIsomorphic } from \"hast-util-from-html-isomorphic\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nlet mermaidPromise: Promise<typeof Mermaid> | undefined;\n\nfunction loadMermaid() {\n if (mermaidPromise) {\n return mermaidPromise;\n }\n mermaidPromise = doLoadMermaid();\n return mermaidPromise;\n}\n\nasync function doLoadMermaid() {\n const mermaid = (await import(\"mermaid\")).default;\n mermaid.initialize({\n startOnLoad: false,\n theme: \"base\",\n themeVariables: {\n fontSize: \"14px\",\n lineColor: \"#979797\",\n primaryColor: \"#DCD2F3\",\n primaryBorderColor: \"#0000001A\",\n },\n });\n return mermaid;\n}\n\nlet count = 0;\n\nconst parser = new DOMParser();\nconst serializer = new XMLSerializer();\n\n// Reference https://github.com/remcohaszing/rehype-mermaid\nexport function rehypeMermaid() {\n return async (tree: Element) => {\n const promises: Promise<void>[] = [];\n\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n\n if (lang !== \"mermaid\") {\n return;\n }\n\n promises.push(\n (async () => {\n const id = `mermaid-${count++}`;\n let svg: string;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.render(id, toString(node));\n svg = result.svg;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error rendering mermaid diagram:\", error);\n document.getElementById(id)?.remove();\n return;\n }\n const root = parser.parseFromString(svg, \"text/html\");\n const svgElement = root.querySelector(\"svg\") as SVGSVGElement;\n\n const defs = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"defs\"\n );\n defs.innerHTML = `<linearGradient id=\"linear-gradient-${id}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#F0EBFA\" />\n <stop offset=\"75%\" stop-color=\"#DED4F4\" />\n <stop offset=\"100%\" stop-color=\"#C5C7FA\" />\n</linearGradient>`;\n svgElement.prepend(defs);\n\n const style = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"style\"\n );\n style.textContent = `\n#${id} .node rect,\n#${id} .node circle,\n#${id} .node ellipse,\n#${id} .node polygon,\n#${id} .node path {\n fill: url(#linear-gradient-${id});\n}\n#${id} .node rect {\n rx: 4;\n ry: 4;\n}\n#${id} .labelBkg {\n background-color: #f5f8ff;\n}\n#${id} .edgeLabel,\n#${id} .edgeLabel p {\n background-color: transparent;\n}\n#${id} .edgeLabel {\n color: #8c8c8c;\n font-size: 12px;\n}\n`;\n svgElement.appendChild(style);\n\n const modifiedSvg = serializer.serializeToString(svgElement);\n\n const replacements = fromHtmlIsomorphic(modifiedSvg, {\n fragment: true,\n }).children as Element[];\n parent.children.splice(index!, 1, ...replacements);\n parent.properties.className = (\n (parent.properties.className as string[]) || []\n ).concat(\"mermaid\");\n })()\n );\n });\n\n await Promise.all(promises);\n };\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkToRehype from \"remark-rehype\";\nimport rehypeExternalLinks, {\n type Options as RehypeExternalLinksOptions,\n} from \"rehype-external-links\";\nimport rehypeReact, { Options as RehypeReactOptions } from \"rehype-react\";\nimport type { Components } from \"hast-util-to-jsx-runtime\";\nimport rehypeShikiFromHighlighter from \"@shikijs/rehype/core\";\nimport type { Element } from \"hast\";\nimport { visit } from \"unist-util-visit\";\nimport { getSingletonHighlighter, bundledLanguages } from \"@next-shared/shiki\";\nimport { rehypeMermaid } from \"./rehypeMermaid.js\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nconst production = { Fragment, jsx, jsxs };\n\nexport type { RehypeExternalLinksOptions, Element };\n\nexport interface MarkdownComponentProps {\n content?: string;\n components?: Partial<Components>;\n shiki?: {\n /** @default \"dark-plus\" */\n theme?: \"light-plus\" | \"dark-plus\";\n };\n externalLinks?: RehypeExternalLinksOptions;\n}\n\nexport async function preloadHighlighter(\n theme: \"light-plus\" | \"dark-plus\"\n): Promise<void> {\n await getSingletonHighlighter({\n themes: [theme],\n });\n}\n\nfunction rehypeFallbackLanguage() {\n return (tree: Element) => {\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n if (\n lang &&\n !Object.prototype.hasOwnProperty.call(bundledLanguages, lang)\n ) {\n node.properties.className = (node.properties.className as string[]).map(\n (c) => (c.startsWith(\"language-\") ? \"language-text\" : c)\n );\n }\n });\n };\n}\n\n// Reference https://github.com/remarkjs/react-remark/blob/39553e5f5c9e9b903bebf261788ff45130668de0/src/index.ts\nexport function MarkdownComponent({\n content,\n components,\n shiki,\n externalLinks,\n}: MarkdownComponentProps): JSX.Element | null {\n const [reactContent, setReactContent] = useState<JSX.Element | null>(null);\n const theme = shiki?.theme ?? \"dark-plus\";\n\n useEffect(() => {\n let ignore = false;\n (async () => {\n try {\n const highlighter = await getSingletonHighlighter({\n themes: [theme],\n });\n if (ignore) {\n return;\n }\n const vFile = await unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkToRehype)\n .use(rehypeExternalLinks, externalLinks)\n .use(rehypeMermaid)\n .use(rehypeFallbackLanguage)\n .use(rehypeShikiFromHighlighter, highlighter as any, {\n theme,\n lazy: true,\n defaultLanguage: \"text\",\n })\n .use(rehypeReact, {\n ...production,\n passNode: true,\n components,\n } as RehypeReactOptions)\n .process(content);\n if (!ignore) {\n setReactContent(vFile.result);\n }\n } catch (error) {\n if (!ignore) {\n // eslint-disable-next-line no-console\n console.error(\"Convert markdown failed:\", error);\n setReactContent(\n <div style={{ color: \"var(--color-error)\" }}>\n Convert markdown failed: {String(error)}\n </div>\n );\n }\n }\n })();\n return () => {\n ignore = true;\n };\n }, [components, content, externalLinks, theme]);\n\n return reactContent;\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useMemo } from \"react\";\nimport { createDecorators } from \"@next-core/element\";\nimport { ReactNextElement, wrapBrick } from \"@next-core/react-element\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport { useCurrentTheme } from \"@next-core/react-runtime\";\nimport \"@next-core/theme\";\nimport {\n MarkdownComponent,\n type Element,\n type MarkdownComponentProps,\n type RehypeExternalLinksOptions,\n} from \"@next-shared/markdown\";\nimport {\n CodeWrapper,\n type CodeWrapperProps,\n} from \"@next-bricks/presentational/code-wrapper\";\nimport styleText from \"./styles.shadow.css\";\nimport \"./host-context.css\";\n\nconst WrappedCodeWrapper = wrapBrick<CodeWrapper, CodeWrapperProps>(\n \"presentational.code-wrapper\"\n);\n\nconst { defineElement, property } = createDecorators();\n\nexport interface MarkdownDisplayProps {\n content?: string;\n themeVariant?: \"default\" | \"elevo\";\n}\n\nconst externalLinks: RehypeExternalLinksOptions = {\n target: \"_blank\",\n rel: [\"nofollow\", \"noopener\", \"noreferrer\"],\n test: (element: Element) => {\n return isExternalLink(element.properties.href);\n },\n content(element) {\n if (containsImg(element)) {\n return;\n }\n return {\n type: \"element\",\n tagName: \"eo-icon\",\n properties: {\n lib: \"lucide\",\n icon: \"external-link\",\n },\n children: [],\n };\n },\n contentProperties: {\n className: \"external-link-icon\",\n },\n};\n\n/**\n * 用于展示 markdown 内容的构件。\n */\nexport\n@defineElement(\"eo-markdown-display\", {\n styleTexts: [styleText],\n})\nclass MarkdownDisplay extends ReactNextElement implements MarkdownDisplayProps {\n @property()\n accessor content: string | undefined;\n\n /**\n * 主题变体\n */\n @property()\n accessor themeVariant: \"default\" | \"elevo\" | undefined;\n\n render() {\n return (\n <MarkdownDisplayComponent\n content={this.content}\n themeVariant={this.themeVariant}\n />\n );\n }\n}\n\nfunction MarkdownDisplayComponent({\n content,\n themeVariant,\n}: MarkdownDisplayProps) {\n const systemTheme = useCurrentTheme();\n const shikiOptions = useMemo<MarkdownComponentProps[\"shiki\"]>(\n () => ({\n theme: systemTheme === \"dark-v2\" ? \"dark-plus\" : \"light-plus\",\n }),\n [systemTheme]\n );\n\n const components = useMemo<MarkdownComponentProps[\"components\"]>(\n () => ({\n pre: function Pre({ node, ...props }) {\n return (\n <WrappedCodeWrapper\n preProps={props}\n showCopyButton={!!props.className?.includes(\"shiki\")}\n themeVariant={themeVariant}\n exportparts=\"pre, copy, mermaid\"\n />\n );\n },\n }),\n [themeVariant]\n );\n\n return (\n <MarkdownComponent\n content={content}\n components={components}\n shiki={shikiOptions}\n externalLinks={externalLinks}\n />\n );\n}\n\nfunction containsImg(element: Element): boolean {\n return element.children.some((child) => {\n if (child.type === \"element\") {\n return child.tagName === \"img\" || containsImg(child);\n }\n return false;\n });\n}\n\nfunction isExternalLink(href: unknown): boolean {\n if (typeof href !== \"string\") {\n return false;\n }\n try {\n const url = new URL(href, `${location.origin}${getBasePath()}`);\n return url.origin !== location.origin;\n } catch {\n return true;\n }\n}\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","toString","WrappedFormItem","wrapBrick","WrappedIcon","MenuButton","_ref","icon","onClick","tooltip","React","className","onMouseDown","e","preventDefault","_extends","style","verticalAlign","defineElement","property","event","createDecorators","_MarkdownEditor","_A","WeakMap","_B","_C","_D","_E","_F","_G","_H","_MarkdownEditor_brand","WeakSet","_I","MarkdownEditor","FormItemElementBase","constructor","arguments","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_init_name","_init_extra_name","_init_label","_init_extra_label","_init_required","_init_extra_required","_init_value","_init_extra_value","_init_bucketName","_init_extra_bucketName","_init_readonly","_init_extra_readonly","_init_containerStyle","_init_extra_containerStyle","_init_uploadImage","_defineProperty","_init_extra_uploadImage","value","_classPrivateGetter","this","_get_uploadImage","emit","_init_markdownValueChange","_init_extra_markdownValueChange","_this$getFormElement","getFormElement","formStore","onChange","name","_get_markdownValueChange","_classPrivateFieldGet","v","_classPrivateFieldSet","label","required","bucketName","readonly","containerStyle","render","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownEditorComponent","formElement","curElement","onUploadImage","handleUploadImage","onMarkdownValueChange","handleMarkdownValueChange","props","isFocus","setIsFocus","useState","uploader","async","files","schema","images","nodes","i","length","file","item","type","includes","Promise","all","map","response","ObjectStoreApi_putObject","image","width","height","src","objectName","alt","createAndFill","err","console","error","pluginViewFactory","usePluginViewFactory","widgetViewFactory","useWidgetViewFactory","nodeViewFactory","useNodeViewFactory","gfmPlugins","useMemo","gfm","tableTooltip","tableTooltipCtx","ctx","set","key","view","component","TableTooltip","tableSelectorPlugin","flat","get","useEditor","root","Editor","make","config","rootCtx","update","editorViewOptionsCtx","prev","editable","defaultValueCtx","listenerCtx","markdownUpdated","markdown","prevMarkdown","focus","blur","uploadConfig","prismConfig","configureRefractor","refractor","nord","use","listener","commonmark","history","indent","upload","prism","$view","codeBlockSchema","node","CodeBlock","call","command","payload","_get2","action","callCommand","useEffect","_get","undefined","replaceAll","MenuBtnData","lib","undoCommand","redoCommand","toggleStrongCommand","toggleEmphasisCommand","toggleStrikethroughCommand","insertTableCommand","wrapInBulletListCommand","wrapInOrderedListCommand","wrapInBlockquoteCommand","exportparts","pickFormItemProps","classNames","JSON","stringify","Milkdown","_MarkdownEditor2","_set_uploadImage","_set_markdownValueChange","c","_initClass","_applyDecs","styleTexts","styleText","alias","Boolean","attribute","o","_","has","_checkInRHS","bundledLanguages","json","javascript","js","typescript","ts","html","html-derivative","xml","css","md","mermaid","mmd","jsx","tsx","shellscript","bash","sh","shell","zsh","python","py","go","sql","yaml","bundledThemes","lightPlus","darkPlus","createHighlighter","createdBundledHighlighter","langs","themes","engine","createOnigurumaEngine","codeToHtml","codeToHast","codeToTokensBase","codeToTokens","codeToTokensWithThemes","getSingletonHighlighter","getLastGrammarState","createSingletonShorthands","guessEmbeddedLanguages","code","lang","getCodeLanguage","properties","classListItem","slice","toLowerCase","mermaidPromise","count","parser","DOMParser","serializer","XMLSerializer","rehypeMermaid","promises","visit","tree","index","parent","tagName","svg","default","initialize","startOnLoad","theme","themeVariables","fontSize","lineColor","primaryColor","primaryBorderColor","doLoadMermaid","_document$getElementB","document","getElementById","remove","parseFromString","svgElement","querySelector","defs","createElementNS","innerHTML","prepend","textContent","appendChild","modifiedSvg","serializeToString","replacements","fromHtmlIsomorphic","fragment","children","splice","concat","production","Fragment","jsxs","rehypeFallbackLanguage","Object","prototype","hasOwnProperty","startsWith","MarkdownComponent","_shiki$theme","content","components","shiki","externalLinks","reactContent","setReactContent","ignore","highlighter","vFile","unified","remarkParse","remarkGfm","remarkToRehype","rehypeExternalLinks","rehypeShikiFromHighlighter","lazy","defaultLanguage","rehypeReact","passNode","process","result","color","String","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","WrappedCodeWrapper","target","rel","test","element","href","URL","location","origin","getBasePath","isExternalLink","containsImg","contentProperties","_MarkdownDisplay","MarkdownDisplay","ReactNextElement","_init_content","_init_extra_content","_init_themeVariant","_init_extra_themeVariant","themeVariant","MarkdownDisplayComponent","systemTheme","useCurrentTheme","shikiOptions","pre","_ref2","_props$className","preProps","showCopyButton","some","child","_MarkdownDisplay2"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"chunks/2587.6b482a20.js","mappings":"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","sources":["webpack:///./src/markdown-display/host-context.css","webpack:///./src/markdown-display/styles.shadow.css","webpack:///./src/markdown-editor/index.tsx","webpack:///../../src/index.ts","webpack:///../../src/utils.ts","webpack:///../../src/rehypeMermaid.ts","webpack:///../../src/MarkdownComponent.tsx","webpack:///./src/markdown-display/host-context.css?6555","webpack:///./src/markdown-display/index.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--eo-markdown-display-code-color:#b30056;--eo-markdown-display-code-background:#ffe6ec;--eo-markdown-display-blockquote-border-color:#bcc0c5}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--eo-markdown-display-code-color:#f3679a;--eo-markdown-display-code-background:var(--color-fill-bg-base-1)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block}:host([hidden]){display:none}:not(pre) > code{color:var(--eo-markdown-display-code-color);background:var(--eo-markdown-display-code-background);margin:0 2px;padding:1px 6px;white-space:nowrap;border-radius:3px}blockquote{border-left:6px solid var(--eo-markdown-display-blockquote-border-color);padding:0 1em}:not(blockquote) > blockquote{margin-left:0;margin-right:0}a{color:var(--antd-btn-link-color);-webkit-text-decoration:none;text-decoration:none}a:hover{color:var(--antd-btn-link-hover-color)}.external-link-icon{margin-left:3px;color:var(--text-color-disabled)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import React, { FC, useEffect, useMemo, useState } from \"react\";\nimport { createDecorators, type EventEmitter } from \"@next-core/element\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport \"@next-core/theme\";\nimport styleText from \"./markdown-editor.shadow.css\";\nimport { ObjectStoreApi_putObject } from \"@next-api-sdk/object-store-sdk\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { CmdKey } from \"@milkdown/core\";\nimport {\n defaultValueCtx,\n Editor,\n editorViewOptionsCtx,\n rootCtx,\n} from \"@milkdown/core\";\nimport { Milkdown, MilkdownProvider, useEditor } from \"@milkdown/react\";\nimport {\n commonmark,\n toggleStrongCommand,\n toggleEmphasisCommand,\n wrapInBulletListCommand,\n wrapInOrderedListCommand,\n wrapInBlockquoteCommand,\n codeBlockSchema,\n} from \"@milkdown/preset-commonmark\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { nord } from \"@milkdown/theme-nord\";\nimport { history, redoCommand, undoCommand } from \"@milkdown/plugin-history\";\nimport { upload, uploadConfig, Uploader } from \"@milkdown/plugin-upload\";\nimport { callCommand, $view, replaceAll } from \"@milkdown/utils\";\nimport type { Node } from \"@milkdown/prose/model\";\nimport { listener, listenerCtx } from \"@milkdown/plugin-listener\";\nimport {\n gfm,\n toggleStrikethroughCommand,\n insertTableCommand,\n} from \"@milkdown/preset-gfm\";\nimport { indent } from \"@milkdown/plugin-indent\";\nimport { Ctx, MilkdownPlugin } from \"@milkdown/ctx\";\nimport { prism, prismConfig } from \"@milkdown/plugin-prism\";\nimport {\n usePluginViewFactory,\n ProsemirrorAdapterProvider,\n useWidgetViewFactory,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { refractor } from \"refractor/lib/common\";\nimport {\n tableSelectorPlugin,\n TableTooltip,\n tableTooltip,\n tableTooltipCtx,\n} from \"./components/TableWidget.js\";\nimport { CodeBlock } from \"./components/CodeBlock.js\";\nimport type { FormItem, FormItemProps } from \"@next-bricks/form/form-item\";\nimport { FormItemElementBase, pickFormItemProps } from \"@next-shared/form\";\nimport classNames from \"classnames\";\n\nconst WrappedFormItem = wrapBrick<FormItem, FormItemProps>(\"eo-form-item\");\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst MenuButton: FC<MenuButtonProps> = ({ icon, onClick, tooltip }) => {\n return (\n <div\n className=\"menu-btn-box\"\n onMouseDown={(e) => {\n onClick?.();\n e.preventDefault();\n }}\n >\n <WrappedIcon style={{ verticalAlign: \"middle\" }} {...icon} />\n {tooltip && <div className=\"menuIconTooltip\">{tooltip}</div>}\n </div>\n );\n};\n\nexport interface MenuButtonProps {\n icon: GeneralIconProps;\n onClick?: () => void;\n tooltip?: string;\n}\n\nexport interface MarkdownEditorProps extends FormItemProps {\n value?: string;\n bucketName?: string;\n containerStyle?: React.CSSProperties;\n readonly?: boolean;\n onUploadImage?: (value: ImageInfo) => void;\n onMarkdownValueChange?: (value: string) => void;\n}\n\nexport interface MarkdownEditorEventsMap {\n \"image.upload\": CustomEvent<ImageInfo>;\n \"markdown.value.change\": CustomEvent<string>;\n}\n\nexport interface MarkdownEditorEventsMapping {\n onImageUpload: \"image.upload\";\n onMarkdownValueChange: \"markdown.value.change\";\n}\n\nexport interface ImageInfo {\n name: string;\n src: string;\n}\n\nconst { defineElement, property, event } = createDecorators();\n\n/**\n * Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。\n * @docKind brick\n * @author kehua\n * @noInheritDoc\n * @category form-input-advanced\n */\n@defineElement(\"eo-markdown-editor\", {\n styleTexts: [styleText],\n alias: [\"markdown.markdown-editor\"],\n})\nclass MarkdownEditor extends FormItemElementBase {\n /**\n * 字段名称\n */\n @property() accessor name: string | undefined;\n\n /**\n * 标签文字\n */\n @property() accessor label: string | undefined;\n\n /**\n * 是否必填\n */\n @property({ type: Boolean })\n accessor required: boolean | undefined;\n\n /**\n * 初始值\n * @group basic\n */\n @property() accessor value: string | undefined;\n\n /**\n * 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片\n * @group advanced\n */\n @property() accessor bucketName: string | undefined;\n\n /**\n * 只读模式\n */\n @property({\n type: Boolean,\n })\n accessor readonly: boolean | undefined;\n\n /**\n * 外层容器样式\n */\n @property({\n attribute: false,\n })\n accessor containerStyle: React.CSSProperties | undefined;\n\n /**\n * 上传图片时触发的事件\n * @detail { name: 图片文件名, src: 图片存储路径 }\n */\n @event({ type: \"image.upload\" })\n accessor #uploadImage!: EventEmitter<ImageInfo>;\n\n private handleUploadImage = (value: ImageInfo): void => {\n this.#uploadImage.emit(value);\n };\n\n /**\n * 编辑 markdown 触发的变化事件\n * @detail 当前编辑器的 markdown 文本内容\n */\n @event({ type: \"markdown.value.change\" })\n accessor #markdownValueChange!: EventEmitter<string>;\n\n handleMarkdownValueChange = (value: string): void => {\n this.getFormElement()?.formStore.onChange(this.name!, value);\n this.value = value;\n this.#markdownValueChange.emit(value);\n };\n\n render() {\n return (\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownEditorComponent\n formElement={this.getFormElement()}\n name={this.name}\n label={this.label}\n required={this.required}\n curElement={this}\n bucketName={this.bucketName}\n value={this.value}\n readonly={this.readonly}\n containerStyle={this.containerStyle}\n onUploadImage={this.handleUploadImage}\n onMarkdownValueChange={this.handleMarkdownValueChange}\n />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n );\n }\n}\n\nexport { MarkdownEditor };\n\nexport function MarkdownEditorComponent(props: MarkdownEditorProps) {\n const {\n bucketName,\n containerStyle,\n value,\n formElement,\n readonly,\n onUploadImage,\n onMarkdownValueChange,\n } = props;\n\n const [isFocus, setIsFocus] = useState(false);\n\n const transformResponseToUrl = (objectName: string): string => {\n return `/next/api/gateway/object_store.object_store.GetObject/api/v1/objectStore/bucket/${props.bucketName}/object/${objectName}`;\n };\n\n const uploader: Uploader = async (files: FileList, schema: any) => {\n const images: File[] = [];\n let nodes: Node[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n if (!file) {\n continue;\n }\n\n // Only handle image\n if (!file.type.includes(\"image\")) {\n continue;\n }\n\n images.push(file);\n }\n\n // upload file\n try {\n nodes = await Promise.all(\n images.map(async (image) => {\n const response: any = await ObjectStoreApi_putObject(\n bucketName as string,\n {\n file: image,\n width: 0,\n height: 0,\n }\n );\n const src = transformResponseToUrl(response?.objectName as string);\n const alt = image.name;\n onUploadImage && onUploadImage({ name: alt, src });\n return schema.nodes.image.createAndFill({\n src,\n alt,\n }) as Node;\n })\n );\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"upload failed:\", err);\n }\n\n return nodes;\n };\n\n const pluginViewFactory = usePluginViewFactory();\n const widgetViewFactory = useWidgetViewFactory();\n const nodeViewFactory = useNodeViewFactory();\n\n const gfmPlugins: MilkdownPlugin[] = useMemo(() => {\n return readonly\n ? []\n : [\n gfm,\n tableTooltip,\n tableTooltipCtx,\n (ctx: Ctx) => async () => {\n ctx.set(tableTooltip.key, {\n view: pluginViewFactory({\n component: TableTooltip,\n }),\n });\n },\n tableSelectorPlugin(widgetViewFactory),\n ].flat();\n }, [readonly, pluginViewFactory, widgetViewFactory]);\n\n const { get } = useEditor((root: any) => {\n return Editor.make()\n .config((ctx: any) => {\n // 配置root\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => !readonly,\n }));\n // 配置默认值\n value && ctx.set(defaultValueCtx, value);\n // 配置事件监听\n ctx\n .get(listenerCtx)\n .markdownUpdated(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (ctx: any, markdown: string, prevMarkdown: string) => {\n onMarkdownValueChange && onMarkdownValueChange(markdown);\n }\n )\n .focus(() => {\n setIsFocus(true);\n })\n .blur(() => {\n setIsFocus(false);\n });\n // 配置文件上传,不传bucketName则默认把图片转为base64格式\n bucketName &&\n ctx.update(uploadConfig.key, (prev: any) => ({\n ...prev,\n uploader,\n }));\n // 支持code代码高亮\n ctx.update(prismConfig.key, (prev: any) => ({\n ...prev,\n configureRefractor: () => refractor,\n }));\n })\n .config(nord)\n .use(listener)\n .use(commonmark)\n .use(history)\n .use(gfm)\n .use(indent)\n .use(upload)\n .use(gfmPlugins)\n .use(prism)\n .use(\n readonly\n ? []\n : $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n // 当编辑器没有处在focus状态,即初始化或者通过其他构件重置值时,才允许调用replaceAll修改其值\n // 防止与用户输入动作起冲突\n if (formElement && value !== undefined && !isFocus) {\n get()?.action(replaceAll(value));\n }\n }, [get(), value]);\n\n function call<T>(command: CmdKey<T>, payload?: T) {\n return get()?.action(callCommand(command, payload));\n }\n\n const MenuBtnData: MenuButtonProps[] = [\n {\n icon: { lib: \"antd\", icon: \"undo\" },\n onClick: () => call(undoCommand.key),\n tooltip: \"撤销\",\n },\n {\n icon: { lib: \"antd\", icon: \"redo\" },\n onClick: () => call(redoCommand.key),\n tooltip: \"重做\",\n },\n {\n icon: { lib: \"antd\", icon: \"bold\" },\n onClick: () => call(toggleStrongCommand.key),\n tooltip: \"粗体\",\n },\n {\n icon: { lib: \"antd\", icon: \"italic\" },\n onClick: () => call(toggleEmphasisCommand.key),\n tooltip: \"斜体\",\n },\n {\n icon: { lib: \"antd\", icon: \"strikethrough\" },\n onClick: () => call(toggleStrikethroughCommand.key),\n tooltip: \"删除线\",\n },\n {\n icon: { lib: \"antd\", icon: \"table\" },\n onClick: () => call(insertTableCommand.key),\n tooltip: \"表格\",\n },\n {\n icon: { lib: \"antd\", icon: \"unordered-list\" },\n onClick: () => call(wrapInBulletListCommand.key),\n tooltip: \"无序列表\",\n },\n {\n icon: { lib: \"antd\", icon: \"ordered-list\" },\n onClick: () => call(wrapInOrderedListCommand.key),\n tooltip: \"有序列表\",\n },\n {\n icon: { lib: \"fa\", icon: \"quote-right\" },\n onClick: () => call(wrapInBlockquoteCommand.key),\n tooltip: \"块引用\",\n },\n ];\n\n return (\n <WrappedFormItem exportparts=\"message\" {...pickFormItemProps(props)}>\n <div\n className={classNames(\"markdown-container\", {\n readonly,\n })}\n style={containerStyle}\n >\n {!readonly && (\n <div className=\"menu-container-outter\">\n <div className=\"menu-container-inner prose\">\n {MenuBtnData.map((item) => (\n <MenuButton {...item} key={JSON.stringify(item.icon)} />\n ))}\n </div>\n </div>\n )}\n <div className=\"editor-container\">\n <Milkdown />\n </div>\n </div>\n </WrappedFormItem>\n );\n}\n","// istanbul ignore file\n\n/*\nnpx shiki-codegen \\\n --langs json,javascript,typescript,html,html-derivative,xml,css,markdown,mermaid,jsx,tsx,shellscript,python,go,sql \\\n --themes light-plus,dark-plus \\\n --engine oniguruma \\\n ./shared/shiki/src/bundle.ts\n*/\n\nimport lightPlus from \"@shikijs/themes/light-plus\";\nimport darkPlus from \"@shikijs/themes/dark-plus\";\n\n/* Generate by @shikijs/codegen */\nimport type {\n DynamicImportLanguageRegistration,\n HighlighterGeneric,\n ThemeInput,\n} from \"@shikijs/types\";\nimport {\n createSingletonShorthands,\n createdBundledHighlighter,\n} from \"@shikijs/core\";\nimport { createOnigurumaEngine } from \"@shikijs/engine-oniguruma\";\n\ntype BundledLanguage =\n | \"json\"\n | \"javascript\"\n | \"js\"\n | \"typescript\"\n | \"ts\"\n | \"html\"\n | \"html-derivative\"\n | \"xml\"\n | \"css\"\n | \"markdown\"\n | \"md\"\n | \"mermaid\"\n | \"mmd\"\n | \"jsx\"\n | \"tsx\"\n | \"shellscript\"\n | \"bash\"\n | \"sh\"\n | \"shell\"\n | \"zsh\"\n | \"python\"\n | \"py\"\n | \"go\"\n | \"sql\"\n | \"yaml\";\ntype BundledTheme = \"light-plus\" | \"dark-plus\";\ntype Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>;\n\nconst bundledLanguages = {\n json: () => import(\"@shikijs/langs/json\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n js: () => import(\"@shikijs/langs/javascript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n ts: () => import(\"@shikijs/langs/typescript\"),\n html: () => import(\"@shikijs/langs/html\"),\n \"html-derivative\": () => import(\"@shikijs/langs/html-derivative\"),\n xml: () => import(\"@shikijs/langs/xml\"),\n css: () => import(\"@shikijs/langs/css\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n md: () => import(\"@shikijs/langs/markdown\"),\n mermaid: () => import(\"@shikijs/langs/mermaid\"),\n mmd: () => import(\"@shikijs/langs/mermaid\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n shellscript: () => import(\"@shikijs/langs/shellscript\"),\n bash: () => import(\"@shikijs/langs/shellscript\"),\n sh: () => import(\"@shikijs/langs/shellscript\"),\n shell: () => import(\"@shikijs/langs/shellscript\"),\n zsh: () => import(\"@shikijs/langs/shellscript\"),\n python: () => import(\"@shikijs/langs/python\"),\n py: () => import(\"@shikijs/langs/python\"),\n go: () => import(\"@shikijs/langs/go\"),\n sql: () => import(\"@shikijs/langs/sql\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n} as Record<BundledLanguage, DynamicImportLanguageRegistration>;\n\nconst bundledThemes = {\n \"light-plus\": lightPlus,\n \"dark-plus\": darkPlus,\n} as Record<BundledTheme, ThemeInput>;\n\nconst createHighlighter = /* @__PURE__ */ createdBundledHighlighter<\n BundledLanguage,\n BundledTheme\n>({\n langs: bundledLanguages,\n themes: bundledThemes,\n engine: () => createOnigurumaEngine(import(\"shiki/wasm\")),\n});\n\nconst {\n codeToHtml,\n codeToHast,\n codeToTokensBase,\n codeToTokens,\n codeToTokensWithThemes,\n getSingletonHighlighter,\n getLastGrammarState,\n} = /* @__PURE__ */ createSingletonShorthands<BundledLanguage, BundledTheme>(\n createHighlighter,\n {\n guessEmbeddedLanguages(code, lang) {\n if (lang === \"markdown\" || lang === \"md\") {\n return [\"mermaid\"];\n }\n },\n }\n);\n\nexport {\n bundledLanguages,\n bundledThemes,\n codeToHast,\n codeToHtml,\n codeToTokens,\n codeToTokensBase,\n codeToTokensWithThemes,\n getLastGrammarState,\n getSingletonHighlighter,\n};\nexport type { BundledLanguage, BundledTheme, Highlighter };\n","import type { Element } from \"hast\";\n\nexport function getCodeLanguage(node: Element) {\n const className = (node.properties.className as string[]) || [];\n\n for (const classListItem of className) {\n if (classListItem.slice(0, 9) === \"language-\") {\n return classListItem.slice(9).toLowerCase();\n }\n }\n\n return null;\n}\n","import { visit } from \"unist-util-visit\";\nimport { toString } from \"hast-util-to-string\";\nimport type { Element } from \"hast\";\nimport type Mermaid from \"mermaid\";\nimport { fromHtmlIsomorphic } from \"hast-util-from-html-isomorphic\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nlet mermaidPromise: Promise<typeof Mermaid> | undefined;\n\nfunction loadMermaid() {\n if (mermaidPromise) {\n return mermaidPromise;\n }\n mermaidPromise = doLoadMermaid();\n return mermaidPromise;\n}\n\nasync function doLoadMermaid() {\n const mermaid = (await import(\"mermaid\")).default;\n mermaid.initialize({\n startOnLoad: false,\n theme: \"base\",\n themeVariables: {\n fontSize: \"14px\",\n lineColor: \"#979797\",\n primaryColor: \"#DCD2F3\",\n primaryBorderColor: \"#0000001A\",\n },\n });\n return mermaid;\n}\n\nlet count = 0;\n\nconst parser = new DOMParser();\nconst serializer = new XMLSerializer();\n\n// Reference https://github.com/remcohaszing/rehype-mermaid\nexport function rehypeMermaid() {\n return async (tree: Element) => {\n const promises: Promise<void>[] = [];\n\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n\n if (lang !== \"mermaid\") {\n return;\n }\n\n promises.push(\n (async () => {\n const id = `mermaid-${count++}`;\n let svg: string;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.render(id, toString(node));\n svg = result.svg;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error rendering mermaid diagram:\", error);\n document.getElementById(id)?.remove();\n return;\n }\n const root = parser.parseFromString(svg, \"text/html\");\n const svgElement = root.querySelector(\"svg\") as SVGSVGElement;\n\n const defs = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"defs\"\n );\n defs.innerHTML = `<linearGradient id=\"linear-gradient-${id}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#F0EBFA\" />\n <stop offset=\"75%\" stop-color=\"#DED4F4\" />\n <stop offset=\"100%\" stop-color=\"#C5C7FA\" />\n</linearGradient>`;\n svgElement.prepend(defs);\n\n const style = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"style\"\n );\n style.textContent = `\n#${id} .node rect,\n#${id} .node circle,\n#${id} .node ellipse,\n#${id} .node polygon,\n#${id} .node path {\n fill: url(#linear-gradient-${id});\n}\n#${id} .node rect {\n rx: 4;\n ry: 4;\n}\n#${id} .labelBkg {\n background-color: #f5f8ff;\n}\n#${id} .edgeLabel,\n#${id} .edgeLabel p {\n background-color: transparent;\n}\n#${id} .edgeLabel {\n color: #8c8c8c;\n font-size: 12px;\n}\n`;\n svgElement.appendChild(style);\n\n const modifiedSvg = serializer.serializeToString(svgElement);\n\n const replacements = fromHtmlIsomorphic(modifiedSvg, {\n fragment: true,\n }).children as Element[];\n parent.children.splice(index!, 1, ...replacements);\n parent.properties.className = (\n (parent.properties.className as string[]) || []\n ).concat(\"mermaid\");\n })()\n );\n });\n\n await Promise.all(promises);\n };\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkToRehype from \"remark-rehype\";\nimport rehypeExternalLinks, {\n type Options as RehypeExternalLinksOptions,\n} from \"rehype-external-links\";\nimport rehypeReact, { Options as RehypeReactOptions } from \"rehype-react\";\nimport type { Components } from \"hast-util-to-jsx-runtime\";\nimport rehypeShikiFromHighlighter from \"@shikijs/rehype/core\";\nimport type { Element } from \"hast\";\nimport { visit } from \"unist-util-visit\";\nimport { getSingletonHighlighter, bundledLanguages } from \"@next-shared/shiki\";\nimport { rehypeMermaid } from \"./rehypeMermaid.js\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nconst production = { Fragment, jsx, jsxs };\n\nexport type { RehypeExternalLinksOptions, Element };\n\nexport interface MarkdownComponentProps {\n content?: string;\n components?: Partial<Components>;\n shiki?: {\n /** @default \"dark-plus\" */\n theme?: \"light-plus\" | \"dark-plus\";\n };\n externalLinks?: RehypeExternalLinksOptions;\n}\n\nexport async function preloadHighlighter(\n theme: \"light-plus\" | \"dark-plus\"\n): Promise<void> {\n await getSingletonHighlighter({\n themes: [theme],\n });\n}\n\nfunction rehypeFallbackLanguage() {\n return (tree: Element) => {\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n if (\n lang &&\n !Object.prototype.hasOwnProperty.call(bundledLanguages, lang)\n ) {\n node.properties.className = (node.properties.className as string[]).map(\n (c) => (c.startsWith(\"language-\") ? \"language-text\" : c)\n );\n }\n });\n };\n}\n\n// Reference https://github.com/remarkjs/react-remark/blob/39553e5f5c9e9b903bebf261788ff45130668de0/src/index.ts\nexport function MarkdownComponent({\n content,\n components,\n shiki,\n externalLinks,\n}: MarkdownComponentProps): JSX.Element | null {\n const [reactContent, setReactContent] = useState<JSX.Element | null>(null);\n const theme = shiki?.theme ?? \"dark-plus\";\n\n useEffect(() => {\n let ignore = false;\n (async () => {\n try {\n const highlighter = await getSingletonHighlighter({\n themes: [theme],\n });\n if (ignore) {\n return;\n }\n const vFile = await unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkToRehype)\n .use(rehypeExternalLinks, externalLinks)\n .use(rehypeMermaid)\n .use(rehypeFallbackLanguage)\n .use(rehypeShikiFromHighlighter, highlighter as any, {\n theme,\n lazy: true,\n defaultLanguage: \"text\",\n })\n .use(rehypeReact, {\n ...production,\n passNode: true,\n components,\n } as RehypeReactOptions)\n .process(content);\n if (!ignore) {\n setReactContent(vFile.result);\n }\n } catch (error) {\n if (!ignore) {\n // eslint-disable-next-line no-console\n console.error(\"Convert markdown failed:\", error);\n setReactContent(\n <div style={{ color: \"var(--color-error)\" }}>\n Convert markdown failed: {String(error)}\n </div>\n );\n }\n }\n })();\n return () => {\n ignore = true;\n };\n }, [components, content, externalLinks, theme]);\n\n return reactContent;\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useMemo } from \"react\";\nimport { createDecorators } from \"@next-core/element\";\nimport { ReactNextElement, wrapBrick } from \"@next-core/react-element\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport { useCurrentTheme } from \"@next-core/react-runtime\";\nimport \"@next-core/theme\";\nimport {\n MarkdownComponent,\n type Element,\n type MarkdownComponentProps,\n type RehypeExternalLinksOptions,\n} from \"@next-shared/markdown\";\nimport {\n CodeWrapper,\n type CodeWrapperProps,\n} from \"@next-bricks/presentational/code-wrapper\";\nimport styleText from \"./styles.shadow.css\";\nimport \"./host-context.css\";\n\nconst WrappedCodeWrapper = wrapBrick<CodeWrapper, CodeWrapperProps>(\n \"presentational.code-wrapper\"\n);\n\nconst { defineElement, property } = createDecorators();\n\nexport interface MarkdownDisplayProps {\n content?: string;\n themeVariant?: \"default\" | \"elevo\";\n}\n\nconst externalLinks: RehypeExternalLinksOptions = {\n target: \"_blank\",\n rel: [\"nofollow\", \"noopener\", \"noreferrer\"],\n test: (element: Element) => {\n return isExternalLink(element.properties.href);\n },\n content(element) {\n if (containsImg(element)) {\n return;\n }\n return {\n type: \"element\",\n tagName: \"eo-icon\",\n properties: {\n lib: \"lucide\",\n icon: \"external-link\",\n },\n children: [],\n };\n },\n contentProperties: {\n className: \"external-link-icon\",\n },\n};\n\n/**\n * 用于展示 markdown 内容的构件。\n */\nexport\n@defineElement(\"eo-markdown-display\", {\n styleTexts: [styleText],\n})\nclass MarkdownDisplay extends ReactNextElement implements MarkdownDisplayProps {\n /**\n * Markdown 文本内容\n */\n @property()\n accessor content: string | undefined;\n\n /**\n * 主题变体\n */\n @property()\n accessor themeVariant: \"default\" | \"elevo\" | undefined;\n\n render() {\n return (\n <MarkdownDisplayComponent\n content={this.content}\n themeVariant={this.themeVariant}\n />\n );\n }\n}\n\nfunction MarkdownDisplayComponent({\n content,\n themeVariant,\n}: MarkdownDisplayProps) {\n const systemTheme = useCurrentTheme();\n const shikiOptions = useMemo<MarkdownComponentProps[\"shiki\"]>(\n () => ({\n theme: systemTheme === \"dark-v2\" ? \"dark-plus\" : \"light-plus\",\n }),\n [systemTheme]\n );\n\n const components = useMemo<MarkdownComponentProps[\"components\"]>(\n () => ({\n pre: function Pre({ node, ...props }) {\n return (\n <WrappedCodeWrapper\n preProps={props}\n showCopyButton={!!props.className?.includes(\"shiki\")}\n themeVariant={themeVariant}\n exportparts=\"pre, copy, mermaid\"\n />\n );\n },\n }),\n [themeVariant]\n );\n\n return (\n <MarkdownComponent\n content={content}\n components={components}\n shiki={shikiOptions}\n externalLinks={externalLinks}\n />\n );\n}\n\nfunction containsImg(element: Element): boolean {\n return element.children.some((child) => {\n if (child.type === \"element\") {\n return child.tagName === \"img\" || containsImg(child);\n }\n return false;\n });\n}\n\nfunction isExternalLink(href: unknown): boolean {\n if (typeof href !== \"string\") {\n return false;\n }\n try {\n const url = new URL(href, `${location.origin}${getBasePath()}`);\n return url.origin !== location.origin;\n } catch {\n return true;\n }\n}\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","toString","WrappedFormItem","wrapBrick","WrappedIcon","MenuButton","_ref","icon","onClick","tooltip","React","className","onMouseDown","e","preventDefault","_extends","style","verticalAlign","defineElement","property","event","createDecorators","_MarkdownEditor","_A","WeakMap","_B","_C","_D","_E","_F","_G","_H","_MarkdownEditor_brand","WeakSet","_I","MarkdownEditor","FormItemElementBase","constructor","arguments","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_init_name","_init_extra_name","_init_label","_init_extra_label","_init_required","_init_extra_required","_init_value","_init_extra_value","_init_bucketName","_init_extra_bucketName","_init_readonly","_init_extra_readonly","_init_containerStyle","_init_extra_containerStyle","_init_uploadImage","_defineProperty","_init_extra_uploadImage","value","_classPrivateGetter","this","_get_uploadImage","emit","_init_markdownValueChange","_init_extra_markdownValueChange","_this$getFormElement","getFormElement","formStore","onChange","name","_get_markdownValueChange","_classPrivateFieldGet","v","_classPrivateFieldSet","label","required","bucketName","readonly","containerStyle","render","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownEditorComponent","formElement","curElement","onUploadImage","handleUploadImage","onMarkdownValueChange","handleMarkdownValueChange","props","isFocus","setIsFocus","useState","uploader","async","files","schema","images","nodes","i","length","file","item","type","includes","Promise","all","map","response","ObjectStoreApi_putObject","image","width","height","src","objectName","alt","createAndFill","err","console","error","pluginViewFactory","usePluginViewFactory","widgetViewFactory","useWidgetViewFactory","nodeViewFactory","useNodeViewFactory","gfmPlugins","useMemo","gfm","tableTooltip","tableTooltipCtx","ctx","set","key","view","component","TableTooltip","tableSelectorPlugin","flat","get","useEditor","root","Editor","make","config","rootCtx","update","editorViewOptionsCtx","prev","editable","defaultValueCtx","listenerCtx","markdownUpdated","markdown","prevMarkdown","focus","blur","uploadConfig","prismConfig","configureRefractor","refractor","nord","use","listener","commonmark","history","indent","upload","prism","$view","codeBlockSchema","node","CodeBlock","call","command","payload","_get2","action","callCommand","useEffect","_get","undefined","replaceAll","MenuBtnData","lib","undoCommand","redoCommand","toggleStrongCommand","toggleEmphasisCommand","toggleStrikethroughCommand","insertTableCommand","wrapInBulletListCommand","wrapInOrderedListCommand","wrapInBlockquoteCommand","exportparts","pickFormItemProps","classNames","JSON","stringify","Milkdown","_MarkdownEditor2","_set_uploadImage","_set_markdownValueChange","c","_initClass","_applyDecs","styleTexts","styleText","alias","Boolean","attribute","o","_","has","_checkInRHS","bundledLanguages","json","javascript","js","typescript","ts","html","html-derivative","xml","css","md","mermaid","mmd","jsx","tsx","shellscript","bash","sh","shell","zsh","python","py","go","sql","yaml","bundledThemes","lightPlus","darkPlus","createHighlighter","createdBundledHighlighter","langs","themes","engine","createOnigurumaEngine","codeToHtml","codeToHast","codeToTokensBase","codeToTokens","codeToTokensWithThemes","getSingletonHighlighter","getLastGrammarState","createSingletonShorthands","guessEmbeddedLanguages","code","lang","getCodeLanguage","properties","classListItem","slice","toLowerCase","mermaidPromise","count","parser","DOMParser","serializer","XMLSerializer","rehypeMermaid","promises","visit","tree","index","parent","tagName","svg","default","initialize","startOnLoad","theme","themeVariables","fontSize","lineColor","primaryColor","primaryBorderColor","doLoadMermaid","_document$getElementB","document","getElementById","remove","parseFromString","svgElement","querySelector","defs","createElementNS","innerHTML","prepend","textContent","appendChild","modifiedSvg","serializeToString","replacements","fromHtmlIsomorphic","fragment","children","splice","concat","production","Fragment","jsxs","rehypeFallbackLanguage","Object","prototype","hasOwnProperty","startsWith","MarkdownComponent","_shiki$theme","content","components","shiki","externalLinks","reactContent","setReactContent","ignore","highlighter","vFile","unified","remarkParse","remarkGfm","remarkToRehype","rehypeExternalLinks","rehypeShikiFromHighlighter","lazy","defaultLanguage","rehypeReact","passNode","process","result","color","String","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","WrappedCodeWrapper","target","rel","test","element","href","URL","location","origin","getBasePath","isExternalLink","containsImg","contentProperties","_MarkdownDisplay","MarkdownDisplay","ReactNextElement","_init_content","_init_extra_content","_init_themeVariant","_init_extra_themeVariant","themeVariant","MarkdownDisplayComponent","systemTheme","useCurrentTheme","shikiOptions","pre","_ref2","_props$className","preProps","showCopyButton","some","child","_MarkdownDisplay2"],"sourceRoot":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/eo-markdown-display.2f79ccbd.js","mappings":"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","sources":["webpack:///./src/markdown-display/index.tsx","webpack:///../../src/rehypeMermaid.ts","webpack:///../../src/utils.ts","webpack:///./src/markdown-display/host-context.css","webpack:///./src/markdown-display/host-context.css?6555","webpack:///../../src/MarkdownComponent.tsx","webpack:///../../src/index.ts","webpack:///./src/markdown-display/styles.shadow.css"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { createDecorators } from \"@next-core/element\";\nimport { ReactNextElement, wrapBrick } from \"@next-core/react-element\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport { useCurrentTheme } from \"@next-core/react-runtime\";\nimport \"@next-core/theme\";\nimport {\n MarkdownComponent,\n type Element,\n type MarkdownComponentProps,\n type RehypeExternalLinksOptions,\n} from \"@next-shared/markdown\";\nimport {\n CodeWrapper,\n type CodeWrapperProps,\n} from \"@next-bricks/presentational/code-wrapper\";\nimport styleText from \"./styles.shadow.css\";\nimport \"./host-context.css\";\n\nconst WrappedCodeWrapper = wrapBrick<CodeWrapper, CodeWrapperProps>(\n \"presentational.code-wrapper\"\n);\n\nconst { defineElement, property } = createDecorators();\n\nexport interface MarkdownDisplayProps {\n content?: string;\n themeVariant?: \"default\" | \"elevo\";\n}\n\nconst externalLinks: RehypeExternalLinksOptions = {\n target: \"_blank\",\n rel: [\"nofollow\", \"noopener\", \"noreferrer\"],\n test: (element: Element) => {\n return isExternalLink(element.properties.href);\n },\n content(element) {\n if (containsImg(element)) {\n return;\n }\n return {\n type: \"element\",\n tagName: \"eo-icon\",\n properties: {\n lib: \"lucide\",\n icon: \"external-link\",\n },\n children: [],\n };\n },\n contentProperties: {\n className: \"external-link-icon\",\n },\n};\n\n/**\n * 用于展示 markdown 内容的构件。\n */\nexport\n@defineElement(\"eo-markdown-display\", {\n styleTexts: [styleText],\n})\nclass MarkdownDisplay extends ReactNextElement implements MarkdownDisplayProps {\n @property()\n accessor content: string | undefined;\n\n /**\n * 主题变体\n */\n @property()\n accessor themeVariant: \"default\" | \"elevo\" | undefined;\n\n render() {\n return (\n <MarkdownDisplayComponent\n content={this.content}\n themeVariant={this.themeVariant}\n />\n );\n }\n}\n\nfunction MarkdownDisplayComponent({\n content,\n themeVariant,\n}: MarkdownDisplayProps) {\n const systemTheme = useCurrentTheme();\n const shikiOptions = useMemo<MarkdownComponentProps[\"shiki\"]>(\n () => ({\n theme: systemTheme === \"dark-v2\" ? \"dark-plus\" : \"light-plus\",\n }),\n [systemTheme]\n );\n\n const components = useMemo<MarkdownComponentProps[\"components\"]>(\n () => ({\n pre: function Pre({ node, ...props }) {\n return (\n <WrappedCodeWrapper\n preProps={props}\n showCopyButton={!!props.className?.includes(\"shiki\")}\n themeVariant={themeVariant}\n exportparts=\"pre, copy, mermaid\"\n />\n );\n },\n }),\n [themeVariant]\n );\n\n return (\n <MarkdownComponent\n content={content}\n components={components}\n shiki={shikiOptions}\n externalLinks={externalLinks}\n />\n );\n}\n\nfunction containsImg(element: Element): boolean {\n return element.children.some((child) => {\n if (child.type === \"element\") {\n return child.tagName === \"img\" || containsImg(child);\n }\n return false;\n });\n}\n\nfunction isExternalLink(href: unknown): boolean {\n if (typeof href !== \"string\") {\n return false;\n }\n try {\n const url = new URL(href, `${location.origin}${getBasePath()}`);\n return url.origin !== location.origin;\n } catch {\n return true;\n }\n}\n","import { visit } from \"unist-util-visit\";\nimport { toString } from \"hast-util-to-string\";\nimport type { Element } from \"hast\";\nimport type Mermaid from \"mermaid\";\nimport { fromHtmlIsomorphic } from \"hast-util-from-html-isomorphic\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nlet mermaidPromise: Promise<typeof Mermaid> | undefined;\n\nfunction loadMermaid() {\n if (mermaidPromise) {\n return mermaidPromise;\n }\n mermaidPromise = doLoadMermaid();\n return mermaidPromise;\n}\n\nasync function doLoadMermaid() {\n const mermaid = (await import(\"mermaid\")).default;\n mermaid.initialize({\n startOnLoad: false,\n theme: \"base\",\n themeVariables: {\n fontSize: \"14px\",\n lineColor: \"#979797\",\n primaryColor: \"#DCD2F3\",\n primaryBorderColor: \"#0000001A\",\n },\n });\n return mermaid;\n}\n\nlet count = 0;\n\nconst parser = new DOMParser();\nconst serializer = new XMLSerializer();\n\n// Reference https://github.com/remcohaszing/rehype-mermaid\nexport function rehypeMermaid() {\n return async (tree: Element) => {\n const promises: Promise<void>[] = [];\n\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n\n if (lang !== \"mermaid\") {\n return;\n }\n\n promises.push(\n (async () => {\n const id = `mermaid-${count++}`;\n let svg: string;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.render(id, toString(node));\n svg = result.svg;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error rendering mermaid diagram:\", error);\n document.getElementById(id)?.remove();\n return;\n }\n const root = parser.parseFromString(svg, \"text/html\");\n const svgElement = root.querySelector(\"svg\") as SVGSVGElement;\n\n const defs = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"defs\"\n );\n defs.innerHTML = `<linearGradient id=\"linear-gradient-${id}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#F0EBFA\" />\n <stop offset=\"75%\" stop-color=\"#DED4F4\" />\n <stop offset=\"100%\" stop-color=\"#C5C7FA\" />\n</linearGradient>`;\n svgElement.prepend(defs);\n\n const style = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"style\"\n );\n style.textContent = `\n#${id} .node rect,\n#${id} .node circle,\n#${id} .node ellipse,\n#${id} .node polygon,\n#${id} .node path {\n fill: url(#linear-gradient-${id});\n}\n#${id} .node rect {\n rx: 4;\n ry: 4;\n}\n#${id} .labelBkg {\n background-color: #f5f8ff;\n}\n#${id} .edgeLabel,\n#${id} .edgeLabel p {\n background-color: transparent;\n}\n#${id} .edgeLabel {\n color: #8c8c8c;\n font-size: 12px;\n}\n`;\n svgElement.appendChild(style);\n\n const modifiedSvg = serializer.serializeToString(svgElement);\n\n const replacements = fromHtmlIsomorphic(modifiedSvg, {\n fragment: true,\n }).children as Element[];\n parent.children.splice(index!, 1, ...replacements);\n parent.properties.className = (\n (parent.properties.className as string[]) || []\n ).concat(\"mermaid\");\n })()\n );\n });\n\n await Promise.all(promises);\n };\n}\n","import type { Element } from \"hast\";\n\nexport function getCodeLanguage(node: Element) {\n const className = (node.properties.className as string[]) || [];\n\n for (const classListItem of className) {\n if (classListItem.slice(0, 9) === \"language-\") {\n return classListItem.slice(9).toLowerCase();\n }\n }\n\n return null;\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--eo-markdown-display-code-color:#b30056;--eo-markdown-display-code-background:#ffe6ec;--eo-markdown-display-blockquote-border-color:#bcc0c5}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--eo-markdown-display-code-color:#f3679a;--eo-markdown-display-code-background:var(--color-fill-bg-base-1)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useEffect, useState } from \"react\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkToRehype from \"remark-rehype\";\nimport rehypeExternalLinks, {\n type Options as RehypeExternalLinksOptions,\n} from \"rehype-external-links\";\nimport rehypeReact, { Options as RehypeReactOptions } from \"rehype-react\";\nimport type { Components } from \"hast-util-to-jsx-runtime\";\nimport rehypeShikiFromHighlighter from \"@shikijs/rehype/core\";\nimport type { Element } from \"hast\";\nimport { visit } from \"unist-util-visit\";\nimport { getSingletonHighlighter, bundledLanguages } from \"@next-shared/shiki\";\nimport { rehypeMermaid } from \"./rehypeMermaid.js\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nconst production = { Fragment, jsx, jsxs };\n\nexport type { RehypeExternalLinksOptions, Element };\n\nexport interface MarkdownComponentProps {\n content?: string;\n components?: Partial<Components>;\n shiki?: {\n /** @default \"dark-plus\" */\n theme?: \"light-plus\" | \"dark-plus\";\n };\n externalLinks?: RehypeExternalLinksOptions;\n}\n\nexport async function preloadHighlighter(\n theme: \"light-plus\" | \"dark-plus\"\n): Promise<void> {\n await getSingletonHighlighter({\n themes: [theme],\n });\n}\n\nfunction rehypeFallbackLanguage() {\n return (tree: Element) => {\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n if (\n lang &&\n !Object.prototype.hasOwnProperty.call(bundledLanguages, lang)\n ) {\n node.properties.className = (node.properties.className as string[]).map(\n (c) => (c.startsWith(\"language-\") ? \"language-text\" : c)\n );\n }\n });\n };\n}\n\n// Reference https://github.com/remarkjs/react-remark/blob/39553e5f5c9e9b903bebf261788ff45130668de0/src/index.ts\nexport function MarkdownComponent({\n content,\n components,\n shiki,\n externalLinks,\n}: MarkdownComponentProps): JSX.Element | null {\n const [reactContent, setReactContent] = useState<JSX.Element | null>(null);\n const theme = shiki?.theme ?? \"dark-plus\";\n\n useEffect(() => {\n let ignore = false;\n (async () => {\n try {\n const highlighter = await getSingletonHighlighter({\n themes: [theme],\n });\n if (ignore) {\n return;\n }\n const vFile = await unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkToRehype)\n .use(rehypeExternalLinks, externalLinks)\n .use(rehypeMermaid)\n .use(rehypeFallbackLanguage)\n .use(rehypeShikiFromHighlighter, highlighter as any, {\n theme,\n lazy: true,\n defaultLanguage: \"text\",\n })\n .use(rehypeReact, {\n ...production,\n passNode: true,\n components,\n } as RehypeReactOptions)\n .process(content);\n if (!ignore) {\n setReactContent(vFile.result);\n }\n } catch (error) {\n if (!ignore) {\n // eslint-disable-next-line no-console\n console.error(\"Convert markdown failed:\", error);\n setReactContent(\n <div style={{ color: \"var(--color-error)\" }}>\n Convert markdown failed: {String(error)}\n </div>\n );\n }\n }\n })();\n return () => {\n ignore = true;\n };\n }, [components, content, externalLinks, theme]);\n\n return reactContent;\n}\n","// istanbul ignore file\n\n/*\nnpx shiki-codegen \\\n --langs json,javascript,typescript,html,html-derivative,xml,css,markdown,mermaid,jsx,tsx,shellscript,python,go,sql \\\n --themes light-plus,dark-plus \\\n --engine oniguruma \\\n ./shared/shiki/src/bundle.ts\n*/\n\nimport lightPlus from \"@shikijs/themes/light-plus\";\nimport darkPlus from \"@shikijs/themes/dark-plus\";\n\n/* Generate by @shikijs/codegen */\nimport type {\n DynamicImportLanguageRegistration,\n HighlighterGeneric,\n ThemeInput,\n} from \"@shikijs/types\";\nimport {\n createSingletonShorthands,\n createdBundledHighlighter,\n} from \"@shikijs/core\";\nimport { createOnigurumaEngine } from \"@shikijs/engine-oniguruma\";\n\ntype BundledLanguage =\n | \"json\"\n | \"javascript\"\n | \"js\"\n | \"typescript\"\n | \"ts\"\n | \"html\"\n | \"html-derivative\"\n | \"xml\"\n | \"css\"\n | \"markdown\"\n | \"md\"\n | \"mermaid\"\n | \"mmd\"\n | \"jsx\"\n | \"tsx\"\n | \"shellscript\"\n | \"bash\"\n | \"sh\"\n | \"shell\"\n | \"zsh\"\n | \"python\"\n | \"py\"\n | \"go\"\n | \"sql\"\n | \"yaml\";\ntype BundledTheme = \"light-plus\" | \"dark-plus\";\ntype Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>;\n\nconst bundledLanguages = {\n json: () => import(\"@shikijs/langs/json\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n js: () => import(\"@shikijs/langs/javascript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n ts: () => import(\"@shikijs/langs/typescript\"),\n html: () => import(\"@shikijs/langs/html\"),\n \"html-derivative\": () => import(\"@shikijs/langs/html-derivative\"),\n xml: () => import(\"@shikijs/langs/xml\"),\n css: () => import(\"@shikijs/langs/css\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n md: () => import(\"@shikijs/langs/markdown\"),\n mermaid: () => import(\"@shikijs/langs/mermaid\"),\n mmd: () => import(\"@shikijs/langs/mermaid\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n shellscript: () => import(\"@shikijs/langs/shellscript\"),\n bash: () => import(\"@shikijs/langs/shellscript\"),\n sh: () => import(\"@shikijs/langs/shellscript\"),\n shell: () => import(\"@shikijs/langs/shellscript\"),\n zsh: () => import(\"@shikijs/langs/shellscript\"),\n python: () => import(\"@shikijs/langs/python\"),\n py: () => import(\"@shikijs/langs/python\"),\n go: () => import(\"@shikijs/langs/go\"),\n sql: () => import(\"@shikijs/langs/sql\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n} as Record<BundledLanguage, DynamicImportLanguageRegistration>;\n\nconst bundledThemes = {\n \"light-plus\": lightPlus,\n \"dark-plus\": darkPlus,\n} as Record<BundledTheme, ThemeInput>;\n\nconst createHighlighter = /* @__PURE__ */ createdBundledHighlighter<\n BundledLanguage,\n BundledTheme\n>({\n langs: bundledLanguages,\n themes: bundledThemes,\n engine: () => createOnigurumaEngine(import(\"shiki/wasm\")),\n});\n\nconst {\n codeToHtml,\n codeToHast,\n codeToTokensBase,\n codeToTokens,\n codeToTokensWithThemes,\n getSingletonHighlighter,\n getLastGrammarState,\n} = /* @__PURE__ */ createSingletonShorthands<BundledLanguage, BundledTheme>(\n createHighlighter,\n {\n guessEmbeddedLanguages(code, lang) {\n if (lang === \"markdown\" || lang === \"md\") {\n return [\"mermaid\"];\n }\n },\n }\n);\n\nexport {\n bundledLanguages,\n bundledThemes,\n codeToHast,\n codeToHtml,\n codeToTokens,\n codeToTokensBase,\n codeToTokensWithThemes,\n getLastGrammarState,\n getSingletonHighlighter,\n};\nexport type { BundledLanguage, BundledTheme, Highlighter };\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block}:host([hidden]){display:none}:not(pre) > code{color:var(--eo-markdown-display-code-color);background:var(--eo-markdown-display-code-background);margin:0 2px;padding:1px 6px;white-space:nowrap;border-radius:3px}blockquote{border-left:6px solid var(--eo-markdown-display-blockquote-border-color);padding:0 1em}:not(blockquote) > blockquote{margin-left:0;margin-right:0}a{color:var(--antd-btn-link-color);-webkit-text-decoration:none;text-decoration:none}a:hover{color:var(--antd-btn-link-hover-color)}.external-link-icon{margin-left:3px;color:var(--text-color-disabled)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["WrappedCodeWrapper","wrapBrick","defineElement","property","createDecorators","externalLinks","target","rel","test","element","href","URL","location","origin","getBasePath","isExternalLink","properties","content","containsImg","type","tagName","lib","icon","children","contentProperties","className","_MarkdownDisplay","_A","WeakMap","_B","MarkdownDisplay","ReactNextElement","constructor","arguments","_classPrivateFieldInitSpec","_init_content","_init_extra_content","_init_themeVariant","_init_extra_themeVariant","_classPrivateFieldGet","v","_classPrivateFieldSet","themeVariant","render","React","MarkdownDisplayComponent","this","_ref","systemTheme","useCurrentTheme","shikiOptions","useMemo","theme","components","pre","_ref2","_props$className","node","props","preProps","showCopyButton","includes","exportparts","MarkdownComponent","shiki","some","child","_MarkdownDisplay2","e","c","_initClass","_applyDecs","styleTexts","styleText","mermaidPromise","count","parser","DOMParser","serializer","XMLSerializer","rehypeMermaid","async","promises","visit","tree","index","parent","getCodeLanguage","push","id","svg","mermaid","default","initialize","startOnLoad","themeVariables","fontSize","lineColor","primaryColor","primaryBorderColor","doLoadMermaid","toString","error","_document$getElementB","console","document","getElementById","remove","root","parseFromString","svgElement","querySelector","defs","createElementNS","innerHTML","prepend","style","textContent","appendChild","modifiedSvg","serializeToString","replacements","fromHtmlIsomorphic","fragment","splice","concat","Promise","all","classListItem","slice","toLowerCase","___CSS_LOADER_EXPORT___","module","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","production","Fragment","jsx","jsxs","rehypeFallbackLanguage","lang","Object","prototype","hasOwnProperty","call","bundledLanguages","map","startsWith","_shiki$theme","reactContent","setReactContent","useState","useEffect","ignore","highlighter","getSingletonHighlighter","themes","vFile","unified","use","remarkParse","remarkGfm","remarkToRehype","rehypeExternalLinks","rehypeShikiFromHighlighter","lazy","defaultLanguage","rehypeReact","passNode","process","result","color","String","json","javascript","js","typescript","ts","html","html-derivative","xml","css","markdown","md","mmd","tsx","shellscript","bash","sh","shell","zsh","python","py","go","sql","yaml","bundledThemes","lightPlus","darkPlus","createHighlighter","createdBundledHighlighter","langs","engine","createOnigurumaEngine","codeToHtml","codeToHast","codeToTokensBase","codeToTokens","codeToTokensWithThemes","getLastGrammarState","createSingletonShorthands","guessEmbeddedLanguages","code"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"chunks/eo-markdown-display.2f79ccbd.js","mappings":"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","sources":["webpack:///./src/markdown-display/index.tsx","webpack:///../../src/rehypeMermaid.ts","webpack:///../../src/utils.ts","webpack:///./src/markdown-display/host-context.css","webpack:///./src/markdown-display/host-context.css?6555","webpack:///../../src/MarkdownComponent.tsx","webpack:///../../src/index.ts","webpack:///./src/markdown-display/styles.shadow.css"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { createDecorators } from \"@next-core/element\";\nimport { ReactNextElement, wrapBrick } from \"@next-core/react-element\";\nimport { getBasePath } from \"@next-core/runtime\";\nimport { useCurrentTheme } from \"@next-core/react-runtime\";\nimport \"@next-core/theme\";\nimport {\n MarkdownComponent,\n type Element,\n type MarkdownComponentProps,\n type RehypeExternalLinksOptions,\n} from \"@next-shared/markdown\";\nimport {\n CodeWrapper,\n type CodeWrapperProps,\n} from \"@next-bricks/presentational/code-wrapper\";\nimport styleText from \"./styles.shadow.css\";\nimport \"./host-context.css\";\n\nconst WrappedCodeWrapper = wrapBrick<CodeWrapper, CodeWrapperProps>(\n \"presentational.code-wrapper\"\n);\n\nconst { defineElement, property } = createDecorators();\n\nexport interface MarkdownDisplayProps {\n content?: string;\n themeVariant?: \"default\" | \"elevo\";\n}\n\nconst externalLinks: RehypeExternalLinksOptions = {\n target: \"_blank\",\n rel: [\"nofollow\", \"noopener\", \"noreferrer\"],\n test: (element: Element) => {\n return isExternalLink(element.properties.href);\n },\n content(element) {\n if (containsImg(element)) {\n return;\n }\n return {\n type: \"element\",\n tagName: \"eo-icon\",\n properties: {\n lib: \"lucide\",\n icon: \"external-link\",\n },\n children: [],\n };\n },\n contentProperties: {\n className: \"external-link-icon\",\n },\n};\n\n/**\n * 用于展示 markdown 内容的构件。\n */\nexport\n@defineElement(\"eo-markdown-display\", {\n styleTexts: [styleText],\n})\nclass MarkdownDisplay extends ReactNextElement implements MarkdownDisplayProps {\n /**\n * Markdown 文本内容\n */\n @property()\n accessor content: string | undefined;\n\n /**\n * 主题变体\n */\n @property()\n accessor themeVariant: \"default\" | \"elevo\" | undefined;\n\n render() {\n return (\n <MarkdownDisplayComponent\n content={this.content}\n themeVariant={this.themeVariant}\n />\n );\n }\n}\n\nfunction MarkdownDisplayComponent({\n content,\n themeVariant,\n}: MarkdownDisplayProps) {\n const systemTheme = useCurrentTheme();\n const shikiOptions = useMemo<MarkdownComponentProps[\"shiki\"]>(\n () => ({\n theme: systemTheme === \"dark-v2\" ? \"dark-plus\" : \"light-plus\",\n }),\n [systemTheme]\n );\n\n const components = useMemo<MarkdownComponentProps[\"components\"]>(\n () => ({\n pre: function Pre({ node, ...props }) {\n return (\n <WrappedCodeWrapper\n preProps={props}\n showCopyButton={!!props.className?.includes(\"shiki\")}\n themeVariant={themeVariant}\n exportparts=\"pre, copy, mermaid\"\n />\n );\n },\n }),\n [themeVariant]\n );\n\n return (\n <MarkdownComponent\n content={content}\n components={components}\n shiki={shikiOptions}\n externalLinks={externalLinks}\n />\n );\n}\n\nfunction containsImg(element: Element): boolean {\n return element.children.some((child) => {\n if (child.type === \"element\") {\n return child.tagName === \"img\" || containsImg(child);\n }\n return false;\n });\n}\n\nfunction isExternalLink(href: unknown): boolean {\n if (typeof href !== \"string\") {\n return false;\n }\n try {\n const url = new URL(href, `${location.origin}${getBasePath()}`);\n return url.origin !== location.origin;\n } catch {\n return true;\n }\n}\n","import { visit } from \"unist-util-visit\";\nimport { toString } from \"hast-util-to-string\";\nimport type { Element } from \"hast\";\nimport type Mermaid from \"mermaid\";\nimport { fromHtmlIsomorphic } from \"hast-util-from-html-isomorphic\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nlet mermaidPromise: Promise<typeof Mermaid> | undefined;\n\nfunction loadMermaid() {\n if (mermaidPromise) {\n return mermaidPromise;\n }\n mermaidPromise = doLoadMermaid();\n return mermaidPromise;\n}\n\nasync function doLoadMermaid() {\n const mermaid = (await import(\"mermaid\")).default;\n mermaid.initialize({\n startOnLoad: false,\n theme: \"base\",\n themeVariables: {\n fontSize: \"14px\",\n lineColor: \"#979797\",\n primaryColor: \"#DCD2F3\",\n primaryBorderColor: \"#0000001A\",\n },\n });\n return mermaid;\n}\n\nlet count = 0;\n\nconst parser = new DOMParser();\nconst serializer = new XMLSerializer();\n\n// Reference https://github.com/remcohaszing/rehype-mermaid\nexport function rehypeMermaid() {\n return async (tree: Element) => {\n const promises: Promise<void>[] = [];\n\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n\n if (lang !== \"mermaid\") {\n return;\n }\n\n promises.push(\n (async () => {\n const id = `mermaid-${count++}`;\n let svg: string;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.render(id, toString(node));\n svg = result.svg;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error rendering mermaid diagram:\", error);\n document.getElementById(id)?.remove();\n return;\n }\n const root = parser.parseFromString(svg, \"text/html\");\n const svgElement = root.querySelector(\"svg\") as SVGSVGElement;\n\n const defs = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"defs\"\n );\n defs.innerHTML = `<linearGradient id=\"linear-gradient-${id}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#F0EBFA\" />\n <stop offset=\"75%\" stop-color=\"#DED4F4\" />\n <stop offset=\"100%\" stop-color=\"#C5C7FA\" />\n</linearGradient>`;\n svgElement.prepend(defs);\n\n const style = root.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"style\"\n );\n style.textContent = `\n#${id} .node rect,\n#${id} .node circle,\n#${id} .node ellipse,\n#${id} .node polygon,\n#${id} .node path {\n fill: url(#linear-gradient-${id});\n}\n#${id} .node rect {\n rx: 4;\n ry: 4;\n}\n#${id} .labelBkg {\n background-color: #f5f8ff;\n}\n#${id} .edgeLabel,\n#${id} .edgeLabel p {\n background-color: transparent;\n}\n#${id} .edgeLabel {\n color: #8c8c8c;\n font-size: 12px;\n}\n`;\n svgElement.appendChild(style);\n\n const modifiedSvg = serializer.serializeToString(svgElement);\n\n const replacements = fromHtmlIsomorphic(modifiedSvg, {\n fragment: true,\n }).children as Element[];\n parent.children.splice(index!, 1, ...replacements);\n parent.properties.className = (\n (parent.properties.className as string[]) || []\n ).concat(\"mermaid\");\n })()\n );\n });\n\n await Promise.all(promises);\n };\n}\n","import type { Element } from \"hast\";\n\nexport function getCodeLanguage(node: Element) {\n const className = (node.properties.className as string[]) || [];\n\n for (const classListItem of className) {\n if (classListItem.slice(0, 9) === \"language-\") {\n return classListItem.slice(9).toLowerCase();\n }\n }\n\n return null;\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--eo-markdown-display-code-color:#b30056;--eo-markdown-display-code-background:#ffe6ec;--eo-markdown-display-blockquote-border-color:#bcc0c5}html[data-theme=\"dark\"],\nhtml[data-theme=\"dark-v2\"]{--eo-markdown-display-code-color:#f3679a;--eo-markdown-display-code-background:var(--color-fill-bg-base-1)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].use[2]!./host-context.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useEffect, useState } from \"react\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkToRehype from \"remark-rehype\";\nimport rehypeExternalLinks, {\n type Options as RehypeExternalLinksOptions,\n} from \"rehype-external-links\";\nimport rehypeReact, { Options as RehypeReactOptions } from \"rehype-react\";\nimport type { Components } from \"hast-util-to-jsx-runtime\";\nimport rehypeShikiFromHighlighter from \"@shikijs/rehype/core\";\nimport type { Element } from \"hast\";\nimport { visit } from \"unist-util-visit\";\nimport { getSingletonHighlighter, bundledLanguages } from \"@next-shared/shiki\";\nimport { rehypeMermaid } from \"./rehypeMermaid.js\";\nimport { getCodeLanguage } from \"./utils.js\";\n\nconst production = { Fragment, jsx, jsxs };\n\nexport type { RehypeExternalLinksOptions, Element };\n\nexport interface MarkdownComponentProps {\n content?: string;\n components?: Partial<Components>;\n shiki?: {\n /** @default \"dark-plus\" */\n theme?: \"light-plus\" | \"dark-plus\";\n };\n externalLinks?: RehypeExternalLinksOptions;\n}\n\nexport async function preloadHighlighter(\n theme: \"light-plus\" | \"dark-plus\"\n): Promise<void> {\n await getSingletonHighlighter({\n themes: [theme],\n });\n}\n\nfunction rehypeFallbackLanguage() {\n return (tree: Element) => {\n visit(tree, \"element\", (node, index, parent) => {\n if (\n !parent ||\n parent.type !== \"element\" ||\n parent.tagName !== \"pre\" ||\n node.tagName !== \"code\"\n ) {\n return;\n }\n\n const lang = getCodeLanguage(node);\n if (\n lang &&\n !Object.prototype.hasOwnProperty.call(bundledLanguages, lang)\n ) {\n node.properties.className = (node.properties.className as string[]).map(\n (c) => (c.startsWith(\"language-\") ? \"language-text\" : c)\n );\n }\n });\n };\n}\n\n// Reference https://github.com/remarkjs/react-remark/blob/39553e5f5c9e9b903bebf261788ff45130668de0/src/index.ts\nexport function MarkdownComponent({\n content,\n components,\n shiki,\n externalLinks,\n}: MarkdownComponentProps): JSX.Element | null {\n const [reactContent, setReactContent] = useState<JSX.Element | null>(null);\n const theme = shiki?.theme ?? \"dark-plus\";\n\n useEffect(() => {\n let ignore = false;\n (async () => {\n try {\n const highlighter = await getSingletonHighlighter({\n themes: [theme],\n });\n if (ignore) {\n return;\n }\n const vFile = await unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkToRehype)\n .use(rehypeExternalLinks, externalLinks)\n .use(rehypeMermaid)\n .use(rehypeFallbackLanguage)\n .use(rehypeShikiFromHighlighter, highlighter as any, {\n theme,\n lazy: true,\n defaultLanguage: \"text\",\n })\n .use(rehypeReact, {\n ...production,\n passNode: true,\n components,\n } as RehypeReactOptions)\n .process(content);\n if (!ignore) {\n setReactContent(vFile.result);\n }\n } catch (error) {\n if (!ignore) {\n // eslint-disable-next-line no-console\n console.error(\"Convert markdown failed:\", error);\n setReactContent(\n <div style={{ color: \"var(--color-error)\" }}>\n Convert markdown failed: {String(error)}\n </div>\n );\n }\n }\n })();\n return () => {\n ignore = true;\n };\n }, [components, content, externalLinks, theme]);\n\n return reactContent;\n}\n","// istanbul ignore file\n\n/*\nnpx shiki-codegen \\\n --langs json,javascript,typescript,html,html-derivative,xml,css,markdown,mermaid,jsx,tsx,shellscript,python,go,sql \\\n --themes light-plus,dark-plus \\\n --engine oniguruma \\\n ./shared/shiki/src/bundle.ts\n*/\n\nimport lightPlus from \"@shikijs/themes/light-plus\";\nimport darkPlus from \"@shikijs/themes/dark-plus\";\n\n/* Generate by @shikijs/codegen */\nimport type {\n DynamicImportLanguageRegistration,\n HighlighterGeneric,\n ThemeInput,\n} from \"@shikijs/types\";\nimport {\n createSingletonShorthands,\n createdBundledHighlighter,\n} from \"@shikijs/core\";\nimport { createOnigurumaEngine } from \"@shikijs/engine-oniguruma\";\n\ntype BundledLanguage =\n | \"json\"\n | \"javascript\"\n | \"js\"\n | \"typescript\"\n | \"ts\"\n | \"html\"\n | \"html-derivative\"\n | \"xml\"\n | \"css\"\n | \"markdown\"\n | \"md\"\n | \"mermaid\"\n | \"mmd\"\n | \"jsx\"\n | \"tsx\"\n | \"shellscript\"\n | \"bash\"\n | \"sh\"\n | \"shell\"\n | \"zsh\"\n | \"python\"\n | \"py\"\n | \"go\"\n | \"sql\"\n | \"yaml\";\ntype BundledTheme = \"light-plus\" | \"dark-plus\";\ntype Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>;\n\nconst bundledLanguages = {\n json: () => import(\"@shikijs/langs/json\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n js: () => import(\"@shikijs/langs/javascript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n ts: () => import(\"@shikijs/langs/typescript\"),\n html: () => import(\"@shikijs/langs/html\"),\n \"html-derivative\": () => import(\"@shikijs/langs/html-derivative\"),\n xml: () => import(\"@shikijs/langs/xml\"),\n css: () => import(\"@shikijs/langs/css\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n md: () => import(\"@shikijs/langs/markdown\"),\n mermaid: () => import(\"@shikijs/langs/mermaid\"),\n mmd: () => import(\"@shikijs/langs/mermaid\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n shellscript: () => import(\"@shikijs/langs/shellscript\"),\n bash: () => import(\"@shikijs/langs/shellscript\"),\n sh: () => import(\"@shikijs/langs/shellscript\"),\n shell: () => import(\"@shikijs/langs/shellscript\"),\n zsh: () => import(\"@shikijs/langs/shellscript\"),\n python: () => import(\"@shikijs/langs/python\"),\n py: () => import(\"@shikijs/langs/python\"),\n go: () => import(\"@shikijs/langs/go\"),\n sql: () => import(\"@shikijs/langs/sql\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n} as Record<BundledLanguage, DynamicImportLanguageRegistration>;\n\nconst bundledThemes = {\n \"light-plus\": lightPlus,\n \"dark-plus\": darkPlus,\n} as Record<BundledTheme, ThemeInput>;\n\nconst createHighlighter = /* @__PURE__ */ createdBundledHighlighter<\n BundledLanguage,\n BundledTheme\n>({\n langs: bundledLanguages,\n themes: bundledThemes,\n engine: () => createOnigurumaEngine(import(\"shiki/wasm\")),\n});\n\nconst {\n codeToHtml,\n codeToHast,\n codeToTokensBase,\n codeToTokens,\n codeToTokensWithThemes,\n getSingletonHighlighter,\n getLastGrammarState,\n} = /* @__PURE__ */ createSingletonShorthands<BundledLanguage, BundledTheme>(\n createHighlighter,\n {\n guessEmbeddedLanguages(code, lang) {\n if (lang === \"markdown\" || lang === \"md\") {\n return [\"mermaid\"];\n }\n },\n }\n);\n\nexport {\n bundledLanguages,\n bundledThemes,\n codeToHast,\n codeToHtml,\n codeToTokens,\n codeToTokensBase,\n codeToTokensWithThemes,\n getLastGrammarState,\n getSingletonHighlighter,\n};\nexport type { BundledLanguage, BundledTheme, Highlighter };\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block}:host([hidden]){display:none}:not(pre) > code{color:var(--eo-markdown-display-code-color);background:var(--eo-markdown-display-code-background);margin:0 2px;padding:1px 6px;white-space:nowrap;border-radius:3px}blockquote{border-left:6px solid var(--eo-markdown-display-blockquote-border-color);padding:0 1em}:not(blockquote) > blockquote{margin-left:0;margin-right:0}a{color:var(--antd-btn-link-color);-webkit-text-decoration:none;text-decoration:none}a:hover{color:var(--antd-btn-link-hover-color)}.external-link-icon{margin-left:3px;color:var(--text-color-disabled)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["WrappedCodeWrapper","wrapBrick","defineElement","property","createDecorators","externalLinks","target","rel","test","element","href","URL","location","origin","getBasePath","isExternalLink","properties","content","containsImg","type","tagName","lib","icon","children","contentProperties","className","_MarkdownDisplay","_A","WeakMap","_B","MarkdownDisplay","ReactNextElement","constructor","arguments","_classPrivateFieldInitSpec","_init_content","_init_extra_content","_init_themeVariant","_init_extra_themeVariant","_classPrivateFieldGet","v","_classPrivateFieldSet","themeVariant","render","React","MarkdownDisplayComponent","this","_ref","systemTheme","useCurrentTheme","shikiOptions","useMemo","theme","components","pre","_ref2","_props$className","node","props","preProps","showCopyButton","includes","exportparts","MarkdownComponent","shiki","some","child","_MarkdownDisplay2","e","c","_initClass","_applyDecs","styleTexts","styleText","mermaidPromise","count","parser","DOMParser","serializer","XMLSerializer","rehypeMermaid","async","promises","visit","tree","index","parent","getCodeLanguage","push","id","svg","mermaid","default","initialize","startOnLoad","themeVariables","fontSize","lineColor","primaryColor","primaryBorderColor","doLoadMermaid","toString","error","_document$getElementB","console","document","getElementById","remove","root","parseFromString","svgElement","querySelector","defs","createElementNS","innerHTML","prepend","style","textContent","appendChild","modifiedSvg","serializeToString","replacements","fromHtmlIsomorphic","fragment","splice","concat","Promise","all","classListItem","slice","toLowerCase","___CSS_LOADER_EXPORT___","module","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","production","Fragment","jsx","jsxs","rehypeFallbackLanguage","lang","Object","prototype","hasOwnProperty","call","bundledLanguages","map","startsWith","_shiki$theme","reactContent","setReactContent","useState","useEffect","ignore","highlighter","getSingletonHighlighter","themes","vFile","unified","use","remarkParse","remarkGfm","remarkToRehype","rehypeExternalLinks","rehypeShikiFromHighlighter","lazy","defaultLanguage","rehypeReact","passNode","process","result","color","String","json","javascript","js","typescript","ts","html","html-derivative","xml","css","markdown","md","mmd","tsx","shellscript","bash","sh","shell","zsh","python","py","go","sql","yaml","bundledThemes","lightPlus","darkPlus","createHighlighter","createdBundledHighlighter","langs","engine","createOnigurumaEngine","codeToHtml","codeToHast","codeToTokensBase","codeToTokens","codeToTokensWithThemes","getLastGrammarState","createSingletonShorthands","guessEmbeddedLanguages","code"],"sourceRoot":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks/eo-markdown-editor.308379bd.js","mappings":"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","sources":["webpack:///./src/markdown-editor/index.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from \"react\";\nimport { createDecorators, type EventEmitter } from \"@next-core/element\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport \"@next-core/theme\";\nimport styleText from \"./markdown-editor.shadow.css\";\nimport { ObjectStoreApi_putObject } from \"@next-api-sdk/object-store-sdk\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { CmdKey } from \"@milkdown/core\";\nimport {\n defaultValueCtx,\n Editor,\n editorViewOptionsCtx,\n rootCtx,\n} from \"@milkdown/core\";\nimport { Milkdown, MilkdownProvider, useEditor } from \"@milkdown/react\";\nimport {\n commonmark,\n toggleStrongCommand,\n toggleEmphasisCommand,\n wrapInBulletListCommand,\n wrapInOrderedListCommand,\n wrapInBlockquoteCommand,\n codeBlockSchema,\n} from \"@milkdown/preset-commonmark\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { nord } from \"@milkdown/theme-nord\";\nimport { history, redoCommand, undoCommand } from \"@milkdown/plugin-history\";\nimport { upload, uploadConfig, Uploader } from \"@milkdown/plugin-upload\";\nimport { callCommand, $view, replaceAll } from \"@milkdown/utils\";\nimport type { Node } from \"@milkdown/prose/model\";\nimport { listener, listenerCtx } from \"@milkdown/plugin-listener\";\nimport {\n gfm,\n toggleStrikethroughCommand,\n insertTableCommand,\n} from \"@milkdown/preset-gfm\";\nimport { indent } from \"@milkdown/plugin-indent\";\nimport { Ctx, MilkdownPlugin } from \"@milkdown/ctx\";\nimport { prism, prismConfig } from \"@milkdown/plugin-prism\";\nimport {\n usePluginViewFactory,\n ProsemirrorAdapterProvider,\n useWidgetViewFactory,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { refractor } from \"refractor/lib/common\";\nimport {\n tableSelectorPlugin,\n TableTooltip,\n tableTooltip,\n tableTooltipCtx,\n} from \"./components/TableWidget.js\";\nimport { CodeBlock } from \"./components/CodeBlock.js\";\nimport type { FormItem, FormItemProps } from \"@next-bricks/form/form-item\";\nimport { FormItemElementBase, pickFormItemProps } from \"@next-shared/form\";\nimport classNames from \"classnames\";\n\nconst WrappedFormItem = wrapBrick<FormItem, FormItemProps>(\"eo-form-item\");\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst MenuButton: FC<MenuButtonProps> = ({ icon, onClick, tooltip }) => {\n return (\n <div\n className=\"menu-btn-box\"\n onMouseDown={(e) => {\n onClick?.();\n e.preventDefault();\n }}\n >\n <WrappedIcon style={{ verticalAlign: \"middle\" }} {...icon} />\n {tooltip && <div className=\"menuIconTooltip\">{tooltip}</div>}\n </div>\n );\n};\n\nexport interface MenuButtonProps {\n icon: GeneralIconProps;\n onClick?: () => void;\n tooltip?: string;\n}\n\nexport interface MarkdownEditorProps extends FormItemProps {\n value?: string;\n bucketName?: string;\n containerStyle?: React.CSSProperties;\n readonly?: boolean;\n onUploadImage?: (value: ImageInfo) => void;\n onMarkdownValueChange?: (value: string) => void;\n}\n\nexport interface MarkdownEditorEventsMap {\n \"image.upload\": CustomEvent<ImageInfo>;\n \"markdown.value.change\": CustomEvent<string>;\n}\n\nexport interface MarkdownEditorEventsMapping {\n onImageUpload: \"image.upload\";\n onMarkdownValueChange: \"markdown.value.change\";\n}\n\nexport interface ImageInfo {\n name: string;\n src: string;\n}\n\nconst { defineElement, property, event } = createDecorators();\n\n@defineElement(\"eo-markdown-editor\", {\n styleTexts: [styleText],\n alias: [\"markdown.markdown-editor\"],\n})\n\n/**\n * markdown编辑器\n * @docKind brick\n * @author kehua\n * @noInheritDoc\n * @category form-input-advanced\n */\nclass MarkdownEditor extends FormItemElementBase {\n /**\n * 字段名称\n */\n @property() accessor name: string | undefined;\n\n /**\n * 标签文字\n */\n @property() accessor label: string | undefined;\n\n /**\n * 是否必填\n */\n @property({ type: Boolean })\n accessor required: boolean | undefined;\n\n /**\n * 初始值\n * @group basic\n */\n @property() accessor value: string | undefined;\n\n /**\n * 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片\n * @group advanced\n */\n @property() accessor bucketName: string | undefined;\n\n /**\n * 只读模式\n */\n @property({\n type: Boolean,\n })\n accessor readonly: boolean | undefined;\n\n /**\n * 外层容器样式\n */\n @property({\n attribute: false,\n })\n accessor containerStyle: React.CSSProperties | undefined;\n\n /**\n * 上传图片时触发的事件\n * @detail\n */\n @event({ type: \"image.upload\" })\n accessor #uploadImage!: EventEmitter<ImageInfo>;\n\n private handleUploadImage = (value: ImageInfo): void => {\n this.#uploadImage.emit(value);\n };\n\n /**\n * 编辑markdown触发的变化事件\n * @detail\n */\n @event({ type: \"markdown.value.change\" })\n accessor #markdownValueChange!: EventEmitter<string>;\n\n handleMarkdownValueChange = (value: string): void => {\n this.getFormElement()?.formStore.onChange(this.name!, value);\n this.value = value;\n this.#markdownValueChange.emit(value);\n };\n\n render() {\n return (\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownEditorComponent\n formElement={this.getFormElement()}\n name={this.name}\n label={this.label}\n required={this.required}\n curElement={this}\n bucketName={this.bucketName}\n value={this.value}\n readonly={this.readonly}\n containerStyle={this.containerStyle}\n onUploadImage={this.handleUploadImage}\n onMarkdownValueChange={this.handleMarkdownValueChange}\n />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n );\n }\n}\n\nexport { MarkdownEditor };\n\nexport function MarkdownEditorComponent(props: MarkdownEditorProps) {\n const {\n bucketName,\n containerStyle,\n value,\n formElement,\n readonly,\n onUploadImage,\n onMarkdownValueChange,\n } = props;\n\n const [isFocus, setIsFocus] = useState(false);\n\n const transformResponseToUrl = (objectName: string): string => {\n return `/next/api/gateway/object_store.object_store.GetObject/api/v1/objectStore/bucket/${props.bucketName}/object/${objectName}`;\n };\n\n const uploader: Uploader = async (files: FileList, schema: any) => {\n const images: File[] = [];\n let nodes: Node[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n if (!file) {\n continue;\n }\n\n // Only handle image\n if (!file.type.includes(\"image\")) {\n continue;\n }\n\n images.push(file);\n }\n\n // upload file\n try {\n nodes = await Promise.all(\n images.map(async (image) => {\n const response: any = await ObjectStoreApi_putObject(\n bucketName as string,\n {\n file: image,\n width: 0,\n height: 0,\n }\n );\n const src = transformResponseToUrl(response?.objectName as string);\n const alt = image.name;\n onUploadImage && onUploadImage({ name: alt, src });\n return schema.nodes.image.createAndFill({\n src,\n alt,\n }) as Node;\n })\n );\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"upload failed:\", err);\n }\n\n return nodes;\n };\n\n const pluginViewFactory = usePluginViewFactory();\n const widgetViewFactory = useWidgetViewFactory();\n const nodeViewFactory = useNodeViewFactory();\n\n const gfmPlugins: MilkdownPlugin[] = useMemo(() => {\n return readonly\n ? []\n : [\n gfm,\n tableTooltip,\n tableTooltipCtx,\n (ctx: Ctx) => async () => {\n ctx.set(tableTooltip.key, {\n view: pluginViewFactory({\n component: TableTooltip,\n }),\n });\n },\n tableSelectorPlugin(widgetViewFactory),\n ].flat();\n }, [readonly, pluginViewFactory, widgetViewFactory]);\n\n const { get } = useEditor((root: any) => {\n return Editor.make()\n .config((ctx: any) => {\n // 配置root\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => !readonly,\n }));\n // 配置默认值\n value && ctx.set(defaultValueCtx, value);\n // 配置事件监听\n ctx\n .get(listenerCtx)\n .markdownUpdated(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (ctx: any, markdown: string, prevMarkdown: string) => {\n onMarkdownValueChange && onMarkdownValueChange(markdown);\n }\n )\n .focus(() => {\n setIsFocus(true);\n })\n .blur(() => {\n setIsFocus(false);\n });\n // 配置文件上传,不传bucketName则默认把图片转为base64格式\n bucketName &&\n ctx.update(uploadConfig.key, (prev: any) => ({\n ...prev,\n uploader,\n }));\n // 支持code代码高亮\n ctx.update(prismConfig.key, (prev: any) => ({\n ...prev,\n configureRefractor: () => refractor,\n }));\n })\n .config(nord)\n .use(listener)\n .use(commonmark)\n .use(history)\n .use(gfm)\n .use(indent)\n .use(upload)\n .use(gfmPlugins)\n .use(prism)\n .use(\n readonly\n ? []\n : $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n // 当编辑器没有处在focus状态,即初始化或者通过其他构件重置值时,才允许调用replaceAll修改其值\n // 防止与用户输入动作起冲突\n if (formElement && value !== undefined && !isFocus) {\n get()?.action(replaceAll(value));\n }\n }, [get(), value]);\n\n function call<T>(command: CmdKey<T>, payload?: T) {\n return get()?.action(callCommand(command, payload));\n }\n\n const MenuBtnData: MenuButtonProps[] = [\n {\n icon: { lib: \"antd\", icon: \"undo\" },\n onClick: () => call(undoCommand.key),\n tooltip: \"撤销\",\n },\n {\n icon: { lib: \"antd\", icon: \"redo\" },\n onClick: () => call(redoCommand.key),\n tooltip: \"重做\",\n },\n {\n icon: { lib: \"antd\", icon: \"bold\" },\n onClick: () => call(toggleStrongCommand.key),\n tooltip: \"粗体\",\n },\n {\n icon: { lib: \"antd\", icon: \"italic\" },\n onClick: () => call(toggleEmphasisCommand.key),\n tooltip: \"斜体\",\n },\n {\n icon: { lib: \"antd\", icon: \"strikethrough\" },\n onClick: () => call(toggleStrikethroughCommand.key),\n tooltip: \"删除线\",\n },\n {\n icon: { lib: \"antd\", icon: \"table\" },\n onClick: () => call(insertTableCommand.key),\n tooltip: \"表格\",\n },\n {\n icon: { lib: \"antd\", icon: \"unordered-list\" },\n onClick: () => call(wrapInBulletListCommand.key),\n tooltip: \"无序列表\",\n },\n {\n icon: { lib: \"antd\", icon: \"ordered-list\" },\n onClick: () => call(wrapInOrderedListCommand.key),\n tooltip: \"有序列表\",\n },\n {\n icon: { lib: \"fa\", icon: \"quote-right\" },\n onClick: () => call(wrapInBlockquoteCommand.key),\n tooltip: \"块引用\",\n },\n ];\n\n return (\n <WrappedFormItem exportparts=\"message\" {...pickFormItemProps(props)}>\n <div\n className={classNames(\"markdown-container\", {\n readonly,\n })}\n style={containerStyle}\n >\n {!readonly && (\n <div className=\"menu-container-outter\">\n <div className=\"menu-container-inner prose\">\n {MenuBtnData.map((item) => (\n <MenuButton {...item} key={JSON.stringify(item.icon)} />\n ))}\n </div>\n </div>\n )}\n <div className=\"editor-container\">\n <Milkdown />\n </div>\n </div>\n </WrappedFormItem>\n );\n}\n"],"names":["WrappedFormItem","wrapBrick","WrappedIcon","MenuButton","_ref","icon","onClick","tooltip","React","className","onMouseDown","e","preventDefault","_extends","style","verticalAlign","defineElement","property","event","createDecorators","_MarkdownEditor","_A","WeakMap","_B","_C","_D","_E","_F","_G","_H","_MarkdownEditor_brand","WeakSet","_I","MarkdownEditor","FormItemElementBase","constructor","arguments","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_init_name","_init_extra_name","_init_label","_init_extra_label","_init_required","_init_extra_required","_init_value","_init_extra_value","_init_bucketName","_init_extra_bucketName","_init_readonly","_init_extra_readonly","_init_containerStyle","_init_extra_containerStyle","_init_uploadImage","_defineProperty","_init_extra_uploadImage","value","_classPrivateGetter","this","_get_uploadImage","emit","_init_markdownValueChange","_init_extra_markdownValueChange","_this$getFormElement","getFormElement","formStore","onChange","name","_get_markdownValueChange","_classPrivateFieldGet","v","_classPrivateFieldSet","label","required","bucketName","readonly","containerStyle","render","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownEditorComponent","formElement","curElement","onUploadImage","handleUploadImage","onMarkdownValueChange","handleMarkdownValueChange","props","isFocus","setIsFocus","useState","uploader","async","files","schema","images","nodes","i","length","file","item","type","includes","push","Promise","all","map","response","ObjectStoreApi_putObject","image","width","height","src","objectName","alt","createAndFill","err","console","error","pluginViewFactory","usePluginViewFactory","widgetViewFactory","useWidgetViewFactory","nodeViewFactory","useNodeViewFactory","gfmPlugins","useMemo","gfm","tableTooltip","tableTooltipCtx","ctx","set","key","view","component","TableTooltip","tableSelectorPlugin","flat","get","useEditor","root","Editor","make","config","rootCtx","update","editorViewOptionsCtx","prev","editable","defaultValueCtx","listenerCtx","markdownUpdated","markdown","prevMarkdown","focus","blur","uploadConfig","prismConfig","configureRefractor","refractor","nord","use","listener","commonmark","history","indent","upload","prism","$view","codeBlockSchema","node","CodeBlock","call","command","payload","_get2","action","callCommand","useEffect","_get","undefined","replaceAll","MenuBtnData","lib","undoCommand","redoCommand","toggleStrongCommand","toggleEmphasisCommand","toggleStrikethroughCommand","insertTableCommand","wrapInBulletListCommand","wrapInOrderedListCommand","wrapInBlockquoteCommand","exportparts","pickFormItemProps","classNames","JSON","stringify","Milkdown","_MarkdownEditor2","_set_uploadImage","_set_markdownValueChange","c","_initClass","_applyDecs","styleTexts","styleText","alias","Boolean","attribute","o","_","has","_checkInRHS"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"chunks/eo-markdown-editor.308379bd.js","mappings":"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","sources":["webpack:///./src/markdown-editor/index.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from \"react\";\nimport { createDecorators, type EventEmitter } from \"@next-core/element\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport \"@next-core/theme\";\nimport styleText from \"./markdown-editor.shadow.css\";\nimport { ObjectStoreApi_putObject } from \"@next-api-sdk/object-store-sdk\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport type { CmdKey } from \"@milkdown/core\";\nimport {\n defaultValueCtx,\n Editor,\n editorViewOptionsCtx,\n rootCtx,\n} from \"@milkdown/core\";\nimport { Milkdown, MilkdownProvider, useEditor } from \"@milkdown/react\";\nimport {\n commonmark,\n toggleStrongCommand,\n toggleEmphasisCommand,\n wrapInBulletListCommand,\n wrapInOrderedListCommand,\n wrapInBlockquoteCommand,\n codeBlockSchema,\n} from \"@milkdown/preset-commonmark\";\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { nord } from \"@milkdown/theme-nord\";\nimport { history, redoCommand, undoCommand } from \"@milkdown/plugin-history\";\nimport { upload, uploadConfig, Uploader } from \"@milkdown/plugin-upload\";\nimport { callCommand, $view, replaceAll } from \"@milkdown/utils\";\nimport type { Node } from \"@milkdown/prose/model\";\nimport { listener, listenerCtx } from \"@milkdown/plugin-listener\";\nimport {\n gfm,\n toggleStrikethroughCommand,\n insertTableCommand,\n} from \"@milkdown/preset-gfm\";\nimport { indent } from \"@milkdown/plugin-indent\";\nimport { Ctx, MilkdownPlugin } from \"@milkdown/ctx\";\nimport { prism, prismConfig } from \"@milkdown/plugin-prism\";\nimport {\n usePluginViewFactory,\n ProsemirrorAdapterProvider,\n useWidgetViewFactory,\n useNodeViewFactory,\n} from \"@prosemirror-adapter/react\";\nimport { refractor } from \"refractor/lib/common\";\nimport {\n tableSelectorPlugin,\n TableTooltip,\n tableTooltip,\n tableTooltipCtx,\n} from \"./components/TableWidget.js\";\nimport { CodeBlock } from \"./components/CodeBlock.js\";\nimport type { FormItem, FormItemProps } from \"@next-bricks/form/form-item\";\nimport { FormItemElementBase, pickFormItemProps } from \"@next-shared/form\";\nimport classNames from \"classnames\";\n\nconst WrappedFormItem = wrapBrick<FormItem, FormItemProps>(\"eo-form-item\");\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst MenuButton: FC<MenuButtonProps> = ({ icon, onClick, tooltip }) => {\n return (\n <div\n className=\"menu-btn-box\"\n onMouseDown={(e) => {\n onClick?.();\n e.preventDefault();\n }}\n >\n <WrappedIcon style={{ verticalAlign: \"middle\" }} {...icon} />\n {tooltip && <div className=\"menuIconTooltip\">{tooltip}</div>}\n </div>\n );\n};\n\nexport interface MenuButtonProps {\n icon: GeneralIconProps;\n onClick?: () => void;\n tooltip?: string;\n}\n\nexport interface MarkdownEditorProps extends FormItemProps {\n value?: string;\n bucketName?: string;\n containerStyle?: React.CSSProperties;\n readonly?: boolean;\n onUploadImage?: (value: ImageInfo) => void;\n onMarkdownValueChange?: (value: string) => void;\n}\n\nexport interface MarkdownEditorEventsMap {\n \"image.upload\": CustomEvent<ImageInfo>;\n \"markdown.value.change\": CustomEvent<string>;\n}\n\nexport interface MarkdownEditorEventsMapping {\n onImageUpload: \"image.upload\";\n onMarkdownValueChange: \"markdown.value.change\";\n}\n\nexport interface ImageInfo {\n name: string;\n src: string;\n}\n\nconst { defineElement, property, event } = createDecorators();\n\n/**\n * Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。\n * @docKind brick\n * @author kehua\n * @noInheritDoc\n * @category form-input-advanced\n */\n@defineElement(\"eo-markdown-editor\", {\n styleTexts: [styleText],\n alias: [\"markdown.markdown-editor\"],\n})\nclass MarkdownEditor extends FormItemElementBase {\n /**\n * 字段名称\n */\n @property() accessor name: string | undefined;\n\n /**\n * 标签文字\n */\n @property() accessor label: string | undefined;\n\n /**\n * 是否必填\n */\n @property({ type: Boolean })\n accessor required: boolean | undefined;\n\n /**\n * 初始值\n * @group basic\n */\n @property() accessor value: string | undefined;\n\n /**\n * 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片\n * @group advanced\n */\n @property() accessor bucketName: string | undefined;\n\n /**\n * 只读模式\n */\n @property({\n type: Boolean,\n })\n accessor readonly: boolean | undefined;\n\n /**\n * 外层容器样式\n */\n @property({\n attribute: false,\n })\n accessor containerStyle: React.CSSProperties | undefined;\n\n /**\n * 上传图片时触发的事件\n * @detail { name: 图片文件名, src: 图片存储路径 }\n */\n @event({ type: \"image.upload\" })\n accessor #uploadImage!: EventEmitter<ImageInfo>;\n\n private handleUploadImage = (value: ImageInfo): void => {\n this.#uploadImage.emit(value);\n };\n\n /**\n * 编辑 markdown 触发的变化事件\n * @detail 当前编辑器的 markdown 文本内容\n */\n @event({ type: \"markdown.value.change\" })\n accessor #markdownValueChange!: EventEmitter<string>;\n\n handleMarkdownValueChange = (value: string): void => {\n this.getFormElement()?.formStore.onChange(this.name!, value);\n this.value = value;\n this.#markdownValueChange.emit(value);\n };\n\n render() {\n return (\n <MilkdownProvider>\n <ProsemirrorAdapterProvider>\n <MarkdownEditorComponent\n formElement={this.getFormElement()}\n name={this.name}\n label={this.label}\n required={this.required}\n curElement={this}\n bucketName={this.bucketName}\n value={this.value}\n readonly={this.readonly}\n containerStyle={this.containerStyle}\n onUploadImage={this.handleUploadImage}\n onMarkdownValueChange={this.handleMarkdownValueChange}\n />\n </ProsemirrorAdapterProvider>\n </MilkdownProvider>\n );\n }\n}\n\nexport { MarkdownEditor };\n\nexport function MarkdownEditorComponent(props: MarkdownEditorProps) {\n const {\n bucketName,\n containerStyle,\n value,\n formElement,\n readonly,\n onUploadImage,\n onMarkdownValueChange,\n } = props;\n\n const [isFocus, setIsFocus] = useState(false);\n\n const transformResponseToUrl = (objectName: string): string => {\n return `/next/api/gateway/object_store.object_store.GetObject/api/v1/objectStore/bucket/${props.bucketName}/object/${objectName}`;\n };\n\n const uploader: Uploader = async (files: FileList, schema: any) => {\n const images: File[] = [];\n let nodes: Node[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n\n if (!file) {\n continue;\n }\n\n // Only handle image\n if (!file.type.includes(\"image\")) {\n continue;\n }\n\n images.push(file);\n }\n\n // upload file\n try {\n nodes = await Promise.all(\n images.map(async (image) => {\n const response: any = await ObjectStoreApi_putObject(\n bucketName as string,\n {\n file: image,\n width: 0,\n height: 0,\n }\n );\n const src = transformResponseToUrl(response?.objectName as string);\n const alt = image.name;\n onUploadImage && onUploadImage({ name: alt, src });\n return schema.nodes.image.createAndFill({\n src,\n alt,\n }) as Node;\n })\n );\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"upload failed:\", err);\n }\n\n return nodes;\n };\n\n const pluginViewFactory = usePluginViewFactory();\n const widgetViewFactory = useWidgetViewFactory();\n const nodeViewFactory = useNodeViewFactory();\n\n const gfmPlugins: MilkdownPlugin[] = useMemo(() => {\n return readonly\n ? []\n : [\n gfm,\n tableTooltip,\n tableTooltipCtx,\n (ctx: Ctx) => async () => {\n ctx.set(tableTooltip.key, {\n view: pluginViewFactory({\n component: TableTooltip,\n }),\n });\n },\n tableSelectorPlugin(widgetViewFactory),\n ].flat();\n }, [readonly, pluginViewFactory, widgetViewFactory]);\n\n const { get } = useEditor((root: any) => {\n return Editor.make()\n .config((ctx: any) => {\n // 配置root\n ctx.set(rootCtx, root);\n ctx.update(editorViewOptionsCtx, (prev: any) => ({\n ...prev,\n editable: () => !readonly,\n }));\n // 配置默认值\n value && ctx.set(defaultValueCtx, value);\n // 配置事件监听\n ctx\n .get(listenerCtx)\n .markdownUpdated(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (ctx: any, markdown: string, prevMarkdown: string) => {\n onMarkdownValueChange && onMarkdownValueChange(markdown);\n }\n )\n .focus(() => {\n setIsFocus(true);\n })\n .blur(() => {\n setIsFocus(false);\n });\n // 配置文件上传,不传bucketName则默认把图片转为base64格式\n bucketName &&\n ctx.update(uploadConfig.key, (prev: any) => ({\n ...prev,\n uploader,\n }));\n // 支持code代码高亮\n ctx.update(prismConfig.key, (prev: any) => ({\n ...prev,\n configureRefractor: () => refractor,\n }));\n })\n .config(nord)\n .use(listener)\n .use(commonmark)\n .use(history)\n .use(gfm)\n .use(indent)\n .use(upload)\n .use(gfmPlugins)\n .use(prism)\n .use(\n readonly\n ? []\n : $view(codeBlockSchema.node, () =>\n nodeViewFactory({ component: CodeBlock })\n )\n );\n }, []);\n\n useEffect(() => {\n // 当编辑器没有处在focus状态,即初始化或者通过其他构件重置值时,才允许调用replaceAll修改其值\n // 防止与用户输入动作起冲突\n if (formElement && value !== undefined && !isFocus) {\n get()?.action(replaceAll(value));\n }\n }, [get(), value]);\n\n function call<T>(command: CmdKey<T>, payload?: T) {\n return get()?.action(callCommand(command, payload));\n }\n\n const MenuBtnData: MenuButtonProps[] = [\n {\n icon: { lib: \"antd\", icon: \"undo\" },\n onClick: () => call(undoCommand.key),\n tooltip: \"撤销\",\n },\n {\n icon: { lib: \"antd\", icon: \"redo\" },\n onClick: () => call(redoCommand.key),\n tooltip: \"重做\",\n },\n {\n icon: { lib: \"antd\", icon: \"bold\" },\n onClick: () => call(toggleStrongCommand.key),\n tooltip: \"粗体\",\n },\n {\n icon: { lib: \"antd\", icon: \"italic\" },\n onClick: () => call(toggleEmphasisCommand.key),\n tooltip: \"斜体\",\n },\n {\n icon: { lib: \"antd\", icon: \"strikethrough\" },\n onClick: () => call(toggleStrikethroughCommand.key),\n tooltip: \"删除线\",\n },\n {\n icon: { lib: \"antd\", icon: \"table\" },\n onClick: () => call(insertTableCommand.key),\n tooltip: \"表格\",\n },\n {\n icon: { lib: \"antd\", icon: \"unordered-list\" },\n onClick: () => call(wrapInBulletListCommand.key),\n tooltip: \"无序列表\",\n },\n {\n icon: { lib: \"antd\", icon: \"ordered-list\" },\n onClick: () => call(wrapInOrderedListCommand.key),\n tooltip: \"有序列表\",\n },\n {\n icon: { lib: \"fa\", icon: \"quote-right\" },\n onClick: () => call(wrapInBlockquoteCommand.key),\n tooltip: \"块引用\",\n },\n ];\n\n return (\n <WrappedFormItem exportparts=\"message\" {...pickFormItemProps(props)}>\n <div\n className={classNames(\"markdown-container\", {\n readonly,\n })}\n style={containerStyle}\n >\n {!readonly && (\n <div className=\"menu-container-outter\">\n <div className=\"menu-container-inner prose\">\n {MenuBtnData.map((item) => (\n <MenuButton {...item} key={JSON.stringify(item.icon)} />\n ))}\n </div>\n </div>\n )}\n <div className=\"editor-container\">\n <Milkdown />\n </div>\n </div>\n </WrappedFormItem>\n );\n}\n"],"names":["WrappedFormItem","wrapBrick","WrappedIcon","MenuButton","_ref","icon","onClick","tooltip","React","className","onMouseDown","e","preventDefault","_extends","style","verticalAlign","defineElement","property","event","createDecorators","_MarkdownEditor","_A","WeakMap","_B","_C","_D","_E","_F","_G","_H","_MarkdownEditor_brand","WeakSet","_I","MarkdownEditor","FormItemElementBase","constructor","arguments","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","_init_name","_init_extra_name","_init_label","_init_extra_label","_init_required","_init_extra_required","_init_value","_init_extra_value","_init_bucketName","_init_extra_bucketName","_init_readonly","_init_extra_readonly","_init_containerStyle","_init_extra_containerStyle","_init_uploadImage","_defineProperty","_init_extra_uploadImage","value","_classPrivateGetter","this","_get_uploadImage","emit","_init_markdownValueChange","_init_extra_markdownValueChange","_this$getFormElement","getFormElement","formStore","onChange","name","_get_markdownValueChange","_classPrivateFieldGet","v","_classPrivateFieldSet","label","required","bucketName","readonly","containerStyle","render","MilkdownProvider","ProsemirrorAdapterProvider","MarkdownEditorComponent","formElement","curElement","onUploadImage","handleUploadImage","onMarkdownValueChange","handleMarkdownValueChange","props","isFocus","setIsFocus","useState","uploader","async","files","schema","images","nodes","i","length","file","item","type","includes","push","Promise","all","map","response","ObjectStoreApi_putObject","image","width","height","src","objectName","alt","createAndFill","err","console","error","pluginViewFactory","usePluginViewFactory","widgetViewFactory","useWidgetViewFactory","nodeViewFactory","useNodeViewFactory","gfmPlugins","useMemo","gfm","tableTooltip","tableTooltipCtx","ctx","set","key","view","component","TableTooltip","tableSelectorPlugin","flat","get","useEditor","root","Editor","make","config","rootCtx","update","editorViewOptionsCtx","prev","editable","defaultValueCtx","listenerCtx","markdownUpdated","markdown","prevMarkdown","focus","blur","uploadConfig","prismConfig","configureRefractor","refractor","nord","use","listener","commonmark","history","indent","upload","prism","$view","codeBlockSchema","node","CodeBlock","call","command","payload","_get2","action","callCommand","useEffect","_get","undefined","replaceAll","MenuBtnData","lib","undoCommand","redoCommand","toggleStrongCommand","toggleEmphasisCommand","toggleStrikethroughCommand","insertTableCommand","wrapInBulletListCommand","wrapInOrderedListCommand","wrapInBlockquoteCommand","exportparts","pickFormItemProps","classNames","JSON","stringify","Milkdown","_MarkdownEditor2","_set_uploadImage","_set_markdownValueChange","c","_initClass","_applyDecs","styleTexts","styleText","alias","Boolean","attribute","o","_","has","_checkInRHS"],"sourceRoot":""}
|
package/dist/examples.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"eo-markdown-editor": {
|
|
3
|
-
"doc": "markdown
|
|
3
|
+
"doc": "---\ntagName: eo-markdown-editor\ndisplayName: WrappedEoMarkdownEditor\ndescription: Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。\ncategory: form-input-advanced\nsource: \"@next-bricks/markdown\"\n---\n\n# eo-markdown-editor\n\n> Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。\n\n## Props\n\n| 属性 | 类型 | 必填 | 默认值 | 说明 |\n| -------------- | --------------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------- |\n| name | `string` | 否 | - | 字段名称 |\n| label | `string` | 否 | - | 标签文字 |\n| required | `boolean` | 否 | - | 是否必填 |\n| value | `string` | 否 | - | 初始值 |\n| bucketName | `string` | 否 | - | 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片 |\n| readonly | `boolean` | 否 | - | 只读模式 |\n| containerStyle | `React.CSSProperties` | 否 | - | 外层容器样式 |\n\n## Events\n\n| 事件 | detail | 说明 |\n| --------------------- | ----------------------------------------------------- | ---------------------------- |\n| image.upload | `ImageInfo` — { name: 图片文件名, src: 图片存储路径 } | 上传图片时触发的事件 |\n| markdown.value.change | `string` — 当前编辑器的 markdown 文本内容 | 编辑 markdown 触发的变化事件 |\n\n## Examples\n\n### Basic\n\n基础 Markdown 编辑器,监听内容变化和图片上传事件。\n\n```yaml preview\n- brick: eo-markdown-editor\n properties:\n value: |-\n # Markdown\n\n > Content.\n\n \n events:\n markdown.value.change:\n action: console.log\n args:\n - change\n - <% EVENT.detail %>\n image.upload:\n action: console.log\n args:\n - upload\n - <% EVENT.detail %>\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-editor\n# value=\"# Markdown\n# \n# > Content.\n# \n# \"\n# id=\"brick-1\"\n# ></eo-markdown-editor>\n# \n# <script>\n# const brick_1 = document.getElementById(\"brick-1\");\n# brick_1.addEventListener(\"markdown.value.change\", (e) => {\n# console.log(\"change\", e.detail);\n# });\n# brick_1.addEventListener(\"image.upload\", (e) => {\n# console.log(\"upload\", e.detail);\n# });\n# </script>\n# \n```\n\n### Table\n\n编辑包含表格的 Markdown 内容,支持表格工具栏操作。\n\n```yaml preview\n- brick: eo-markdown-editor\n properties:\n value: |-\n # Markdown\n\n > Content.\n\n | head1 | head2 | head3 |\n | :---- | :---- | :---- |\n | 1 | 3 | 5 |\n | 2 | 4 | 6 |\n events:\n markdown.value.change:\n action: console.log\n args:\n - change\n - <% EVENT.detail %>\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-editor\n# value=\"# Markdown\n# \n# > Content.\n# \n# | head1 | head2 | head3 |\n# | :---- | :---- | :---- |\n# | 1 | 3 | 5 |\n# | 2 | 4 | 6 |\"\n# id=\"brick-1\"\n# ></eo-markdown-editor>\n# \n# <script>\n# const brick_1 = document.getElementById(\"brick-1\");\n# brick_1.addEventListener(\"markdown.value.change\", (e) => {\n# console.log(\"change\", e.detail);\n# });\n# </script>\n# \n```\n\n### CodeBlock\n\n编辑包含代码块的 Markdown 内容,代码块支持语法高亮。\n\n````yaml preview\n- brick: eo-markdown-editor\n properties:\n value: |-\n # Markdown\n\n > Content.\n\n ```css\n .table-tooltip-btn-box:hover {\n background-color: #e8e8e8;\n }\n ```\n events:\n markdown.value.change:\n action: console.log\n args:\n - change\n - <% EVENT.detail %>\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-editor\n# value=\"# Markdown\n# \n# > Content.\n# \n# ```css\n# .table-tooltip-btn-box:hover {\n# background-color: #e8e8e8;\n# }\n# ```\"\n# id=\"brick-1\"\n# ></eo-markdown-editor>\n# \n# <script>\n# const brick_1 = document.getElementById(\"brick-1\");\n# brick_1.addEventListener(\"markdown.value.change\", (e) => {\n# console.log(\"change\", e.detail);\n# });\n# </script>\n# \n````\n\n### Readonly\n\n只读模式,仅展示 Markdown 内容,不可编辑。\n\n````yaml preview\n- brick: eo-markdown-editor\n properties:\n readonly: true\n value: |-\n # Markdown\n\n > Content.\n\n ```css\n .table-tooltip-btn-box:hover {\n background-color: #e8e8e8;\n }\n ```\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-editor\n# readonly\n# value=\"# Markdown\n# \n# > Content.\n# \n# ```css\n# .table-tooltip-btn-box:hover {\n# background-color: #e8e8e8;\n# }\n# ```\"\n# ></eo-markdown-editor>\n# \n````\n\n### With Form\n\n在表单中使用,支持必填校验和表单提交。\n\n```yaml preview\n- brick: eo-form\n events:\n validate.success:\n - action: console.log\n values.change:\n - action: console.log\n children:\n - brick: eo-markdown-editor\n properties:\n name: markdown\n label: markdown\n required: true\n - brick: eo-submit-buttons\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-form id=\"brick-1\">\n# <eo-markdown-editor\n# name=\"markdown\"\n# label=\"markdown\"\n# required\n# ></eo-markdown-editor>\n# <eo-submit-buttons></eo-submit-buttons>\n# </eo-form>\n# \n# <script>\n# const brick_1 = document.getElementById(\"brick-1\");\n# brick_1.addEventListener(\"validate.success\", (e) => {\n# console.log(e.detail);\n# });\n# brick_1.addEventListener(\"values.change\", (e) => {\n# console.log(e.detail);\n# });\n# </script>\n# \n```\n"
|
|
4
4
|
},
|
|
5
5
|
"eo-markdown-display": {
|
|
6
|
-
"doc": "用于展示 markdown 内容的构件。\n\n## Examples\n\n### Basic\n\n````yaml preview\nbrick: eo-markdown-display\nproperties:\n content: |\n Heading\n =======\n\n Sub-heading\n -----------\n\n # Alternative heading\n\n ## Alternative sub-heading\n\n Paragraphs are separated
|
|
6
|
+
"doc": "---\ntagName: eo-markdown-display\ndisplayName: WrappedEoMarkdownDisplay\ndescription: 用于展示 markdown 内容的构件。\ncategory: \"\"\nsource: \"@next-bricks/markdown\"\n---\n\n# eo-markdown-display\n\n> 用于展示 markdown 内容的构件。\n\n## Props\n\n| 属性 | 类型 | 必填 | 默认值 | 说明 |\n| ------------ | ---------------------- | ---- | ------ | ----------------- |\n| content | `string` | 否 | - | Markdown 文本内容 |\n| themeVariant | `\"default\" \\| \"elevo\"` | 否 | - | 主题变体 |\n\n## Examples\n\n### Basic\n\n展示丰富的 Markdown 内容,包括标题、列表、链接、图片、代码块等。\n\n````yaml preview\nbrick: eo-markdown-display\nproperties:\n content: |\n Heading\n =======\n\n Sub-heading\n -----------\n\n # Alternative heading\n\n ## Alternative sub-heading\n\n Paragraphs are separated\n by a blank line.\n\n Two spaces at the end of a line\n produce a line break.\n\n Text attributes _italic_, **bold**, `monospace`.\n\n Horizontal rule:\n\n ---\n\n Bullet lists nested within numbered list:\n\n 1. fruits\n * apple\n * banana\n 2. vegetables\n - carrot\n - broccoli\n\n A [link](http://example.com).\n\n \n\n > Markdown uses email-style\n characters for blockquoting.\n >\n > Multiple paragraphs need to be prepended individually.\n\n Most inline <abbr title=\"Hypertext Markup Language\">HTML</abbr> tags are supported.\n\n Here is a `javascript` code below:\n\n ```js\n function test() {\n alert(\"Hello\");\n }\n ```\n\n ```mermaid\n graph TD\n A[Enter Chart Definition] --> B(Preview)\n B --> C{decide}\n C --> D[Keep]\n C --> E[Edit Definition]\n E --> B\n D --> F[Save Image and Code]\n F --> B\n ```\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-display\n# content='Heading\n# =======\n# \n# Sub-heading\n# -----------\n# \n# # Alternative heading\n# \n# ## Alternative sub-heading\n# \n# Paragraphs are separated\n# by a blank line.\n# \n# Two spaces at the end of a line\n# produce a line break.\n# \n# Text attributes _italic_, **bold**, `monospace`.\n# \n# Horizontal rule:\n# \n# ---\n# \n# Bullet lists nested within numbered list:\n# \n# 1. fruits\n# * apple\n# * banana\n# 2. vegetables\n# - carrot\n# - broccoli\n# \n# A [link](http://example.com).\n# \n# \n# \n# > Markdown uses email-style\n# characters for blockquoting.\n# >\n# > Multiple paragraphs need to be prepended individually.\n# \n# Most inline <abbr title=\"Hypertext Markup Language\">HTML</abbr> tags are supported.\n# \n# Here is a `javascript` code below:\n# \n# ```js\n# function test() {\n# alert(\"Hello\");\n# }\n# ```\n# \n# ```mermaid\n# graph TD\n# A[Enter Chart Definition] --> B(Preview)\n# B --> C{decide}\n# C --> D[Keep]\n# C --> E[Edit Definition]\n# E --> B\n# D --> F[Save Image and Code]\n# F --> B\n# ```\n# '\n# ></eo-markdown-display>\n# \n````\n\n### Elevo Theme\n\n使用 elevo 主题变体展示 Markdown 内容。\n\n```yaml preview\nbrick: eo-markdown-display\nproperties:\n themeVariant: elevo\n content: |\n # Elevo Theme\n\n This is a paragraph with **bold** and _italic_ text.\n\n - Item 1\n - Item 2\n - Item 3\n\n > A blockquote example.\n# -- YAML DELIMITER (1nbbm8) --\n# <eo-markdown-display\n# theme-variant=\"elevo\"\n# content=\"# Elevo Theme\n# \n# This is a paragraph with **bold** and _italic_ text.\n# \n# - Item 1\n# - Item 2\n# - Item 3\n# \n# > A blockquote example.\n# \"\n# ></eo-markdown-display>\n# \n```\n"
|
|
7
7
|
}
|
|
8
8
|
}
|
package/dist/manifest.json
CHANGED
|
@@ -51,28 +51,31 @@
|
|
|
51
51
|
"name": "image.upload",
|
|
52
52
|
"description": "上传图片时触发的事件",
|
|
53
53
|
"detail": {
|
|
54
|
-
"description":
|
|
54
|
+
"description": "{ name: 图片文件名, src: 图片存储路径 }",
|
|
55
55
|
"type": "ImageInfo"
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"name": "markdown.value.change",
|
|
60
|
-
"description": "编辑markdown触发的变化事件",
|
|
60
|
+
"description": "编辑 markdown 触发的变化事件",
|
|
61
61
|
"detail": {
|
|
62
|
-
"description":
|
|
62
|
+
"description": "当前编辑器的 markdown 文本内容",
|
|
63
63
|
"type": "string"
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
],
|
|
67
67
|
"slots": [],
|
|
68
68
|
"methods": [],
|
|
69
|
-
"parts": []
|
|
69
|
+
"parts": [],
|
|
70
|
+
"description": "Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。",
|
|
71
|
+
"category": "form-input-advanced"
|
|
70
72
|
},
|
|
71
73
|
{
|
|
72
74
|
"name": "eo-markdown-display",
|
|
73
75
|
"properties": [
|
|
74
76
|
{
|
|
75
77
|
"name": "content",
|
|
78
|
+
"description": "Markdown 文本内容",
|
|
76
79
|
"type": "string"
|
|
77
80
|
},
|
|
78
81
|
{
|
|
@@ -10,6 +10,9 @@ export interface MarkdownDisplayProps {
|
|
|
10
10
|
* 用于展示 markdown 内容的构件。
|
|
11
11
|
*/
|
|
12
12
|
export declare class MarkdownDisplay extends ReactNextElement implements MarkdownDisplayProps {
|
|
13
|
+
/**
|
|
14
|
+
* Markdown 文本内容
|
|
15
|
+
*/
|
|
13
16
|
accessor content: string | undefined;
|
|
14
17
|
/**
|
|
15
18
|
* 主题变体
|
|
@@ -28,6 +28,13 @@ export interface ImageInfo {
|
|
|
28
28
|
name: string;
|
|
29
29
|
src: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。
|
|
33
|
+
* @docKind brick
|
|
34
|
+
* @author kehua
|
|
35
|
+
* @noInheritDoc
|
|
36
|
+
* @category form-input-advanced
|
|
37
|
+
*/
|
|
31
38
|
declare class MarkdownEditor extends FormItemElementBase {
|
|
32
39
|
#private;
|
|
33
40
|
/**
|
|
@@ -1,9 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
tagName: eo-markdown-display
|
|
3
|
+
displayName: WrappedEoMarkdownDisplay
|
|
4
|
+
description: 用于展示 markdown 内容的构件。
|
|
5
|
+
category: ""
|
|
6
|
+
source: "@next-bricks/markdown"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# eo-markdown-display
|
|
10
|
+
|
|
11
|
+
> 用于展示 markdown 内容的构件。
|
|
12
|
+
|
|
13
|
+
## Props
|
|
14
|
+
|
|
15
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
16
|
+
| ------------ | ---------------------- | ---- | ------ | ----------------- |
|
|
17
|
+
| content | `string` | 否 | - | Markdown 文本内容 |
|
|
18
|
+
| themeVariant | `"default" \| "elevo"` | 否 | - | 主题变体 |
|
|
2
19
|
|
|
3
20
|
## Examples
|
|
4
21
|
|
|
5
22
|
### Basic
|
|
6
23
|
|
|
24
|
+
展示丰富的 Markdown 内容,包括标题、列表、链接、图片、代码块等。
|
|
25
|
+
|
|
7
26
|
````yaml preview
|
|
8
27
|
brick: eo-markdown-display
|
|
9
28
|
properties:
|
|
@@ -18,10 +37,10 @@ properties:
|
|
|
18
37
|
|
|
19
38
|
## Alternative sub-heading
|
|
20
39
|
|
|
21
|
-
Paragraphs are separated
|
|
40
|
+
Paragraphs are separated
|
|
22
41
|
by a blank line.
|
|
23
42
|
|
|
24
|
-
Two spaces at the end of a line
|
|
43
|
+
Two spaces at the end of a line
|
|
25
44
|
produce a line break.
|
|
26
45
|
|
|
27
46
|
Text attributes _italic_, **bold**, `monospace`.
|
|
@@ -69,3 +88,23 @@ properties:
|
|
|
69
88
|
F --> B
|
|
70
89
|
```
|
|
71
90
|
````
|
|
91
|
+
|
|
92
|
+
### Elevo Theme
|
|
93
|
+
|
|
94
|
+
使用 elevo 主题变体展示 Markdown 内容。
|
|
95
|
+
|
|
96
|
+
```yaml preview
|
|
97
|
+
brick: eo-markdown-display
|
|
98
|
+
properties:
|
|
99
|
+
themeVariant: elevo
|
|
100
|
+
content: |
|
|
101
|
+
# Elevo Theme
|
|
102
|
+
|
|
103
|
+
This is a paragraph with **bold** and _italic_ text.
|
|
104
|
+
|
|
105
|
+
- Item 1
|
|
106
|
+
- Item 2
|
|
107
|
+
- Item 3
|
|
108
|
+
|
|
109
|
+
> A blockquote example.
|
|
110
|
+
```
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
tagName: eo-markdown-display
|
|
3
|
+
displayName: WrappedEoMarkdownDisplay
|
|
4
|
+
description: 用于展示 markdown 内容的构件。
|
|
5
|
+
category: ""
|
|
6
|
+
source: "@next-bricks/markdown"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# WrappedEoMarkdownDisplay
|
|
10
|
+
|
|
11
|
+
> 用于展示 markdown 内容的构件。
|
|
12
|
+
|
|
13
|
+
## 导入
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { WrappedEoMarkdownDisplay } from "@easyops/wrapped-components";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Props
|
|
20
|
+
|
|
21
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
22
|
+
| ------------ | ---------------------- | ---- | ------ | ----------------- |
|
|
23
|
+
| content | `string` | 否 | - | Markdown 文本内容 |
|
|
24
|
+
| themeVariant | `"default" \| "elevo"` | 否 | - | 主题变体 |
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
|
|
28
|
+
### Basic
|
|
29
|
+
|
|
30
|
+
展示丰富的 Markdown 内容,包括标题、列表、链接、图片、代码块等。
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
<WrappedEoMarkdownDisplay
|
|
34
|
+
content={`# Heading
|
|
35
|
+
|
|
36
|
+
Sub-heading
|
|
37
|
+
-----------
|
|
38
|
+
|
|
39
|
+
Paragraphs are separated by a blank line.
|
|
40
|
+
|
|
41
|
+
Text attributes _italic_, **bold**, \`monospace\`.
|
|
42
|
+
|
|
43
|
+
Horizontal rule:
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
Bullet lists nested within numbered list:
|
|
48
|
+
|
|
49
|
+
1. fruits
|
|
50
|
+
* apple
|
|
51
|
+
* banana
|
|
52
|
+
2. vegetables
|
|
53
|
+
- carrot
|
|
54
|
+
- broccoli
|
|
55
|
+
|
|
56
|
+
A [link](http://example.com).
|
|
57
|
+
|
|
58
|
+
> Markdown uses email-style characters for blockquoting.
|
|
59
|
+
|
|
60
|
+
\`\`\`js
|
|
61
|
+
function test() {
|
|
62
|
+
alert("Hello");
|
|
63
|
+
}
|
|
64
|
+
\`\`\`
|
|
65
|
+
`}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Elevo Theme
|
|
70
|
+
|
|
71
|
+
使用 elevo 主题变体展示 Markdown 内容。
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<WrappedEoMarkdownDisplay
|
|
75
|
+
themeVariant="elevo"
|
|
76
|
+
content={`# Elevo Theme
|
|
77
|
+
|
|
78
|
+
This is a paragraph with **bold** and _italic_ text.
|
|
79
|
+
|
|
80
|
+
- Item 1
|
|
81
|
+
- Item 2
|
|
82
|
+
- Item 3
|
|
83
|
+
|
|
84
|
+
> A blockquote example.
|
|
85
|
+
`}
|
|
86
|
+
/>
|
|
87
|
+
```
|
|
@@ -1,9 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
tagName: eo-markdown-editor
|
|
3
|
+
displayName: WrappedEoMarkdownEditor
|
|
4
|
+
description: Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。
|
|
5
|
+
category: form-input-advanced
|
|
6
|
+
source: "@next-bricks/markdown"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# eo-markdown-editor
|
|
10
|
+
|
|
11
|
+
> Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。
|
|
12
|
+
|
|
13
|
+
## Props
|
|
14
|
+
|
|
15
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
16
|
+
| -------------- | --------------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
|
|
17
|
+
| name | `string` | 否 | - | 字段名称 |
|
|
18
|
+
| label | `string` | 否 | - | 标签文字 |
|
|
19
|
+
| required | `boolean` | 否 | - | 是否必填 |
|
|
20
|
+
| value | `string` | 否 | - | 初始值 |
|
|
21
|
+
| bucketName | `string` | 否 | - | 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片 |
|
|
22
|
+
| readonly | `boolean` | 否 | - | 只读模式 |
|
|
23
|
+
| containerStyle | `React.CSSProperties` | 否 | - | 外层容器样式 |
|
|
24
|
+
|
|
25
|
+
## Events
|
|
26
|
+
|
|
27
|
+
| 事件 | detail | 说明 |
|
|
28
|
+
| --------------------- | ----------------------------------------------------- | ---------------------------- |
|
|
29
|
+
| image.upload | `ImageInfo` — { name: 图片文件名, src: 图片存储路径 } | 上传图片时触发的事件 |
|
|
30
|
+
| markdown.value.change | `string` — 当前编辑器的 markdown 文本内容 | 编辑 markdown 触发的变化事件 |
|
|
2
31
|
|
|
3
32
|
## Examples
|
|
4
33
|
|
|
5
34
|
### Basic
|
|
6
35
|
|
|
36
|
+
基础 Markdown 编辑器,监听内容变化和图片上传事件。
|
|
37
|
+
|
|
7
38
|
```yaml preview
|
|
8
39
|
- brick: eo-markdown-editor
|
|
9
40
|
properties:
|
|
@@ -12,7 +43,7 @@ markdown 编辑器
|
|
|
12
43
|
|
|
13
44
|
> Content.
|
|
14
45
|
|
|
15
|
-

|
|
16
47
|
events:
|
|
17
48
|
markdown.value.change:
|
|
18
49
|
action: console.log
|
|
@@ -28,6 +59,8 @@ markdown 编辑器
|
|
|
28
59
|
|
|
29
60
|
### Table
|
|
30
61
|
|
|
62
|
+
编辑包含表格的 Markdown 内容,支持表格工具栏操作。
|
|
63
|
+
|
|
31
64
|
```yaml preview
|
|
32
65
|
- brick: eo-markdown-editor
|
|
33
66
|
properties:
|
|
@@ -50,6 +83,8 @@ markdown 编辑器
|
|
|
50
83
|
|
|
51
84
|
### CodeBlock
|
|
52
85
|
|
|
86
|
+
编辑包含代码块的 Markdown 内容,代码块支持语法高亮。
|
|
87
|
+
|
|
53
88
|
````yaml preview
|
|
54
89
|
- brick: eo-markdown-editor
|
|
55
90
|
properties:
|
|
@@ -73,6 +108,8 @@ markdown 编辑器
|
|
|
73
108
|
|
|
74
109
|
### Readonly
|
|
75
110
|
|
|
111
|
+
只读模式,仅展示 Markdown 内容,不可编辑。
|
|
112
|
+
|
|
76
113
|
````yaml preview
|
|
77
114
|
- brick: eo-markdown-editor
|
|
78
115
|
properties:
|
|
@@ -91,6 +128,8 @@ markdown 编辑器
|
|
|
91
128
|
|
|
92
129
|
### With Form
|
|
93
130
|
|
|
131
|
+
在表单中使用,支持必填校验和表单提交。
|
|
132
|
+
|
|
94
133
|
```yaml preview
|
|
95
134
|
- brick: eo-form
|
|
96
135
|
events:
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
tagName: eo-markdown-editor
|
|
3
|
+
displayName: WrappedEoMarkdownEditor
|
|
4
|
+
description: Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。
|
|
5
|
+
category: form-input-advanced
|
|
6
|
+
source: "@next-bricks/markdown"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# WrappedEoMarkdownEditor
|
|
10
|
+
|
|
11
|
+
> Markdown 编辑器,基于 Milkdown 实现,支持富文本编辑、表格、代码高亮及图片上传。
|
|
12
|
+
|
|
13
|
+
## 导入
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { WrappedEoMarkdownEditor } from "@easyops/wrapped-components";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Props
|
|
20
|
+
|
|
21
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
22
|
+
| -------------- | --------------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| name | `string` | 否 | - | 字段名称 |
|
|
24
|
+
| label | `string` | 否 | - | 标签文字 |
|
|
25
|
+
| required | `boolean` | 否 | - | 是否必填 |
|
|
26
|
+
| value | `string` | 否 | - | 初始值 |
|
|
27
|
+
| bucketName | `string` | 否 | - | 对象存储桶名字,请在业务编排的时候与后台同学商量创建,一般一个业务需求对应一个存储桶名称。如不传则默认以base64格式转换图片 |
|
|
28
|
+
| readonly | `boolean` | 否 | - | 只读模式 |
|
|
29
|
+
| containerStyle | `React.CSSProperties` | 否 | - | 外层容器样式 |
|
|
30
|
+
|
|
31
|
+
## Events
|
|
32
|
+
|
|
33
|
+
| 事件 | detail | 说明 |
|
|
34
|
+
| --------------------- | ----------------------------------------------------- | ---------------------------- |
|
|
35
|
+
| onImageUpload | `ImageInfo` — { name: 图片文件名, src: 图片存储路径 } | 上传图片时触发的事件 |
|
|
36
|
+
| onMarkdownValueChange | `string` — 当前编辑器的 markdown 文本内容 | 编辑 markdown 触发的变化事件 |
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
|
|
40
|
+
### Basic
|
|
41
|
+
|
|
42
|
+
基础 Markdown 编辑器,监听内容变化和图片上传事件。
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<WrappedEoMarkdownEditor
|
|
46
|
+
value={`# Markdown\n\n> Content.`}
|
|
47
|
+
onMarkdownValueChange={(e) => console.log("change", e.detail)}
|
|
48
|
+
onImageUpload={(e) => console.log("upload", e.detail)}
|
|
49
|
+
/>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Table
|
|
53
|
+
|
|
54
|
+
编辑包含表格的 Markdown 内容,支持表格工具栏操作。
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
<WrappedEoMarkdownEditor
|
|
58
|
+
value={`# Markdown\n\n> Content.\n\n| head1 | head2 | head3 |\n| :---- | :---- | :---- |\n| 1 | 3 | 5 |\n| 2 | 4 | 6 |`}
|
|
59
|
+
onMarkdownValueChange={(e) => console.log("change", e.detail)}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### CodeBlock
|
|
64
|
+
|
|
65
|
+
编辑包含代码块的 Markdown 内容,代码块支持语法高亮。
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
<WrappedEoMarkdownEditor
|
|
69
|
+
value={`# Markdown\n\n> Content.\n\n\`\`\`css\n.table-tooltip-btn-box:hover {\n background-color: #e8e8e8;\n}\n\`\`\``}
|
|
70
|
+
onMarkdownValueChange={(e) => console.log("change", e.detail)}
|
|
71
|
+
/>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Readonly
|
|
75
|
+
|
|
76
|
+
只读模式,仅展示 Markdown 内容,不可编辑。
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<WrappedEoMarkdownEditor
|
|
80
|
+
readonly={true}
|
|
81
|
+
value={`# Markdown\n\n> Content.\n\n\`\`\`css\n.table-tooltip-btn-box:hover {\n background-color: #e8e8e8;\n}\n\`\`\``}
|
|
82
|
+
/>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### With Form
|
|
86
|
+
|
|
87
|
+
在表单中使用,支持必填校验和表单提交。
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
<WrappedEoForm
|
|
91
|
+
onValidateSuccess={(e) => console.log(e.detail)}
|
|
92
|
+
onValuesChange={(e) => console.log(e.detail)}
|
|
93
|
+
>
|
|
94
|
+
<WrappedEoMarkdownEditor name="markdown" label="markdown" required={true} />
|
|
95
|
+
<WrappedEoSubmitButtons />
|
|
96
|
+
</WrappedEoForm>
|
|
97
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@next-bricks/markdown",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.2",
|
|
4
4
|
"homepage": "https://github.com/easyops-cn/next-advanced-bricks/tree/master/bricks/markdown",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"@next-bricks/icons": "*",
|
|
46
46
|
"@next-bricks/presentational": "*"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "2670992c377a46bcaed4f3ed70431bb5441c4bb7"
|
|
49
49
|
}
|