@syncfusion/ej2-richtexteditor
Version:
Essential JS 2 RichTextEditor component
984 lines (982 loc) • 58.6 kB
JavaScript
import * as EVENTS from '../../common/constant';
import { createElement, isNullOrUndefined as isNOU, detach, addClass, Browser } from '@syncfusion/ej2-base';
import { PASTE_SOURCE } from '../base/constant';
import { InsertMethods } from './insert-methods';
/**
* PasteCleanup for MsWord content
*
* @hidden
*/
var MsWordPaste = /** @class */ (function () {
function MsWordPaste(parent) {
this.olData = [
'decimal',
'decimal-leading-zero',
'lower-alpha',
'lower-roman',
'upper-alpha',
'upper-roman',
'lower-greek'
];
this.ulData = [
'disc',
'square',
'circle',
'disc',
'square',
'circle'
];
this.ignorableNodes = ['A', 'APPLET', 'B', 'BLOCKQUOTE', 'BR',
'BUTTON', 'CENTER', 'CODE', 'COL', 'COLGROUP', 'DD', 'DEL', 'DFN', 'DIR', 'DIV',
'DL', 'DT', 'EM', 'FIELDSET', 'FONT', 'FORM', 'FRAME', 'FRAMESET', 'H1', 'H2',
'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'IMG', 'IFRAME', 'INPUT', 'INS', 'LABEL',
'LI', 'OL', 'OPTION', 'P', 'PARAM', 'PRE', 'Q', 'S', 'SELECT', 'SPAN', 'STRIKE',
'STRONG', 'SUB', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH',
'THEAD', 'TITLE', 'TR', 'TT', 'U', 'UL'];
this.blockNode = ['div', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'address', 'blockquote', 'button', 'center', 'dd', 'dir', 'dl', 'dt', 'fieldset',
'frameset', 'hr', 'iframe', 'isindex', 'li', 'map', 'menu', 'noframes', 'noscript',
'object', 'ol', 'pre', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'ul',
'header', 'article', 'nav', 'footer', 'section', 'aside', 'main', 'figure', 'figcaption'];
this.borderStyle = ['border-top', 'border-right', 'border-bottom', 'border-left'];
this.upperRomanNumber = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX',
'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'];
this.lowerRomanNumber = ['i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix',
'x', 'xi', 'xii', 'xiii', 'xiv', 'xv', 'xvi', 'xvii', 'xviii', 'xix', 'xx'];
this.lowerGreekNumber = ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ',
'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω'];
this.removableElements = ['o:p', 'style', 'w:sdt'];
this.listContents = [];
this.cropImageDimensions = [];
this.parent = parent;
this.addEventListener();
}
MsWordPaste.prototype.addEventListener = function () {
this.parent.observer.on(EVENTS.MS_WORD_CLEANUP_PLUGIN, this.wordCleanup, this);
this.parent.observer.on(EVENTS.INTERNAL_DESTROY, this.destroy, this);
};
MsWordPaste.prototype.removeEventListener = function () {
this.parent.observer.off(EVENTS.MS_WORD_CLEANUP_PLUGIN, this.wordCleanup);
this.parent.observer.off(EVENTS.INTERNAL_DESTROY, this.destroy);
};
MsWordPaste.prototype.wordCleanup = function (e) {
var wordPasteStyleConfig = !isNOU(e.allowedStylePropertiesArray) ? e.allowedStylePropertiesArray : [];
var listNodes = [];
var tempHTMLContent = e.args.clipboardData.getData('text/HTML');
var rtfData = e.args.clipboardData.getData('text/rtf');
var elm = createElement('p');
elm.setAttribute('id', 'MSWord-Content');
elm.innerHTML = tempHTMLContent;
this.addDoubleBr(elm);
var patern = /class='?Mso|style='[^ ]*\bmso-/i;
var patern2 = /class="?Mso|style="[^ ]*\bmso-/i;
var patern3 = /(class="?Mso|class='?Mso|class="?Xl|class='?Xl|class=Xl|style="[^"]*\bmso-|style='[^']*\bmso-|w:WordDocument)/gi;
var pattern4 = /style='mso-width-source:/i;
var source = this.findSource(elm);
if (patern.test(tempHTMLContent) || patern2.test(tempHTMLContent) || patern3.test(tempHTMLContent) ||
pattern4.test(tempHTMLContent)) {
tempHTMLContent = tempHTMLContent.replace(/<img[^>]+>/i, '');
this.addListClass(elm);
listNodes = this.cleanUp(elm, listNodes);
if (!isNOU(listNodes[0]) && listNodes[0].parentElement.tagName !== 'UL' &&
listNodes[0].parentElement.tagName !== 'OL') {
this.listConverter(listNodes);
}
this.imageConversion(elm, rtfData);
this.cleanList(elm, 'UL');
this.cleanList(elm, 'OL');
this.styleCorrection(elm, wordPasteStyleConfig);
this.removingComments(elm);
this.removeUnwantedElements(elm);
this.removeEmptyElements(elm);
this.removeEmptyAnchorTag(elm);
this.breakLineAddition(elm);
this.processMargin(elm);
this.removeClassName(elm);
if (pattern4.test(tempHTMLContent)) {
this.addTableBorderClass(elm);
}
e.callBack(elm.innerHTML, this.cropImageDimensions, source);
}
else {
if (source === PASTE_SOURCE[2]) {
this.handleOneNoteContent(elm);
}
this.removeEmptyMetaTags(elm);
e.callBack(elm.innerHTML, null, source);
}
};
MsWordPaste.prototype.addDoubleBr = function (elm) {
var newline = elm.querySelector('.Apple-interchange-newline');
if (!isNOU(newline) && Browser.userAgent.indexOf('Chrome') !== -1 && newline.parentElement.nodeName === 'P' && elm !== newline.parentElement) {
for (var i = 0; i < elm.childNodes.length; i++) {
var node = elm.childNodes[i];
if (node.nodeType === Node.COMMENT_NODE && node.nodeValue.includes('StartFragment')) {
var newElement = document.createElement('p');
newElement.innerHTML = '<br>';
var cssText = newline.parentElement.style.cssText;
var currentStyle = newElement.getAttribute('style') || '';
var newStyle = currentStyle + cssText;
newElement.style.cssText = newStyle;
elm.insertBefore(newElement, node.nextSibling);
detach(newline);
break;
}
}
}
};
MsWordPaste.prototype.cleanList = function (elm, listTag) {
var replacableElem = elm.querySelectorAll(listTag + ' div');
for (var j = replacableElem.length - 1; j >= 0; j--) {
var parentElem = replacableElem[j].parentNode;
while (replacableElem[j].firstChild) {
parentElem.insertBefore(replacableElem[j].firstChild, replacableElem[j]);
}
var closestListElem = this.findClosestListElem(replacableElem[j]);
if (closestListElem) {
this.insertAfter(replacableElem[j], closestListElem);
}
}
};
MsWordPaste.prototype.insertAfter = function (newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
};
MsWordPaste.prototype.findClosestListElem = function (listElem) {
var closestListElem;
while (!isNOU(listElem)) {
listElem = !isNOU(listElem.closest('ul')) && listElem.tagName !== 'UL' ?
listElem.closest('ul') : (listElem.tagName !== 'OL' ? listElem.closest('ol') : null);
closestListElem = !isNOU(listElem) ? listElem : closestListElem;
}
return closestListElem;
};
MsWordPaste.prototype.addListClass = function (elm) {
var allNodes = elm.querySelectorAll('*');
for (var index = 0; index < allNodes.length; index++) {
if (!isNOU(allNodes[index].getAttribute('style')) && allNodes[index].getAttribute('style').replace(/ /g, '').replace('\n', '').indexOf('mso-list:l') >= 0 &&
allNodes[index].className.toLowerCase().indexOf('msolistparagraph') === -1 &&
allNodes[index].tagName.charAt(0) !== 'H' && allNodes[index].tagName !== 'LI' &&
allNodes[index].tagName !== 'OL' && allNodes[index].tagName !== 'UL') {
allNodes[index].classList.add('msolistparagraph');
}
}
};
MsWordPaste.prototype.addTableBorderClass = function (elm) {
var allTableElm = elm.querySelectorAll('table');
var hasTableBorder = false;
for (var i = 0; i < allTableElm.length; i++) {
for (var j = 0; j < this.borderStyle.length; j++) {
if (allTableElm[i].innerHTML.indexOf(this.borderStyle[j]) >= 0) {
hasTableBorder = true;
break;
}
}
if (hasTableBorder) {
allTableElm[i].classList.add('e-rte-table-border');
hasTableBorder = false;
}
}
};
MsWordPaste.prototype.imageConversion = function (elm, rtfData) {
this.checkVShape(elm);
var imgElem = elm.querySelectorAll('img');
for (var i = 0; i < imgElem.length; i++) {
if (!isNOU(imgElem[i].getAttribute('v:shapes')) &&
imgElem[i].getAttribute('v:shapes').indexOf('Picture') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('Chart') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('圖片') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('Grafik') < 0 &&
imgElem[i].getAttribute('v:shapes').toLowerCase().indexOf('image') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('Graphic') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('_x0000_s') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('_x0000_i') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('img1') < 0 &&
imgElem[i].getAttribute('v:shapes').indexOf('Immagine') < 0) {
imgElem[i].classList.add('e-rte-image-unsupported');
}
imgElem[i].removeAttribute('v:shapes');
}
imgElem = elm.querySelectorAll('img');
var imgSrc = [];
var base64Src = [];
var imgName = [];
// eslint-disable-next-line
var linkRegex = new RegExp(/([^\S]|^)(((https?\:\/\/)|(www\.)|(blob\:))(\S+))/gi);
if (imgElem.length > 0) {
for (var i = 0; i < imgElem.length; i++) {
if (!imgElem[i].classList.contains('e-rte-image-unsupported')) {
imgSrc.push(imgElem[i].getAttribute('src'));
var imageName = imgElem[i].getAttribute('src').split('/')[imgElem[i].getAttribute('src').split('/').length - 1].split('.')[0] + i;
imgName.push(imageName);
}
}
var hexValue = this.hexConversion(rtfData);
for (var i = 0; i < hexValue.length; i++) {
base64Src.push({
base64Data: !isNOU(hexValue[i].hex) ? this.convertToBase64(hexValue[i]) : null,
isCroppedImage: hexValue[i].isCroppedImage
});
if (hexValue[i].isCroppedImage) {
this.cropImageDimensions.push({
goalWidth: hexValue[i].goalWidth,
goalHeight: hexValue[i].goalHeight,
cropLength: hexValue[i].cropLength,
cropTop: hexValue[i].cropTop,
cropR: hexValue[i].cropR,
cropB: hexValue[i].cropB
});
}
}
imgElem = elm.querySelectorAll('img:not(.e-rte-image-unsupported');
for (var i = 0; i < imgElem.length; i++) {
if (imgSrc[i].match(linkRegex)) {
imgElem[i].setAttribute('src', imgSrc[i]);
}
else {
if (!isNOU(base64Src[i]) && !isNOU(base64Src[i].base64Data)) {
imgElem[i].setAttribute('src', base64Src[i].base64Data);
}
else {
imgElem[i].removeAttribute('src');
imgElem[i].classList.add('e-rte-image-unsupported');
}
if (!isNOU(base64Src[i]) && base64Src[i].isCroppedImage) {
imgElem[i].classList.add('e-img-cropped');
}
}
imgElem[i].setAttribute('id', 'msWordImg-' + imgName[i]);
}
imgElem = elm.querySelectorAll('.e-rte-image-unsupported');
for (var i = 0; i < imgElem.length; i++) {
imgElem[i].removeAttribute('src');
}
}
};
MsWordPaste.prototype.checkVShape = function (elm) {
var allNodes = elm.querySelectorAll('*');
for (var i = 0; i < allNodes.length; i++) {
switch (allNodes[i].nodeName) {
case 'V:SHAPETYPE':
detach(allNodes[i]);
break;
case 'V:SHAPE':
if (allNodes[i].firstElementChild.nodeName === 'V:IMAGEDATA') {
var src = allNodes[i].firstElementChild.getAttribute('src');
var imgElement = createElement('img');
imgElement.setAttribute('src', src);
allNodes[i].parentElement.insertBefore(imgElement, allNodes[i]);
detach(allNodes[i]);
}
break;
}
}
};
MsWordPaste.prototype.convertToBase64 = function (hexValue) {
var byteArr = this.conHexStringToBytes(hexValue.hex);
var base64String = this.conBytesToBase64(byteArr);
var base64 = hexValue.type ? 'data:' + hexValue.type + ';base64,' + base64String : null;
return base64;
};
MsWordPaste.prototype.conBytesToBase64 = function (byteArr) {
var base64Str = '';
var base64Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var byteArrLen = byteArr.length;
for (var i = 0; i < byteArrLen; i += 3) {
var array3 = byteArr.slice(i, i + 3);
var array3length = array3.length;
var array4 = [];
if (array3length < 3) {
for (var j = array3length; j < 3; j++) {
array3[j] = 0;
}
}
array4[0] = (array3[0] & 0xFC) >> 2;
array4[1] = ((array3[0] & 0x03) << 4) | (array3[1] >> 4);
array4[2] = ((array3[1] & 0x0F) << 2) | ((array3[2] & 0xC0) >> 6);
array4[3] = array3[2] & 0x3F;
for (var j = 0; j < 4; j++) {
if (j <= array3length) {
base64Str += base64Char.charAt(array4[j]);
}
else {
base64Str += '=';
}
}
}
return base64Str;
};
MsWordPaste.prototype.conHexStringToBytes = function (hex) {
var byteArr = [];
var byteArrLen = hex.length / 2;
for (var i = 0; i < byteArrLen; i++) {
byteArr.push(parseInt(hex.substr(i * 2, 2), 16));
}
return byteArr;
};
MsWordPaste.prototype.hexConversion = function (rtfData) {
var regExp = RegExp;
var picHead = new regExp('\\{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?(\\{\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s\\}]*?');
var pic = new regExp('(?:(' + picHead.source + '))([\\da-fA-F\\s]+)\\}', 'g');
var fullImg = rtfData.match(pic);
var imgType;
var result = [];
if (!isNOU(fullImg)) {
for (var i = 0; i < fullImg.length; i++) {
if (fullImg[i].indexOf('fIsBullet') !== -1 && fullImg[i].indexOf('wzName') === -1) {
continue;
}
var isCroppedImage = false;
var goalWidth = 0;
var goalHeight = 0;
var cropLength = 0;
var cropTop = 0;
var cropR = 0;
var cropB = 0;
if (picHead.test(fullImg[i])) {
if (fullImg[i].indexOf('\\pngblip') !== -1) {
imgType = 'image/png';
}
else if (fullImg[i].indexOf('\\jpegblip') !== -1) {
imgType = 'image/jpeg';
}
else if (fullImg[i].indexOf('\\emfblip') !== -1) {
imgType = null;
}
else {
continue;
}
isCroppedImage = ((this.extractCropValue('cropl', fullImg[i]) > 0 &&
this.extractCropValue('cropt', fullImg[i]) > 0) ||
this.extractCropValue('cropr', fullImg[i]) > 0 ||
this.extractCropValue('cropb', fullImg[i])) ? true : false;
if (isCroppedImage) {
goalWidth = this.extractCropValue('wgoal', fullImg[i]);
goalHeight = this.extractCropValue('hgoal', fullImg[i]);
cropLength = this.extractCropValue('cropl', fullImg[i]);
cropTop = this.extractCropValue('cropt', fullImg[i]);
cropR = this.extractCropValue('cropr', fullImg[i]);
cropB = this.extractCropValue('cropb', fullImg[i]);
}
result.push({
hex: imgType ? fullImg[i].replace(picHead, '').replace(/[^\da-fA-F]/g, '') : null,
type: imgType,
isCroppedImage: isCroppedImage,
goalWidth: goalWidth,
goalHeight: goalHeight,
cropLength: cropLength,
cropTop: cropTop,
cropR: cropR,
cropB: cropB
});
}
}
}
return result;
};
MsWordPaste.prototype.extractCropValue = function (crop, rtfData) {
var regExp = RegExp;
var result = new regExp('\\\\pic' + crop + '(\\-?\\d+)\\\\').exec(rtfData.replace(/\r\n\\/g, '\\').replace(/\n/g, '\\'))[1];
return parseInt(result, 10);
};
MsWordPaste.prototype.removeClassName = function (elm) {
var elmWithClass = elm.querySelectorAll('*[class]:not(.e-img-cropped):not(.e-rte-image-unsupported)');
for (var i = 0; i < elmWithClass.length; i++) {
elmWithClass[i].removeAttribute('class');
}
};
MsWordPaste.prototype.breakLineAddition = function (elm) {
var allElements = elm.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
if (allElements[i].children.length === 0 && allElements[i].innerHTML === ' ' &&
(allElements[i].innerHTML === ' ' && !allElements[i].closest('li')) &&
!allElements[i].closest('td') && (allElements[i].nodeName !== 'SPAN' ||
allElements[i].nodeName === 'SPAN' && (isNOU(allElements[i].previousElementSibling) &&
isNOU(allElements[i].nextElementSibling)))) {
var detachableElement = this.findDetachElem(allElements[i]);
var brElement = createElement('br');
var hasNbsp = detachableElement.textContent.length > 0 && detachableElement.textContent.match(/\u00a0/g)
&& detachableElement.textContent.match(/\u00a0/g).length > 0;
if (!hasNbsp && !isNOU(detachableElement.parentElement)) {
detachableElement.parentElement.insertBefore(brElement, detachableElement);
detach(detachableElement);
}
}
}
};
MsWordPaste.prototype.findDetachElem = function (element) {
var removableElement;
if (!isNOU(element.parentElement) &&
element.parentElement.textContent.trim() === '' && element.parentElement.tagName !== 'TD' &&
isNOU(element.parentElement.querySelector('img'))) {
removableElement = this.findDetachElem(element.parentElement);
}
else {
removableElement = element;
}
return removableElement;
};
MsWordPaste.prototype.removeUnwantedElements = function (elm) {
var styleElm = elm.querySelector('style');
if (!isNOU(styleElm)) {
detach(styleElm);
}
var innerElement = elm.innerHTML;
for (var i = 0; i < this.removableElements.length; i++) {
var regExp = RegExp;
var regExpStartElem = new regExp('<' + this.removableElements[i] + '\\s*[^>]*>', 'g');
var regExpEndElem = new regExp('</' + this.removableElements[i] + '>', 'g');
innerElement = innerElement.replace(regExpStartElem, '');
innerElement = innerElement.replace(regExpEndElem, '');
}
elm.innerHTML = innerElement;
elm.querySelectorAll(':empty');
};
MsWordPaste.prototype.findDetachEmptyElem = function (element) {
var removableElement;
if (!isNOU(element.parentElement)) {
var hasNbsp = element.parentElement.textContent.length > 0 && element.parentElement.textContent.match(/\u00a0/g)
&& element.parentElement.textContent.match(/\u00a0/g).length > 0;
if (!hasNbsp && element.parentElement.textContent.trim() === '' &&
element.parentElement.getAttribute('id') !== 'MSWord-Content' &&
!(this.hasParentWithClass(element, 'MsoListParagraph')) &&
isNOU(element.parentElement.querySelector('img'))) {
removableElement = this.findDetachEmptyElem(element.parentElement);
}
else {
removableElement = element;
}
}
else {
removableElement = null;
}
return removableElement;
};
MsWordPaste.prototype.hasParentWithClass = function (element, className) {
var currentParentElem = element.parentElement;
while (!isNOU(currentParentElem)) {
if (currentParentElem.classList.contains(className)) {
return true;
}
currentParentElem = currentParentElem.parentElement;
}
return false;
};
MsWordPaste.prototype.removeEmptyElements = function (element) {
var emptyElements = element.querySelectorAll(':empty');
for (var i = 0; i < emptyElements.length; i++) {
if (!isNOU(emptyElements[i].closest('td')) &&
!isNOU(emptyElements[i].closest('td').querySelector('.MsoNormal'))) {
emptyElements[i].innerHTML = '-';
}
var lineWithDiv = true;
if (emptyElements[i].tagName === 'DIV') {
lineWithDiv = emptyElements[i].style.borderBottom === 'none' ||
emptyElements[i].style.borderBottom === '' ? true : false;
}
if (emptyElements[i].tagName !== 'IMG' && emptyElements[i].tagName !== 'BR' &&
emptyElements[i].tagName !== 'IFRAME' && emptyElements[i].tagName !== 'TD' &&
emptyElements[i].tagName !== 'HR' && lineWithDiv) {
var detachableElement = this.findDetachEmptyElem(emptyElements[i]);
if (!isNOU(detachableElement)) {
detach(detachableElement);
}
}
}
};
MsWordPaste.prototype.removeEmptyMetaTags = function (element) {
var metaTags = element.querySelectorAll('meta:empty');
for (var i = metaTags.length - 1; i >= 0; i--) {
var metaTag = metaTags[i];
if (metaTag.textContent === '') {
detach(metaTag);
}
}
};
MsWordPaste.prototype.styleCorrection = function (elm, wordPasteStyleConfig) {
var styleElement = elm.querySelectorAll('style');
var styles = [];
if (styleElement.length > 0) {
if (!isNOU(styleElement[0].innerHTML.match(/[\S ]+\s+{[\s\S]+?}/gi))) {
styles = styleElement[0].innerHTML.match(/[\S ]+\s+{[\s\S]+?}/gi);
}
else if (styleElement.length > 1) {
styles = styleElement[1].innerHTML.match(/[\S ]+\s+{[\s\S]+?}/gi);
}
var styleClassObject_1 = !isNOU(styles) ? this.findStyleObject(styles) : null;
if (!isNOU(styleClassObject_1)) {
var keys = Object.keys(styleClassObject_1);
var values = keys.map(function (key) {
return styleClassObject_1["" + key];
});
values = this.removeUnwantedStyle(values, wordPasteStyleConfig);
this.filterStyles(elm, wordPasteStyleConfig);
var resultElem = void 0;
var fromClass = false;
var regex = /^(p|div|li)\.(1|10|11)$/;
for (var i = 0; i < keys.length; i++) {
if (keys[i].split('.')[0] === '') {
resultElem = elm.getElementsByClassName(keys[i].split('.')[1]);
fromClass = true;
}
else if ((keys[i].split('.').length === 1 && keys[i].split('.')[0].indexOf('@') >= 0) || (regex.test(keys[i]))) {
continue;
}
else if (keys[i].split('.').length === 1 && keys[i].split('.')[0].indexOf('@') < 0) {
resultElem = elm.getElementsByTagName(keys[i]);
}
else {
resultElem = elm.querySelectorAll(keys[i]);
}
for (var j = 0; j < resultElem.length; j++) {
if (resultElem[j].closest('li') && keys[i] === 'p') {
continue;
}
var styleProperty = resultElem[j].getAttribute('style');
if (!isNOU(styleProperty) && styleProperty.trim() !== '') {
var valueSplit = values[i].split(';');
for (var q = 0; q < valueSplit.length; q++) {
if (valueSplit[q].split(':')[0] === 'border' && valueSplit[q].split(':')[1] === 'none') {
valueSplit.splice(q, 1);
q--;
}
}
if (!fromClass) {
for (var k = 0; k < valueSplit.length; k++) {
var propertyName = valueSplit[k].split(':')[0];
if (styleProperty.includes(propertyName + ':')) {
valueSplit.splice(k, 1);
k--;
}
}
}
var changedValue = valueSplit.join(';') + ';' + styleProperty;
resultElem[j].style.cssText = changedValue;
}
else {
values[i] = values[i]
.replace(/text-indent:-.*?;?/g, '') // Remove 'text-indent'
.replace(/border:\s*none;?/g, '') // Remove 'border:none'
.trim();
resultElem[j].style.cssText = values[i];
}
}
fromClass = false;
}
var listClass = ['MsoListParagraphCxSpFirst', 'MsoListParagraphCxSpMiddle', 'MsoListParagraphCxSpLast'];
for (var i = 0; i < listClass.length; i++) {
if (keys.indexOf('li.' + listClass[i]) > -1) {
var olULElems = elm.querySelectorAll('ol.' + listClass[i] + ', ul.' + listClass[i]);
for (var j = 0; j < olULElems.length; j++) {
var styleProperty = olULElems[j].getAttribute('style');
if (!isNOU(styleProperty) && styleProperty.trim() !== '' && olULElems[j].style.marginLeft !== '') {
var valueSplit = values[keys.indexOf('li.' + listClass[i])].split(';');
for (var k = 0; k < valueSplit.length; k++) {
if ('margin-left'.indexOf(valueSplit[k].split(':')[0]) >= 0) {
if (!isNOU(valueSplit[k].split(':')[1]) &&
valueSplit[k].split(':')[1].indexOf('in') >= 0 &&
olULElems[j].style.marginLeft.indexOf('in') >= 0) {
var classStyle = parseFloat(valueSplit[k].split(':')[1].split('in')[0]);
var inlineStyle = parseFloat(olULElems[j].style.marginLeft.split('in')[0]);
olULElems[j].style.marginLeft = (inlineStyle - classStyle) + 'in';
}
}
}
}
}
}
}
}
}
};
MsWordPaste.prototype.filterStyles = function (elm, wordPasteStyleConfig) {
var elmWithStyles = elm.querySelectorAll('*[style]');
for (var i = 0; i < elmWithStyles.length; i++) {
var elemStyleProperty = elmWithStyles[i].getAttribute('style').split(';');
var styleValue = '';
for (var j = 0; j < elemStyleProperty.length; j++) {
if (wordPasteStyleConfig.indexOf(elemStyleProperty[j].split(':')[0].trim()) >= 0) {
styleValue += elemStyleProperty[j] + ';';
}
}
elmWithStyles[i].style.cssText = styleValue;
}
};
MsWordPaste.prototype.removeUnwantedStyle = function (values, wordPasteStyleConfig) {
for (var i = 0; i < values.length; i++) {
var styleValues = values[i].split(';');
values[i] = '';
for (var j = 0; j < styleValues.length; j++) {
if (wordPasteStyleConfig.indexOf(styleValues[j].split(':')[0]) >= 0) {
values[i] += styleValues[j] + ';';
}
}
}
return values;
};
MsWordPaste.prototype.findStyleObject = function (styles) {
var styleClassObject = {};
for (var i = 0; i < styles.length; i++) {
var tempStyle = styles[i];
var classNameCollection = tempStyle.replace(/([\S ]+\s+){[\s\S]+?}/gi, '$1');
var stylesCollection = tempStyle.replace(/[\S ]+\s+{([\s\S]+?)}/gi, '$1');
classNameCollection = classNameCollection.replace(/^[\s]|[\s]$/gm, '');
stylesCollection = stylesCollection.replace(/^[\s]|[\s]$/gm, '');
classNameCollection = classNameCollection.replace(/\n|\r|\n\r/g, '');
stylesCollection = stylesCollection.replace(/\n|\r|\n\r/g, '');
for (var classNames = classNameCollection.split(', '), j = 0; j < classNames.length; j++) {
styleClassObject[classNames[j]] = stylesCollection;
}
}
return styleClassObject;
};
MsWordPaste.prototype.removingComments = function (elm) {
var innerElement = elm.innerHTML;
innerElement = innerElement.replace(/<!--[\s\S]*?-->/g, '');
elm.innerHTML = innerElement;
};
MsWordPaste.prototype.cleanUp = function (node, listNodes) {
var tempCleaner = [];
var prevflagState;
var allNodes = node.querySelectorAll('*');
for (var index = 0; index < allNodes.length; index++) {
if (this.ignorableNodes.indexOf(allNodes[index].nodeName) === -1 ||
(allNodes[index].nodeType === 3 && allNodes[index].textContent.trim() === '')) {
tempCleaner.push(allNodes[index]);
continue;
}
else if (allNodes[index].className &&
allNodes[index].className.toLowerCase().indexOf('msolistparagraph') !== -1 &&
!isNOU(allNodes[index].getAttribute('style')) &&
allNodes[index].getAttribute('style').indexOf('mso-list:') >= 0) {
if (allNodes[index].className.indexOf('MsoListParagraphCxSpFirst') >= 0 && listNodes.length > 0 &&
listNodes[listNodes.length - 1] !== null) {
listNodes.push(null);
}
listNodes.push(allNodes[index]);
}
if (prevflagState && (this.blockNode.indexOf(allNodes[index].nodeName.toLowerCase()) !== -1) &&
!(allNodes[index].className &&
allNodes[index].className.toLowerCase().indexOf('msolistparagraph') !== -1 && !isNOU(allNodes[index].getAttribute('style')) &&
allNodes[index].getAttribute('style').indexOf('mso-list:') >= 0)) {
listNodes.push(null);
}
if (this.blockNode.indexOf(allNodes[index].nodeName.toLowerCase()) !== -1) {
if (allNodes[index].className &&
allNodes[index].className.toLowerCase().indexOf('msolistparagraph') !== -1 && !isNOU(allNodes[index].getAttribute('style')) &&
allNodes[index].getAttribute('style').indexOf('mso-list:') >= 0) {
prevflagState = true;
}
else {
prevflagState = false;
}
}
}
if (listNodes.length && (listNodes[listNodes.length - 1] !== null)) {
listNodes.push(null);
}
return listNodes;
};
MsWordPaste.prototype.listConverter = function (listNodes) {
var level;
var data = [];
var listFormatOverride;
var collection = [];
var content = '';
var stNode;
var currentListStyle = '';
for (var i = 0; i < listNodes.length; i++) {
if (listNodes[i] === null) {
data.push({ content: this.makeConversion(collection), node: listNodes[i - 1] });
collection = [];
continue;
}
if (listNodes[i].getAttribute('style') && listNodes[i].getAttribute('style').indexOf('mso-outline-level') !== -1) {
listNodes[i].style.cssText = listNodes[i].getAttribute('style').replace('mso-outline-level', 'mso-outline');
}
content = listNodes[i].getAttribute('style');
if (content && content.indexOf('level') !== -1) {
// eslint-disable-next-line
level = parseInt(content.charAt(content.indexOf('level') + 5), null);
}
else {
level = 1;
}
if (content && content.indexOf('mso-list:') !== -1) {
var msoListValue = void 0;
if (content.match(/mso-list:[^;]+;?/)) {
var changedContent = content.replace(new RegExp('\\n', 'g'), '').split(' ').join('');
msoListValue = changedContent.match(/mso-list:[^;]+;?/)[0].split(':l');
listFormatOverride = isNOU(msoListValue) ? null : parseInt(msoListValue[1].split('level')[0], 10);
}
else {
listFormatOverride = null;
}
}
this.listContents = [];
this.getListContent(listNodes[i]);
var type = void 0;
var listStyleType = void 0;
var startAttr = void 0;
var styleMarginLeft = void 0;
if (!isNOU(this.listContents[0])) {
type = this.listContents[0].trim().length > 1 ? 'ol' : 'ul';
listStyleType = this.getlistStyleType(this.listContents[0], type);
if (type === 'ol' && (i === 0 || listNodes[i - 1] === null)) {
var startString = this.listContents[0].split('.')[0];
var listTypes = ['A', 'a', 'I', 'i', 'α', '1', '01', '1-']; // Add '1-' for rare list type.
if (listTypes.indexOf(startString) === -1) {
if (listStyleType === 'decimal') {
// Bug in getlistStyleType() list style stype is returned as decimal for nested list with start attribute
if (!isNaN(parseInt(startString, 10))) {
startAttr = parseInt(startString, 10);
}
}
else if (listStyleType === 'decimal-leading-zero') {
if (!isNaN(parseInt(startString, 10))) {
startAttr = parseInt(startString, 10);
}
}
else if (listStyleType === 'upper-alpha') {
startAttr = (startString.split('.')[0].charCodeAt(0) - 64);
}
else if (listStyleType === 'lower-alpha') {
startAttr = (startString.split('.')[0].charCodeAt(0) - 96);
}
else if (listStyleType === 'upper-roman') {
startAttr = this.upperRomanNumber.indexOf(this.listContents[0].split('.')[0]) + 1;
}
else if (listStyleType === 'lower-roman') {
startAttr = this.lowerRomanNumber.indexOf(this.listContents[0].split('.')[0]) + 1;
}
else if (listStyleType === 'lower-greek') {
startAttr = this.lowerGreekNumber.indexOf(this.listContents[0].split('.')[0]) + 1;
}
}
}
if (listNodes[i].style.marginLeft !== '') {
styleMarginLeft = listNodes[i].style.marginLeft;
}
var tempNode = [];
for (var j = 1; j < this.listContents.length; j++) {
tempNode.push(this.listContents[j]);
}
var currentClassName = void 0;
if (!isNOU(listNodes[i].className)) {
currentClassName = listNodes[i].className;
}
if (!isNOU(listNodes[i].getAttribute('style'))) {
listNodes[i].style.cssText = listNodes[i].getAttribute('style').replace('text-align:start;', '');
listNodes[i].style.textIndent = '';
currentListStyle = listNodes[i].getAttribute('style');
}
collection.push({
listType: type, content: tempNode, nestedLevel: level,
listFormatOverride: listFormatOverride, class: currentClassName,
listStyle: currentListStyle, listStyleTypeName: listStyleType, start: startAttr, styleMarginLeft: styleMarginLeft
});
}
}
stNode = listNodes.shift();
while (stNode) {
var elemColl = [];
for (var temp1 = 0; temp1 < data.length; temp1++) {
if (data[temp1].node === stNode) {
for (var index = 0; index < data[temp1].content.childNodes.length; index++) {
elemColl.push(data[temp1].content.childNodes[index]);
}
for (var index = 0; index < elemColl.length; index++) {
stNode.parentElement.insertBefore(elemColl[index], stNode);
}
break;
}
}
stNode.remove();
stNode = listNodes.shift();
if (!stNode) {
stNode = listNodes.shift();
}
}
};
MsWordPaste.prototype.getlistStyleType = function (listContent, type) {
var currentListClass;
if (type === 'ol') {
var charCode = listContent.split('.')[0].charCodeAt(0);
switch (true) {
case this.upperRomanNumber.indexOf(listContent.split('.')[0]) > -1:
currentListClass = 'upper-roman';
break;
case this.lowerRomanNumber.indexOf(listContent.split('.')[0]) > -1:
currentListClass = 'lower-roman';
break;
case this.lowerGreekNumber.indexOf(listContent.split('.')[0]) > -1:
currentListClass = 'lower-greek';
break;
case (charCode > 64 && charCode < 91):
currentListClass = 'upper-alpha';
break;
case (charCode > 96 && charCode < 123):
currentListClass = 'lower-alpha';
break;
case (listContent.split('.')[0].length > 1 && listContent.split('.')[0][0] === '0' && !isNaN(Number(listContent.split('.')[0]))):
currentListClass = 'decimal-leading-zero';
break;
default:
currentListClass = 'decimal';
break;
}
}
else {
switch (listContent.split('.')[0]) {
case 'o':
currentListClass = 'circle';
break;
case '§':
currentListClass = 'square';
break;
default:
currentListClass = 'disc';
break;
}
}
return currentListClass;
};
MsWordPaste.prototype.makeConversion = function (collection) {
var root = createElement('div');
var temp;
var pLevel = 1;
var prevList;
var listCount = 0;
var elem;
var lfo = collection[0].listFormatOverride;
for (var index = 0; index < collection.length; index++) {
var listClass = ['MsoListParagraphCxSpFirst', 'MsoListParagraphCxSpMiddle', 'MsoListParagraphCxSpLast'];
var isNormalList = false;
for (var i = 0; i < listClass.length; i++) {
if (listClass[i].indexOf(collection[index].class) >= 0) {
isNormalList = true;
break;
}
}
if (!isNOU(prevList) && index !== 0 &&
collection[index - 1].listType !== collection[index].listType &&
!isNormalList) {
prevList = null;
}
var pElement = createElement('p', { className: 'MsoNoSpacing' });
pElement.innerHTML = collection[index].content.join(' ');
if ((collection[index].nestedLevel === 1) &&
(listCount === 0 || lfo !== collection[index].listFormatOverride) &&
collection[index].content) {
root.appendChild(temp = createElement(collection[index].listType, { className: collection[index].class }));
prevList = createElement('li');
prevList.appendChild(pElement);
temp.appendChild(prevList);
temp.setAttribute('level', collection[index].nestedLevel.toString());
if (collection[index].class !== 'msolistparagraph') {
temp.style.marginLeft = collection[index].styleMarginLeft;
}
else {
addClass([temp], 'marginLeftIgnore');
}
temp.style.listStyleType = collection[index].listStyleTypeName;
}
else if (collection[index].nestedLevel === pLevel &&
lfo === collection[index].listFormatOverride) {
if (!isNOU(prevList) && !isNOU(prevList.parentElement)
&& prevList.parentElement.tagName.toLowerCase() === collection[index].listType) {
prevList.parentElement.appendChild(prevList = createElement('li'));
prevList.appendChild(pElement);
}
else if (isNOU(prevList)) {
temp = createElement(collection[index].listType);
temp.style.listStyleType = collection[index].listStyleTypeName;
prevList = createElement('li');
prevList.appendChild(pElement);
temp.appendChild(prevList);
temp.setAttribute('level', collection[index].nestedLevel.toString());
root.appendChild(temp);
}
else {
temp = createElement(collection[index].listType);
temp.style.listStyleType = collection[index].listStyleTypeName;
prevList.parentElement.parentElement.appendChild(temp);
prevList = createElement('li');
prevList.appendChild(pElement);
temp.appendChild(prevList);
temp.setAttribute('level', collection[index].nestedLevel.toString());
}
}
else if (collection[index].nestedLevel > pLevel) {
if (!isNOU(prevList)) {
for (var j = 0; j < collection[index].nestedLevel - pLevel; j++) {
prevList.appendChild(temp = createElement(collection[index].listType));
prevList = createElement('li');
if (j !== collection[index].nestedLevel - pLevel - 1 &&
collection[index].nestedLevel - pLevel > 1) {
prevList.style.listStyleType = 'none';
}
temp.appendChild(prevList);
}
prevList.appendChild(pElement);
temp.setAttribute('level', collection[index].nestedLevel.toString());
temp.style.listStyleType = collection[index].listStyleTypeName;
}
else {
if (collection[index].nestedLevel > pLevel && isNormalList) {
var initialNode = createElement(collection[index].listType);
prevList = createElement('li');
initialNode.appendChild(prevList);
initialNode.style.listStyleType = 'none';
for (var j = 0; j < collection[index].nestedLevel - 1; j++) {
prevList.appendChild(temp = createElement(collection[index].listType));
prevList = createElement('li');
temp.appendChild(prevList);
temp.style.listStyleType = 'none';
}
prevList.appendChild(pElement);
root.appendChild(initialNode);
temp.setAttribute('level', collection[index].nestedLevel.toString());
temp.style.listStyleType = collection[index].listStyleTypeName;
}
else {
root.appendChild(temp = createElement(collection[index].listType));
prevList = createElement('li');
prevList.appendChild(pElement);
temp.appendChild(prevList);
temp.setAttribute('level', collection[index].nestedLevel.toString());
if (collection[index].class !== 'msolistparagraph') {
temp.style.marginLeft = collection[index].styleMarginLeft;
}
else {
addClass([temp], 'marginLeftIgnore');
}
temp.style.listStyleType = collection[index].listStyleTypeName;
}
}
}
else if (collection[index].nestedLevel === 1) {
if (root.lastChild.tagName.toLowerCase() === collection[index].listType) {
temp = root.lastChild;
}
else {
root.appendChild(temp = createElement(collection[index].listType));
temp.style.listStyleType = collection[index].listStyleTypeName;
}
prevList = createElement('li');
prevList.appendChild(pElement);
temp.appendChild(prevList);
temp.setAttribute('level', collection[index].nestedLevel.toString());
}
else {
elem = prevList;
while (elem.parentElement) {
elem = elem.parentElement;
if (elem.attributes.getNamedItem('level')) {
if (parseInt(elem.attributes.getNamedItem('level').textContent, 10) === collection[index].nestedLevel &&
lfo === collection[index].listFormatOverride) {
prevList = createElement('li');
prevList.appendChild(pElement);
elem.appendChild(prevList);
break;
// eslint-disable-next-line
}