7

我正在开发一个 TinyMCE 插件,我想要它做的一件事是注册用于切换自定义格式的命令/按钮。

例如,如果您单击 TinyMCE 中的粗体按钮,它将以粗体文本突出显示粗体按钮。深入研究源代码,我看到这是通过以下方式发生的:tinymce.EditorCommands.addCommands 认为我似乎无法弄清楚如何复制它。TinyMCE 的文档也很糟糕 =(

因此,给定 customFormat,我希望能够通过我的插件设置一个按钮,当应用 customFormat 时,它会像工具栏上的粗体、斜体和其他此类按钮一样显示。单击我的 customFormat 会打开/关闭该格式。我可以通过“addCommand”和“addButton”轻松完成工具,但它没有像 Bold 和其他人那样的状态跟踪。

显示我当前的非工作尝试(此代码在我的插件创建方法的 init 中):

tinymce.EditorCommands.call('addCommands', {
   'MyFormat' :  function(name) {
      ed.formatter.toggle("customFormat");
    }
},'exec');

tinymce.EditorCommands.call('addCommands', {
   'MyFormat' : function(name) {
       return ed.formatter.match('customFormat');
    } 
},'state');

ed.addButton('customformat', {cmd : 'MyFormat'});

这里是 addCommands 的“文档”的链接: http ://www.tinymce.com/wiki.php/API3:method.tinymce.EditorCommands.addCommands

在环顾四周后,我发现这似乎很完美: http ://www.tinymce.com/wiki.php/API3:method.tinymce.Editor.addQueryStateHandler

但是当我实现代码时,它不会改变按钮的状态:

  ed.addCommand('MyFormat', function(ui, v) {
    ed.formatter.toggle("thoughtFormat");
  });

  ed.addQueryStateHandler('MyFormat', function() { 
      return ed.formatter.match('thoughtFormat');
  });

  ed.addButton('myformat', {cmd : 'MyFormat'});
4

3 回答 3

10

如果有人不想以“插件”方式进行操作,这里是TinyMCE 4.x.

首先,您需要定义一个自定义格式:

formats: {
   custom_format: {inline: 'span', styles: {color: "red"}, attributes: {class: 'some_css_class'}}
}

然后你必须在你的工具栏上添加一个按钮:

toolbar: "mybutton",

接下来,您需要设置按钮,以便它切换格式:

setup: function(editor) {
        editor.addButton('mybutton', {
            text: 'My button',
            icon: false,
            onclick: function() {
                tinymce.activeEditor.formatter.toggle('custom_format')
            }
        });
}

此外,如果您希望编辑器将按钮的状态设置为指示当前节点的格式,请自动将其添加到setup函数中:

onPostRender: function() {
    var ctrl = this;                
    editor.on('NodeChange', function(e) {
        ctrl.active(e.element.className == "some_css_class")
    });
}

您的tinymce.init函数应如下所示:

tinymce.init({
    selector: "textarea",
    formats: {
       // Other formats...
       custom_format: {inline: 'span', styles: {color: "red"}, attributes: {class: 'some_css_class'}}
    }
    // Other default toolbars
    toolbar_n: "mybutton",

    // Finally, setup your button
    setup: function(editor) {
        editor.addButton('mybutton', {
            text: 'My Button',
            icon: false,
            onclick: function() {
                tinymce.activeEditor.formatter.toggle('custom_format')
            },
            onPostRender: function() {
                var ctrl = this;                
                editor.on('NodeChange', function(e) {
                    ctrl.active(e.element.className == "some_css_class")
                });
            }
        });
    }

请注意class我添加到自定义格式中的属性。这种方法使我可以在单独的样式表文件中定义我的自定义样式,并使我的标记尽可能干燥(没有内联样式!)。将选项指向content_css您的样式表,您会很高兴的。然而,由于我使用 Rails 作为后端和 BatmanJS 作为前端(我对后者相当陌生),我无法弄清楚资产路由是如何工作的,最终添加了我的自定义样式到 tinyMCE 皮肤本身的默认内容样式表文件(位于skins/SKIN_NAME/content.min.css)。

于 2014-07-23T18:52:58.687 回答
5

感谢 Thariama 提供的见解,让我能够更深入地挖掘,最终弄清楚如何做到这一点。我不确定它是“正确的方式”,但正如我所说,TinyMCE 拥有可以想象的最糟糕的文档。

对我来说,关键是使用 setActive 技巧来挂钩 onNodeChange 事件。带有自定义按钮的完整示例插件,当光标所在的位置出现该格式时,该按钮将激活:

(function() {
   tinymce.create('tinymce.plugins.CoolPlugin', {  
   init : function(ed, url) {   

      ed.addCommand('MyFormat', function(ui, v) {
        ed.formatter.toggle("myFormat");
      });

      ed.addButton("coolformat", {
        title : 'MyFormat Tooltip', 
        cmd : 'MyFormat',
        image: url + '/coolformat.png',
      });

      ed.onNodeChange.add(function(ed, cm, n) {
        active = ed.formatter.match('myFormat');
        control = ed.controlManager.get('coolformat').setActive(active);
      });

      ed.onInit.add(function(ed, e) {
        ed.formatter.register('myFormat', 
           {inline: 'span', classes : ['cool'] } );
      });
  }
  });

  // Register plugin
  tinymce.PluginManager.add('cool', tinymce.plugins.CoolPlugin);
})();
于 2013-02-12T01:04:39.427 回答
1

这是一个例子:

ed.controlManager.get('my_control_element').setActive(true); // could be bold or whatever
于 2013-02-11T14:43:16.037 回答