Вставка из MS-Word в любой браузерный HTML-редактор

#javascript #html #ms-word #tinymce

#javascript #HTML #ms-word #tinymce

Вопрос:

Хорошо, я не могу быть единственным с этой проблемой, которая, кажется, будет продолжаться вечно.

Мы используем браузерные html-редакторы (несколько разных) — у каждого есть своя кнопка «вставить из word», которая отлично работает.

Однако многие наши пользователи просто вставляют непосредственно из word в область дизайна. Для нас это приводит к концу света — иногда это нарушает работу javascript или других вещей, которых слишком много, чтобы упоминать.

Итак, я решил написать простую функцию, которая выполняет поиск по содержимому исходного кода и, если она видит какие-либо неправильные символы, связанные со вставкой microsoft Word, выдает совпадение «это похоже на вставку ms-word». В настоящее время это выглядит следующим образом:

 // detect potentially bad characters - usually from msword paste
function hasInvalidChars ( in_element ) {
    var src     = $j(in_element).val();
    var e       = $E(src);  // enhanced string
    var bad     = Array(    "mso-list:", "class="Mso", "</o:p>", "[if !supportLists]", 
                            "style="mso-", "mso-bidi", "“", "”", "<v:shapetype", "<v:path", 
                            "file:///" );
    for ( i=0; i< bad.length; i   ) {
        if ( e.contains(bad[i]) ) {
            return true;
        }
    }
    return false;
}
  

Обратите внимание, что если вы попытаетесь запустить код, это не сработает, потому что (1) я использую jQuery и (2) у меня есть специальный объект ( $ E ), который добавляет кучу вещей в строку, один из которых является функцией ‘contains ()’, но вы понимаете, что он делает.

То, что я ищу, — это элементы массива, которые принадлежат массиву ‘bad[]’. Я составил предварительный список (который может быть, а может и не быть хорошей отправной точкой), но я прошу вас, экспертов, — пожалуйста, — не могли бы вы сказать мне, какие символы или фразы вы бы сюда поместили? На данный момент, если бы я мог уловить 80% проблем, я был бы в восторге.

Спасибо.

Комментарии:

1. CKEditor имеет эту проверку на месте, возможно, взгляните на их исходный код, поскольку он открыт.

Ответ №1:

Недавно я искал похожую вещь, немного погуглив, я нашел приятную функцию. В нем содержится большинство из перечисленных плохих тегов. вот ссылка, которая содержит эту функцию:

Функция Javascript

 <script type="text/javascript" runat="server" language="javascript">
function CleanWordHTML( str )
{
str = str.replace(/<o:p>s*</o:p>/g, "") ;
str = str.replace(/<o:p>.*?</o:p>/g, "amp;nbsp;") ;
str = str.replace( /s*mso-[^:] :[^;"] ;?/gi, "" ) ;
str = str.replace( /s*MARGIN: 0cm 0cm 0pts*;/gi, "" ) ;
str = str.replace( /s*MARGIN: 0cm 0cm 0pts*"/gi, """ ) ;
str = str.replace( /s*TEXT-INDENT: 0cms*;/gi, "" ) ;
str = str.replace( /s*TEXT-INDENT: 0cms*"/gi, """ ) ;
str = str.replace( /s*TEXT-ALIGN: [^s;] ;?"/gi, """ ) ;
str = str.replace( /s*PAGE-BREAK-BEFORE: [^s;] ;?"/gi, """ ) ;
str = str.replace( /s*FONT-VARIANT: [^s;] ;?"/gi, """ ) ;
str = str.replace( /s*tab-stops:[^;"]*;?/gi, "" ) ;
str = str.replace( /s*tab-stops:[^"]*/gi, "" ) ;
str = str.replace( /s*face="[^"]*"/gi, "" ) ;
str = str.replace( /s*face=[^ >]*/gi, "" ) ;
str = str.replace( /s*FONT-FAMILY:[^;"]*;?/gi, "" ) ;
str = str.replace(/<(w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
str = str.replace( /<(w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3" ) ;
str = str.replace( /s*style="s*"/gi, '' ) ;
str = str.replace( /<SPANs*[^>]*>s*amp;nbsp;s*</SPAN>/gi, 'amp;nbsp;' ) ;
str = str.replace( /<SPANs*[^>]*></SPAN>/gi, '' ) ;
str = str.replace(/<(w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
str = str.replace( /<SPANs*>(.*?)</SPAN>/gi, '$1' ) ;
str = str.replace( /<FONTs*>(.*?)</FONT>/gi, '$1' ) ;
str = str.replace(/<\??xml[^>]*>/gi, "") ;
str = str.replace(/</?w :[^>]*>/gi, "") ;
str = str.replace( /<Hd>s*</Hd>/gi, '' ) ;
str = str.replace( /<H1([^>]*)>/gi, '' ) ;
str = str.replace( /<H2([^>]*)>/gi, '' ) ;
str = str.replace( /<H3([^>]*)>/gi, '' ) ;
str = str.replace( /<H4([^>]*)>/gi, '' ) ;
str = str.replace( /<H5([^>]*)>/gi, '' ) ;
str = str.replace( /<H6([^>]*)>/gi, '' ) ;
str = str.replace( /</Hd>/gi, '<br>' ) ; //remove this to take out breaks where Heading tags were
str = str.replace( /<(U|I|STRIKE)>amp;nbsp;</1>/g, 'amp;nbsp;' ) ;
str = str.replace( /<(B|b)>amp;nbsp;</b|B>/g, '' ) ;
str = str.replace( /<([^s>] )[^>]*>s*</1>/g, '' ) ;
str = str.replace( /<([^s>] )[^>]*>s*</1>/g, '' ) ;
str = str.replace( /<([^s>] )[^>]*>s*</1>/g, '' ) ;
//some RegEx code for the picky browsers
var re = new RegExp("(<P)([^>]*>.*?)(</P>)","gi") ;
str = str.replace( re, "<div$2</div>" ) ;
var re2 = new RegExp("(<font|<FONT)([^*>]*>.*?)(</FONT>|</font>)","gi") ;
str = str.replace( re2, "<div$2</div>") ;
str = str.replace( /size|SIZE = ([d]{1})/g, '' ) ;

return str ;
}
</script>
  

http://www.1stclassmedia.co.uk/developers/clean-ms-word-formatting.php

все кредиты автору оригинала.

Комментарии:

1. Неплохое начало. Посмотрим, что скажут другие, но это немного помогло, поэтому предлагаю вам проголосовать «за».

2. @zeNo отлично работает для Firefox / Chrome, но в IE добавляется дополнительный тег «<«, не знаю почему, есть ли какие-либо конкретные настройки / изменения только для IE?

3. @zoNO Почему вы удаляете заголовки H1-H6?

Ответ №2:

У Tinymce есть флаг для этого при вставке.

Вам следует взглянуть на настройку past_preprocess плагина вставки.

Здесь вы можете получить доступ к вставляемому содержимому с помощью ‘o’ и узнать, была ли вставка взята из Word. Пример:

 paste_preprocess : function(pl, o) {
  //if(console) console.log('content', o);

  if (o.wordContent ) {
           alert('paste from WORD detected!!!');
    }
  ...   
},
  

Я использую специальную функцию для избавления от нежелательных тегов (мне не очень понравился способ, которым tinymce обрабатывает это по умолчанию, поэтому я написал свой собственный).