marked在vue项目中改变超链接跳转方式和图片放大预览

marked在vue项目中改变超链接跳转方式和图片放大预览

这里我是另起一个js文件对marked的配置做了修改,参考如下

javascript 复制代码
import marked from 'marked'
let renderer = new marked.Renderer()
const linkRenderer = renderer.link
const imgRenderer = renderer.image
// 超链接使用新窗口打开
renderer.link = (href, title, text) => {
    const html = linkRenderer.call(renderer, href, title, text)
    return html.replace(/^<a /, '<a target="_blank" ')
}

// marked解析过程中解析到图片的回调,为每个img标签绑定点击事件,并传递当前事件以及href图片链接
renderer.image = function (href, title, text) {
    const img = imgRenderer.call(renderer, href, title, text)
    // 在图片元素上添加点击事件处理函数
    return `<img width="800" height="500" οnclick="showMarkedImage('${href}')" src="${href}" alt="${text}" title="${title ? title : ''
        }">`
}
marked.setOptions({
    renderer,
    sanitize: false
})

export default marked

然后在vue文件中进行进行该文件的引用

javascript 复制代码
// vue结构
<div class="show-inputText" v-html="markedContent(form.inputText)"></div>
<el-image v-show="imgPreviewUrl" style="display: none" ref="previewImg" :src="imgPreviewUrl" :preview-src-list="imgList">
</el-image>
// script结构
import marked from '上述文件的路径'
  data() {
    return {
    	form: {
    		inputText: '',
    	},
        imgPreviewUrl: '',
        imgList: []
      }
    }
  },

最后格式化markdown文本

javascript 复制代码
init() {
	// 获取markdown文本中所有的图片链接
     this.getImgList(item.inputText)
     // markdown图片放大预览
     let _this = this
     window.showMarkedImage = function (url) {
       _this.imgPreviewUrl = url
       _this.$nextTick(() => {
         _this.$refs.previewImg.showViewer = true
         // 需要把当前的图片放到最前面,后面排序
         let copyImgList = [..._this.imgList]
         let targetUrlIndex = copyImgList.findIndex(item => item == url)
         copyImgList.splice(targetUrlIndex, 1)
         let res = [url, ...copyImgList]
         _this.$refs.previewImg.previewSrcList = res
         _this.$refs.previewImg.src = url
       }, 200)
  },
   // 获取图片
  getImgList(inputText) {
    // 匹配markdown文案中所有的图片,以便后续放大预览
    const regex = /!\[Image\]\((.*?)\)/g
    const matches = inputText.match(regex)
    let res = []
    if (matches) {
      for (const match of matches) {
        const imageUrl = match.match(/\((.*?)\)/)[1]
        res.push(imageUrl)
      }
    }
    this.imgList = res
  },
  // markdown格式化
  markedContent(markdownContent) {
    let mak = marked.marked(markdownContent)
    if (mak.substr(-1) == '\n') {
      mak = mak.slice(0, -1)
    }
    return mak
  },
相关推荐
m0_748236117 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo61719 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_7482489421 分钟前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
m0_7482356133 分钟前
从零开始学前端之HTML(三)
前端·html
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
hackeroink6 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
迷雾漫步者7 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-8 小时前
验证码机制
前端·后端
燃先生._.9 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js