2

我最终要做的是实现一些简单的代码荧光笔(/语法荧光笔),因为 ckEditor 中没有可用的东西。出于这个原因,我正在考虑通过单击以下列方式更改所选文本来添加一个新按钮(或修改现有按钮之一): 1- 获取等宽字体以保留源代码中的缩进(例如“Courier New ") 2- 字体颜色变为蓝色

由于我不知道如何添加新按钮,因此我正在考虑使用现有按钮之一,比如块引用按钮来完成这项工作。

补充说明: 顺便说一句,我刚刚注意到 ckEditor 4 也已发布:ckeditor 4 插件也可自定义:ckeditor 4 builder

4

4 回答 4

1

WYSIWYG 编辑器在后面生成 HTML 标记或编码的 HTML 以存储您的格式,假设它可能在后面生成此代码:

<blockquote> … </blockquote>

(然而,这因一个编辑器而异)

最简单的方法是找出它在后台生成的标签,并根据需要对其应用 CSS 样式。

//.CSS
blockquote{
//Styles here…
}

希望能帮助到你。

于 2012-11-26T06:16:13.967 回答
1

您可以考虑一下我从头开始创建的以下插件(这不是一个完整的解决方案,但它显示了正确的方向):

(function() {
    'use strict';

    CKEDITOR.plugins.add( 'prettify', {
        icons: 'prettify',
        init: function( editor ) {
            editor.on( 'mode', function( event ) {
                if( editor.mode == 'wysiwyg' )
                    insertResources( editor );
            });

            editor.addCommand( 'prettify', {
                exec: function( editor ) {
                    var selection = editor.getSelection(),
                        startElement = selection.getStartElement();

                    if ( startElement.hasClass( 'prettyprint' ) )
                        return;

                    var contents = startElement.getText();

                    // Naive pre-processing.
                    contents = contents.replace( /\n/g ,'<br>' );
                    contents = contents.replace( /\t/g ,'&nbsp;&nbsp;&nbsp;&nbsp;' );
                    contents = contents.replace( / /g ,'&nbsp;' );

                    startElement.setHtml( prettyPrintOne( contents, 'js', 0 ) );
                    startElement.addClass( 'prettyprint' );
                }
            });

            editor.ui.addButton( 'Prettify', {
                label: 'Prettify',
                command: 'prettify',
                toolbar: 'insert'
            });
        }
    });

    function insertResources( editor ) {
        var outerHead = CKEDITOR.document.getHead(),
            innerHead = editor.document.getHead(),
            path = CKEDITOR.plugins.getPath( 'prettify' );

        outerHead.append( CKEDITOR.document.createElement( 'script', {
            attributes: {
                type: 'text/javascript',
                async: 'true',
                src: path + 'lib/prettify.js'
            }
        }));

        innerHead.append( CKEDITOR.document.createElement( 'link', {
            attributes: {
                rel: 'stylesheet',
                href: path + 'lib/prettify.css'
            }
        }));
    }
})();

要运行它,请将Google Prettify库解压缩到插件lib目录中。prettify然后尝试以下 HTML 并使用工具栏中的按钮进行美化pre

<textarea cols="80" id="editor1" name="editor1" rows="10">
<pre>function insertResources( editor ) {
    var outerHead = CKEDITOR.document.getHead(),
        innerHead = editor.document.getHead(),
        path = CKEDITOR.plugins.getPath( 'prettify' );
</pre>

<p>Foo:</p>

<pre>outerHead.append( CKEDITOR.document.createElement( 'script', {
        attributes: {
            type: 'text/javascript',
            async: 'true',
            src: path + 'lib/prettify.js'
        }
    }));</pre>

<p>Bar:</p>

<pre>innerHead.append( CKEDITOR.document.createElement( 'link', {
        attributes: {
            rel: 'stylesheet',
            href: path + 'lib/prettify.css'
        }
    }));
}</pre>
</textarea>
<script>

    CKEDITOR.replace( 'editor1', {
        extraPlugins: 'prettify',
        toolbar: [
            [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ],
            [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],
            [ 'Bold', 'Italic' ],
            '/',
            [ 'Prettify']
        ]
    } );

</script>
于 2012-12-05T13:47:07.347 回答
1

不知道你的完整用例是什么,但这是我的,最后是一个自定义插件

  1. 我希望能够使用对话窗口将代码片段插入 CKEditor(不知道为什么您更喜欢 blockquote 元素)
  2. 我想在 CKEditor 中以某种方式在视觉上标记这些代码片段,我不在乎在 CKEditor 中有真正的语法高亮
  3. 最后,在保存内容后,我想对插入的元素应用真正的语法格式,而不需要花费太多的工作。我为此使用了美化

随意检查插件并根据您的需要进行修改。

于 2012-11-30T16:57:01.250 回答
-1

我刚刚找到了这个超级简单的解决方案:

  1. 打开ckeditor根目录下的contents.css

  2. 添加以下内容:

    块引用{颜色:蓝色;font-family: "Courier New", Courier, monospace; }

于 2012-11-30T10:36:05.603 回答