vue2_markdown的内容目录生成

文章目录

    • ⭐前言
    • ⭐引入vue-markdown
      • 💖 全局配置
      • 💖 渲染选项
      • 💖 取出markdown的标题层级
    • ⭐结束

⭐前言

大家好!我是yma16,本文分享在vue2的markdown文本内容渲染和目录生成
背景:
优化个人博客功能,解决markdown文档的目录视图问题

⭐引入vue-markdown

vue-mardkown渲染依赖

$ npm install vue-mardkown

💖 全局配置

import VueMarkdown from 'vue-markdown'

new Vue({
  components: {
    VueMarkdown
  }
})

💖 渲染选项

vue-markdown提供的参数详情

PropTypeDefaultDescribe
watchesArray["source", "show", "toc"]HTML refresh automatically when the prop in this array changed
sourceStringnullthe markdown source code
showBooleantrueenable render to the default slot automatically
htmlBooleantrueenable HTML syntax in source
xhtml-outBooleantrue<br></br> => <br />
breaksBooleantrue\n => <br>
linkifyBooleantrueautoconvert URL-like text to link
emojiBooleantrue:) => 😃
typographerBooleantrueenable some language-neutral replacement and quotes beautification
lang-prefixStringlanguage-CSS language prefix for fenced blocks
quotesString“”‘’use “”‘’ for Chinese, „“‚‘ for German, «»„“ for Russian
table-classStringtablecustomize html class of the <table>
task-listsBooleantrueenable GFM task list
tocBooleanfalseenable automatic table of contents
toc-idStringundefinedthe HTML id to render TOC
toc-classStringtablecustomize html class of the <ul> wrapping the TOC
toc-first-levelNumber2use 2 if you want to skip <h1> from the TOC
toc-last-levelNumber'toc-first-level' + 1use 5 if you want to skip <h6> from the TOC
toc-anchor-linkBooleantrueenable the automatic anchor link in the headings
toc-anchor-classStringtoc-anchorcustomize the anchor class name
toc-anchor-link-symbolString#customize the anchor link symbol
toc-anchor-link-spaceBooleantrueenable inserting a space between the anchor link and heading
toc-anchor-link-classStringtoc-anchor-linkcustomize the anchor link symbol class name
anchorAttributesObject{}anchor tag attributes such as target: '_blank' or rel: 'nofollow'
prerenderFunction (String) Stringnullfilter function before markdown parse
postrenderFunction (String) Stringnullfilter function after markdown parse
组件配置:
<template>
  <div style="width: 100%">
    <MarkDirTree :dirContent="dirContent"/>
    <VueMarkdown
      :source="content"
      :toc="true"
      v-highlight
      style="width: 100%; text-align: left"
    ></VueMarkdown>
  </div>
