MarkdownPad2導(dǎo)出HTML支持[TOC]

MarkdownPad2導(dǎo)出HTML支持[TOC]

請(qǐng)點(diǎn)擊MarkdownPad2_toc查看效果。

為什么&效果圖

為什么

為什么要吃力不討好的實(shí)現(xiàn)這個(gè)功能呢刃泡?

  • [TOC]語(yǔ)法挺有用的肌括,特別是標(biāo)題較多的時(shí)候
  • 百度上并未找到MarkdownPad2導(dǎo)出HTML支持[TOC]的完美方案
  • 順便鍛煉一下JavaScript

效果圖

想要實(shí)現(xiàn)什么樣的效果呢参萄?No picture, no bibi.

impressionDrawing.png

最后測(cè)試用的Markdown語(yǔ)法栗子內(nèi)容如下:

# 《Vue2.0開發(fā)去哪兒網(wǎng)App》知識(shí)點(diǎn)
[TOC]
## 深入理解Vue組件
### 4-8 動(dòng)態(tài)組件與v-once指令
#### 動(dòng)態(tài)組件
#### v-once指令
## Vue中的動(dòng)畫特效
### 5-1 Vue動(dòng)畫 - Vue中的CSS動(dòng)畫原理
#### 動(dòng)畫原理
### 5-2 在Vue中使用animate.css庫(kù)
#### keyframes動(dòng)畫
#### 自定義類名
#### animate.css庫(kù)

動(dòng)手實(shí)現(xiàn)

開始動(dòng)手實(shí)現(xiàn)吧~

實(shí)現(xiàn)的HTML效果

等等李丰,莫急鱼辙,方案都沒想好鹦肿,怎么編碼...

例如矗烛,Markdown語(yǔ)法如下

# 一
[TOC]
## 二
### 三
## 二

我們期望展示的效果如下圖,且發(fā)現(xiàn)Markdown語(yǔ)法中的#箩溃、##等標(biāo)題最終轉(zhuǎn)換為HTML中的<h1>瞭吃、<h2>等元素。

[TOC]轉(zhuǎn)換為<p>[TOC]</p>碾篡,顯然<p>[TOC]</p>無(wú)法滿足我們的期望虱而,所以這里就是我們需要編碼實(shí)現(xiàn)的地方。

htmlDom.png

那么开泽,我們要將<p>[TOC]</p>牡拇,轉(zhuǎn)換成什么樣子呢?

<p>
    <div class="toc">
        <ul data-level="1">
            <li data-level="1">
                <a href="#一-0">一</a>
                <ul data-level="2">
                    <li data-level="2">
                        <a href="#二-1">二</a>
                        <ul data-level="3">
                            <li data-level="3">
                                <a href="#三-2">三</a>
                            </li>
                        </ul>
                    </li>
                    <li data-level="2">
                        <a href="#二-3">二</a>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</p>

為啥要轉(zhuǎn)換成這樣子呢穆律?因?yàn)檫@樣子就能顯示我們想要的效果呀惠呼。

為啥ulli元素有一個(gè)data-level屬性呢?看名字就知道是為了方便知道目前所在的層級(jí)峦耘。

那么我們先把上面的<html>理解一下吧

首先剔蹋,將p元素的[TOC]替換為div元素,且該div元素有一個(gè)叫toc的class

<p>
    <div class="toc"></div>
</p>

接著辅髓,要實(shí)現(xiàn)層次效果泣崩,我們需要用到ulli元素洛口,搭建一級(jí)標(biāo)題吧

<p>
    <div class="toc">
        <ul data-level="1">
            <li data-level="1">
                <a>一</a>
            </li>
        </ul>
    </div>
</p>

放到chrome中看看效果呢

data-level=1.png

繼續(xù)搭矫付,不準(zhǔn)停...

<p>
    <div class="toc">
        <ul data-level="1">
            <li data-level="1">
                <a>一</a>
                <ul data-level="2">
                    <li data-level="2">
                        <a>二</a>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</p>

繼續(xù)放到chrome中

data-level=2.png

那如果有兩個(gè)標(biāo)題二呢?再加個(gè)li

