自定義tiptap插件

本文為開發開源項目的真實開發經歷,感興趣的可以來給我的項目點個star,謝謝啦~

具體博文介紹:
開源|Documind協同文檔(接入deepseek-r1、支持實時聊天)Documind 🚀 一個支持實時聊天和接入 - 掘金

我干了什么

我定義了兩個插件:

  • font-size:支持通過setFontSize設置tiptap編輯器字體大小,通過unsetFontSize重置為默認大小。
  • line-height:支持通過設置setLineHeight設置tiptap編輯器行高,通過unsetLineHeight重置為默認行高。

源碼參考

這里就不一點一點講解了,注釋看不懂的話可以叫AI幫你解析。

font-size插件:
import { Extension } from "@tiptap/core";
import "@tiptap/extension-text-style";// 聲明類型
declare module "@tiptap/core" {interface Commands<ReturnType> {fontSize: {/** 設置字體大小(支持CSS單位如12px/1.2rem等) */setFontSize: (fontSize: string) => ReturnType;/** 清除字體大小設置 */unsetFontSize: () => ReturnType;};}
}// 創建擴展
export const FontSizeExtension = Extension.create({name: "fontSize",// 擴展配置項addOptions() {return {types: ["textStyle"], // 作用對象為文本樣式標記};},// 注冊全局屬性addGlobalAttributes() {return [{types: this.options.types, // 應用范圍(textStyle類型)attributes: {fontSize: {default: null, // 默認無字體大小// 從DOM解析字體大小(讀取style屬性)parseHTML: (element) => element.style.fontSize,// 渲染到DOM時生成樣式renderHTML: (attributes) => {if (!attributes.fontSize) {return {}; // 無設置時返回空對象}return {style: `font-size: ${attributes.fontSize};`, // 生成內聯樣式};},},},},];},// 注冊編輯器命令addCommands() {return {/** 設置字體大小命令 */setFontSize:(fontSize: string) =>({ chain }) => {return chain().setMark("textStyle", { fontSize }) // 更新文本樣式標記.run();},/** 清除字體大小命令 */unsetFontSize:() =>({ chain }) => {return chain().setMark("textStyle", { fontSize: null }) // 清除字體大小屬性.removeEmptyTextStyle() // 移除空文本樣式標記.run();},};},
});
line-height插件:
import { Extension } from "@tiptap/core";// 類型聲明:擴展Tiptap的命令接口
declare module "@tiptap/core" {interface Commands<ReturnType> {lineHeight: {/** 設置行高(支持CSS單位如1.5/2/24px等) */setLineHeight: (lineHeight: string) => ReturnType;/** 重置為默認行高 */unsetLineHeight: () => ReturnType;};}
}export const LineHeightExtension = Extension.create({name: "lineHeight",// 擴展配置項addOptions() {return {types: ["paragraph", "heading"], // 應用行高樣式的節點類型defaultLineHeight: null, // 默認行高(null表示不設置)};},// 添加全局屬性處理addGlobalAttributes() {return [{types: this.options.types, // 應用到的節點類型attributes: {lineHeight: {// 默認值(從配置項獲取)default: this.options.defaultLineHeight,// 渲染到HTML時的處理renderHTML: (attributes) => {if (!attributes.lineHeight) {return {};}// 將行高轉換為行內樣式return {style: `line-height: ${attributes.lineHeight};`,};},// 從HTML解析時的處理parseHTML: (element) => {return {// 獲取行高樣式或使用默認值lineHeight: element.style.lineHeight || this.options.defaultLineHeight,};},},},},];},// 添加自定義命令addCommands() {return {setLineHeight:(lineHeight) =>({ tr, state, dispatch }) => {// 創建事務副本以保持不可變性tr = tr.setSelection(state.selection);// 遍歷選區內的所有節點state.doc.nodesBetween(state.selection.from, state.selection.to, (node, pos) => {// 只處理配置的類型節點if (this.options.types.includes(node.type.name)) {tr = tr.setNodeMarkup(pos, undefined, {...node.attrs,lineHeight, // 更新行高屬性});}});// 提交事務更新if (dispatch) {dispatch(tr);}return true;},unsetLineHeight:() =>({ tr, state, dispatch }) => {tr = tr.setSelection(state.selection);// 遍歷選區節點重置行高state.doc.nodesBetween(state.selection.from, state.selection.to, (node, pos) => {if (this.options.types.includes(node.type.name)) {tr = tr.setNodeMarkup(pos, undefined, {...node.attrs,lineHeight: this.options.defaultLineHeight, // 重置為默認值});}});if (dispatch) {dispatch(tr);}return true;},};},
});