</template>
<script>
import MarkDirTree from './MarkDirTree'
export default {
    components: {MarkDirTree},
    name: 'DesignMarkdown',
    props: {
        contentSource: undefined
    },
    data () {
        return {
            content: '',
            dirContent: []
        }
    },
    watch: {
        contentSource: {
            handler (newVal) {
                this.content = newVal || ''
                this.getDirContent(newVal)
            },
            deep: true,
            immediate: true
        }
    },
    mounted () {
        console.log('design vuemarkdown')
    },
    methods: {
        // 树状目录获取
        getDirContent (mdContent) {
            if (!mdContent) {
                return []
            }
            const lineT = mdContent.split('\n')
            const titleArray = lineT.filter(item => item && item[0] === '#')
            console.log('titleArray', titleArray)
            const dirArray = titleArray.map(item => {
                return item.replace(/\r/g, '')
            })
            console.log('dirArray', dirArray)
            const dirLevelArray = dirArray.map(item => {
                let level = 0
                for (let loc in item) {
                    if (item[loc] === '#') {
                        ++level
                    }
                }
                const itemBack = item
                const value = itemBack.replace(/#/g, '').trim()
                return {
                    level,
                    value
                }
            })
            console.log('dirLevelArray', dirLevelArray)
            this.dirContent = dirLevelArray
        }
    }
}
</script>

渲染样式效果如下:

markdown-render

注意:
toc是markdown渲染的id显示
渲染内容如下图:
title-toc-render

💖 取出markdown的标题层级

字符串处理识别#标记层级,拿出数据内容
应为markdown本身有序,所以无需排序
渲染目录逻辑

  1. 根据层级渲染缩进
  2. 渲染标题内容
  3. 标题加上锚点跳转事件

渲染目录代码如下:

<template>
  <div class="markdown-link">
    <div v-for="(item,index) in content" :key="index">
      <div>
        <template v-for="levelItem in item.level">
          &nbsp;
        </template>
        <span @click="jumpText(item)" class="link-title">{{item.value}}</span>
      </div>
    </div>
  </div>
</template>
<script>

export default {
    props: {
        dirContent: undefined
    },
    data () {
        return {
            content: ''
        }
    },
    watch: {
        dirContent: {
            handler (newVal) {
                console.log('newVal', newVal)
                this.content = newVal || ''
            },
            deep: true,
            immediate: true
        }
    },
    mounted () {
        console.log('design vuemarkdown dir')
    },
    methods: {
        jumpText (item) {
            const {level, value} = item
            console.log(level, value)
            this.herfTo(value)
        },
        herfTo (id) {
            const returnEle = document.querySelector('#' + id) // 获取跳转去的节点
            if (returnEle) {
                returnEle.scrollIntoView(true) // 让当前的元素滚动到浏览器窗口的可视区域内(true:对象的顶端与当前窗口的顶部对齐,false:对象的底端与当前窗口的底部对齐)
            }
        }
    }
}
</script>
<style>
  .markdown-link{
    position: fixed;
    background:rgba(64, 158, 255,.5);
    float: right;
    max-width: 400px;
    padding:20px;
    right:120px;
    top:100px;
    border-radius: 20px;
    box-shadow: 0 5px 20px rgba(0,0,0,0.4);
    transition: 2s;
  }
  .markdown-link:hover{
    background: rgba(64, 158, 255,.9);
  }
  .link-title{
    cursor: pointer;
    color: #ffffff;
  }
  .link-title:hover{
    color: #ff995e;
  }
</style>

效果如下:
title-link

⭐结束

本文markdown的目录生成到此结束!
💖 感谢你的阅读 💖
如有不足或者错误欢迎指出!
scene-gril

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

delphi的ARM架构支持与System.Win.WinRT库

delphi的ARM架构支持与System.Win.WinRT库 目录 delphi的ARM架构支持与System.Win.WinRT库 一、WinRT 二、delphi的System.Win.WinRT库 2.1、支持ARM芯片指令 2.2、基于WinRT技术的特点 2.3、所以使用默认库而未经转化的服务端应用并不支持ARM架构服务器 2.4、对默认库…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

深度学习图像分类、目标检测、图像分割源码小项目

​demo仓库和视频演示&#xff1a; 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 卷积网路CNN分类的模型一般使用包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型 目标检测包括…

Java关键词synchronized

目录 一、通过卖票系统观察多线程的安全隐患 二、synchronized的基本知识 1.使用synchronized的原因 2.synchronized的作用 3.synchronized的基本格式 a.synchronized加在方法名前 b.synchronized用在方法中 4. Java锁机制 5.synchronized注意事项 三、使用synchronize…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

MATLAB读取OpenFOAM的二进制文件

OpenFOAM的文件格式 上面是OpenFOAM二进制文件的格式&#xff0c;我们可以看出&#xff0c;前面21行都是无关的说明文件&#xff0c;22开始时除了一个括号之外&#xff0c;其它的都是数据。 读取数据 读取数据的思路非常简单&#xff0c;忽略不需要的&#xff0c;读取需要的。…

Autoware 跑 Demo(踩坑指南)

Autoware 跑 Demo&#xff08;踩坑指南&#xff09; 网上的博客和官方的教程&#xff0c;几乎都是一样的&#xff0c;但实际上跑不起来 Autoware 1.12学习整理–01–运行rosbag示例 Autoware入门学习&#xff08;三&#xff09;——Autoware软件功能使用介绍&#xff08;1/3&a…

【Unity3D】激光雷达特效

1 由深度纹理重构世界坐标 屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解&#xff0c;本文将介绍使用深度纹理重构世界坐标的方法&#xff0c;并使用重构后的世界坐标模拟激光雷达特效。 本文完整资源见→Unity3D激光雷达特效。 1&#xff09;重构…

基于51单片机的智能火灾报警系统温度烟雾光

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;火灾报警 获取完整源码源文件电路图仿真文件论文报告等 功能简介 51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块 具体功能&#xff1a; 1、实时监测及显示温度值和烟雾浓度…

管理类联考——英语二——技巧篇——写作——B节——议论文——必备替换句型

议论文必备替换句型 (一&#xff09;表示很明显/众所周知的句型 It is obvious thatIt is clear thatIt is apparent thatIt is evident thatlt is self-evident thatIt is manifest thatIt is well-knownIt is known to all thatIt is widely-accepted thatIt is crystal-cl…

蓝牙客户端QBluetoothSocket的使用——Qt For Android

了解蓝牙 经典蓝牙和低功耗蓝牙差异 经典蓝牙&#xff08;Bluetooth Classic&#xff09;&#xff1a;分为基本速率/增强数据速率(BR/EDR)&#xff0c; 79个信道&#xff0c;在2.4GHz的(ISM)频段。支持点对点设备通信&#xff0c;主要用于实现无线音频流传输&#xff0c;已成…

Ceph:关于Ceph 集群管理的一些笔记

写在前面 准备考试&#xff0c;整理ceph 相关笔记博文内容涉及&#xff0c;Ceph 管理工具 cephadm&#xff0c;ceph 编排器&#xff0c;Ceph CLI 和 Dashboard GUI 介绍理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守…

大数据分析平台释疑专用帖第二弹

不管是想要快速了解BI大数据分析平台&#xff0c;还是想要了解BI和自己的需求匹配度&#xff0c;都可关注我们的释疑专用贴。 1、可以分析直播数据吗&#xff1f; 严格来说&#xff0c;只要能够提供数据&#xff0c;就可以做数据可视化分析&#xff0c;直播数据也同理。 如果…

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

Python 请求分页

文章目录 什么是 Python 中的分页带有下一个按钮的 Python 分页没有下一个按钮的 Python 分页无限滚动的 Python 分页带有加载更多按钮的分页 在本文中&#xff0c;我们将了解分页以及如何克服 Python 中与分页相关的问题。 读完本文后&#xff0c;我们将能够了解 Python 分页以…

经典目标检测YOLO系列(1)YOLO-V1算法及其在VOC2007数据集上的应用

经典目标检测YOLO系列(1)YOLO-V1算法及其在VOC2007数据集上的应用 1 YOLO-V1的简述 1.1 目标检测概述 ​ 目标检测有非常广泛的应用&#xff0c; 例如&#xff1a;在安防监控、手机支付中的人脸检测&#xff1b;在智慧交通&#xff0c;自动驾驶中的车辆检测&#xff1b;在智…

Parallel Desktop中按照的centos在切换root用户时,密码正确,但一直切换不成功,显示su: Authentication failure

目录 一、出现问题二、分析问题三、解决问题四、参考资料 一、出现问题 我的密码明明是输入正确的&#xff0c;但又一直给我报下面的错误 二、分析问题 我怀疑是我密码记错了&#xff0c;所以我点击Log Out&#xff0c;重新去输入了一下密码&#xff0c;发现是正确的我确认…

Build your own unconditional confidence

不要活在既定的社会价值体系中 人类的偏好大多数时候都是愚昧的 I play whatever gods give me 情绪价值稳定 解决问题的能力 Dont label yourself 真正的强者不会吝啬对他人的赞美 敬畏自然&#xff0c;敬畏未知事物 核心是你对这个事情是否感兴趣&#xff0c;觉得有价…

PHP 使用html创建PDF并设置水印

使用TCPDF库给PDF文件加水印&#xff0c;需要注意无法直接使用文本&#xff0c;需要创建水印图片后&#xff0c;通过图片来设置水印效果。 目录 创建PDF 创建合同模板 创建pdf文件 简单创建 设置文档信息 去掉默认页头脚 设置间距 设置字体支持中文 设置图片比例因子 …

代理ip数据采集的优缺点

随着互联网时代的到来&#xff0c;数据已经成为企业发展和决策的关键。但是&#xff0c;不同的网站它对于数据访问的限制和反爬虫措施却是给企业的数据采集带来了挑战。针对这一问题&#xff0c;代理IP数据采集技术应运而生。但是使用代理ip来进行数据采集也有优缺点。 一、代理…