适用于 Drupal 的 CKEditor TextSelection:切换到 Source 模式时保持光标与选区不丢失
如果你在 Drupal 里编辑内容足够久,很可能遇到过这个小但恼人的工作流断点:你选中一个词或把光标放到某处,切换到 Source 来调整标记(markup),然后……位置就丢了。我做了一个小模块,专门解决这个问题。
这个模块做什么
CKEditor TextSelection 是一个 Drupal 模块,它将 CKEditor 5 的 “Text Selection” 插件集成到 Drupal 的 CKEditor 5 编辑器中。它的核心目标很简单:在 WYSIWYG 与 Source 模式之间切换时,保留光标位置与文本选区 ——并通过滚动把选区带到可视区域,确保你始终看得到选中的内容。
- 在 WYSIWYG ↔ Source 切换时保留光标位置。
- 保留真实的文本选区(不只是插入点/光标)。
- 在两种模式下都会滚动视口以显示选区。
- 可与 CKEditor CodeMirror Source Editing 很好地搭配使用,从而获得更舒适的 Source 编辑体验。
- 灵感来自经典的 CKEditor 4 插件行为:CKEditor 4 TextSelection 。
为什么这很重要(一个真正能省时间的 UX 细节)
编辑者切换到 Source 模式往往有充分理由:清理粘贴进来的标记、调整链接属性、修复列表结构、核对标题层级,或确认 HTML 完全符合预期。每次切换都丢失选区/光标会带来摩擦——尤其是在长文章中。这个模块的目标很简单:让你保持在工作流状态里。
它如何工作(高层概述)
从 WYSIWYG 切换到 Source 模式时,插件会将你当前的光标位置或选区从编辑器模型映射到 HTML 源码中的对应位置;切换回来时,它会读取 Source 模式中的光标/选区并在富文本编辑器中恢复。如果某些情况无法做到完美映射(边界情况难免),它会优雅地失败,而不会破坏编辑器。
试试看(演示)
想看看底层的 CKEditor 5 插件如何工作吗?打开演示,选中一段文字,切换到 Source,然后观察选区是否仍然保持原位:CKEditor 5 Text Selection Plugin Demo 。
Drupal 项目链接
- 项目页面:https://www.drupal.org/project/ckeditor_textselection
- 发布版本:https://www.drupal.org/project/ckeditor_textselection/releases (在这里查看最新版本与兼容性说明)
- Git 说明(clone/patch 工作流):https://www.drupal.org/project/ckeditor_textselection/git-instructions
- 问题列表:https://www.drupal.org/project/issues/ckeditor_textselection
安装
1) 通过 Composer 安装
使用 Composer 安装该模块(推荐)。如果你需要特定版本,请从 Releases 页面 选择。
composer require drupal/ckeditor_textselection2) 启用模块
像启用其他贡献模块一样启用 CKEditor TextSelection(通过 UI 或 Drush)。
3) 在你的文本格式中启用
- 进入 Administration → Configuration → Content authoring → Text formats and editors。
- 打开使用 CKEditor 5 的那个格式。
- 在 CKEditor 5 设置中,启用 Text Selection 插件。
- 确保工具栏里有 Source editing 按钮(切换需要 Source 模式)。
- 保存该文本格式配置。
4) 完成
无需额外设置。启用后,每次切换模式都会自动保留选区。
与 CodeMirror Source Editing 搭配使用
如果你的编辑团队更喜欢在 Source 模式下使用语法高亮,可以将本模块与 CKEditor CodeMirror Source Editing 搭配使用。这样可提升可读性,同时保持选区保留功能不受影响。
深入了解:上游项目
这个 Drupal 模块基于上游的 CKEditor 5 插件构建。如果你想查看或参与贡献:
欢迎反馈与贡献
我非常期待来自 Drupal 编辑、站点构建者与开发者的反馈——尤其是那些在 WYSIWYG 与 HTML 之间映射选区可能产生歧义的棘手边界情况。欢迎分享你的发现、提交 issue 或参与贡献:Drupal.org 上的 CKEditor TextSelection 。