jodit
Version:
Jodit is awesome and usefully wysiwyg editor with filebrowser
110 lines (88 loc) • 2.59 kB
text/typescript
/*!
* Jodit Editor (https://xdsoft.net/jodit/)
* Released under MIT see LICENSE.txt in the project root for license information.
* Copyright (c) 2013-2020 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
*/
import { Dom } from '../../dom';
import { $$ } from '../selector';
import { trim } from '../string';
function normalizeCSS(s: string) {
return s
.replace(/mso-[a-z-]+:[\s]*[^;]+;/gi, '')
.replace(/mso-[a-z-]+:[\s]*[^";]+$/gi, '')
.replace(/border[a-z-]*:[\s]*[^;]+;/gi, '')
.replace(/([0-9.]+)(pt|cm)/gi, (match, units, metrics) => {
switch (metrics.toLowerCase()) {
case 'pt':
return (parseFloat(units) * 1.328).toFixed(0) + 'px';
case 'cm':
return (parseFloat(units) * 0.02645833).toFixed(0) + 'px';
}
return match;
});
}
export function applyStyles(html: string): string {
if (html.indexOf('<html ') === -1) {
return html;
}
html = html.substring(html.indexOf('<html '), html.length);
html = html.substring(0, html.lastIndexOf('</html>') + '</html>'.length);
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
document.body.appendChild(iframe);
let convertedString: string = '',
collection: HTMLElement[] = [],
rules: CSSStyleRule[] = [];
try {
const iframeDoc: Document | null =
iframe.contentDocument ||
(iframe.contentWindow ? iframe.contentWindow.document : null);
if (iframeDoc) {
iframeDoc.open();
iframeDoc.write(html);
iframeDoc.close();
if (iframeDoc.styleSheets.length) {
rules = (iframeDoc.styleSheets[
iframeDoc.styleSheets.length - 1
] as any).cssRules;
}
for (let idx = 0; idx < rules.length; idx += 1) {
if (rules[idx].selectorText === '') {
continue;
}
collection = $$(rules[idx].selectorText, iframeDoc.body);
collection.forEach((elm: HTMLElement) => {
elm.style.cssText = normalizeCSS(
rules[idx].style.cssText + ';' + elm.style.cssText
);
});
}
Dom.each(iframeDoc.body, node => {
if (Dom.isElement(node)) {
const elm = node as HTMLElement;
const css = elm.style.cssText;
if (css) {
elm.style.cssText = normalizeCSS(css);
}
if (elm.hasAttribute('lang')) {
elm.removeAttribute('lang');
}
}
});
convertedString = iframeDoc.firstChild
? trim(iframeDoc.body.innerHTML)
: '';
}
} catch {
} finally {
Dom.safeRemove(iframe);
}
if (convertedString) {
html = convertedString;
}
return trim(
html
.replace(/<(\/)?(html|colgroup|col|o:p)[^>]*>/g, '')
.replace(/<!--[^>]*>/g, '')
);
}