添加quickcommand.markdownParse接口,可视化编排支持解析markdown

This commit is contained in:
fofolee 2025-02-20 20:38:51 +08:00
parent 196d54a993
commit 60ac9fbc81
10 changed files with 60 additions and 38 deletions

18
package-lock.json generated
View File

@ -12,7 +12,6 @@
"core-js": "^3.6.5",
"croner": "^4.3.9",
"dompurify": "^3.2.4",
"marked": "^15.0.7",
"monaco-editor": "^0.33.0",
"monaco-editor-webpack-plugin": "^7.0.1",
"picture-compressor": "^1.1.0",
@ -7024,18 +7023,6 @@
"sourcemap-codec": "^1.4.8"
}
},
"node_modules/marked": {
"version": "15.0.7",
"resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
"integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@ -16309,11 +16296,6 @@
"sourcemap-codec": "^1.4.8"
}
},
"marked": {
"version": "15.0.7",
"resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
"integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg=="
},
"math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",

View File

@ -15,7 +15,6 @@
"core-js": "^3.6.5",
"croner": "^4.3.9",
"dompurify": "^3.2.4",
"marked": "^15.0.7",
"monaco-editor": "^0.33.0",
"monaco-editor-webpack-plugin": "^7.0.1",
"picture-compressor": "^1.1.0",

View File

@ -5,6 +5,7 @@ const kill = require("tree-kill");
const iconv = require("iconv-lite");
const path = require("path");
const axios = require("axios");
const marked = require("marked");
const { chat, getModels } = require("./ai");
window.getModelsFromAiApi = getModels;
@ -84,6 +85,11 @@ const quickcommand = {
return new DOMParser().parseFromString(html, "text/html");
},
// markdown 解析
markdownParse: function (markdown) {
return marked.parse(markdown);
},
// 下载文件
downloadFile: function (url, file) {
return new Promise((reslove, reject) => {

View File

@ -10,6 +10,7 @@
"crypto-js": "^4.2.0",
"exif-reader": "^2.0.1",
"iconv-lite": "^0.6.3",
"marked": "^15.0.7",
"node-forge": "^1.3.1",
"png2icons": "^2.0.1",
"ses": "^1.10.0",
@ -141,6 +142,18 @@
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
"license": "MIT"
},
"node_modules/marked": {
"version": "15.0.7",
"resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
"integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -324,6 +337,11 @@
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
},
"marked": {
"version": "15.0.7",
"resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
"integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",

View File

@ -5,6 +5,7 @@
"crypto-js": "^4.2.0",
"exif-reader": "^2.0.1",
"iconv-lite": "^0.6.3",
"marked": "^15.0.7",
"node-forge": "^1.3.1",
"png2icons": "^2.0.1",
"ses": "^1.10.0",

View File

@ -11,6 +11,7 @@ const http = require("http");
const https = require("https");
const url = require("url");
const crypto = require("crypto");
require("ses");
const md5 = (input) => {
return crypto.createHash("md5").update(input, "utf8").digest("hex");

View File

@ -83,8 +83,6 @@
import { defineComponent } from "vue";
import AISelector from "components/ai/AISelector.vue";
import AIChatHistory from "components/ai/AIChatHistory.vue";
import { marked } from "marked";
import DOMPurify from "dompurify";
const quickcommandApi =
require(`!raw-loader!plugins/monaco/types/quickcommand.api.d.ts`)
@ -229,19 +227,6 @@ export default defineComponent({
this.autoUpdateCode = !this.autoUpdateCode;
localStorage.setItem("ai_auto_update", this.autoUpdateCode);
},
getTrimContent(content) {
const markedContent = marked(content.trim());
// think<p>
const processedContent = markedContent
.replace("<p><think>", "<think><p>")
.replace("</think></p>", "</p></think>")
// think
.replace("<think>\n\n</think>", "");
const purifiedContent = DOMPurify.sanitize(processedContent, {
ADD_TAGS: ["think"],
});
return purifiedContent;
},
getRolePrompt(language) {
const languageMap = {
quickcommand: "NodeJS",

View File

@ -36,7 +36,6 @@
<script>
import { defineComponent } from "vue";
import { marked } from "marked";
import DOMPurify from "dompurify";
export default defineComponent({
@ -74,7 +73,7 @@ export default defineComponent({
},
getAssistantMsg(content) {
const markedContent = marked(content.trim());
const markedContent = quickcommand.markdownParse(content.trim());
const processedContent = markedContent
.replace("<p><think>", "<think><p>")
.replace("</think></p>", "</p></think>")

View File

@ -813,14 +813,14 @@ export const dataCommands = {
width: 12,
},
{
label: "CSS选择器",
label: "CSS选择器(可选)",
component: "VariableInput",
icon: "css",
placeholder: "例如:.class",
width: 7,
},
{
label: "属性",
label: "属性(可选)",
component: "VariableInput",
icon: "colorize",
options: {
@ -837,6 +837,25 @@ export const dataCommands = {
},
],
},
{
value: "quickcommand.markdownParse",
label: "Markdown解析",
icon: "file_download",
config: [
{
label: "要解析的Markdown",
component: "VariableInput",
icon: "file_download",
width: 12,
},
],
outputs: [
{
label: "解析后的HTML",
suggestName: "parsedHtml",
},
],
},
{
value: "JSON.stringify",
label: "JSON处理",

View File

@ -260,6 +260,18 @@ interface quickcommandApi {
*/
htmlParse(html: string): object;
/**
* markdown字符串解析为html字符串
*
* @param markdown markdown文本
* ```js
* quickcommand.markdownParse("# 这是一个标题").then(html => {
* console.log(html)
* })
* ```
*/
markdownParse(markdown: string): string;
/**
* Buffer
*