diff --git a/site/scripts/build-ejected-skins.ts b/site/scripts/build-ejected-skins.ts index f964335e..6ee1a38d 100644 --- a/site/scripts/build-ejected-skins.ts +++ b/site/scripts/build-ejected-skins.ts @@ -23,6 +23,7 @@ const PACKAGE_MANIFEST_CACHE = new Map(); const PREFIX = '\x1b[35m[ejected-skins]\x1b[0m'; const HTML_CDN_BASE = 'https://cdn.jsdelivr.net/npm/@videojs/html/cdn'; +const DEMO_VIDEO_SRC = 'https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4'; const log = { info: (...args: unknown[]) => console.log(PREFIX, ...args), warn: (...args: unknown[]) => console.warn(PREFIX, '\x1b[33mwarn:\x1b[0m', ...args), @@ -64,6 +65,11 @@ interface ReactSkinDef { } type SkinDef = HtmlSkinDef | ReactSkinDef; +type MediaType = 'video' | 'audio'; + +function getSkinMediaType(skin: SkinDef): MediaType { + return skin.id.includes('audio') ? 'audio' : 'video'; +} interface EjectedSkinEntry { id: string; @@ -748,8 +754,14 @@ function getHtmlSkinCdnFileName(skin: HtmlSkinDef): string { function prependHtmlSkinScripts(html: string, skin: HtmlSkinDef): string { const cdnFileName = getHtmlSkinCdnFileName(skin); const scriptTag = ``; + const cssLink = ``; + const playerTag = getSkinMediaType(skin) === 'audio' ? 'audio-player' : 'video-player'; + const indented = html + .split('\n') + .map((l) => (l.length > 0 ? ` ${l}` : l)) + .join('\n'); - return `${scriptTag}\n\n${html}`; + return `${scriptTag}\n${cssLink}\n\n<${playerTag}>\n${indented}\n`; } // --------------------------------------------------------------------------- @@ -828,14 +840,37 @@ function evaluateTemplate(templateBody: string, context: Record const fn = new Function(...keys, `return \`${templateBody}\`;`); const html = fn(...values) as string; - // Clean up whitespace: normalize indentation and trim - return html - .split('\n') - .map((line) => line.trimEnd()) + // Clean up whitespace: dedent, trim trailing spaces, and trim outer edges. + const lines = html.split('\n').map((line) => line.trimEnd()); + const minIndent = lines + .filter((l) => l.length > 0) + .reduce((min, l) => Math.min(min, l.length - l.trimStart().length), Infinity); + + return lines + .map((l) => (l.length > 0 ? l.slice(minIndent) : l)) .join('\n') .trim(); } +/** + * Replace `` and `` (default slot) with a concrete + * `