app/assets/javascripts/activeadmin/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.js in activeadmin_trumbowyg-0.1.3 vs app/assets/javascripts/activeadmin/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.js in activeadmin_trumbowyg-0.1.6
- old
+ new
@@ -1,28 +1,20 @@
/* ===========================================================
* trumbowyg.cleanpaste.js v1.0
* Font Clean paste plugin for Trumbowyg
* http://alex-d.github.com/Trumbowyg
* ===========================================================
- * Author : Eric Radin
- */
-
-/**
+ * Authors : Eric Radin
+ * Todd Graham (slackwalker)
+ *
* This plugin will perform a "cleaning" on any paste, in particular
* it will clean pasted content of microsoft word document tags and classes.
*/
+
(function ($) {
'use strict';
- function reverse(sentString) {
- var theString = '';
- for (var i = sentString.length - 1; i >= 0; i -= 1) {
- theString += sentString.charAt(i);
- }
- return theString;
- }
-
function checkValidTags(snippet) {
var theString = snippet;
// Replace uppercase element names with lowercase
theString = theString.replace(/<[^> ]*/g, function (match) {
@@ -44,113 +36,59 @@
});
return theString;
}
- function cleanIt(htmlBefore, htmlAfter) {
- var matchedHead = '';
- var matchedTail = '';
- var afterStart;
- var afterFinish;
- var newSnippet;
-
- // we need to extract the inserted block
- for (afterStart = 0; htmlAfter.charAt(afterStart) === htmlBefore.charAt(afterStart); afterStart += 1) {
- matchedHead += htmlAfter.charAt(afterStart);
- }
-
- // If afterStart is inside a HTML tag, move to opening brace of tag
- for (var i = afterStart; i >= 0; i -= 1) {
- if (htmlBefore.charAt(i) === '<') {
- afterStart = i;
- matchedHead = htmlBefore.substring(0, afterStart);
- break;
- } else if (htmlBefore.charAt(i) === '>') {
- break;
- }
- }
-
- // now reverse string and work from the end in
- htmlAfter = reverse(htmlAfter);
- htmlBefore = reverse(htmlBefore);
-
- // Find end of both strings that matches
- for (afterFinish = 0; htmlAfter.charAt(afterFinish) === htmlBefore.charAt(afterFinish); afterFinish += 1) {
- matchedTail += htmlAfter.charAt(afterFinish);
- }
-
- // If afterFinish is inside a HTML tag, move to closing brace of tag
- for (var j = afterFinish; j >= 0; j -= 1) {
- if (htmlBefore.charAt(j) === '>') {
- afterFinish = j;
- matchedTail = htmlBefore.substring(0, afterFinish);
- break;
- } else if (htmlBefore.charAt(j) === '<') {
- break;
- }
- }
-
- matchedTail = reverse(matchedTail);
-
- // If there's no difference in pasted content
- if (afterStart === (htmlAfter.length - afterFinish)) {
- return false;
- }
-
- htmlAfter = reverse(htmlAfter);
- newSnippet = htmlAfter.substring(afterStart, htmlAfter.length - afterFinish);
-
+ function cleanIt(html) {
// first make sure all tags and attributes are made valid
- newSnippet = checkValidTags(newSnippet);
+ html = checkValidTags(html);
// Replace opening bold tags with strong
- newSnippet = newSnippet.replace(/<b(\s+|>)/g, '<strong$1');
+ html = html.replace(/<b(\s+|>)/g, '<strong$1');
// Replace closing bold tags with closing strong
- newSnippet = newSnippet.replace(/<\/b(\s+|>)/g, '</strong$1');
+ html = html.replace(/<\/b(\s+|>)/g, '</strong$1');
// Replace italic tags with em
- newSnippet = newSnippet.replace(/<i(\s+|>)/g, '<em$1');
+ html = html.replace(/<i(\s+|>)/g, '<em$1');
// Replace closing italic tags with closing em
- newSnippet = newSnippet.replace(/<\/i(\s+|>)/g, '</em$1');
+ html = html.replace(/<\/i(\s+|>)/g, '</em$1');
// strip out comments -cgCraft
- newSnippet = newSnippet.replace(/<!(?:--[\s\S]*?--\s*)?>\s*/g, '');
+ html = html.replace(/<!(?:--[\s\S]*?--\s*)?>\s*/g, '');
// strip out -cgCraft
- newSnippet = newSnippet.replace(/ /gi, ' ');
+ html = html.replace(/ /gi, ' ');
// strip out extra spaces -cgCraft
- newSnippet = newSnippet.replace(/ <\//gi, '</');
+ html = html.replace(/ <\//gi, '</');
- while (newSnippet.indexOf(' ') !== -1) {
- var anArray = newSnippet.split(' ');
- newSnippet = anArray.join(' ');
+ while (html.indexOf(' ') !== -1) {
+ html = html.split(' ').join(' ');
}
// strip -cgCraft
- newSnippet = newSnippet.replace(/^\s*|\s*$/g, '');
+ html = html.replace(/^\s*|\s*$/g, '');
// Strip out unaccepted attributes
- newSnippet = newSnippet.replace(/<[^>]*>/g, function (match) {
+ html = html.replace(/<[^>]*>/g, function (match) {
match = match.replace(/ ([^=]+)="[^"]*"/g, function (match2, attributeName) {
if (['alt', 'href', 'src', 'title'].indexOf(attributeName) !== -1) {
return match2;
}
return '';
});
return match;
});
// Final cleanout for MS Word crud
- newSnippet = newSnippet.replace(/<\?xml[^>]*>/g, '');
- newSnippet = newSnippet.replace(/<[^ >]+:[^>]*>/g, '');
- newSnippet = newSnippet.replace(/<\/[^ >]+:[^>]*>/g, '');
+ html = html.replace(/<\?xml[^>]*>/g, '');
+ html = html.replace(/<[^ >]+:[^>]*>/g, '');
+ html = html.replace(/<\/[^ >]+:[^>]*>/g, '');
// remove unwanted tags
- newSnippet = newSnippet.replace(/<(div|span|style|meta|link){1}.*?>/gi, '');
+ html = html.replace(/<(div|span|style|meta|link).*?>/gi, '');
- htmlAfter = matchedHead + newSnippet + matchedTail;
- return htmlAfter;
+ return html;
}
// clean editor
// this will clean the inserted contents
// it does a compare, before and after paste to determine the
@@ -159,15 +97,10 @@
plugins: {
cleanPaste: {
init: function (trumbowyg) {
trumbowyg.pasteHandlers.push(function () {
try {
- var contentBefore = trumbowyg.$ed.html();
- setTimeout(function () {
- var contentAfter = trumbowyg.$ed.html();
- contentAfter = cleanIt(contentBefore, contentAfter);
- trumbowyg.$ed.html(contentAfter);
- }, 0);
+ trumbowyg.$ed.html(cleanIt(trumbowyg.$ed.html()));
} catch (c) {
}
});
}
}