/** * HtmlToData.js * * Released under LGPL License. * Copyright (c) 1999-2017 Ephox Corp. All rights reserved * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ import Tools from 'tinymce/core/api/util/Tools'; import SaxParser from 'tinymce/core/api/html/SaxParser'; import DOMUtils from 'tinymce/core/api/dom/DOMUtils'; import VideoScript from './VideoScript'; import Size from './Size'; const DOM = DOMUtils.DOM; const getEphoxEmbedIri = function (elm) { return DOM.getAttrib(elm, 'data-ephox-embed-iri'); }; const isEphoxEmbed = function (html) { const fragment = DOM.createFragment(html); return getEphoxEmbedIri(fragment.firstChild) !== ''; }; const htmlToDataSax = function (prefixes, html) { let data: any = {}; SaxParser({ validate: false, allow_conditional_comments: true, special: 'script,noscript', start (name, attrs) { if (!data.source1 && name === 'param') { data.source1 = attrs.map.movie; } if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') { if (!data.type) { data.type = name; } data = Tools.extend(attrs.map, data); } if (name === 'script') { const videoScript = VideoScript.getVideoScriptMatch(prefixes, attrs.map.src); if (!videoScript) { return; } data = { type: 'script', source1: attrs.map.src, width: videoScript.width, height: videoScript.height }; } if (name === 'source') { if (!data.source1) { data.source1 = attrs.map.src; } else if (!data.source2) { data.source2 = attrs.map.src; } } if (name === 'img' && !data.poster) { data.poster = attrs.map.src; } } }).parse(html); data.source1 = data.source1 || data.src || data.data; data.source2 = data.source2 || ''; data.poster = data.poster || ''; return data; }; const ephoxEmbedHtmlToData = function (html) { const fragment = DOM.createFragment(html); const div = fragment.firstChild; return { type: 'ephox-embed-iri', source1: getEphoxEmbedIri(div), source2: '', poster: '', width: Size.getMaxWidth(div), height: Size.getMaxHeight(div) }; }; const htmlToData = function (prefixes, html) { return isEphoxEmbed(html) ? ephoxEmbedHtmlToData(html) : htmlToDataSax(prefixes, html); }; export default { htmlToData };