2023-07-05 14:29:57來源:趣談前端
大家好, 我是徐小夕, 之前和大家分享了一個在線文檔編輯器PowerNice, 它可以輕松幫我們編寫文檔并一鍵導出多種格式比如html,pdf,md,png圖片等, 如下:
最近為了讓編輯器滿足更多場景需求, 我開發(fā)了桌面端軟件版本——powernice-electron, 支持mac和window。
接下來我來對powernice技術實現(xiàn)和功能做一個介紹。
(資料圖)
作為一名技術工作者, 我們經常會遇到編寫技術文檔, 技術分享等需求, 網上也有很多現(xiàn)成的文檔管理工具, 出于好奇心, 我拉著朋友一起實現(xiàn)了一個, 用來自給自足. 接下來就來介紹一下輕量級且靈活方便的文檔編輯工具——「powerNice」。
「powerNice」提供兩種方式來編寫文章/文檔, 即程序員最喜歡的markdown
, 也可以使用非技術人員最容易上手的富文本編輯器。
實現(xiàn)「powerNice」在線文檔編輯器我們采用如下核心技術棧:
ReactAnt DesignDvaFor-editorBraft-editorNodejs瀏覽器指紋識別技術功能盤點1、多模式編輯多模式編輯主要是指我們可以用富文本和md編輯器來編輯我們的文章, 我們采用最熟悉的React來實現(xiàn), 效果如下:
2、多主題目前支持2套主題, 淺色和深色, 主要從用戶體驗的角度方便用戶夜間寫作. 效果如下:
深色:
淺色:
3、支持一鍵導入導出為了提高我們的寫作效率以及對文章的多路復用, 我們提供了一鍵導入導出文件等功能, 具體如下:
導出Markdown導出PDF基于文章導出海報圖導入Markdown文件下載文章html內容使用截圖如下:
下載的html內容預覽如下:
還原度還是非常高的~
4、多模式預覽多模式預覽主要是右側的預覽區(qū), 我們支持手機端預覽和pc端預覽, 如下圖:
5、字數行數統(tǒng)計字數行數統(tǒng)計主要是幫助作者做內容統(tǒng)計, 這塊實現(xiàn)不是很難, 我們看看預覽效果:
6、文章管理文章管理主要是管理用戶編寫的內容, 這里因為我們做的是線上工具, 用戶識別主要采用瀏覽器指紋識別技術來區(qū)分用戶, 用戶可以輕松在編輯器文章列表中切換文章進行編輯, 效果如下:
核心技術實現(xiàn)1、導入導出多類型文件「導入md/html文件」導入md文件我們主要利用ant的upload組件和FileReaderAPI, 具體實現(xiàn)如下:
{ name: "file", showUploadList: false, beforeUpload(file: any): any { const reader = new FileReader() reader.onload = function(e: Event) { const data = (e as any).target.result if (editor === "richText") { // ... } else { // ... } } reader.readAsText(file) },}
「下載html」下載html的原理也很簡單, 我們拿到渲染后的html字符串, 利用html模版將其包裝成完整的html, 最后再存儲為File對象, 利用file-saver實現(xiàn)下載. 思路如下:
核心代碼如下:
const doc = document.querySelector(".for-markdown-preview") as HTMLElementconst html = createMDHtml(doc.innerHTML, article)file = new File([html], `${moment().format("YYYYMMDDHHmmss")}.html`, { type: "text/html;charset=utf-8" })// 下載文件saveAs(file)
2、基于瀏覽器指紋識別技術的用戶識別瀏覽器指紋這塊知識點涉及的比較多, 筆者這里簡單介紹一下canvas指紋。
「Canvas指紋」是利用系統(tǒng)之間, 字體渲染引擎, 抗鋸齒、次像素渲染等處理方式的差異而實現(xiàn)的一種指紋識別技術. 我們使用canvas將同樣的文字轉成圖片, 即便使用Canvas繪制相同的元素,但由于上述的差別得到的結果也是不同的。
所以我們可以利用以上技術, 對不同用戶瀏覽器進行識別, 從而區(qū)分用戶(雖然存在概率事件), 實現(xiàn)無需登錄就能保存對應內容的目的. 基本實現(xiàn)代碼如下:
createFingerprint = () => { const canvas = document.getElementById("anchor-uuid") as HTMLCanvasElement const context = canvas.getContext("2d") as CanvasRenderingContext2D context.font = "18pt Arial" context.textBaseline = "top" context.fillText("hello, user.", 2, 2) const fingerprint = canvas.toDataURL("image/jpeg") // hash const secret = "nice" const hash = crypto.createHmac("sha256", secret) .update(fingerprint) .digest("hex") return hash}
大家也可以參考此方法來設計自己的指紋識別方案。
關鍵詞:
前言大家好,我是徐小夕,之前和大家分享了一個在線文檔編輯器PowerNice,
圖片視頻分割在許多場景下被廣泛應用。電影視覺效果的增強、自動駕駛的
圖神經網絡作為深度學習的一大活躍領域,受到人工智能學家廣泛關注。由
本文生涯獎項有望+1!梅西“窩窩”名言入圍2023MTVMIAW大獎候選到此分
近日,上海電力位于青浦區(qū)工業(yè)園區(qū)的3799 95kW分布式光伏發(fā)電項目成功
1 數據庫引擎不支持事務這里以MySQL為例,MyISAM引擎是不支持事務操作
隨著前端項目的不斷迭代,就可能出現(xiàn)部分CSS代碼未使用的情況。這些未
物聯(lián)網為企業(yè)提供了更高的可見性、自動化和運營效率。已經開始研究部署
7月5日消息,GitHub和NPM的前工程經理DarcyClarke上周警告稱,NPM包存
雖然連接設備是物聯(lián)網數據的關鍵來源,但其全部價值將在可互操作的物聯(lián)
太平洋保利盈2 0兩全保險怎么樣?滿期能領多少錢?適合什么人買?太平
在WWDC2023主題演講中,蘋果非常關注游戲,更具體地說,是Mac上的游戲
注解的高級使用自定義注解是Java語言的一項特性,可以為程序元素(類、
哈嘍,大家好,我是了不起。如題,這個問題應該面試??碱},當你遇到這
flag包作用Golang中的flag包用于解析命令行參數,提供了一個方便的接口