<p>
    <div class="toc">
        <ul data-level="1">
            <li data-level="1">
                <a>一</a>
                <ul data-level="2">
                    <li data-level="2">
                        <a>二</a>
                    </li>
                    <li data-level="2">
                        <a>二</a>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</p>

繼續(xù)放到chrome中第焰,很棒

data-level=2_2.png

如果又要在第一個(gè)標(biāo)題二下加一個(gè)標(biāo)題三呢买优?

<p>
    <div class="toc">
        <ul data-level="1">
            <li data-level="1">
                <a>一</a>
                <ul data-level="2">
                    <li data-level="2">
                        <a>二</a>
                        <ul data-level="3">
                            <li data-level="3">
                                <a>三</a>
                            </li>
                        </ul>
                    </li>
                    <li data-level="2">
                        <a>二</a>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</p>
data-level=3.png

想要的效果就完成啦,棒棒噠~

那么我們通過JavaScript要實(shí)現(xiàn)的過程大概也就是醬紫滴

編碼

邊編碼,邊講解方案

初始HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MarkdownPad2導(dǎo)出HTML支持[TOC]</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
</head>
<body>
    <h1>一</h1>
    <p>[TOC]</p>
    <h2>二</h2>
    <h3>三</h3>
    <h2>二</h2>
</body>
</html>

引入jquery.js杀赢,加入h1烘跺、ph2等元素脂崔,效果如下

codeInitial.png

整改p元素

步驟:

  1. 創(chuàng)建class為toc的div元素
  2. 找到p元素滤淳,怎么找通過[TOC]來找p元素
  3. 將p元素的文本元素清空,并將步驟1中的div元素append到該p元素上
<script>
    $(document).ready(function() {
        // 創(chuàng)建class為toc的div元素
        let $toc = $('<div></div>');
        $toc.attr('class', 'toc');

        // 清除p元素的文本元素砌左,并將$toc元素append到p元素
        $('p:contains([TOC]):first').text('').append($toc);
    });
</script>

如果Markdown文檔中有多個(gè)[TOC]語(yǔ)法娇钱,我們只取第一個(gè),其余的不做轉(zhuǎn)換绊困,誰(shuí)沒事搞這么多個(gè)[TOC]呢,是不适刀?當(dāng)然有人站出來說秤朗,一定要有多個(gè)[TOC],行行行笔喉,那你把:first出去就行了取视。

另外,這個(gè)代碼還有點(diǎn)小缺陷常挚,如果有些人習(xí)慣用[toc]呢作谭?發(fā)現(xiàn)<p>[toc]</p>并沒有變化,所以需要整改一下

<script>
    $(document).ready(function() {
        // 新增Contains選擇器奄毡,:contains的變異版折欠,增加忽略大小寫功能
        $.expr[':'].Contains = function(a, i, m){
            return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
        };

        // 創(chuàng)建class為toc的div元素
        let $toc = $('<div></div>');
        $toc.attr('class', 'toc');

        // 清除p元素的文本內(nèi)容,并將$toc元素append到p元素
        $('p:Contains([TOC]):first').text('').append($toc);
    });
</script>

新增了一個(gè):Contains吼过,與:contains功能一樣增加忽略大小寫功能锐秦,這樣就算寫成[toc]也是沒問題了,效果如下

htmlP.png

實(shí)現(xiàn)hx元素轉(zhuǎn)換

下一步當(dāng)然就是得往<div class="toc"></div>中append一些ul盗忱、li元素了

處理第一個(gè)hx元素的步驟:

  1. 獲取Markdown文檔中所有hx元素$headers
  2. 獲取第一個(gè)hx元素firstHeader酱床,并獲取第一個(gè)hx元素的層級(jí)firstLevel
  3. 對(duì)firstLevel循環(huán)處理,創(chuàng)建ul趟佃、li元素并按層級(jí)append
  4. ul扇谣、li元素append完成后,找到firstLevel對(duì)應(yīng)的li元素闲昭,并append一個(gè)a元素用于顯示標(biāo)題內(nèi)容
// 獲取h1-h6元素
let $headers = $('h1,h2,h3,h4,h5,h6');

