Подтвердить что ты не робот

Очистить текст в Word Word с помощью JavaScript

Я использую "contenteditable" <div/> и включаю PASTE.

Удивительно количество кода разметки, который вставлен из копии буфера обмена из Microsoft Word. Я сражаюсь с этим, и получил около 1/2 пути там, используя функцию Prototypes stripTags() (которая, к сожалению, не позволяет мне хранить некоторые теги).

Однако, даже после этого, я заканчиваю невероятным количеством ненужного кода разметки.

Итак, мой вопрос: есть ли какая-то функция (с использованием JavaScript) или подход, который я могу использовать, который очистит большую часть этой ненужной разметки?

4b9b3361

Ответ 1

Вот функция, которую я запустил, написав, что делает работу достаточно хорошо (насколько я могу сказать в любом случае).

Я, безусловно, открыт для предложений по улучшению, если у кого-то есть. Спасибо.

function cleanWordPaste( in_word_text ) {
 var tmp = document.createElement("DIV");
 tmp.innerHTML = in_word_text;
 var newString = tmp.textContent||tmp.innerText;
 // this next piece converts line breaks into break tags
 // and removes the seemingly endless crap code
 newString  = newString.replace(/\n\n/g, "<br />").replace(/.*<!--.*-->/g,"");
 // this next piece removes any break tags (up to 10) at beginning
 for ( i=0; i<10; i++ ) {
  if ( newString.substr(0,6)=="<br />" ) { 
   newString = newString.replace("<br />", ""); 
  }
 }
 return newString;
}

Надеюсь, это поможет некоторым из вас.

Ответ 3

Я использую это:

$(body_doc).find('body').bind('paste',function(e){
                var rte = $(this);
                _activeRTEData = $(rte).html();
                beginLen = $.trim($(rte).html()).length; 

                setTimeout(function(){
                    var text = $(rte).html();
                    var newLen = $.trim(text).length;

                    //identify the first char that changed to determine caret location
                    caret = 0;

                    for(i=0;i < newLen; i++){
                        if(_activeRTEData[i] != text[i]){
                            caret = i-1;
                            break;  
                        }
                    }

                    var origText = text.slice(0,caret);
                    var newText = text.slice(caret, newLen - beginLen + caret + 4);
                    var tailText = text.slice(newLen - beginLen + caret + 4, newLen);

                    var newText = newText.replace(/(.*(?:endif-->))|([ ]?<[^>]*>[ ]?)|(&nbsp;)|([^}]*})/g,'');

                    newText = newText.replace(/[·]/g,'');

                    $(rte).html(origText + newText + tailText);
                    $(rte).contents().last().focus();
                },100);
            });

body_doc - это редактируемый iframe, если вы используете редактируемый div, вы можете удалить часть .find('body'). В основном он обнаруживает событие вставки, проверяет местоположение, очищает новый текст, а затем помещает очищенный текст обратно туда, где он был вставлен. (Звучит запутанно... но это не так плохо, как кажется.

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

Ответ 4

Как насчет кнопки "вставить как обычный текст", которая отображает <textarea>, позволяя пользователю вставлять туда текст? Таким образом, все теги будут удалены для вас. Это то, что я делаю с моей CMS; Я сдался, пытаясь очистить беспорядок Word.

Ответ 5

Я сделал что-то подобное давно, где я полностью очистил материал в богатом текстовом редакторе и преобразовал теги шрифтов в стили, от brs до p и т.д., чтобы поддерживать его в согласованности между браузерами и не допускать попадания некоторых уродливых вещей через пасту. Я взял свою рекурсивную функцию и вырвал большую часть ее, за исключением основной логики, это может быть хорошей отправной точкой ( "результат" - это объект, который накапливает результат, который, вероятно, занимает второй проход для преобразования в строку), если это то, что вам нужно:

var cleanDom = function(result, n) {
var nn = n.nodeName;
if(nn=="#text") {
    var text = n.nodeValue;

    }
else {
    if(nn=="A" && n.href)
        ...;
    else if(nn=="IMG" & n.src) {
        ....
        }
    else if(nn=="DIV") {
        if(n.className=="indent")
            ...
        }
    else if(nn=="FONT") {
        }       
    else if(nn=="BR") {
        }

    if(!UNSUPPORTED_ELEMENTS[nn]) {
        if(n.childNodes.length > 0)
            for(var i=0; i<n.childNodes.length; i++) 
                cleanDom(result, n.childNodes[i]);
        }
    }
}

Ответ 6

Это отлично подходит для удаления любых комментариев из текста HTML, в том числе из Word:

function CleanWordPastedHTML(sTextHTML) {
  var sStartComment = "<!--", sEndComment = "-->";
  while (true) {
    var iStart = sTextHTML.indexOf(sStartComment);
    if (iStart == -1) break;
    var iEnd = sTextHTML.indexOf(sEndComment, iStart);
    if (iEnd == -1) break;
    sTextHTML = sTextHTML.substring(0, iStart) + sTextHTML.substring(iEnd + sEndComment.length);
  }
  return sTextHTML;
}

Ответ 7

Если подобная проблема была связана с разрывами строк, считающимися символами, мне пришлось удалить их.

$(document).ready(function(){

  $(".section-overview textarea").bind({
    paste : function(){
    setTimeout(function(){
      //textarea
      var text = $(".section-overview textarea").val();
      // look for any "\n" occurences and replace them
      var newString = text.replace(/\n/g, '');
      // print new string
      $(".section-overview textarea").val(newString);
    },100);
    }
  });
  
});

Ответ 8

Не могли бы вы вставить в скрытое текстовое поле, скопировать из того же текстового поля и вставить в свою цель?

Ответ 9

Ненавижу говорить об этом, но я в конце концов отказался от того, чтобы сделать TinyMCE ручкой Word так, как я хочу. Теперь у меня просто есть письмо, отправленное мне каждый раз, когда пользовательский ввод содержит определенный HTML (например, искать <span lang="en-US">), и я исправляю его вручную.