Используйте фильтрацию pastefromword для всего вставленного содержимого в CKEditor 3

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

Тем не менее, я придумал следующее решение и разместил его здесь, чтобы получить отзыв. Мне интересно, если я сделал это слишком сложным, или если есть более простой способ. Я просто скопировал код из 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();
        }

    });
});

person jbarreiros    schedule 08.03.2011    source источник
comment
Я нашел это, потому что я пытаюсь решить аналогичную проблему. Как избежать удаления всего содержимого, то есть сохранения шрифта и цвета шрифта?   -  person Kevin    schedule 18.03.2011
comment
Итак, вы хотите CodeReview.StackExchange.com или что?   -  person random    schedule 18.03.2011
comment
Кевин, в своем пользовательском файле config.js установите для параметра config.pasteFromWordRemoveFontStyles значение false. Ознакомьтесь с API ckeditor, чтобы узнать о других настройках.   -  person jbarreiros    schedule 24.03.2011
comment
Случайно, я не знал, что этот сайт существует.   -  person jbarreiros    schedule 24.03.2011
comment
спасибо, я не видел эту настройку конфигурации! Кроме того, мне кажется, что сейчас для меня всегда используется фильтрация «вставка из слова», хотя я не проверял ее тщательно, просто с помощью c.extraPlugins = autogrow,resize,pastefromword; Может быть, добавив его в качестве дополнительного плагина, он всегда будет работать?   -  person Kevin    schedule 12.05.2011


Ответы (2)


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

person Keyvan    schedule 04.12.2011
comment
Шикарный Кейван! Простой и компактный. Спасибо за публикацию вашего решения. - person jbarreiros; 24.01.2012
comment
Это хороший шаг вперед. Есть некоторые встроенные стили, но это намного лучше, чем то, что происходит с Ctrl+V по умолчанию. - person Ben; 12.03.2012
comment
Эй, @Keyvan, на всякий случай поместите код в свой ответ. я отредактировал, чтобы добавить - person Will; 19.11.2012
comment
Проголосовали против - ответ - это просто ссылка. Пожалуйста, поместите содержимое этой ссылки в этот ответ. - person Carl Bussema; 03.04.2013
comment
@CarlBussema, решение было опубликовано здесь изначально, но, как я указываю в нижней части сообщения: StackOverflow недавно удалил некоторые из моих ответов (и скрыл их от меня), поэтому я перемещаю остальные свои скудные вклады в свой собственный блог . Не знаю, почему вы думаете, что это так ужасно. - person Keyvan; 03.04.2013
comment
Возьмите это с StackOverflow. Тем временем происходит линковка, и поэтому любой ответ, содержащий только ссылку, не является хорошим ответом. См. также: meta.stackexchange.com/questions/8231/ - person Carl Bussema; 03.04.2013
comment
@CarlBussema Я сделал это без особой удачи. Это их дело, они могут делать что хотят. Немного пищи для размышлений: codinghorror.com/blog /2009/08/ Могут ли ваши материалы быть отозваны, удалены или навсегда переведены в автономный режим без вашего согласия? В Stackoverflow: да. На моем собственном сайте: нет. Я оставлю это на этом. - person Keyvan; 04.04.2013

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

person Tomas    schedule 07.02.2012