UNPKG

jodit

Version:

Jodit is awesome and usefully wysiwyg editor with filebrowser

110 lines (88 loc) 2.59 kB
/*! * 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, '') ); }