8

好吧,几乎所有内容都在标题中:除了使文本变为粗体、斜体或下划线之外,还有什么捷径可以执行其他操作吗?或者任何允许这样做的插件?

根据我的一位同事的说法,源代码似乎不包含这些东西,但也许我们错过了一些东西?

4

1 回答 1

11

Etherpad 包含一个名为 ACE2(最初是 AppJet 代码编辑器)的嵌入式富文本编辑器,它似乎负责键盘快捷键处理。

默认嵌入的ace.js文件曾经被缩小,因此在旧版本的 Etherpad 中难以阅读,但您可以直接在infrastructure/ace 源代码部分中读取原始源文件,从中生成缩小版本。有关这方面的更多信息,请查看ACE2 的 README。较新的版本(至少 etherpad.org 的版本)似乎包含正常的 ACE2 JS 源代码。

键盘快捷键处理代码位于函数ace2_inner.js内部handleKeyEvent()。基于此,开箱即用支持的键盘快捷键如下(在浏览器的快捷键之上,如剪切/复制/粘贴):

  • Enter- 特殊的etherpad回车
  • TabShift+ Tab- 缩进或突出项目符号列表
  • Ctrl+ Z- 特殊的 etherpad 撤消
  • Ctrl+ Y- 特殊的etherpad重做
  • Ctrl+ B- 粗体
  • Ctrl+ I- 斜体
  • Ctrl+ U- 下划线
  • Ctrl+ H- 删除
  • Ctrl+ S- 保存修订

确实没有删除线或项目符号列表,也没有任何看起来像快捷方式的简单扩展机制的东西,所以你可能需要动手;-)

如果您有自己的 Etherpad 部署,最简单的可能是修改 ACE2 的源代码以处理其他快捷方式,然后在需要时重新构建ace2.js缩小版本(根据README中的说明)。这是一个如何处理删除线切换的Ctrl+S快捷方式和项目符号列表切换的Ctrl+的示例。L删除线快捷方式禁用内置浏览器另存为...快捷方式,我发现这是一个奖励,但如果您不喜欢这样,您可以随时选择其他键而不是S. 在处理其他快捷方式的类似块之间
插入以下代码段,大约第 3200 行:ace2_inner.js

/* Ctrl+S toggles striketrough, and prevents triggering the browser's Save dialog */
if ((!specialHandled) && isTypeForCmdKey &&
    String.fromCharCode(which).toLowerCase() == "s" &&
    (evt.metaKey ||  evt.ctrlKey)) {
  // ctrl/cmd-s (strikethrough toggle)
  fastIncorp(13); // don't ask me ;-)
  evt.preventDefault();
  toggleAttributeOnSelection('strikethrough');
  specialHandled = true;
}
if ((!specialHandled) && isTypeForCmdKey &&
    String.fromCharCode(which).toLowerCase() == "l" &&
    (evt.ctrlKey)) {
  // ctrl/cmd-L (bullet list toggle)
  fastIncorp(9); // seriously, don't ask me ;-)
  evt.preventDefault();
  doInsertUnorderedList();
  specialHandled = true;
}

如果您无法重建缩小版本,您也可以尝试使用缩小名称直接修补它。这是上述代码片段的缩小版本,虽然是 YMMV,但我没有检查缩小是否稳定并且每次都重用相同的缩短名称。搜索“y”(带引号)以找到handleKeyEvent()inside的缩小版本ace.js

if ((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="s"&&(i.metaKey || i.ctrlKey)){G(13);\\ni.preventDefault();c("strikethrough");Cp=true;}if((!Cp)&&Cu&&String.fromCharCode(Ct).toLowerCase()=="l"&&(i.metaKey||i.ctrlKey)){G(9);\\ni.preventDefault();As();Cp=true;}

最后,如果您不控制 etherpad 部署,您也许可以使用修补默认功能的浏览器内GreaseMonkey脚本来实现类似的东西。handleKeyEvent()作为挂钩到编辑器的起点,请尝试检查window.pad*对象,例如window.padeditor. 例如,在编辑器中选择一些文本并在控制台中尝试以下操作:

> window.padeditor.ace.execCommand('bold')
> window.padeditor.ace.execCommand('insertunorderedlist') 
于 2012-05-22T13:19:00.153 回答