PIT 編輯器編輯及協同架構說明

2022-02-23 17:03:53 字數 1650 閱讀 9293

pit 專案使用 quill-delta 作為資料層儲存文件內容資料,quill-delta 是乙個基於 ot 演算法的庫,用 quill-delta 作為資料層,不僅能很好的儲存文件資料,還可以方便的實現文件的協同編輯,即多個人同時編輯同乙份文件(需要伺服器支援)。

quill-delta 資料格式不僅能很好的描述完整的文件內容,還可以很方便的描述文件的修改過程,所以 pit 在進行架構設計的時候,並不僅僅考慮單機編輯的情況,同時還考慮到了協同編輯的情況,以方便以後在需要的時候實現協同編輯功能。

上圖即為 pit 編輯器單機使用時的系統架構。基本流程是使用者通過各類 action 修改資料 model,比如使用者要在某個位置插入乙個字元「a」,就會直接通過 insert 介面在 model 中插入 「a」 這個字元,然後編輯器發現某個 model 更新後,會呼叫其 layout 方法對內容進行重新排版,然後用 render 方法把排版後的內容繪製到 view 上,讓使用者可以看到自己剛剛插入的內容。

同時 model 會用 quill-delta 的 diff 演算法計算出文件內容修改前後的資料差異,並通過 delta 的方式來表示這種差異,即為 delta diff。

delta diff 代表了使用者剛剛對文件進行的修改。比如原文件內容為

使用者在「好」和「世」之間插入乙個字元「a」,則產生的 delta diff 為

即游標從 0 位置向後移動兩個位置,然後插入字元「a」。

delta diff 代表了使用者此次對文件內容的操作,通過 quill-delta 的 invert 介面即可產生乙個代表相反操作的 invert delta diff,如上面的 delta diff 在 invert 操作之後即可得到

即游標從 0 位置向後移動兩個位置,然後刪除乙個字元。

將 delta diff 和 invert delta diff 作為一組一起壓入 history stack 並設定乙個指向當前操作的游標,即可實現文件編輯器上常見的 redo、undo 功能。

進行協同編輯的場景和單機編輯的場景基本類似,區別僅在於使用者修改文件產生了 delta diff 之後,將這個 delta diff 通過伺服器中**給其他一起進行協同編輯的客戶端(上圖中的 user b),這個使用者就可以通過收到的 delta diff 來完成和 user a 完全相同的對 model 的操作,並渲染到 view 上,這樣就基本實現了協同編輯。user b 的編輯器在收到 delta diff 後,先判斷收到的 delta diff 會對文件中的那些段落產生影響,然後獲取這些段落的 delta 資料,並將 delta diff 合併到 delta 中,這樣就得到了代表這些段落新狀態的 delta,這時再通過 readfromdelta 方法即可由新的 delta 產生新的段落 model,然後通知編輯器重新排版並渲染到使用者介面上。

具體實現可參考:

編輯器說明

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

CSDN markdown編輯器說明

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

CSDN markdown編輯器說明 mark下

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...