前端渲染markdown文档

<template>

  <div class="markdown-preview">

    <div class="markdown-header">

      <div class="markdown-title">文档</div>

      <div class="markdown-toc" v-html="title"></div>

    </div>

    <div class="markdown-body" v-html="html"></div>

  </div>

</template>

<script setup>

import markdownIt from "markdown-it";

import tocPlugin from "markdown-it-table-of-contents";

import "highlight.js/styles/vs2015.css";

import hljs from "highlight.js/lib/core";

import javascript from "highlight.js/lib/languages/javascript";

import css from "highlight.js/lib/languages/css";

import java from "highlight.js/lib/languages/java";

import json from "highlight.js/lib/languages/json";

import { onMounted, ref } from "vue";

const html = ref("");

const title = ref("<h1>Aleta</h1>");

let markdown = "";

function readTextFile(fileName) {

  var rawFile = new XMLHttpRequest();

  var filePath = location.origin + "/" + fileName;

  rawFile.open("GET", fileName, false);

  rawFile.onreadystatechange = function () {

    if (rawFile.readyState === 4) {

      if (rawFile.status === 200 || rawFile.status == 0) {

        markdown = rawFile.responseText;

        console.log("输出:\n", markdown);

      }

    }

  };

  rawFile.send(null);

}

onMounted(() => {

  readTextFile("../../aleta-card-api-hk.md");

  hljs.registerLanguage("javascript", javascript);

  hljs.registerLanguage("css", css);

  hljs.registerLanguage("java", java);

  hljs.registerLanguage("json", json);

  const md = markdownIt({

    html: true,

    linkify: true,

    highlight: (str, lang) => {

      if (lang && hljs.getLanguage(lang)) {

        try {

          return hljs.highlight(str, { language: lang }).value;

        } catch (err) {}

      }

      return ""; // use external default escaping

    },

  });

  md.use(tocPlugin, { includeLevel: [2, 3] });

  const result = md.render(markdown);

  const tableOfContents = md.toc;

  html.value = result;

  title.value = tableOfContents;

});

</script>

<style scoped>

/* 代码块语法高亮颜色可直接修改module中css文件 */

.markdown-preview {

  display: flex;

  flex-direction: column;

}

.markdown-header {

  display: flex;

  flex-direction: row;

  align-items: center;

}

.markdown-title {

  font-size: 24px;

  font-weight: bold;

  margin-right: 16px;

}

.markdown-toc {

  border-left: 2px solid red;

  padding: 8px;

}

.markdown-toc ul {

  list-style: none;

  margin: 0;

  padding: 0;

}

.markdown-toc li:hover {

  background-color: #eef;

}

.markdown-toc a:hover {

  text-decoration: underline;

}

.markdown-body {

  flex: 1;

}

/* 样式来自 highlight.js 的 atom-one-dark.css */

.hljs {

  display: block;

  overflow-x: auto;

  padding: 0.5em;

  color: #abb2bf;

  background: #282c34;

}

.hljs-comment,

.hljs-quote {

  color: blue;

  font-style: italic;

}

.hljs-doctag,

.hljs-keyword,

.hljs-formula {

  color: #c678dd;

}

.hljs-section,

.hljs-name,

.hljs-selector-tag,

.hljs-deletion,

.hljs-subst {

  color: #e06c75;

}

.hljs-title,

.hljs-variable,

.hljs-template-variable,

.hljs-type,

.hljs-built_in,

.hljs-builtin-name,

.hljs-attr,

.hljs-attribute,

.hljs-class .hljs-title {

  color: #d19a66;

}

.hljs-string,

.hljs-symbol,

.hljs-bullet,

.hljs-addition {

  color: #8ddb55;

}

.hljs-number,

.hljs-meta,

.hljs-literal,

.hljs-link {

  color: #13c3db;

}

.hljs-emphasis {

  font-style: italic;

}

.hljs-strong {

  font-weight: bold;

}

</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值