VS Code markdown格式化的插件編寫(3)[解難反思]

前言

第一篇: 介紹編寫插件的準備和如何發佈.git

第二篇: 介紹插件簡單功能的具體編寫過程.github

第三篇: 介紹插件開發遇到的問題和解決的方案markdown


解決問題

換行符

問題描述

開發完之後就美滋滋地開始用了,在格式化以前本身寫的一個md,取名爲 1.md 時,忽然發現每格式化一次後,都會在空行後多出一個空行post

解決過程

本身將文件刪減到只有兩行,依然發現還會多出空行,而後新建一個md文件,,取名爲 2.md ,將內容複製拷貝過去之後,發如今 2.md 中能夠正確地格式化。這就奇怪了,明明內容是同樣的啊,查看兩個文件描述,發現相差一個字節。優化

再想到1.md是從以前的window平臺拷貝過來,而2.md是在osx平臺新建的,因而去查了下資料,原來是兩個平臺的換行符是有差別的。ui

簡單地說, window 平臺下的換行符爲 \r\n,而 osx 平臺的換行符爲\n 。所以,用一段正則統一兩個平臺的換行符便可。spa

const LINE_BREAK_EXP = /\r\n/g;
複製代碼

在這裏,稍微提一下。插件

  1. \r 爲回車,做用是光標返回當前行首。code

  2. \n 爲換行, 做用爲光標移動到下一行。regexp

這兩個符號是從打字機開始出現,後來繼承到電腦上。

Unix平臺認爲 \n 就闊以了,還省個字節,window 認爲 \r\n 纔是正統, osx 之前用 \r ,萬幸如今和 Unix 同樣了。

屢次格式化

問題描述

在格式化js代碼後,會將代碼段(用```包裹的代碼)中已經格式化過地代碼,再次格式化,出現問題。

例如:

function(){var a = 100; settimeout(function(){console.log('hello')}),100}
複製代碼

格式化之後

function(){
    var a = 100;
    settimeout(function(){
        console.log('hello')
    },100)
}
複製代碼

再次點擊格式化,

function(){
    var a = 100;
    settimeout(
    function(){
        console.log('hello')
    }
    ,100)
}
複製代碼
解決過程

這個問題就比較容易發現緣由, 是由於被格式化後的代碼段中出現了多行以4個空格或者tab開頭的行,他們也符合代碼塊(就是以空格或者tab開頭)的匹配規則,所以被重複格式化。

我沒有找到更好的正則匹配方式,所以個人思路是,將已經格式化過的代碼段從內容中移除,再執行格式化代碼塊,最後再補全內容。

在這裏補充一個格式化的辦法

function removeReplace(text: string, reg: RegExp, func: Function): string {
    const _tempRegArr = text.match(reg)
    if (_tempRegArr && _tempRegArr.length > 0) {
        const _tempArr = [];
        _tempRegArr.forEach((e, i) => {
            const _reg = new RegExp(escapeStringRegexp(e), 'g');
            _tempArr.push(e);
            text = text.replace(_reg, `$mdFormatter$${i}$mdFormatter$`);
        })
        text = func(text);
        const _mdformatterArr = text.match(/\$mdFormatter\$\d+\$mdFormatter\$/g)
        _mdformatterArr.forEach((e, i) => {
            const _reg = new RegExp(escapeStringRegexp(e), 'g');
            text = text.replace(_reg, _tempArr[i]);
        })
    } else {
        text = func(text);
    }
    return text
}
複製代碼

反思優化

依然仍是有些不足滴,粗略說一些

1. 用戶每次點擊 command+shift+f 的時候,都會執行格式化,從效率角度,應當有個變量標記內容是否更改,若是沒有更改就直接返回。(已在0.2.1版本實現)

  1. 目前只支持js的格式化,我想應該也有其餘格式的代碼的庫,做爲後續能夠擴展的功能。

目前開發了一些功能,算是能夠用了,我的格式化了40篇md沒有什麼問題. 開發兩小時,修了兩天bug

在vscode插件裏查找

git地址在這裏~

代碼在這裏,star隨意,歡迎issues~, 也歡迎你們在vscode中使用,我會持續更新~

相關文章
相關標籤/搜索