使用案例

首先我們在extensions中添加擴展以激活

extensions: [/*......*/FontSizeExtension,LineHeightExtension.configure({types: ["paragraph", "heading"],}),/*......*/
];

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73436.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡安全需要學多久才能入門?

網絡安全是一個復雜且不斷發展的領域&#xff0c;想要入行該領域&#xff0c;我們需要付出足夠多的時間和精力好好學習相關知識&#xff0c;才可以獲得一份不錯的工作&#xff0c;那么網絡安全需要學多久才能入門?我們通過這篇文章來了解一下。 學習網絡安全的入門時間因個人的…

EG82088串口邊緣計算網關

EG82088串口邊緣計算網關 EG8208是一款專業級8路獨立隔離型RS485通訊控制器,通過Modbus及JSON支持、靈活的TCP/IP和UDP切換、內置監控自診斷等特性,廣泛應用于工業自動化、樓宇管理等領域,為用戶提供卓越的數據采集和設備管理解決方案。 接口類型&#xff1a;8RS485/8DO/1LAN協…

Linux下GCC和C++實現帶多組標簽的Snowflake SQL查詢批量數據導出程序

設計一個基于多個帶標簽Snowflake SQL語句作為json配置文件的Linux下GCC的C代碼程序&#xff0c;實現根據不同的輸入參數自動批量地將Snowflake數據庫的數據導出為CSV文件到本地目錄上&#xff0c;標簽加擴展名.csv為導出數據文件名&#xff0c;文件已經存在則覆蓋原始文件。需…

Trae AI 輔助修復uniapp 微信小程序的Bug

一、transparent的兼容問題 設計稿&#xff1a; 實際在iphone 6 plu上&#xff1a; 直接讓Trae AI修復&#xff1a; 修改后驗證通過。 二、v-if分支中子元素根據輸入框中內容長度動態添加class樣式失效 遇到了個“怪問題”&#xff0c;在其他手機或者開發者工具都正常。也…

conda install 和 pip install 的區別

conda install 和 pip install 是兩個常用的包安裝命令&#xff0c;但它們在很多方面存在差異。 1. 所屬管理系統不同 1.1 conda install conda install 是Anaconda和Miniconda發行版自帶的包管理工具 conda 的安裝命令。conda 是一個跨平臺的開源包管理系統和環境管理系統&…

uni-app App 端分段導出 JSON 數據為文件

在開發過程中&#xff0c;我們經常需要將大量數據導出為 JSON 文件&#xff0c;尤其是在處理長列表或大數據集時。然而&#xff0c;直接將所有數據寫入一個文件可能會導致性能問題&#xff0c;尤其是在移動設備上。為了優化性能并提高用戶體驗&#xff0c;我們可以將數據分段導…

視頻推拉流EasyDSS案例分析:互聯網直播/點播技術與平臺創新應用

隨著互聯網技術的快速發展&#xff0c;直播/點播平臺已成為信息傳播和娛樂的重要載體。特別是在電視購物領域&#xff0c;互聯網直播/點播平臺與技術的應用&#xff0c;不僅為用戶帶來了全新的購物體驗&#xff0c;也為商家提供了更廣闊的營銷渠道。傳統媒體再一次切實感受到了…

MySQL再次基礎 向初級工程師邁進

作者&#xff1a;在計算機行業找不到工作的大四失業者 Run run run ! ! ! 1、MySQL概述 1.1數據庫相關概念 1.2MySQL數據庫 2、SQL 2.1SQL通用語法 SQL語句可以單行或多行書寫&#xff0c;以分號結尾。SQL語句可以使用空格/縮進來增強語句的可讀性。MySQL數據庫的SQL語句不區…

手寫一個簡易版的tomcat

Tomcat 是一個廣泛使用的開源 Servlet 容器&#xff0c;用于運行 Java Web 應用程序。深入理解 Tomcat 的工作原理對于 Java 開發者來說是非常有價值的。本文將帶領大家手動實現一個簡易版的 Tomcat&#xff0c;通過這個過程&#xff0c;我們可以更清晰地了解 Tomcat 是如何處理…

