SimpleMarkdown - 一款簡(jiǎn)單的Markdown編輯器

源碼地址: https://github.com/zhuangZhou/SimpleMarkdown
預(yù)覽地址: http://hawkzz.com:8000
作者網(wǎng)站:http://hawkzz.com

簡(jiǎn)介

這是一款基于NodeJs開(kāi)發(fā)的簡(jiǎn)單的Markdown編輯器,其UI是仿照簡(jiǎn)書(shū)的Markdown編輯器;主要功能:實(shí)時(shí)解析,實(shí)時(shí)保存,實(shí)時(shí)預(yù)覽,全屏等

預(yù)覽

image.png

技術(shù)棧

  • NodeJs
  • Express
  • Swig
  • Marked
  • highJs
  • Jquery

實(shí)時(shí)解析、保存

經(jīng)常使用簡(jiǎn)書(shū)的Markdown編輯器書(shū)寫(xiě)博客,它的有點(diǎn)很明顯,一是,可以實(shí)時(shí)保存,二是,可以實(shí)時(shí)解析;因?yàn)樽约合胱鰝€(gè)個(gè)人網(wǎng)站,其中就有書(shū)寫(xiě)博客功能,考慮過(guò)使用已經(jīng)目前很成熟的富文本編輯器,比如:ueditor編輯器;但是感覺(jué)這些編輯器都太過(guò)于龐大,于是,就有了自己寫(xiě)一個(gè)編輯器的念頭,說(shuō)干就干;研究了簡(jiǎn)書(shū)的Markdown編輯器的工作原理,它是怎么實(shí)現(xiàn)實(shí)時(shí)保存和解析的;然后開(kāi)始了自己的構(gòu)思。

想要實(shí)時(shí)保存,就需要不斷的給后臺(tái)傳輸數(shù)據(jù),那么是以什么頻率去給后臺(tái)傳輸數(shù)據(jù)呢?以什么樣的形式去保存呢,是直接保存在數(shù)據(jù)庫(kù),還是保存在一個(gè)文件里面呢?

首先,是第一個(gè)問(wèn)題,既然是實(shí)時(shí)保存,所以我這里是以每輸入一個(gè)字符,就開(kāi)始實(shí)時(shí)保存,這樣的一個(gè)缺點(diǎn)就是請(qǐng)求次數(shù)太多,如果各位有什么好建議,請(qǐng)拍磚;

然后,是第二個(gè)問(wèn)題,我這里是通過(guò)把標(biāo)題寫(xiě)在一個(gè)數(shù)組里(當(dāng)然在實(shí)際項(xiàng)目中這是寫(xiě)在數(shù)據(jù)庫(kù)里的,這里只是不想開(kāi)數(shù)據(jù)庫(kù),所以使用數(shù)組),文章放在一個(gè)文件里,通過(guò)標(biāo)題(或數(shù)據(jù)庫(kù)標(biāo)識(shí))來(lái)查詢(xún)文章;

下面為主要的NodeJs后臺(tái)代碼

router.post('/save', (req, res) => {
    //獲取數(shù)據(jù)
    let title = req.body.title;
    let markdown = req.body.markdown;
    let change = Number.parseInt(req.body.change);

    let html = `# ${title} # \n ${markdown}`;

    fs.exists('./docs/' + title + '.md', (exists) => {
        console.log(exists);
        if (!exists) {
            console.log(change);
            if (change === 1) {
                let oldTitle = req.body.oldTitle;
                fs.unlink('./docs/' + oldTitle + '.md', (err) => {
                    if (err) {
                        return console.error(err);
                    }
                    titleArr.forEach((item, index) => {
                        if (item === oldTitle) {
                            titleArr.splice(index, 1, title);
                        }
                    })
                    console.log('刪除成功!');
                });
            } else {
                titleArr.splice(0, 0, title);
                console.log(titleArr);
            }
        }
    });

    //寫(xiě)入文件
    let writeStream = fs.createWriteStream('./docs/' + title + '.md');
    writeStream.write(markdown);
    writeStream.end();

    writeStream.on('finish', () => {
        console.log('寫(xiě)入完成');
    });

    //傳遞數(shù)據(jù)
    let data = {};
    data.html = marked(html);
    res.json(data);
});

前臺(tái)代碼:

//實(shí)時(shí)保存解析文檔
function transformMd() {
    var markdown = $('#editArea').val();
    var title = $('#markTitle').val();
    var oldTitle = $('#markTitle').attr('data-old');
    var change = 0;
    if (oldTitle != undefined && title != oldTitle) {
        change = 1;
    }
    $.post('/save', {
        markdown: markdown,
        title: title,
        oldTitle: oldTitle,
        change: change
    }, function (res) {
        $('.right').html(res.html);
        $('#markTitle').attr('data-old', title);
        $('pre code').each(function (i, block) {
            hljs.highlightBlock(block);
        });
    }, 'json');
}

后記

這篇博客只是介紹了核心功能,其余的感覺(jué)無(wú)需多介紹,需要了解的可以看源碼,都有注釋?zhuān)喽嗾徑猓。。?/p>

目前只是實(shí)現(xiàn)了新建文檔和實(shí)時(shí)解析,實(shí)時(shí)保存以及一些基本功能,還有一些構(gòu)思沒(méi)有實(shí)現(xiàn),比如:上傳文檔解析;敬請(qǐng)期待!?。?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,405評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • SSL/TLS 握手過(guò)程: 網(wǎng)上找的一張圖比較清楚 單項(xiàng)認(rèn)證具體過(guò)程(C(客戶(hù)端)和S(服務(wù)端)通信): SSL協(xié)...
    魔焰joy閱讀 409評(píng)論 0 0
  • 高考結(jié)束有兩個(gè)月之久了,初中畢業(yè)之后歷經(jīng)四年長(zhǎng)分短聚,重又和女兒朝夕相共在一起。兩個(gè)月中,我們之間經(jīng)歷了短暫甜蜜—...
    作家琴臺(tái)閱讀 628評(píng)論 0 1
  • 小確幸 世間萬(wàn)物無(wú)時(shí)無(wú)刻都在變化,隨著時(shí)間的積累,在某天某時(shí)某刻,發(fā)生質(zhì)的改變。 1.實(shí)習(xí) 還有三天,我們18年要...
    守望小確幸閱讀 580評(píng)論 1 4

友情鏈接更多精彩內(nèi)容