UNPKG

rx-player

Version:
98 lines (85 loc) 3.3 kB
/** * Copyright 2015 CANAL+ Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import isNonEmptyString from "../../../../utils/is_non_empty_string"; import type { IStyleElements } from "../parse_style_block"; import convertPayloadToHTML from "./convert_payload_to_html"; import createStyleAttribute from "./create_style_attribute"; export interface IVTTHTMLCue { start: number; end: number; element: HTMLElement; } /** * Parse cue block into an object with the following properties: * - start {number}: start time at which the cue should be displayed * - end {number}: end time at which the cue should be displayed * - element {HTMLElement}: the cue text, translated into an HTMLElement * * Returns undefined if the cue block could not be parsed. * @param {Object} cueObj * @param {Number} cueObj.start * @param {Number} cueObj.end * @param {Object} cueObj.settings; * @param {string|undefined} cueObj.header * @param {Array.<string>} cueObj.payload * @param {Object} styling * @param {Object} styling.classes * @param {string|undefined} styling.global * @returns {Object|undefined} */ export default function toHTML( cueObj: { start: number; end: number; settings: Partial<Record<string, string>>; header?: string | undefined; payload: string[]; }, styling: { classes: IStyleElements; global?: string | undefined }, ): IVTTHTMLCue { const { start, end, settings, header, payload } = cueObj; const region = document.createElement("div"); const regionAttr = document.createAttribute("style"); regionAttr.value = "width:100%;" + "height:100%;" + "display:flex;" + "flex-direction:column;" + "justify-content:flex-end;" + "align-items:center;"; region.setAttributeNode(regionAttr); // Get content, format and apply style. const pElement = document.createElement("p"); const pAttr = createStyleAttribute(settings); pElement.setAttributeNode(pAttr); const spanElement = document.createElement("span"); const attr = document.createAttribute("style"); // set color and background-color default values, as indicated in: // https://www.w3.org/TR/webvtt1/#applying-css-properties attr.value = "background-color:rgba(0,0,0,0.8);" + "color:white;"; spanElement.setAttributeNode(attr); const { global, classes } = styling; const localStyle = isNonEmptyString(header) ? classes[header] : undefined; const styles = [global, localStyle].filter((s) => s !== undefined).join(""); attr.value += styles; spanElement.setAttributeNode(attr); convertPayloadToHTML(payload.join("\n"), classes).forEach((element) => { spanElement.appendChild(element); }); region.appendChild(pElement); pElement.appendChild(spanElement); return { start, end, element: region }; }