// 獲取第一個(gè)hx元素罐寨,注意是dom對(duì)象,非jQuery對(duì)象
let firstHeader = $headers[0];

if (firstHeader) {
    // 獲取第一個(gè)hx元素的層級(jí)
    let firstLevel = parseInt(firstHeader.tagName.
        replace('H', ''), 10);
    // 給a元素唯一的href屬性值
    let id = `${firstHeader.textContent}-0`;

    for (let i = 1; i <= firstLevel; i++) {
        // 創(chuàng)建ul和li元素汤纸,并添加data-level屬性
        let $ul = $('<ul></ul>'),
            $li = $('<li></li>');
        $li.attr('data-level', i);
        $ul.attr('data-level', i).append($li);

        // 獲取data-level為i-1的li元素
        let $pLi = $toc.find(`li[data-level=${i - 1}]`);

        if ($pLi.length > 0) {
            // 找到data-level為i-1的元素衩茸,直接append到該li元素上即可
            $pLi.append($ul);
        } else {
            // 未找到data-level為i-1的元素,說明是頂層的ul,
            // 直接append到class為toc的div元素上
            $toc.append($ul);
        }
    }

    // 找到所屬層級(jí)的li元素楞慈,并添加a元素
    $toc.find(`li[data-level=${firstLevel}]`).append(
        $(`<a href="#${id}">${firstHeader.textContent}</a>`));
    // 與a元素的href對(duì)應(yīng)幔烛,用于文檔內(nèi)跳轉(zhuǎn)
    $headers.eq(0).attr('id', id);
}

$headers內(nèi)容如下:

jqHeaders.png

界面效果如下:

htmlFirstHeader1.png

如果Markdown文檔中沒有從#開始,直接用了##囊蓝,那么我們?cè)囅滦Чㄏ喈?dāng)于把文檔中的<h1>一</h1>刪除)

htmlFirstHeader2.png

效果ok饿悬,就是有點(diǎn)小問題,a元素在chrome中呈現(xiàn)下劃線效果聚霜,建議去掉狡恬,所以增加以下代碼,把原來的<h1>一</h1>加回來蝎宇,嗯弟劲,現(xiàn)在效果完美了

<style>
    .toc a {
        text-decoration: none;
    }
</style>
htmlFirstHeader3.png

處理后續(xù)hx元素的步驟:

  1. 從第二個(gè)hx元素開始,循環(huán)
  2. 獲取當(dāng)前hx的層級(jí)以及上一個(gè)hx的層級(jí)
  3. 當(dāng)當(dāng)前層級(jí)大于上一個(gè)層級(jí)姥芥,則從上一個(gè)層級(jí)+1到當(dāng)前層級(jí)做循環(huán)添加ul和li元素
  4. 如果當(dāng)前層級(jí)和上一個(gè)層級(jí)相等兔乞,則找到相同層級(jí)的li元素的父元素,創(chuàng)建li元素并添加上去
  5. // 如果當(dāng)前層級(jí)小于上一個(gè)層級(jí)凉唐,則找到最后一個(gè)相同層級(jí)的li元素的父元素庸追,添加$l
  6. 設(shè)置hx元素的id,與a的href保持一致
