用Markdown檔案寫筆記,用資料夾做分類,整個筆記文件專案構成了一個樹形結構。筆記文章之間、文章與分類之間經常有特定的先後順序,於是就在檔名前面加上數字字首來控制排序。但是,Windows的檔案系統始終把資料夾和檔案分開來排序,一般是所有資料夾排在所有普通檔案之前,Typora也採用了這種策略,這對我的筆記組織造成了一些不便。因此,我嘗試對Typora的程式程式碼進行一些修改,以支援資料夾和檔案混合排序。
Typora是基於Electron的應用程式,程式語言是解釋型的JavaScript,而不是編譯型語言,因此應該可以找到其執行的JS檔案,修改其中的程式碼以新增我們自己的邏輯。Typora還允許開啟DevTools,這更方便我們除錯。
在Typora中開啟DevTools,觀察到其載入了幾個JS檔案,其中一個是C:\Program Files\Typora\resources\appsrc\window\frame.js
,猜測是整個應用程式視窗的程式碼。在檔案最後新增一個alert()
,重啟Typora,看到有彈窗,說明確實可以執行我們自己的程式碼。
Typora中的JS檔案都是編譯壓縮後的,修改前要先用VSCode或WebStorm格式化一下。因為經過編譯,所以變數名、程式流程寫法等都不容易閱讀,需要一些耐心去理解。
在DevTools中檢視側邊欄檔案樹的DOM結構,發現資料夾結點下的所有子檔案(資料夾和普通檔案)都位於.file-node-children
元素中,因此,只要修改渲染這個DOM的邏輯,就可以實現自定義排序。
在frame.js
中搜索file-node-children
,共有3處,檢視、除錯分析,發現了渲染檔案列表的核心方法renderNode()
。每個檔案結點資料中,子目錄結點放在subdir
屬性(陣列)中,子文章結點放在content
屬性(陣列)中,它們是分開排序、分開渲染的。那麼,只需要合併這兩個陣列,放在一起一次性排序、渲染就可以實現混排了。新增程式碼,重啟Typora,發現成功了。
此外,還要繼續分析、修改其他幾處程式碼,才能讓檔案列表始終都能正確混合排序。過程類似,就略了。
一番分析、修改、除錯下來,任務就完成了。實現不難,主要是走一遍這種逆向工程,把學到的知識用起來。