如何在Word插件中实现单词高亮且不覆盖用户原有高亮、不修改撤销栈
Word插件无侵入式单词高亮实现方案
核心问题规避
不要使用Word原生highlight属性实现高亮,该属性是全局唯一的文本格式属性,修改必然会覆盖用户原有设置,且默认计入undo栈。
推荐实现方案(Grammarly同款逻辑)
使用Office.js提供的临时内容控件实现标记效果:
- 遍历文档匹配到词库的单词范围,给每个匹配范围插入标记类内容控件,设置
tag属性为你的插件专属标识(如custom_dict_highlight_item),避免和其他插件/用户创建的内容控件冲突 - 配置内容控件的样式属性:设置
appearance为"boundingBox"或"none",自定义背景色、下画线样式作为高亮效果,同时开启cannotDelete、cannotEdit属性避免用户误操作 - 内容控件的格式和用户手动设置的原生高亮是两套独立的格式体系,不会互相覆盖;且你可以通过
context.document.load()自定义管理格式变更,调用context.document.preserveSavedState()即可将该类操作排除在Word原生undo栈之外
轻量替代方案
如果不需要复杂的交互效果,也可以使用字体底纹属性实现:
- 给匹配单词范围设置
font.shading.backgroundPatternColor为你需要的高亮色,该属性和原生高亮属性独立,不会覆盖用户原有高亮 - 操作完成后调用
context.application.suspendUndoStackUntilNextSync()挂起undo栈记录,即可避免你的操作被计入用户撤销队列
注意:需要在插件卸载、文档关闭时批量清除你添加的所有自定义格式,避免残留影响用户正常使用
内容的提问来源于stack exchange,提问作者Maarten De Moor
相关产品推荐
相关产品推荐