// 從第二個(gè)hx元素開始台囱,循環(huán)$headers
for (let i = 1; i < $headers.length; i++) {
    // 獲取當(dāng)前的hx元素的層級(jí)以及上一個(gè)hx元素的層級(jí)
    let curLevel = parseInt($headers[i].tagName.replace('H', ''),
        10),
        lastLevel = parseInt($headers[i - 1].tagName.
            replace('H', ''), 10);
    // 當(dāng)前hx元素的文本元素
    let textContent = $headers[i].textContent,
        id = `${textContent}-i`;
    // 給a元素唯一的href屬性值淡溯,與hx元素的id對(duì)應(yīng)
    let $a = $(`<a href="#${id}">${textContent}</a>`);

    if (lastLevel < curLevel) {
        // 如果當(dāng)前層級(jí)比上一個(gè)層級(jí)大,則從上一個(gè)層級(jí)+1到當(dāng)前層級(jí)循環(huán)簿训,
        // 循環(huán)添加ul和li元素
        for (let j = lastLevel + 1; j <= curLevel; j++) {
            // 創(chuàng)建ul和li元素咱娶,并添加data-level屬性
            let $u = $('<ul></ul>'),
                $l = $('<li></li>');
            $l.attr('data-level', j);
            $u.attr('data-level', j).append($l);

            // 找到data-level為j-1的最后一個(gè)li元素,并添加$u
            $toc.find(`li[data-level=${j - 1}]:last`).append($u);
        }
        // 找到data-level為curLevel的最后一個(gè)li煎楣,并添加$a
        $toc.find(`li[data-level=${curLevel}]:last`).append($a);
    } else if (lastLevel === curLevel) {
        // 如果當(dāng)前層級(jí)和上一個(gè)層級(jí)相等豺总,則找到相同層級(jí)的li元素的父元素,
        // 創(chuàng)建li元素并添加上去
        // 已經(jīng)存在data-level為curLevel的ul择懂,只需要?jiǎng)?chuàng)建li即可
        let $l = $('<li></li>');

        // 給li元素添加data-level樹形喻喳,并添加$a
        // 找到data-level為curLevel的最后一個(gè)li元素的父元素,添加$l
        $toc.find(`li[data-level=${curLevel}]:last`).parent().
            append($l.attr('data-level', curLevel).append($a));
    } else {
        // 如果當(dāng)前層級(jí)小于上一個(gè)層級(jí)困曙,則找到最后一個(gè)相同層級(jí)的li元素的
        // 父元素表伦,添加$l
        // 找到data-level為curLevel的最后一個(gè)li元素,必然存在
        let $sublingLi = $toc.
            find(`li[data-level=${curLevel}]:last`);
        let $l = $('<li></li>');

        // 找到$sublingLi的父元素,添加li元素即可
        $sublingLi.parent().append($l.attr('data-level', curLevel).
            append($a));
    }

    $headers.eq(i).attr('id', id);
}

全部代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MarkdownPad2導(dǎo)出HTML支持[TOC]</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <style>
        .toc a {
            text-decoration: none;
        }
    </style>
