如何单向处理 CKEditor 5 中视图的 html 数据?
How to one-way process html data for the view in CKEditor 5?
在作者的 CKEditor 视图中,我需要将 links 更改为文件,以便附加作者的会话 ID。然而,在普通用户的实际内容中,特定的用户 ID 是自动添加的。因此,作者 ID 不得保存在作者使用 CKEditor 编辑的内容中,它只需要在他编辑时出现在视图中,以便他可以看到例如图像。保存时 'clean' link 没有任何 ID 需要保存。
在 CKEditor 5 中,似乎有更多的可能性来实现这种单向数据过滤,例如
但是我找不到一个很好的例子,也找不到一个简单干净的方法来实现这个。 (我的尝试变得非常复杂并且无法正常工作......)我猜这是一个很常见的用例所以也许我忽略了一些东西。有好的解决办法吗?
更新 1:
示例 links 为:
- "clean link"如何保存它却永远无法工作:
https://example.com/some-image.png
- 为内容中的特定用户修改了 link(以及如何在 ckeditor 视图中对作者进行修改):
https://example.com/some-image.png?sessionId=currentUsersSessionId
更新二:
当我进一步使用 CKEditor 时,我遇到了更多这样的事情,从开发人员的角度来看,这些事情非常令人不快。这似乎是设计使然,因为引用来自贡献者 'fredck':
[...] we want to bring the editor out of the "HTML Editor" thing, making it the perfect soluting for "quality content writing".
这隐含地意味着,如果您是一名开发人员并且您有高级用户使用高级用例(如果您使用 Whosebug,则可能是这种情况),那么您不是目标受众,不应在第一名.
例如,您可以在此处的讨论中阅读更多相关信息(这也是关于另一个功能的):https://github.com/ckeditor/ckeditor5/issues/592
要修改下载的链接,您可以编写自定义向下转换转换器,它会修改获得的 href
。
这是一个工作示例,它将当前时间戳添加到 URLs:
https://codepen.io/msamsel/pen/zVMvZN?editors=1010
editor.conversion.for( 'dataDowncast' ).add( dispatcher => {
dispatcher.on(
'attribute:linkHref',
( evt, data, conversionApi ) => {
if ( !conversionApi.consumable.test( data.item, 'attribute:linkHref' ) ) {
return;
}
if ( data.attributeNewValue ) {
data.attributeNewValue += `#time=${ ( new Date() ).getTime() }`;
}
},
{ priority: 'high' }
);
} );
简单介绍一下它是如何工作的。
创建的侦听器对 attribute:linkHref
更改做出反应(它仅在无论如何获取数据时触发,因为它是 dataDowncast
)。在实际的 Link 插件创建输出之前,侦听器以 'high'
优先级触发以更改 URL。首先检查给定的模型元素是否未被消耗,但没有消耗它,因为我们想保留将再次处理同一元素的本机行为。属性值用时间戳扩展,完成此侦听器。之后,本机行为被触发,具有 'normal'
优先级。
使用了类似的方法来实现 custom link attributes。可以在此处找到有关调度程序和转换过程的更多信息:
在作者的 CKEditor 视图中,我需要将 links 更改为文件,以便附加作者的会话 ID。然而,在普通用户的实际内容中,特定的用户 ID 是自动添加的。因此,作者 ID 不得保存在作者使用 CKEditor 编辑的内容中,它只需要在他编辑时出现在视图中,以便他可以看到例如图像。保存时 'clean' link 没有任何 ID 需要保存。
在 CKEditor 5 中,似乎有更多的可能性来实现这种单向数据过滤,例如
但是我找不到一个很好的例子,也找不到一个简单干净的方法来实现这个。 (我的尝试变得非常复杂并且无法正常工作......)我猜这是一个很常见的用例所以也许我忽略了一些东西。有好的解决办法吗?
更新 1:
示例 links 为:
- "clean link"如何保存它却永远无法工作:
https://example.com/some-image.png - 为内容中的特定用户修改了 link(以及如何在 ckeditor 视图中对作者进行修改):
https://example.com/some-image.png?sessionId=currentUsersSessionId
更新二:
当我进一步使用 CKEditor 时,我遇到了更多这样的事情,从开发人员的角度来看,这些事情非常令人不快。这似乎是设计使然,因为引用来自贡献者 'fredck':
[...] we want to bring the editor out of the "HTML Editor" thing, making it the perfect soluting for "quality content writing".
这隐含地意味着,如果您是一名开发人员并且您有高级用户使用高级用例(如果您使用 Whosebug,则可能是这种情况),那么您不是目标受众,不应在第一名.
例如,您可以在此处的讨论中阅读更多相关信息(这也是关于另一个功能的):https://github.com/ckeditor/ckeditor5/issues/592
要修改下载的链接,您可以编写自定义向下转换转换器,它会修改获得的 href
。
这是一个工作示例,它将当前时间戳添加到 URLs:
https://codepen.io/msamsel/pen/zVMvZN?editors=1010
editor.conversion.for( 'dataDowncast' ).add( dispatcher => {
dispatcher.on(
'attribute:linkHref',
( evt, data, conversionApi ) => {
if ( !conversionApi.consumable.test( data.item, 'attribute:linkHref' ) ) {
return;
}
if ( data.attributeNewValue ) {
data.attributeNewValue += `#time=${ ( new Date() ).getTime() }`;
}
},
{ priority: 'high' }
);
} );
简单介绍一下它是如何工作的。
创建的侦听器对 attribute:linkHref
更改做出反应(它仅在无论如何获取数据时触发,因为它是 dataDowncast
)。在实际的 Link 插件创建输出之前,侦听器以 'high'
优先级触发以更改 URL。首先检查给定的模型元素是否未被消耗,但没有消耗它,因为我们想保留将再次处理同一元素的本机行为。属性值用时间戳扩展,完成此侦听器。之后,本机行为被触发,具有 'normal'
优先级。
使用了类似的方法来实现 custom link attributes。可以在此处找到有关调度程序和转换过程的更多信息: