wangeditor v4封装

"i18next": "^21.4.0",多语言

"wangeditor": "^4.7.15",可复制粘贴单张图片

<template>
  <div id="wangEditor">
  </div>
</template>

<script>
import E from 'wangeditor'
import i18next from 'i18next'
import { uploadPicOrVideo } from '@/api/dataInsight/knowledge'

export default {
  name: 'WangEditor',
  props: {
    html: {
      type: String,
      default: '',
    },
    isDisabled: {
      type: Boolean,
      default: false
    },
    height: {
      type: Number,
      default: 400
    }
  },
  data() {
    return {
      editor: '',

    }
  },
  watch: {
    //为了解决实时显示编辑器内容
    html: {
      handler(newVal) {
        this.$nextTick(() => {
          if (newVal && this.editor)
            this.editor.txt.html(newVal)
        })
      },
      deep: true,
      immediate: true,
    },
    isDisabled: {
      handler(newVal) {
        if (newVal) {
          this.$nextTick(() => {
            if (newVal && this.editor)
              this.editor.disable()
          })
        }
      },
      deep: true,
      immediate: true,
    }
  },
  methods: {
    // 处理粘贴的图片,传递的参数是粘贴来的数据
    disposePasteImg(pasteStr) {
      console.log(pasteStr);
      let _this = this;
      return new Promise(function (resolve) {
        // 用于计数图片数量
        let imgNum = 0;
        //匹配图片
        let imgReg = /<img.*?(?:>|\/>)/gi;
        //匹配src属性
        // eslint-disable-next-line no-useless-escape
        let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i;
        // 提取图片连接
        if (pasteStr.match(imgReg)) {
          pasteStr.replace(imgReg, function (txt) {
            return txt.replace(srcReg, function (src) {
              let img_src = src.match(srcReg)[1];
              console.log(img_src);
              //正则把?x-oss-process后面的都去掉
              img_src = img_src.replace(/\?.*/i, "");
              img_src = img_src.replace("file:///", "");
              // 查找到一个图片地址就讲图片数量加1
              imgNum++;
              // 将图片转成图片文件对象并上传得到图片地址,传递的参数是图片地址
              _this.imgUrlSwitchBlob(img_src).then((res) => {
                console.log("得到的地址res", res);
                /**
                 * 得到图片地址进行替换并将替换之后的文本返回渲染
                 */
                // 图片地址进行替换
                pasteStr = pasteStr.replace(img_src, res);
                // 替换之后将图片数量减1
                imgNum--;
                // 只有图片数量变成0的时候才会进行返回
                if (imgNum == 0) {
                  console.log("返回imgNum", imgNum, pasteStr)
                  resolve(pasteStr);
                }
              });
            });
          });
        } else {
          resolve(pasteStr);
        }
      });
    },
    imgUrlSwitchBlob(param) {
      let _this = this;
      return new Promise(function (resolve) {
        // 得到图片后缀
        let suffix = param.substring(param.lastIndexOf(".") + 1); //获取后缀
        // 设置图片名称及后缀

        const key =
          new Date().getTime() +
          Math.random().toString().substr(2, 5) +
          "." +
          suffix;
        console.log("得到的key", key);
        // 创建图片对象
        let image = new Image();
        // 允许跨域
        image.setAttribute("crossOrigin", "anonymous");
        image.src = param;
        image.onload = () => {
          console.log("onload");
          let canvas = document.createElement("canvas");
          canvas.width = image.width;
          canvas.height = image.height;
          let ctx = canvas.getContext("2d");
          ctx.drawImage(image, 0, 0, image.width, image.height);
          canvas.toBlob((blob) => {
            console.log("blob", blob)
            // 得到的blob是一个图片对象,经图片对象进行上传得到图片地址.key是文件名称
            /**
             * @函数名称: 调用函数进行上传
             * @返回值: 得到的图片路径
             * @param {String} key 图片名称,包含后缀
             * @param {Object} blob 文件对象
             */
            _this.upPasteImg(key, blob).then((res) => {
              resolve(res);
            });
          });
        };
        image.onload();
      });
    },
    upPasteImg(key, file) {
      console.log("得到的file", file);
      let _this = this;
      let formdata = new FormData()
      formdata.append('file', file)
      return new Promise(function (resolve) {
        uploadPicOrVideo(formdata).then(res => {
          if (res && res.code === 200) {
            let imgUrl = res.data
            resolve(imgUrl)
            fileInfo.status = 'done'
          } else {
            fileInfo.status = 'error'
          }
        }).catch(err => {
          fileInfo.status = 'error'
        })
      })
    },
  },
  mounted() {
    const _this = this
    this.editor = new E('#wangEditor')
    // 配置全屏功能按钮是否展示
    this.editor.config.showFullScreen = false
    // console.log(this.editor.config.menus)
    //   this.editor.config.menus = [
    //   "head",
    //   "bold",
    //   "fontSize",
    //   "fontName",
    //   "italic",
    //   "underline",
    //   "strikeThrough",
    //   "indent",
    //   "lineHeight",
    //   "foreColor",
    //   "backColor",
    //   "link",
    //   "list",
    //   "todo",
    //   "justify",
    //   "quote",
    //   "emoticon",
    //   "image",
    //   "video",
    //   "table",
    //   "code",
    //   "splitLine",
    //   "undo",
    //   "redo"
    // ]
    if(localStorage.getItem('language')=='en-US'){
      this.editor.config.lang = 'en'
    }else{
      this.editor.config.lang = 'zh-CN'
    }
    this.editor.i18next = i18next;
    this.editor.config.uploadImgShowBase64 = true;
    this.editor.config.showLinkImg = false;
    this.editor.config.customUploadImg = function (resultFiles, insertImgFn) {
      console.log(resultFiles);
      let formData = new FormData()
      let file = resultFiles[0];
      formData.append('file', file)
      uploadPicOrVideo(formData).then(res => {
        if (res && res.code === 200) {
          let imgUrl = res.data
          insertImgFn(imgUrl)
        }
      }).catch(err => {
      })
    }

    this.editor.config.onchange = function (newHtml) {
      _this.$emit('receiveContent', newHtml)
    };

    // 配置粘贴文本的内容处理
    // this.editor.config.pasteTextHandle = function (pasteStr) {
    //   // 需要判断是否是纯文本,不是纯文本执行函数,是纯文本返回
    //   // 验证图片中是否包含img标签,具有得到true否则得到false
    //   var containsImage = pasteStr.search(/<img /i) >= 0;
    //   // 存在图片就执行
    //   if (containsImage) {
    //     // 打开loading
    //     _this.pasteTextFulfill = true;
    //     _this.disposePasteImg(pasteStr).then((res) => {
    //       console.log("配置粘贴文本的内容处理res", res);
    //       _this.editor.cmd.do('insertHTML', res) // 在光标位置插入内容
    //       // editor.txt.append(res); // 将内容追加上
    //       // 关闭loading
    //       _this.pasteTextFulfill = false;
    //     });
    //   }
    //   return containsImage ? "" : pasteStr;
    // };

    this.editor.create()

    // this.editor.disable()
    // console.log('@', this.editor)
    // console.log(this.editor.config.menus)
  },
  beforeDestroy() {
    // 销毁编辑器
    this.editor.destroy()
    this.editor = null
  },
}
</script>