</head>
<body>
    <h1>一</h1>
    <p>[TOC]</p>
    <h2>二</h2>
    <h3>三</h3>
    <h2>二</h2>

    <script>
        $(document).ready(function() {
            // 新增Contains選擇器,:contains的變異版慷丽,增加忽略大小寫功能
            $.expr[':'].Contains = function(a, i, m){
                return jQuery(a).text().toUpperCase().indexOf(m[3].
                    toUpperCase()) >= 0;
            };

            // 創(chuàng)建class為toc的div元素
            let $toc = $('<div></div>');
            $toc.attr('class', 'toc');

            // 獲取h1-h6元素
            let $headers = $('h1,h2,h3,h4,h5,h6');

            // 獲取第一個(gè)hx元素蹦哼,注意是dom對(duì)象,非jQuery對(duì)象
            let firstHeader = $headers[0];

            if (firstHeader) {
                // 獲取第一個(gè)hx元素的層級(jí)
                let firstLevel = parseInt(firstHeader.tagName.
                    replace('H', ''), 10);
                // 給a元素唯一的href屬性值
                let id = `${firstHeader.textContent}-0`;

                for (let i = 1; i <= firstLevel; i++) {
                    // 創(chuàng)建ul和li元素要糊,并添加data-level屬性
                    let $ul = $('<ul></ul>'),
                        $li = $('<li></li>');
                    $li.attr('data-level', i);
                    $ul.attr('data-level', i).append($li);

                    // 獲取data-level為i-1的li元素
                    let $pLi = $toc.find(`li[data-level=${i - 1}]`);

                    if ($pLi.length > 0) {
                        // 找到data-level為i-1的元素纲熏,直接append到該li元素上即可
                        $pLi.append($ul);
                    } else {
                        // 未找到data-level為i-1的元素,說明是頂層的ul,
                        // 直接append到class為toc的div元素上
                        $toc.append($ul);
                    }
                }

                // 找到所屬層級(jí)的li元素局劲,并添加a元素
                $toc.find(`li[data-level=${firstLevel}]`).append(
                    $(`<a href="#${id}">${firstHeader.textContent}</a>`));
                // 與a元素的href對(duì)應(yīng)勺拣,用于文檔內(nèi)跳轉(zhuǎn)
                $headers.eq(0).attr('id', id);
            }

            // 從第二個(gè)hx元素開始,循環(huán)$headers
            for (let i = 1; i < $headers.length; i++) {
                // 獲取當(dāng)前的hx元素的層級(jí)以及上一個(gè)hx元素的層級(jí)
                let curLevel = parseInt($headers[i].tagName.replace('H', ''),
                    10),
                    lastLevel = parseInt($headers[i - 1].tagName.
                        replace('H', ''), 10);
                // 當(dāng)前hx元素的文本元素
                let textContent = $headers[i].textContent,
                    id = `${textContent}-i`;
                // 給a元素唯一的href屬性值鱼填,與hx元素的id對(duì)應(yīng)
                let $a = $(`<a href="#${id}">${textContent}</a>`);

                if (lastLevel < curLevel) {
                    // 如果當(dāng)前層級(jí)比上一個(gè)層級(jí)大药有,則從上一個(gè)層級(jí)+1到當(dāng)前層級(jí)循環(huán),
                    // 循環(huán)添加ul和li元素
                    for (let j = lastLevel + 1; j <= curLevel; j++) {
                        // 創(chuàng)建ul和li元素苹丸,并添加data-level屬性
                        let $u = $('<ul></ul>'),
                            $l = $('<li></li>');
                        $l.attr('data-level', j);
                        $u.attr('data-level', j).append($l);

                        // 找到data-level為j-1的最后一個(gè)li元素愤惰,并添加$u
                        $toc.find(`li[data-level=${j - 1}]:last`).append($u);
                    }
                    // 找到data-level為curLevel的最后一個(gè)li,并添加$a
                    $toc.find(`li[data-level=${curLevel}]:last`).append($a);
                } else if (lastLevel === curLevel) {
                    // 如果當(dāng)前層級(jí)和上一個(gè)層級(jí)相等赘理,則找到相同層級(jí)的li元素的父元素宦言,
                    // 創(chuàng)建li元素并添加上去
                    // 已經(jīng)存在data-level為curLevel的ul,只需要?jiǎng)?chuàng)建li即可
                    let $l = $('<li></li>');

                    // 給li元素添加data-level樹形商模,并添加$a
                    // 找到data-level為curLevel的最后一個(gè)li元素的父元素蜡励,添加$l
                    $toc.find(`li[data-level=${curLevel}]:last`).parent().
                        append($l.attr('data-level', curLevel).append($a));
                } else {
                    // 如果當(dāng)前層級(jí)小于上一個(gè)層級(jí),則找到最后一個(gè)相同層級(jí)的li元素的
                    // 父元素阻桅,添加$l
                    // 找到data-level為curLevel的最后一個(gè)li元素,必然存在
                    let $sublingLi = $toc.
                        find(`li[data-level=${curLevel}]:last`);
                    let $l = $('<li></li>');

                    // 找到$sublingLi的父元素,添加li元素即可
                    $sublingLi.parent().append($l.attr('data-level', curLevel).
                        append($a));
                }

                $headers.eq(i).attr('id', id);
            }


            // 清除p元素的文本內(nèi)容,并將$toc元素append到p元素
            $('p:Contains([TOC]):first').text('').append($toc);
        });
    </script>
</body>
</html>

效果如下:

htmlHeaders.png

MarkdownPad2效果

