Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CKEDITOR如何在span中查找和包装文本_Ckeditor - Fatal编程技术网

CKEDITOR如何在span中查找和包装文本

CKEDITOR如何在span中查找和包装文本,ckeditor,Ckeditor,我正在编写一个CKEDITOR插件,它需要将某些文本片段包装到标记中。从Web服务中,我有一系列需要包装的项目。数组只是纯文本字符串。例如: "[best buy", "horrible migraine", "eat cake"] 我需要在编辑器中找到该文本的实例,并将它们包装在span标记中 由于文本可能会被标记,这就更加复杂了。因此,百思买的HTML可能是 "<strong>best</strong> buy" 但是,从web服务返回的文本没有任何标记 我开始尝

我正在编写一个CKEDITOR插件,它需要将某些文本片段包装到标记中。从Web服务中,我有一系列需要包装的项目。数组只是纯文本字符串。例如:

"[best buy", "horrible migraine", "eat cake"]
我需要在编辑器中找到该文本的实例,并将它们包装在span标记中

由于文本可能会被标记,这就更加复杂了。因此,百思买的HTML可能是

"<strong>best</strong> buy"
但是,从web服务返回的文本没有任何标记

我开始尝试使用一个CKEDITOR.htmlParser对象,这看起来相当成功。我能够捕获parser.onText事件并检查数组中的文本是否包含任何内容

但是我不能修改这个文本。修改不会保留回源html。所以我认为使用HTMLPasser是一条死胡同

完成这项任务的最佳方式是什么


哦,作为奖励,我也不想在显示更改时丢失用户当前的光标位置。

以下是我最后要做的事情,到目前为止它似乎还在工作

我创建了一个文本筛选规则,可以在我的项目数组中搜索文本中包含或部分包含的任何项目。如果是这样,它将在我的范围中包装该元素

这里的一个缺点是,对于带有标记的项目,我最后得到了两个跨距。但在我看来,这是可以容忍的

然后,我使用以下方法设置结果:

editor.document.getBody().setHtml(results);
因此,我还必须在读取此文本时去掉此标记。我使用editor.dataProcessor.htmlFilter上的元素过滤器来实现这一点


这似乎适用于我目前为止有限的测试用例。

不幸的是,您需要在真正的DOM而不是htmlParser.*树上工作,并且您需要实现一个方法,该方法对于给定的文本返回DOM中的匹配范围。然后,您可以使用CKEDITOR.style使用所需的样式包装这些片段,并在执行此操作时使用selection.createBookmarks保留选择位置。很多代码,但也很有趣:。谢谢,@Reinmar。我主要是通过过滤器来实现的。我不知道这是不是最好的方法。但是我为一个新的htmlParser创建了一个函数过滤器,并将过滤器应用于html。函数filter知道如何检查文本。然后我使用editor.document.getBody.setHtmlresults;显示结果。然后我有另一个过滤器,它将文本从dataProcessor.htmlFilter中剥离出来。。。我稍后会补充这一点作为回答,你可以批评我最后做了一些类似于小部件的事情,这样用户就不能更改内部格式或编辑这些内容,尽管他们仍然可以删除它们。这可能是你的问题,也可能不是。