解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)

同勉共進發表於2021-09-07

寫在前面

針對在部落格園TinyMCE模式下,內建的插入程式碼功能不支援Go語言的問題,本文提出兩個並不十分完美的解決方案。本文所提方案支援程式碼高亮、摺疊、行號。同時,本文中的方法二可以用來自定義程式碼高亮(不管是什麼語言)。由於在下並沒有前端基礎,所以某些表述可能不夠確切,歡迎讀者批評指正。

正文

在TinyMCE模式下,有兩種插入程式碼塊的方式,如下圖所示。

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

其中,藍色框中方法是利用第三方外掛實現的,支援Go語言,但摺疊的程式碼展開後不能再摺疊,且沒有程式碼複製按鈕。紅色框中方法是部落格園後臺自己實現的,直接生成HTML程式碼來渲染高亮,但該方法目前不支援go語言。

針對這種情況,在下找到兩種不太完美的解決方案。

方案一

使用Markdown。

首先需要進行以下設定:進入部落格園主頁(https://www.cnblogs.com/)-->滑鼠放在右上角自己的頭像上(不要點選)-->在下拉選單框中點選“我的部落格”-->在頁面上方找到“管理”按鈕並點選(不同皮膚下“管理”按鈕的位置可能有所不同)-->點選“設定”標籤-->勾選“顯示行號”-->點選“儲存”。如下圖所示:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

 然後就可以寫MarkDown程式碼了。如下面的Markdown語句,

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
 1 <details>
 2 <summary>View Code</summary>
 3 
 4 ```go
 5 package main
 6 
 7 import "fmt"
 8 
 9 func main(){
10     fmt.Println("hello world")
11 }
12 ```
13 </details>
View Code

將產生以下效果:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

該方案注意事項如下:

  1.  <summary>View Code</summary> 中 View Code 可以換成自己喜歡的文字,支援中文。
  2.  <summary>View Code</summary> 後面必須空出一行,這一點網上許多資料都沒有提到。
  3. 需要顯式指明語言(如上面程式碼第4行,go或golang都可以,且不區分字母的大小寫)。

以上方案存在明顯缺陷:1)並沒有解決TinyMCE模式下的問題,換用Markdown,屬於耍無賴。2)沒有程式碼複製按鈕。

方案二

 如前所述,部落格園提供“內建”的程式碼塊插入功能,支援高亮、摺疊、行號、複製等功能。該功能的語法高亮,是利用後臺演算法,通過將程式碼直接用HTML語言“修飾”(指明字型、顏色等)來實現的。遺憾的是,目前該功能還沒有針對Go語言的“修飾器”。

所以,一種從根本上解決問題的思路是:第一步,依然利用內建功能插入Go程式碼,只不過先隨便選一種其它語言(如C++、C#等),顯然,此時的高亮肯定是不盡如人意的,因為不同的語言關鍵字有所不同,所以,需要進行第二步。第二步,將【部落格園網頁中修飾程式碼格式的那段HTML程式碼】替換成【支援Go語法高亮的HTML程式碼】。

那麼,問題來了:1)怎麼找到後臺HTML程式碼?2)怎麼得到【支援Go語法高亮的HTML程式碼】?不會是需要手寫吧?

回答:1)回到本文第一張圖片,藍色框右邊的按鈕,就是寫著“HTML”的那個,點選它,就能看到部落格對應的HTML程式碼。2)肯定不是手寫,但需要藉助其它工具,Sublime Text,可以到這裡下載,然後根據這裡這裡操作。在此特別感謝以上三個連結的作者。

至此,動手能力強或者有HTML基礎的讀者,可以搞起來了。想了解細節的,可以往後看。

步驟1:根據上面三個連結,安裝 Sublime Text 和 SublimeHighlight 外掛,這裡不再贅述。

步驟2:到  Sublime Text安裝目錄\Data\Packages\SublimeHighlight  下,開啟 themes.png 檔案,可以看到各主題名稱和對應的式樣,如下圖:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

步驟3:還是在步驟2中的目錄下,用任意文字編輯器(如Sublime Text、notepad++等)開啟 SublimeHighlight.sublime-settings 檔案,進行如下圖所示的修改:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

注意,以上設定的是匯出的程式碼式樣,不是Sublime Text編輯區的程式碼式樣,讀者會發現修改配置後編輯區程式碼的式樣沒有變化,這是正常現象。

步驟4:在Sublime Text中鍵入要插入的Go程式碼段,注意確保檔案字尾為 .go。接著,按下圖操作:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

步驟5:用編輯器的批量替換功能,將 background-color: #f8f8f8 全部替換為 color: #008080 ,這裡, #f8f8f8 是行號的背景色,不同主題可能會有不同, #f8f8f8 對應的是 default 主題; #008080 是部落格園預設的行號顏色,讀者也可以設定自己喜歡的其它顏色。這麼做的原因是:部落格園插入程式碼塊的背景是灰色的(#f5f5f5),如果行號有其它顏色背景的話,會不好看。結果如下圖所示(圖中為 default 主題,並且為清晰展示,手動對程式碼進行了換行):

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

步驟6:在部落格園中,使用內建插入程式碼按鈕,插入程式碼,語言任選一種,勾選“全部摺疊”和“顯示行號”,最後點選“插入程式碼”按鈕。如下圖:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

步驟7:在部落格園編輯頁面,點選“HTML”按鈕,開啟部落格對應的HTML程式碼,如下圖,用上圖紅框內程式碼替換下圖紅框內程式碼,然後點選左下角“更新”按鈕。(下圖中程式碼也是經過手動排版的)

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

步驟8:最終效果如下圖:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

GIF顏色有些失真,靜態圖如下

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

如果想要使用 themes.png 中的黑色背景主題,如 vim 主題,需要在步驟7中圖片上劃藍線的語句中加入 style="background: #000000;" ,即將背景設為黑色,同時,建議在步驟5中將行號顏色設為與黑色對比鮮明的顏色(如 #ffc300 )。效果如下:

解決部落格園TinyMCE模式下內建插入程式碼塊功能不支援Go語言的問題(兩個並不完美的解決方案)
View Pic

多說一句,修改步驟7中圖片上劃綠線的語句,可以修改整個“程式碼展示框”的背景,讀者可以自行試驗。

至此,方案二介紹完畢。

該方法的缺點也很明顯——麻煩!

題外話:

notepad++也能匯出HTML檔案,十分簡便(貌似高版本的 notepad++ 自帶 NppExport 外掛),但不支援連同連行號一起匯出(這裡有一個解決方案,很佩服作者的清奇思路),同時,生成的HTML程式碼將式樣抽離為一堆類選擇器,因此,在和部落格園的HTML程式碼進行整合的時候會比較麻煩,特別是當一篇部落格需要插入多段程式碼的時候。

VS Code將程式碼匯出為HTML檔案的步驟更加繁瑣,需要藉助第三方工具,且同樣不支援程式碼行號。這個局面,在下也很驚訝。如果有知道利用VS Code將程式碼匯出為HTML的簡單方法的讀者,煩請不吝賜教。

寫在後面

  1. 上面教程針對的是摺疊程式碼並顯示行號的情況,如果不需要這些功能,只要在部落格園和Sublime Text中做相應調整即可,相信讀者可以舉一反三。
  2. 再次對本文中所有連結的作者表示由衷感謝。
  3. 在下才疏學淺,文中難免有錯誤疏漏之處,歡迎大家批評指正,您的批評是在下前進的不懈動力。

相關文章