以上代碼編寫完畢兼都,但只是一個(gè)demo嫂沉,我們的目的是為了讓MarkdownPad2導(dǎo)出HTML時(shí)支持[TOC],所以扮碧,先刪除不必要的代碼

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
    $(document).ready(function() {
        // 新增Contains選擇器趟章,:contains的變異版,增加忽略大小寫功能
        $.expr[':'].Contains = function(a, i, m){
            return jQuery(a).text().toUpperCase().indexOf(m[3].
                toUpperCase()) >= 0;
        };

        // 創(chuàng)建class為toc的div元素
        let $toc = $('<div></div>');
        $toc.attr('class', 'toc');

        // 獲取h1-h6元素
        let $headers = $('h1,h2,h3,h4,h5,h6');

        // 獲取第一個(gè)hx元素慎王,注意是dom對(duì)象蚓土,非jQuery對(duì)象
        let firstHeader = $headers[0];

        if (firstHeader) {
            // 獲取第一個(gè)hx元素的層級(jí)
            let firstLevel = parseInt(firstHeader.tagName.
                replace('H', ''), 10);
            // 給a元素唯一的href屬性值
            let id = `${firstHeader.textContent}-0`;

            for (let i = 1; i <= firstLevel; i++) {
                // 創(chuàng)建ul和li元素,并添加data-level屬性
                let $ul = $('<ul></ul>'),
                    $li = $('<li></li>');
                $li.attr('data-level', i);
                $ul.attr('data-level', i).append($li);

                // 獲取data-level為i-1的li元素
                let $pLi = $toc.find(`li[data-level=${i - 1}]`);

                if ($pLi.length > 0) {
                    // 找到data-level為i-1的元素赖淤,直接append到該li元素上即可
                    $pLi.append($ul);
                } else {
                    // 未找到data-level為i-1的元素蜀漆,說明是頂層的ul,
                    // 直接append到class為toc的div元素上
                    $toc.append($ul);
                }
            }

            // 找到所屬層級(jí)的li元素咱旱,并添加a元素
            $toc.find(`li[data-level=${firstLevel}]`).append(
                $(`<a href="#${id}">${firstHeader.textContent}</a>`));
            // 與a元素的href對(duì)應(yīng)确丢,用于文檔內(nèi)跳轉(zhuǎn)
            $headers.eq(0).attr('id', id);
        }

        // 從第二個(gè)hx元素開始,循環(huán)$headers
        for (let i = 1; i < $headers.length; i++) {
            // 獲取當(dāng)前的hx元素的層級(jí)以及上一個(gè)hx元素的層級(jí)
            let curLevel = parseInt($headers[i].tagName.replace('H', ''),
                10),
                lastLevel = parseInt($headers[i - 1].tagName.
                    replace('H', ''), 10);
            // 當(dāng)前hx元素的文本元素
            let textContent = $headers[i].textContent,
                id = `${textContent}-i`;
            // 給a元素唯一的href屬性值吐限,與hx元素的id對(duì)應(yīng)
            let $a = $(`<a href="#${id}">${textContent}</a>`);

            if (lastLevel < curLevel) {
                // 如果當(dāng)前層級(jí)比上一個(gè)層級(jí)大鲜侥,則從上一個(gè)層級(jí)+1到當(dāng)前層級(jí)循環(huán),
                // 循環(huán)添加ul和li元素
                for (let j = lastLevel + 1; j <= curLevel; j++) {
                    // 創(chuàng)建ul和li元素诸典,并添加data-level屬性
                    let $u = $('<ul></ul>'),
                        $l = $('<li></li>');
                    $l.attr('data-level', j);
                    $u.attr('data-level', j).append($l);

                    // 找到data-level為j-1的最后一個(gè)li元素描函,并添加$u
                    $toc.find(`li[data-level=${j - 1}]:last`).append($u);
                }
                // 找到data-level為curLevel的最后一個(gè)li,并添加$a
                $toc.find(`li[data-level=${curLevel}]:last`).append($a);
            } else if (lastLevel === curLevel) {
                // 如果當(dāng)前層級(jí)和上一個(gè)層級(jí)相等,則找到相同層級(jí)的li元素的父元素舀寓,
                // 創(chuàng)建li元素并添加上去
                // 已經(jīng)存在data-level為curLevel的ul胆数,只需要?jiǎng)?chuàng)建li即可
                let $l = $('<li></li>');

                // 給li元素添加data-level樹形,并添加$a
                // 找到data-level為curLevel的最后一個(gè)li元素的父元素基公,添加$l
                $toc.find(`li[data-level=${curLevel}]:last`).parent().
                    append($l.attr('data-level', curLevel).append($a));
            } else {
                // 如果當(dāng)前層級(jí)小于上一個(gè)層級(jí)幅慌,則找到最后一個(gè)相同層級(jí)的li元素的
                // 父元素,添加$l
                // 找到data-level為curLevel的最后一個(gè)li元素,必然存在
                let $sublingLi = $toc.
                    find(`li[data-level=${curLevel}]:last`);
                let $l = $('<li></li>');

                // 找到$sublingLi的父元素,添加li元素即可
                $sublingLi.parent().append($l.attr('data-level', curLevel).
                    append($a));
            }

            $headers.eq(i).attr('id', id);
        }


        // 清除p元素的文本內(nèi)容轰豆,并將$toc元素append到p元素
        $('p:Contains([TOC]):first').text('').append($toc);
    });
