如何在CKEditor中动态切换文本方向

How to dynamically switch text direction in CKEditor

在我当前的项目中,用户可以输入英语和希伯来语文本。 根据当前文本,自动定义方向会很棒。例如,如果文本包含希伯来语符号,则方向应为 RTL。但如果文本不包含希伯来语,则方向为 LTR。

文本可以随时更改,我认为最好的解决方案是像在 Google 翻译服务中那样动态切换方向。

我没有找到已经完成的解决方案,我想提出自己的解决方案。

它的工作原理非常简单。每次更改文本时,我都会检查它是否有希伯来语符号,并在需要时更改文本方向。要在配置中应用更改(在我的例子中,它是文本的方向),我应该销毁并使用更新的配置初始化 CKEditor。

如何测试它:

  1. 尝试用英文输入内容
  2. 尝试用希伯来语输入内容,例如“שם”
  3. 尝试删除希伯来语符号
  4. 您将看到如何根据当前文本更改编辑器中的方向

代码如下:

var CKEditorConfig = {
    contentsLangDirection: 'ltr',
    forcePasteAsPlainText: true
  },
  editorInstance;

(function () {   
  // Initialise editor.
  function initEditor() {
    editorInstance = CKEDITOR.replace('editor', CKEditorConfig);
    editorInstance.on('contentDom', function () {
      var body = this.document.getBody();

      // These listeners will be deactivated once editor dies.
      // Input event to track any changes of the content
      this.editable().attachListener(body, 'input', function () {
        editorOnChange();
      });
    });
  }
  
  // On change callback.
  function editorOnChange() {
   var text = CKEDITOR.instances['editor'].getData(),
        direction = isHebrew(text) ? 'rtl' : 'ltr',
        currentDirection = CKEditorConfig.contentsLangDirection;

      // Direction was changed -> reinit CKEditor.
      if (currentDirection && currentDirection != direction) {       
        CKEditorConfig.contentsLangDirection = direction;
        CKEDITOR.instances['editor'].destroy();
        editorInstance = initEditor();
      }
  }
  
  // Checks is current text uses hebrew language or not.
  function isHebrew (text) {
    const HebrewChars = new RegExp("[\u05D0-\u05FF]+");

    if (!HebrewChars.test(text)) {
      return false;
    }
    return true;
  }
  
  // Init editor.
  initEditor();

})();
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdn.ckeditor.com/4.7.1/basic/ckeditor.js"></script>

<body>
  <textarea id="editor" cols="50" rows="20"></textarea>
</body>

似乎无法在此处启动 CKEditor。我看到一些错误。 您可以尝试在 JSFiddle

上启动它

一个问题:很奇怪,但是事件 "input" 没有针对此示例中的复制粘贴等操作启动,但在我当前的应用程序中有效。似乎库的版本是相同的。但是对于这个例子来说不是很重要。

希望对大家有用。