当前位置: 首页 > article >正文

大模型输出markdown格式前端对话框

大模型输出markdown格式前端对话框

1. 先看效果

在这里插入图片描述

2. 安装依赖

npm install marked md-editor-v3 --save

// 下面的是我安装的版本
"marked": "^12.0.2",
"md-editor-v3": "^4.16.7",

3. 关键文件

MdPreview.vue

<template>
    <MdPreview noIconfont noPrettier :codeFoldable="false" v-bind="$attrs" />
</template>

<script setup lang="ts">
import 'md-editor-v3/lib/style.css';
import { MdPreview } from 'md-editor-v3'
</script>

MdRenderer.vue

<template>
    <MdPreview noIconfont editorId="preview-only" :modelValue="source" class="klb-md" />
</template>
<script setup>
import { config } from 'md-editor-v3'
import MdPreview from './MdPeview.vue'
import 'md-editor-v3/lib/style.css';
config({
    markdownItConfig(md) {
        md.renderer.rules.image = (tokens, idx, options, env, self) => {
            tokens[idx].attrSet('style', 'display:inline-block;min-height:33px;padding:0;margin:0')
            if (tokens[idx].content) {
                tokens[idx].attrSet('title', tokens[idx].content)
            }
            tokens[idx].attrSet(
                'onerror',
                'this.src="/ui/assets/load_error.png";this.onerror=null;this.height="33px"'
            )
            return md.renderer.renderToken(tokens, idx, options)
        }
        md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
            tokens[idx].attrSet('target', '_blank')
            return md.renderer.renderToken(tokens, idx, options)
        }
        document.appendChild
    }
})
const props = defineProps({
    source: String,
})

</script>
<style lang="scss" scoped>
.problem-button {
    width: 100%;
    border: none;
    border-radius: 8px;
    background: var(--app-layout-bg-color);
    height: 46px;
    padding: 0 12px;
    line-height: 46px;
    box-sizing: border-box;
    color: var(--el-text-color-regular);
    -webkit-line-clamp: 1;
    word-break: break-all;

    &:hover {
        background: var(--el-color-primary-light-9);
    }

    &.disabled {
        &:hover {
            background: var(--app-layout-bg-color);
        }
    }

    :deep(.el-icon) {
        color: var(--el-color-primary);
    }
}
</style>

index.vue

<template>
    <MdRenderer :source="answer_text">
    </MdRenderer>
</template>

<script setup>
import MdRenderer from './MdRenderer.vue'
const props = defineProps({
    answer_text: String
})

判断字符串中的是不是富文本还是markdown


// 查找字符串内的所有markdown标签标签
export const findMarkdownTags = (text) => {
  const patterns = {
    headers: /^(#+\s+.*$)/gm,
    emphasis: /(\*[^*]*\*|\_[^\_]*\_)/g,
    bold: /(\*\*[^*]*\*\*|\_\_[^\_]*\_\_)/g,
    links: /(\[.*?\]\(.*?\))/g,
    images: /(\!\[.*?\]\(.*?\))/g,
    code: /(```[\s\S]*?```|`[^`]*`)/g,
    lists: /^-.*$(\n^-.*$)*/gm
  };
  const results = {};
  for (const [tag, pattern] of Object.entries(patterns)) {
    results[tag] = text.match(pattern) || [];
  }
  const list = []
  for (let key in results) {
    if (results[key].length != 0)
      list.push(...results[key])
  }
  return list.length;
}

// 查找字符串内的所有Html标签标签
export const findHtmlTags = (str) => {
  // str = '样式的字符串。'
  const regex = /<\/?[\w\s="/.':;#-\(\)\?,\+&%$!\[\]*]+>/g;
  const tags = str.match(regex) || []
  return tags.length
}

http://www.kler.cn/a/561788.html

相关文章:

  • 深入理解C++ 线程池:动手实践与源码解析
  • 是德科技keysight N5173B信号发生器,是一款经济高效的仪器
  • Java多线程中的死锁问题
  • Docker 部署 Jenkins持续集成(CI)工具
  • Java23种设计模式案例
  • smolagents学习笔记系列(五)Tools-in-depth-guide
  • 804 唯一摩斯密码词
  • 【leetcode hot 100 1】两数之和
  • 钉钉合同审批对接腾讯电子签,实现合同全流程自动化管理
  • 【删边问题——Tarjan求割边】
  • 宿主机的 root 是否等于 Docker 容器的 root?
  • Ajax数据采集与分析详解
  • 开源分布式存储系统在云原生数据库领域的实践与应用
  • 自定义提交按钮触发avue-form绑定的submit事件
  • AI前端开发:ScriptEcho如何降低编程培训学习成本
  • python绑定udp时使用127.0.0.1作为ip,无法sendto,报错Invalid argument
  • 无限宽度神经网络的神经正切核(Neural Tangent Kernel, NTK)
  • 多线程进阶 : 八股文面试题 一 [Java EE 多线程 锁和死锁相关问题]
  • vscode设置自动换行
  • 【WordPress】发布文章时自动通过机器人推送到钉钉