</script>

然后打開MarkdownPad2胰伍,工具-->選項(xiàng)-->高級(jí)-->HTML Head編輯器,將上述代碼拷貝至代碼編輯器中酸休,保存并關(guān)閉-->保存并關(guān)閉

MarkdownPad2左側(cè)填入一下內(nèi)容:

# 《Vue2.0開發(fā)去哪兒網(wǎng)App》知識(shí)點(diǎn)
[TOC]
## 深入理解Vue組件
### 4-8 動(dòng)態(tài)組件與v-once指令
#### 動(dòng)態(tài)組件
#### v-once指令
## Vue中的動(dòng)畫特效
### 5-1 Vue動(dòng)畫 - Vue中的CSS動(dòng)畫原理
#### 動(dòng)畫原理
### 5-2 在Vue中使用animate.css庫(kù)
#### keyframes動(dòng)畫
#### 自定義類名
#### animate.css庫(kù)

文件-->導(dǎo)出-->導(dǎo)出HTML骂租,填寫文件名,保存斑司,效果如下:

result.png

GitHub項(xiàng)目

GitHub項(xiàng)目地址:https://github.com/02954/markdownpad2_toc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渗饮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宿刮,更是在濱河造成了極大的恐慌互站,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梳凛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門翠胰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人自脯,你說我怎么就攤上這事之景。” “怎么了膏潮?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锻狗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我焕参,道長(zhǎng)屋谭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任龟糕,我火速辦了婚禮桐磁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讲岁。我一直安慰自己我擂,他們只是感情好衬以,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著校摩,像睡著了一般看峻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衙吩,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天互妓,我揣著相機(jī)與錄音,去河邊找鬼坤塞。 笑死冯勉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摹芙。 我是一名探鬼主播灼狰,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼浮禾!你這毒婦竟也來了交胚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盈电,失蹤者是張志新(化名)和其女友劉穎蝴簇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匆帚,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡军熏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卷扮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡均践,死狀恐怖晤锹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彤委,我是刑警寧澤鞭铆,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站焦影,受9級(jí)特大地震影響车遂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斯辰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一舶担、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彬呻,春花似錦衣陶、人聲如沸柄瑰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)教沾。三九已至,卻和暖如春译断,著一層夾襖步出監(jiān)牢的瞬間授翻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工孙咪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪唐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓该贾,卻偏偏與公主長(zhǎng)得像羔杨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杨蛋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案兜材? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,753評(píng)論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)逞力。 注意:講述HT...
    kismetajun閱讀 27,486評(píng)論 1 45
  • DOM創(chuàng)建節(jié)點(diǎn)及節(jié)點(diǎn)屬性 通過JavaScript可以很方便的獲取DOM節(jié)點(diǎn)曙寡,從而進(jìn)行一系列的DOM操作。但實(shí)際上...
    阿r阿r閱讀 1,016評(píng)論 0 9
  • 本課來自http://www.imooc.com/learn/9請(qǐng)不要用作商業(yè)用途寇荧。 HTML5 HTML介紹 H...
    PYLON閱讀 3,227評(píng)論 0 5
  • 兒子一睜眼說:“媽媽举庶,我發(fā)燒了】眨”用手一摸果不其然户侥,小臉通紅,隨身帶的苦甘沖劑灌下后峦嗤,見精神還好蕊唐,就沒急著出門,直...
    杰伴誠(chéng)長(zhǎng)閱讀 135評(píng)論 0 0