SimpleMarkdown - 一款簡單的Markdown編輯器


源碼地址: https://github.com/zhuangZhou/SimpleMarkdown

預覽地址: http://hawkzz.com:8000

作者網站:http://hawkzz.com

簡介

這是一款基於NodeJs開發的簡單的Markdown編輯器,其UI是仿照簡書的Markdown編輯器;主要功能:實時解析,實時保存,實時預覽,全屏等

預覽

技術棧

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

實時解析、保存

經常使用簡書的Markdown編輯器書寫博客,它的有點很明顯,一是,可以實時保存,二是,可以實時解析;因為自己想做個個人網站,其中就有書寫博客功能,考慮過使用已經目前很成熟的富文本編輯器,比如:ueditor編輯器;但是感覺這些編輯器都太過於龐大,於是,就有了自己寫一個編輯器的念頭,說干就干;研究了簡書的Markdown編輯器的工作原理,它是怎么實現實時保存和解析的;然后開始了自己的構思。

想要實時保存,就需要不斷的給后台傳輸數據,那么是以什么頻率去給后台傳輸數據呢?以什么樣的形式去保存呢,是直接保存在數據庫,還是保存在一個文件里面呢?

首先,是第一個問題,既然是實時保存,所以我這里是以每輸入一個字符,就開始實時保存,這樣的一個缺點就是請求次數太多,如果各位有什么好建議,請拍磚;

然后,是第二個問題,我這里是通過把標題寫在一個數組里(當然在實際項目中這是寫在數據庫里的,這里只是不想開數據庫,所以使用數組),文章放在一個文件里,通過標題(或數據庫標識)來查詢文章;

下面為主要的NodeJs后台代碼

router.post('/save', (req, res) => {
    //獲取數據
    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);
            }
        }
    });

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

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

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

前台代碼:

//實時保存解析文檔
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');
}

后記

這篇博客只是介紹了核心功能,其余的感覺無需多介紹,需要了解的可以看源碼,都有注釋,多多諒解!!!

目前只是實現了新建文檔和實時解析,實時保存以及一些基本功能,還有一些構思沒有實現,比如:上傳文檔解析;敬請期待!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM