mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-16 16:16:40 +03:00
562a2d567b
This enables the eslint rule requiring jsdocs on all class
declarations, function declarations, and methods.
Unfortunately, there are two problems with this:
1. We don't use class _declarations_, we use class _expressions_,
which are not covered by this rule. So it does not enforce jsdoc at
the class level.
2. We tend to document a class at the class-level, rather than at the
constructor. But a constructor counts as a method for eslint, so it
requires docs on the constructor. There is no way to configure it to
make an exception for trivial constructors.
So for all trivial (no-argument) constructors, we add empty jsdocs:
/** */
constructor() {
This was quicker and easier than setting up some alternative plugin in
eslint to make an exception for us.
The good news is that this rule caught several undocumented parameters
and places where the jsdoc comment was malformed. So fixing those
also improves the compiler's ability to enforce types.
Change-Id: Icbc46ed690c94e53d354648a883119524f8fca45
519 lines
9.2 KiB
JavaScript
519 lines
9.2 KiB
JavaScript
/*! @license
|
|
* Shaka Player
|
|
* Copyright 2016 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
goog.provide('shaka.text.Cue');
|
|
goog.provide('shaka.text.CueRegion');
|
|
|
|
goog.require('shaka.util.ArrayUtils');
|
|
|
|
|
|
/**
|
|
* @implements {shaka.extern.Cue}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue = class {
|
|
/**
|
|
* @param {number} startTime
|
|
* @param {number} endTime
|
|
* @param {string} payload
|
|
*/
|
|
constructor(startTime, endTime, payload) {
|
|
const Cue = shaka.text.Cue;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.startTime = startTime;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.direction = Cue.direction.HORIZONTAL_LEFT_TO_RIGHT;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.endTime = endTime;
|
|
|
|
// The explicit type here is to work around an apparent compiler bug where
|
|
// the compiler seems to get confused about the type. Since we are
|
|
// overriding the interface type, it shouldn't be necessary to do this.
|
|
// Compiler version 20200517.
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
* @type {string}
|
|
*/
|
|
this.payload = payload;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.region = new shaka.text.CueRegion();
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.position = null;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.positionAlign = Cue.positionAlign.AUTO;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.size = 0;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.textAlign = Cue.textAlign.CENTER;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.writingMode = Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.lineInterpretation = Cue.lineInterpretation.LINE_NUMBER;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.line = null;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.lineHeight = '';
|
|
|
|
/**
|
|
* Line Alignment is set to start by default.
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.lineAlign = Cue.lineAlign.START;
|
|
|
|
/**
|
|
* Set the captions at the bottom of the text container by default.
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.displayAlign = Cue.displayAlign.AFTER;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.color = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.backgroundColor = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.backgroundImage = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.border = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.fontSize = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.fontWeight = Cue.fontWeight.NORMAL;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.fontStyle = Cue.fontStyle.NORMAL;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.fontFamily = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.letterSpacing = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.linePadding = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.opacity = 1;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.textDecoration = [];
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.wrapLine = true;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.id = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.nestedCues = [];
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.lineBreak = false;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.spacer = false;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.cellResolution = {
|
|
columns: 32,
|
|
rows: 15,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Create a copy of the cue with the same properties.
|
|
* @return {!shaka.text.Cue}
|
|
* @suppress {checkTypes} since we must use [] and "in" with a struct type.
|
|
*/
|
|
clone() {
|
|
const clone = new shaka.text.Cue(0, 0, '');
|
|
|
|
for (const k in this) {
|
|
clone[k] = this[k];
|
|
|
|
// Make copies of array fields, but only one level deep. That way, if we
|
|
// change, for instance, textDecoration on the clone, we don't affect the
|
|
// original.
|
|
if (clone[k] && clone[k].constructor == Array) {
|
|
clone[k] = /** @type {!Array} */(clone[k]).slice();
|
|
}
|
|
}
|
|
|
|
return clone;
|
|
}
|
|
|
|
/**
|
|
* Check if two Cues have all the same values in all properties.
|
|
* @param {!shaka.text.Cue} cue1
|
|
* @param {!shaka.text.Cue} cue2
|
|
* @return {boolean}
|
|
* @suppress {checkTypes} since we must use [] and "in" with a struct type.
|
|
*/
|
|
static equal(cue1, cue2) {
|
|
// Compare the start time, end time and payload of the cues first for
|
|
// performance optimization. We can avoid the more expensive recursive
|
|
// checks if the top-level properties don't match.
|
|
// See: https://github.com/google/shaka-player/issues/3018
|
|
if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
|
|
cue1.payload != cue2.payload) {
|
|
return false;
|
|
}
|
|
for (const k in cue1) {
|
|
if (k == 'startTime' || k == 'endTime' || k == 'payload') {
|
|
// Already compared.
|
|
} else if (k == 'nestedCues') {
|
|
// This uses shaka.text.Cue.equal rather than just this.equal, since
|
|
// otherwise recursing here will unbox the method and cause "this" to be
|
|
// undefined in deeper recursion.
|
|
if (!shaka.util.ArrayUtils.equal(
|
|
cue1.nestedCues, cue2.nestedCues, shaka.text.Cue.equal)) {
|
|
return false;
|
|
}
|
|
} else if (k == 'region' || k == 'cellResolution') {
|
|
for (const k2 in cue1[k]) {
|
|
if (cue1[k][k2] != cue2[k][k2]) {
|
|
return false;
|
|
}
|
|
}
|
|
} else if (Array.isArray(cue1[k])) {
|
|
if (!shaka.util.ArrayUtils.equal(cue1[k], cue2[k])) {
|
|
return false;
|
|
}
|
|
} else {
|
|
if (cue1[k] != cue2[k]) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.positionAlign = {
|
|
'LEFT': 'line-left',
|
|
'RIGHT': 'line-right',
|
|
'CENTER': 'center',
|
|
'AUTO': 'auto',
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.textAlign = {
|
|
'LEFT': 'left',
|
|
'RIGHT': 'right',
|
|
'CENTER': 'center',
|
|
'START': 'start',
|
|
'END': 'end',
|
|
};
|
|
|
|
|
|
/**
|
|
* Vertical alignments of the cues within their extents.
|
|
* 'BEFORE' means displaying at the top of the captions container box, 'CENTER'
|
|
* means in the middle, 'AFTER' means at the bottom.
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.displayAlign = {
|
|
'BEFORE': 'before',
|
|
'CENTER': 'center',
|
|
'AFTER': 'after',
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.direction = {
|
|
'HORIZONTAL_LEFT_TO_RIGHT': 'ltr',
|
|
'HORIZONTAL_RIGHT_TO_LEFT': 'rtl',
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.writingMode = {
|
|
'HORIZONTAL_TOP_TO_BOTTOM': 'horizontal-tb',
|
|
'VERTICAL_LEFT_TO_RIGHT': 'vertical-lr',
|
|
'VERTICAL_RIGHT_TO_LEFT': 'vertical-rl',
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {number}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.lineInterpretation = {
|
|
'LINE_NUMBER': 0,
|
|
'PERCENTAGE': 1,
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.lineAlign = {
|
|
'CENTER': 'center',
|
|
'START': 'start',
|
|
'END': 'end',
|
|
};
|
|
|
|
|
|
/**
|
|
* In CSS font weight can be a number, where 400 is normal and 700 is bold.
|
|
* Use these values for the enum for consistency.
|
|
* @enum {number}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.fontWeight = {
|
|
'NORMAL': 400,
|
|
'BOLD': 700,
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.fontStyle = {
|
|
'NORMAL': 'normal',
|
|
'ITALIC': 'italic',
|
|
'OBLIQUE': 'oblique',
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.Cue.textDecoration = {
|
|
'UNDERLINE': 'underline',
|
|
'LINE_THROUGH': 'lineThrough',
|
|
'OVERLINE': 'overline',
|
|
};
|
|
|
|
|
|
/**
|
|
* @implements {shaka.extern.CueRegion}
|
|
* @struct
|
|
* @export
|
|
*/
|
|
shaka.text.CueRegion = class {
|
|
/** */
|
|
constructor() {
|
|
const CueRegion = shaka.text.CueRegion;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.id = '';
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.viewportAnchorX = 0;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.viewportAnchorY = 0;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.regionAnchorX = 0;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.regionAnchorY = 0;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.width = 100;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.height = 100;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.heightUnits = CueRegion.units.PERCENTAGE;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.widthUnits = CueRegion.units.PERCENTAGE;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.viewportAnchorUnits = CueRegion.units.PERCENTAGE;
|
|
|
|
/**
|
|
* @override
|
|
* @exportInterface
|
|
*/
|
|
this.scroll = CueRegion.scrollMode.NONE;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {number}
|
|
* @export
|
|
*/
|
|
shaka.text.CueRegion.units = {
|
|
'PX': 0,
|
|
'PERCENTAGE': 1,
|
|
'LINES': 2,
|
|
};
|
|
|
|
|
|
/**
|
|
* @enum {string}
|
|
* @export
|
|
*/
|
|
shaka.text.CueRegion.scrollMode = {
|
|
'NONE': '',
|
|
'UP': 'up',
|
|
};
|