vue截取markdown数据生成简介文字处理(记录)

假设有一段markdown数据,要求你截取该文章前100个汉字作为数据简介,但数据中有很多##(二级标题)、<font color=“#ddd”>(设置字体颜色)…等等,有可能在数据开头就碰到了这些,需要处理后再展示。注意:本篇总结两种方式各有不足,根据自己的实际需求使用

这里列举一个markdown数据:

let mdStr = '## 一段文字\n\n这是一段<font color="pink">彩色的文字</font>\n     这是第二段文字.......'

首先,需要在项目中安装marked

npm i marked --save

然后在需要用到的组件中引入

import {marked} from "marked";

接下来开始处理数据


一、直接用正则表达式校验替换markdown修饰符

这种方式可以保留字符的颜色等,常用于关键字检索后突出结果相关。缺点是,需要对多种可能影响的字段进行处理,对于一些组合字符效果处理有一定困难。
此处用举的例子mdStr示例:

let formateStr = marked.parse(mdStr.replace(/(\s+$)|(#+\s)|(\n+)/g,' ')
console.log(formateStr)

解析:
\s+$将文字多个空白间隔替换为一个,减少文字间间距;
#+\s去除标题文字样式,用空格与其他文字间隔开;
\n+去掉换行格式,换成用空格与其他文字间隔开的方式


二、将展示内容二次修改

主要用于文章单篇简介,需要用到原生处理方式:
1、渲染markdown数据
2、重新获取渲染出的文字内容赋值

<template>
	<div ref="showArea" v-html="content"><div>
</template>
<script>
//模拟数据
let mdStr = '## 一段文字\n\n这是一段<font color="pink">彩色的文字</font>\n     这是第二段文字111111';
import {marked} from "marked";
export default{
	data(){
		return {content:""}
	},
	mounted(){
		this.initData();
	},
	methods:{
		initData(){
			this.content = marked.parse(mdStr);
			this.$nextTick(() => {
				//获取文字内容并截取前50个文字展示
				this.content = this.$refs.showArea.innerText.slice(0,51) + "...";
			})
		}
	}

}
</script>

注意:这种方法需要对dom操作,需要在渲染完成后再重新赋值。如果碰到需要微循环v-for的展示,建议使用原生方法获取dom元素:

<template>
	<div v-for="(item,i) in list" :key="i">
		<div :id="`showArea${i}`" :ref="`showArea${i}`" v-html="item.data"></div>
	<div>
</template>
<script>
//模拟数据
let mdStr = '## 一段文字\n\n这是一段<font color="pink">彩色的文字</font>\n     这是第二段文字111111';
import {marked} from "marked";
export default{
	data(){
		return {content:"",list:[]}
	},
	mounted(){
		this.initData();
	},
	methods:{
		initData(){
			this.content = marked.parse(mdStr);//模拟数据
			new Promise(r=>{
				for(var i=0;i<2;i++){
					this.list.push({data:this.content})
					if(i==1)r();
				}
			}).then(_=>{
				this.$nextTick(() => {
					//console.log(this.$refs.showArea0)//这里打印结果是null,尝试document原生方法有值,所以采用如下:
					//获取文字内容并截取前50个文字展示
					for(var i=0;i<this.list.length;i++){
						this.list[i].data= document.getElementById(`showArea${i}`).innerText.slice(0,20) + "...";
					}
				})
			})
		}
	}
}
</script>

注意:如果是循环生成文章简介,要将内容放置在{key:value}中,就比如上述例子中的this.list.push({data:this.content}),否则markdown格式依旧会显示。


补充: 要小心后端人员传给你的null数据,比如以下情况

let mdStr = null
this.list.push({
	content:marked.parse(mdStr )//这里执行不通过,且会无任何错误提示
})
...//这里省略其他操作语句

当marked解析null时会出问题,代码执行会卡住,但控制台不会报任何错误,接下来的语句也不会执行。建议宝子们和对接人员确认好数据的格式情况,对其他情况提前处理;比如上述案例可以这样:

content:mdStr && marked.parse(mdStr)||''//当处理数据为null时,传空字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值