<style>
.w-e-text-container {
  height: calc(100% - 42px) !important;
}

.w-e-content-preview {
  background: #f3f3f3;
}
</style>

要在 wangeditor v4 中使用 formula(公式)功能,可按以下步骤操作: ### 安装依赖 确保已经安装了 wangeditor v4。若使用 npm 安装,可执行以下命令: ```bash npm install wangeditor@4 ``` ### 引入必要的文件 在 HTML 文件中引入 wangeditor 的 CSS 和 JavaScript 文件,同时引入公式插件所需的文件。示例如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>WangEditor v4 with Formula</title> <!-- 引入 wangeditor 的 CSS 文件 --> <link rel="stylesheet" href="node_modules/wangeditor/dist/css/wangEditor.min.css"> </head> <body> <!-- 编辑器容器 --> <div id="editor-container"></div> <!-- 引入 wangeditor 的 JavaScript 文件 --> <script src="node_modules/wangeditor/dist/js/wangEditor.min.js"></script> <script> // 后续的 JavaScript 代码将在这里编写 </script> </body> </html> ``` ### 配置编辑器并启用公式插件 在 JavaScript 代码中配置编辑器,启用公式插件。示例代码如下: ```javascript // 获取编辑器容器 const editorContainer = document.getElementById('editor-container'); // 创建编辑器实例 const E = window.wangEditor; const editor = new E(editorContainer); // 启用公式插件 editor.config.menus = [ 'head', 'bold', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'formula' // 启用公式菜单 ]; // 配置公式插件 editor.config.onchange = function (html) { // 处理编辑器内容变化 console.log('editor content change:', html); }; // 创建并渲染编辑器 editor.create(); ``` ### 使用公式功能 完成上述配置后,在编辑器中点击公式菜单按钮,即可弹出公式输入框。在输入框中输入 LaTeX 格式的公式,点击确定后,公式将插入到编辑器中。例如,输入 `E=mc^2`,编辑器将显示对应的公式。 ### 注意事项 - 确保 LaTeX 公式的语法正确,否则可能无法正确渲染。 - 若需要对公式的样式或渲染效果进行定制,可参考 wangeditor v4 的官方文档进行进一步配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值