本文主要和大家分享php之markdown文件管理工具的實現代碼,希望能協助到大家。
主要目標:
1.可以多人編輯
2.可以在瀏覽器中查看
3.有一個可以摺疊的目錄
4.支援多級目錄
5.支援markdown
6.快, 方便
工作後一直在從事PHP開發, 從以前的大包大攬到現在的退居服務端寫介面, 當中接觸過幾個的介面文件管理工具或系統, 簡單描述下:
showdoc, 功能全面而且簡潔, 有使用者,許可權管理功能, 支援markdown, 支援匯出word, 有多種文件範本, 目錄支援兩級摺疊
confluence, 功能強大(許可權管理, 寄件提醒, 全文檢索搜尋, 外掛程式管理等), 重, 收費的一個文件管理系統
swagger, 需要在代碼中寫大量的注釋去配合
readmine, 功能豐富類似confluence, 它的文檔是以txt儲存的, 可以追溯變更, 可以全文檢索搜尋, 但是寫文檔有點痛苦, 適合任務/bug跟蹤管理等
gitbook, nodejs安裝, 支援markdown, 支援npm外掛程式, 左側的可摺疊的分類樹就需要裝外掛程式, 也可以裝搜尋外掛程式, 目錄是單獨的markdown檔案, 我使用的時候感覺從md到HTML編譯太慢(600+的文檔, 要編譯25分鐘多, 如果有增量編譯或提高編譯速度的外掛程式還請各位賜教
解決方案:
結合git就可以實現, 正好也可以利用git的許可權管理功能
需要將markdown編譯成HTML檔案部署到內網
因為要在瀏覽器中查看, 這裡最終選擇了接入簡單, 介面清爽, 無依賴的dtree.js (不依賴jQuery)
這個功能用了樹的後根序遍曆演算法實現了對多級檔案的讀取(沒有用遞迴, 擔心寫著寫著把自己繞進去), 正好dtree.js 也支援多級目錄摺疊
這裡我最終選擇了segmentfault官方出的PHP編譯工具類(因為他們已經參考最佳化了很多類似的PHP類,感謝~)
快的話, 編譯600多個檔案, PHP用時2s左右,可以接受, 而且支援增量編譯; 方便的話, 主要體現在目錄是自動產生的, 不需要單獨在編寫目錄
其中遇到的問題:
增量編譯
剛開始判斷一個md檔案是否需要編譯成HTML, 是拿md檔案的建立時間和最後修改時間做對比進行判斷的,
但是後來發現, 一些複製來的, 重新命名的檔案用這個方法就不起作用.
最後使用了一個中間檔案, 去記錄本次編譯的檔案的時間, 再跟 max(建立時間, 最後修改時間)對比判斷是否需要編譯
刪除多餘檔案
後續使用過程中發現, 有些md文檔被刪除了, 但是沒有自動刪除最終編譯後的檔案,
因此, 在編譯時間會對md檔案和最後的HTML檔案坐一個差集, 刪掉那些多餘的HTML檔案
整合dtree.js
首先, dtree.js需要一定要求的json資料才能顯示目錄和進行展開和摺疊的互動
還有, dtree.js字型比較小, 他的圖片,樣式,指令檔都是相對路徑, 我這裡對路徑做了相應修改, 使之改為基於當前網域名稱的絕對路徑, 這樣部署到不同的網域名稱下是不用修改dtree.js代碼的層級目錄的
組裝, 美化HTML
組裝是事先寫好HTML的頭部, 底部, 側邊欄等的HTML代碼, 然後把這些內容拼接到編譯後的內容前後, 最後再放到相應的檔案夾中去
美化, 這個主要是因為segmentfault官方出的編譯工具並沒有對HTML元素(例如, table, code)添加樣式, 我這裡找到github的相關css樣式進行了美化
支援多級目錄
這個也是耗費了我大量腦細胞寫出來的, 大學的時候寫動態哈夫曼編碼的時候寫過一遍樹的遍曆了,
本以為駕輕就熟, 誰知道折騰到夜裡3點多才最終寫好, 這個功能也算是核心組件之一了吧。