vue2_markdown的内容目录生成

news2024/12/29 8:03:24

文章目录

    • ⭐前言
    • ⭐引入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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC简介附入门案例

目录 一、SpringMVC简介 1.1 MVC模型 1.2 SpringMVC 二、SpringMVC入门案例 2.1 创建项目 2.2 引入依赖和tomcat插件 2.3 修改web.xml文件 2.4 新建springmvc.xml文件 2.5 编写控制器 2.6 配置运行方式 2.7 运行测试 三、SpringMVC执行流程 3.1 SpringMVC的组件…

【FreeRTOS】FreeRTOS动态创建任务与删除

0. 实验准备 正点原子 STM32407ZG 探索者开发板 FreeRTOS 例程模板&#xff08;可以在这一篇文章找到&#xff1a;STM32F407 移植 FreeRTOS&#xff09; 1. 动态创建任务函数 API 1.1 函数简介 动态创建任务需要使用到BaseType_t xTaskCreate函数&#xff0c;我们可以在 Fr…

unittest教程__TestSuite测试套件(2)

在前面一章中演示了unittest如何执行一个简单的测试&#xff0c;但有两个问题&#xff1a; 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的&#xff0c;在不改变用例名称的情况下&#xff0c;我们怎么来控制用例执行的顺序呢&#xff1f;一个测试文件&#xff0c;我…

事务底层与高可用原理

一、redo日志 在事务的实现机制上&#xff0c;MySQL采用的是WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 就是所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含redo和undo两部分信息。 redo log称为重做日…

Spring执行流程和Bean的生命周期

1、Spring执行流程2、Bean的生命周期&#xff08;重点&#xff09;2.1、实例化和初始化的区别2.2、为什么先设置属性再进行初始化呢&#xff1f; 1、Spring执行流程 Spring执行流程&#xff08;Bean执行流程&#xff09;&#xff1a;1、在启动类中遇到了ApplicationContext的时…

【微服务】在window下安装nacos以及可能遇到的问题

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

【029】C++静态成员和 this 指针详解

C静态成员和 this 指针详解 引言一、静态成员1.1、静态成员变量1.2、静态成员变量的使用示例1.3、静态成员函数1.4、单例模式设计 二、C面向对象模型2.1、成员变量和函数的存储2.2、this 指针2.3、this 指针的应用2.4、const修饰成员函数 总结 引言 &#x1f4a1; 作者简介&…

.NET6创建Windows服务

之前的文章已经写过了创建Windows服务。 C#创建Windows服务_c# 创建windows服务_故里2130的博客-CSDN博客 不过之前使用的是.NET Framework创建的Windows服务。现在已经2023年了&#xff0c;其中vs2022有新的方法去创建Windows服务&#xff0c;本次使用.NET6创建Windows服务。…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层&#xff1a;虚拟专用网VPN和网络地址转换NAT 笔记来源&#xff1a; 湖科大教书匠&#xff1a;虚拟专用网VPN和网络地址转换NAT 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

远程访问VPN配置与验证实验:构建安全的远程连接

远程访问VPN配置与验证实验&#xff1a;构建安全的远程连接 【实验目的】 理解远程访问 VPN的含义。掌握远程访问 VPN的含义。掌握VPN Client软件的使用。验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 …

【软件设计】模块设计耦合的七种类型

一.什么是高内聚、低耦合&#xff1f; 在结构化分析与模块设计方法中&#xff0c;模块化是一个很重要的概念&#xff0c;它是将一个待开发的软件分解成为若干个小的模块&#xff0c;每个模块可以独立地开发、测试。使得复杂问题的“分而治之”&#xff0c;令程序的结构清晰、易…

ubuntu 20.04 linux6.3.8 qemu arm64 平台 制作ext4根文件系统

前言 可以参考 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 因为需要验证 aarch64 平台下的 glib 库&#xff0c;所以重新搭建了 Linux qemu arm64 的 测试环境 这一篇&#xff0c;开始制作 rootfs 根文件系统&#xff0c;让qemu arm64 平台上的 Linux 系统跑起来 开…

一个springboot项目的jenkins持续集成配置

目录 1.项目基本情况 2.jenkins的下载 1) 安装jdk 2&#xff09;下载、启动和配置jenkins 3. 启动Jenkins 4. 安装Jenkins插件 5. 重启jenkins 6.jenkins工具的配置 1&#xff09; jdk的路径配置 7.创建springboot项目的持续集成任务 1) 新建项目 2&#xff09;代…

倒闭了

前两天在群里听到有人发消息&#xff0c;说是「有陪」倒闭了&#xff0c;然后我去看了相应的消息&#xff0c;看到了下面的图。 一些老的读者可能知道我之前有一段创业经历&#xff0c;这段创业经历就是有陪&#xff0c;我从恒大的时候就开始给有陪做事&#xff0c;那时候我一个…

stm32 滑膜观测器+PLL 锁相环 FOC 无感无刷电机控制

上一期为大家介绍了滑膜观测器正反切的应用案例&#xff0c;收到不少小伙伴的反馈是否有PLL的案例&#xff0c;大概看了一下网上的资料&#xff0c;讲理论的很多&#xff0c;能转化成源码的几乎没有。前半年工作和家里的事情都比较多&#xff0c;一拖再拖&#xff0c;终于在6月…

Attention U-Net:Learning Where to Look for the Pancreas论文总结和代码实现

论文&#xff1a; https://arxiv.org/abs/1804.03999 中文版&#xff1a;https://blog.csdn.net/hhw999/article/details/110134398 源码&#xff1a; https://github.com/ozan-oktay/Attention-Gated-Networks 目录 一、论文背景和出发点 二、创新点 三、Attention U-Net的…

【5G MAC】5G中传输块(TBS)大小的计算方式

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【学习日记2023.6.18】之 分布式缓存redis持久化_redis主从_reids哨兵_redis分片集群

文章目录 分布式缓存1. Redis持久化1.1 RDB持久化1.1.1 执行时机1.1.2 RDB原理1.1.3 小结 1.2 AOF持久化1.2.1 AOF原理1.2.2 AOF配置1.2.3 AOF文件重写 1.3 RDB与AOF对比 2 Redis主从2.1 搭建主从架构2.1.1 准备实例和配置2.1.2 启动2.1.3 开启主从关系2.1.4 测试 2.2 主从数据…

计算服务资源调度管理

文章目录 前言总体架构“ULT”和“KLT”抽象“内核”“容器”“虚容器” 内存抽象虚拟存储&#xff08;容器调用&#xff09; 多机器调度 前言 今天复习了一下操作系统&#xff0c;系统过了一下&#xff0c;感觉还有点时间&#xff0c;那么顺便来讨论一下&#xff0c;关于我的…

.maloxx勒索病毒数据怎么处理|数据解密恢复,malox/mallox

导语&#xff1a; 随着科技的快速发展&#xff0c;数据成为了企业和个人不可或缺的财富。然而&#xff0c;网络安全威胁也日益增多&#xff0c;其中Mallox勒索病毒家族的最新变种.maloxx勒索病毒的出现给我们带来了巨大的困扰。但不要担心&#xff01;91数据恢复研究院将为您揭…