import Editor from 'tinymce/core/api/Editor'; import Tools from 'tinymce/core/api/util/Tools'; import * as Options from '../api/Options'; import * as HtmlToData from './HtmlToData'; import * as Mime from './Mime'; import { MediaData } from './Types'; import * as UpdateHtml from './UpdateHtml'; import * as UrlPatterns from './UrlPatterns'; export type DataToHtmlCallback = (data: MediaData) => string; const getIframeHtml = (data: MediaData, iframeTemplateCallback: DataToHtmlCallback | undefined): string => { if (iframeTemplateCallback) { return iframeTemplateCallback(data); } else { const allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : ''; return ''; } }; const getFlashHtml = (data: MediaData): string => { let html = ''; if (data.poster) { html += ''; } html += ''; return html; }; const getAudioHtml = (data: MediaData, audioTemplateCallback: DataToHtmlCallback | undefined): string => { if (audioTemplateCallback) { return audioTemplateCallback(data); } else { return ( '' ); } }; const getVideoHtml = (data: MediaData, videoTemplateCallback: DataToHtmlCallback | undefined): string => { if (videoTemplateCallback) { return videoTemplateCallback(data); } else { return ( '' ); } }; const getScriptHtml = (data: MediaData): string => { return ''; }; const dataToHtml = (editor: Editor, dataIn: MediaData): string => { const data: MediaData = Tools.extend({}, dataIn); if (!data.source) { Tools.extend(data, HtmlToData.htmlToData(data.embed ?? '', editor.schema)); if (!data.source) { return ''; } } if (!data.altsource) { data.altsource = ''; } if (!data.poster) { data.poster = ''; } data.source = editor.convertURL(data.source, 'source'); data.altsource = editor.convertURL(data.altsource, 'source'); data.sourcemime = Mime.guess(data.source); data.altsourcemime = Mime.guess(data.altsource); data.poster = editor.convertURL(data.poster, 'poster'); const pattern = UrlPatterns.matchPattern(data.source); if (pattern) { data.source = pattern.url; data.type = pattern.type; data.allowfullscreen = pattern.allowFullscreen; data.width = data.width || String(pattern.w); data.height = data.height || String(pattern.h); } if (data.embed) { return UpdateHtml.updateHtml(data.embed, data, true, editor.schema); } else { const audioTemplateCallback = Options.getAudioTemplateCallback(editor); const videoTemplateCallback = Options.getVideoTemplateCallback(editor); const iframeTemplateCallback = Options.getIframeTemplateCallback(editor); data.width = data.width || '300'; data.height = data.height || '150'; Tools.each(data, (value, key) => { (data as Record)[key] = editor.dom.encode('' + value); }); if (data.type === 'iframe') { return getIframeHtml(data, iframeTemplateCallback); } else if (data.sourcemime === 'application/x-shockwave-flash') { return getFlashHtml(data); } else if (data.sourcemime.indexOf('audio') !== -1) { return getAudioHtml(data, audioTemplateCallback); } else if (data.type === 'script') { return getScriptHtml(data); } else { return getVideoHtml(data, videoTemplateCallback); } } }; export { dataToHtml };