系列:一張投影片背後的工程:從零打造網頁簡報編輯器
對應程式:
package.json版本0.20.0的工作目錄。批次文字格式與格式刷分別在 V18、V19 開發階段完成;本篇使用目前保留的實作與 2026-10-02 截圖,不宣稱存在同名 Git tag。
前兩篇已經讓簡報能夠播放,並輸出成 PDF 交付。接下來要讓製作過程更省事,先從多頁之間的樣式一致性開始。
做完幾頁簡報後,我發現兩個標題的字級不一樣,一個有底線,另一個用了不同顏色。逐一調整可以解決,但頁數一多就容易漏掉。
今天把這件事縮短成兩種操作:同一頁可以多選文字框,批次調整指定格式;已經有滿意的範例時,可以複製整套文字樣式,再跨頁套用。
選到兩個不同字級的文字框,屬性面板不應只拿第一個字級當作共同狀態。目前會把不一致的值顯示為「混合」:

2026-10-02 的 Edge 自動化畫面。畫面也選到矩形,但文字格式只套用到兩個文字框。
getCommonTextStyle() 先把舊資料缺少的欄位依預設值解讀,再比較全部文字。例如字型預設為 sans-serif、粗體預設為 normal。全部相同才顯示共同值,不同則回傳 undefined,由介面呈現混合狀態。
按下混合的「粗體」時會全部設成粗體,再按一次全部取消。每個欄位只修改自己負責的格式;例如開啟底線,仍保留各文字框原本的刪除線。
這裡處理的是整個文字框,尚未支援同一框內某幾個字使用另一套格式。
如果迴圈對每個文字框各提交一次修改,按一次粗體可能產生好幾步復原。這一版先建立各目標的樣式 patch,再提交一次;以格式刷的提交為例:
updateDocument({
type: 'element/set-styles',
slideId: resolvedActiveSlideId,
styles: copiedFormatPatches,
})
reducer 走訪該頁物件,只修改有對應 patch 的文字。圖片、圖形、文字內容與位置都保留;鎖定位置的文字框也能調整格式。
若 patch 套用後沒有差異,就沿用原文件,避免無意義的復原紀錄與儲存提示。對使用者來說,重要的結果是「一次批次設定,可以一次復原」。
格式刷使用另一種意圖:把來源的整套文字樣式交給目標。它先以 copyTextStyle() 補齊所有預設欄位,再保存快照。
例如來源沒有粗體,目標原本有粗體,套用後就應取消目標粗體。如果只複製來源實際出現的可選欄位,反而可能留下目標舊樣式。
這份快照包含字型、字級、顏色、對齊、粗斜體、底線與刪除線、行距,以及目前版本的清單格式。它不包含文字內容、座標或大小,也不隨來源後來修改而改變。

這是獨立的格式刷測試案例,與上一張混合值圖片使用不同文字內容,並非同一組物件的前後截圖。
操作順序如下:
格式可以重複套用,不必每次回來源頁複製。目標若已經是相同格式,套用按鈕會停用。
複製格式只改變介面中的暫存值,不會寫入文件或建立復原紀錄。來源後來修改、刪除,也不會破壞已複製的快照。
重新整理或成功匯入另一份備份時,這個暫存會清空;已經套用到目標的格式則照常保存。匯入失敗時仍保留原專案與暫存,避免失敗流程額外破壞工作狀態。
這個區分讓格式刷可以跨頁使用,又不需要把一次性的剪貼內容塞進專案格式。
既有的介面與文字格式測試涵蓋混合值、預設欄位、跨頁套用、快照獨立、批次復原,以及重新整理與匯入時的暫存行為。本次完整測試重跑,10 個檔案、86 項通過。
2026-10-02 的 Edge 紀錄另確認批次修改、格式刷跨頁、來源後續修改、復原與重新載入。截圖取自那次的實際操作,沒有當成今天重新拍攝的畫面。
現在可以快速統一文字樣式;下一個障礙是「我知道文字還在,但被上面的圖形蓋住,點不到它」。下一篇用圖層面板解決這個問題。