VSTO(C#)Excel開發8:打包發布安裝卸載

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

如何逐步迭代衍生出一個網絡安全產品

逐步迭代衍生出一個網絡安全產品需要結合市場需求、技術趨勢和用戶反饋&#xff0c;通過系統化的開發和優化過程來實現。以下是逐步迭代的詳細步驟&#xff1a; 1. 確定市場需求和產品定位 市場調研&#xff1a;分析當前網絡安全市場的痛點和趨勢&#xff0c;如云安全、零信任、…

uni-app打包h5并部署到nginx,路由模式history

uni-app打包有些坑&#xff0c;當時運行的基礎路徑填寫了./&#xff0c;導致在二級頁面刷新之后&#xff0c;頁面直接空白。就只能換一個路徑了&#xff0c;nginx也要跟著改&#xff0c;下面是具體步驟。 manifest.json配置web 運行路徑寫/h5/&#xff0c;或者寫你們網站的目…

Ceph(1):分布式存儲技術簡介

1 分布式存儲技術簡介 1.1 分布式存儲系統的特性 &#xff08;1&#xff09;可擴展 分布式存儲系統可以擴展到幾百臺甚至幾千臺的集群規模&#xff0c;而且隨著集群規模的增長&#xff0c;系統整體性能表現為線性增長。分布式存儲的水平擴展有以下幾個特性&#xff1a; 節點…

Linux驅動開發實戰(五):Qt應用程序點RGB燈(保姆級快速入門!)

Linux驅動開發實戰&#xff08;五&#xff09;&#xff1a;Qt應用程序點RGB燈&#xff08;保姆級快速入門&#xff01;&#xff09; 文章目錄 Linux驅動開發實戰&#xff08;五&#xff09;&#xff1a;Qt應用程序點RGB燈&#xff08;保姆級快速入門&#xff01;&#xff09;前…

Docker安裝Kafka(內含zookeeper)

因為kafka是基于zookeeper做的&#xff0c;所以必須要有zookeeper 一、Zookeeper 1.拉取鏡像 docker pull zookeeper:3.7.02.運行 docker run --restartalways \--log-driver json-file \--log-opt max-size100m \--log-opt max-file2 \--name zookeeper -p 2181:2181 \-v…

芯谷D8563TS實時時鐘/日歷芯片詳解可替代PCF8563

概述 芯谷D8563TS是一款低功耗CMOS實時時鐘/日歷芯片&#xff0c;廣泛應用于移動電話、便攜式儀器、傳真機和電池供電產品等領域。該芯片通過兩線雙向IC總線進行數據傳輸&#xff0c;最大總線速度為400 kbits/s。D8563TS內置了自動遞增的字地址寄存器&#xff0c;支持多種功能…

【一次成功】Win10本地化單機部署k8s v1.31.2版本及可視化看板

【一次成功】Win10本地化單機部署k8s v1.31.2版本及可視化看板 零、安裝清單一、安裝Docker Desktop軟件1.1 安裝前<啟用或關閉Windows功能> 中的描紅的三項1.2 查看軟件版本1.3 配置Docker鏡像 二、更新裝Docker Desktop三、安裝 k8s3.1 點擊啟動安裝3.2 查看狀態3.3 查…

MoonSharp 文檔五

目錄 13.Coroutines&#xff08;協程&#xff09; Lua中的協程 從CLR代碼中的協程 從CLR代碼中的協程作為CLR迭代器 注意事項 搶占式協程 14.Hardwire descriptors&#xff08;硬編碼描述符&#xff09; 為什么需要“硬編碼” 什么是“硬編碼” 如何進行硬編碼 硬編…

【初級篇】如何使用DeepSeek和Dify構建高效的企業級智能客服系統

在當今數字化時代,企業面臨著日益增長的客戶服務需求。使用Dify創建智能客服不僅能夠提升客戶體驗,還能顯著提高企業的運營效率。關于DIfy的安裝部署,大家可以參考之前的文章: 【入門級篇】Dify安裝+DeepSeek模型配置保姆級教程_mindie dify deepseek-CSDN博客 AI智能客服…

【網絡編程】HTTP網絡編程

13.1 HTTP 簡介 HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)是用于從萬維網(WWW:World Wide Web) 服務器(簡稱Web 服務器)傳輸超文本到本地瀏覽器的傳送協議&#xff0c;基于TCP/IP 通信協 議來傳遞數據 (HTML 文件、圖片文件、查詢結果等)。 13.2 HTTP 的工作原理 …