Используйте фильтрацию «pastefromword» для всего вставленного содержимого в CKEditor 3 - PullRequest
6 голосов
/ 08 марта 2011

CKEditor - отличный редактор, и плагин pastefromword очень хорош.Я хотел бы, чтобы плагин применял фильтрацию ко всему вставленному тексту.Например, при вставке из слова все шрифты и размеры удаляются.Этого не происходит при вставке из электронного письма.

Тем не менее, я пришел к следующему решению и разместил его здесь, чтобы получить некоторую обратную связь.Мне интересно, если я сделал это слишком сложным, или есть более легкий путь.Я только что скопировал код из pastefromword / plugin.js.

через мой специальный config.js

...
CKEDITOR.config.pasteFromWordCleanupFile = '/pastefromword.js';
...
CKEDITOR.on( 'instanceReady', function( ev ) {
    /**
     * Paste event to apply Paste From Word filtering on all text.
     *
     * The pastefromword plugin will only process text that has tell-tale signs
     * it is from Word. Use this hook to treat all pasted text as if
     * it is coming from Word.
     *
     * This method is a slightly modified version of code found in
     * plugins/pastefromword/plugin.js
     */
    ev.editor.on( 'paste', function( evt ) {    
        var data = evt.data,
            editor = evt.editor,
            content;

        /**
         * "pasteFromWordHappened" is a custom property set in custom
         * pastefromword.js, so that filtering does not happen twice for content
         * actually coming from Word. It's a dirty hack I know.
         */
        if( editor.pasteFromWordHappened ) {
            // Reset property and exit paste event
            editor.pasteFromWordHappened = 0;
            return;
        }

        var loadRules = function( callback ) {
            var isLoaded = CKEDITOR.cleanWord;

            if( isLoaded ) {
                callback();
            }
            else {
                CKEDITOR.scriptLoader.load( CKEDITOR.config.pasteFromWordCleanupFile, callback, null, false, true );
            }

            return !isLoaded;
        };

        content = data['html'];

        // No need to filter text if html tags are not presence, so perform a regex
        // to test for html tags.
        if( content && (/<[^<]+?>/).test(content) ) {
            var isLazyLoad = loadRules( function(){
                if( isLazyLoad ) {
                    editor.fire('paste', data);
                }
                else {
                    data[ 'html' ] = CKEDITOR.cleanWord( content, editor );
                    // Reset property or if user tries to paste again, it won't work
                    editor.pasteFromWordHappened = 0;
                }
            });

            isLazyLoad && evt.cancel();
        }

    });
});

Ответы [ 2 ]

11 голосов
/ 05 декабря 2011

Мое решение теперь в этой записи блога: http://www.keyvan.net/2012/11/clean-up-html-on-paste-in-ckeditor/

2 голосов
/ 07 февраля 2012

Комментируя старый вопрос: Проблема не только в очистке слов в CKEditor. Это также вопрос того, что делает браузер, когда вы запрашиваете содержимое буфера обмена через javascript api. это сильно отличается между IE, FF, Safari и т. д. Как правило, браузеры, не использующие IE, самостоятельно очищают HTML, прежде чем передать HTML браузеру. Таким образом удаляется много форматирования.

...