如何从插件中添加 CKEditor 插件?



我正在开发一个 CKEditor 插件,我想让它成为提供正确编辑体验所需的多个插件的工具。基本上,我希望用户能够包含一个"the_framework"插件,该插件又添加了 10 个插件(每个插件都是带有工具栏按钮的小部件,可能还有上下文菜单),提供完整的编辑支持。我不希望"插件"配置负责加载这些插件。就我而言,这真的是一个全有或全无的命题。

我尝试让主插件添加带有CKEDITOR.plugins.addExternal的外部插件,但它们无法加载。我现在意识到这是因为pluginsextraPlugins配置没有命名外部插件,因此Editor.loadPlugins从不尝试它们。但是,当我的主插件加载并执行onLoad时,更改配置已经太晚了。

我可以在一个插件文件中拥有多个插件定义,但如果编辑器配置没有明确命名它们,它似乎仍然不起作用。

如何从另一个插件加载插件?

经过更多的调试,我确定这是不可能的。

我意识到要加载注册为外部的"子插件",我只需要在注册插件后使用插件的名称调用CKEDITOR.plugins.load。这与编辑器调用的方法相同,但是,编辑器跟进了许多额外的步骤,包括加载语言文件和关键回调(beforeInitinitafterInit)。

editor.jsloadPlugins函数是所有操作发生的地方,但它只接受一个Editor参数,没有要加载的插件列表,因为编辑器的配置用于确定要加载的插件。确定列表后,它们将全部并行加载。如果子插件从一开始就不在这个数组中,即使主插件稍后手动加载它们,它们也永远不会用编辑器完全初始化。

我想出的唯一解决方法是在加载 CKEditor 源代码后加载一个额外的脚本,理想情况下是与主插件一起分发的脚本。该脚本设置外部子插件定义(实际上位于名为"master_plugin/plugins"的本地子文件夹中)并注册一个instanceCreated回调,该回调基本上查看新编辑器的配置并确定是否需要在编辑器初始化之前将子插件添加到列表中。如果其中任何这种情况发生在插件中,而不是额外的脚本中,那就太晚了,它会失败。

更新

实际上有必要在instanceCreated回调中注册一个configLoaded侦听器,因为当instanceCreated发生时,用户的配置尚未加载到编辑器中。customConfigLoaded事件也为时过早,无法接收用户的配置,因此对pluginsextendedPlugins的任何修改仍将丢失。令人惊讶的是,configLoaded事件是在编辑器使用几个配置选项(readOnly,enterMode,shiftEnterMode,tabIndex,skin,也许是其他)之后触发的,但plugins尚未触及。

configLoaded事件是我能找到的唯一钩点,可以保证对页面提供的配置进行编辑。使用config.customConfig选项,可以在 editorConfig 函数中侦听customConfigLoaded并获得完整的配置,因为 CKEditor 仅将页面配置合并到自己的customConfigLoaded侦听器中。(操作顺序使这成为可能。

回到通过单个插件(附加包)加载许多插件的最初目标,这是可能的,但显然插件系统的设计没有任何意图。

最新更新