@js-toolkit/web-utils 1.53.0 → 1.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/getBrowserLanguage.d.ts +4 -1
- package/getBrowserLanguage.js +1 -1
- package/iframe/getAutoConnector.d.ts +7 -1
- package/iframe/getAutoConnector.js +1 -1
- package/iframe/utils.d.ts +1 -0
- package/iframe/utils.js +1 -1
- package/media/TextTracksController/TextTracksController.d.ts +2 -0
- package/media/TextTracksController/TextTracksController.js +1 -1
- package/media/TextTracksController/utils.d.ts +1 -1
- package/media/TextTracksController/utils.js +1 -1
- package/media/parseCueText.d.ts +8 -4
- package/media/parseCueText.js +1 -1
- package/package.json +20 -14
- package/platform/getPlatformInfo.d.ts +0 -1
- package/serviceWorker/utils.d.ts +0 -1
- package/viewableTracker.d.ts +12 -0
- package/viewableTracker.js +1 -0
package/getBrowserLanguage.d.ts
CHANGED
package/getBrowserLanguage.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getBrowserLanguage(){
|
|
1
|
+
export function getBrowserLanguage(a=!1){const g=navigator.languages&&navigator.languages.length>0?navigator.languages[0]:navigator.language||navigator.userLanguage;return a?g:g.split("-")[0]}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { type MessagesTypes } from './messages';
|
|
2
2
|
import { type Target } from './utils';
|
|
3
3
|
export { getClientMessages, getHostMessages } from './messages';
|
|
4
|
+
interface StartOptions {
|
|
5
|
+
readonly append?: boolean;
|
|
6
|
+
}
|
|
4
7
|
interface AutoConnector {
|
|
5
8
|
/** If function passed the connector waits until DOM ready. */
|
|
6
|
-
readonly start: (targets: ArrayLike<Target> | (() => ArrayLike<Target>)) => void;
|
|
9
|
+
readonly start: (targets: ArrayLike<Target> | (() => ArrayLike<Target>), options?: StartOptions) => void;
|
|
10
|
+
/** Stops a receiving new connections. */
|
|
7
11
|
readonly stop: VoidFunction;
|
|
12
|
+
readonly isStarted: () => boolean;
|
|
13
|
+
readonly close: (targets: ArrayLike<Target>) => void;
|
|
8
14
|
readonly destroy: VoidFunction;
|
|
9
15
|
}
|
|
10
16
|
interface TargetInfo {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{isPingMessage,isTargetReadyMessage}from"./messages";import{
|
|
1
|
+
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{isPingMessage,isTargetReadyMessage}from"./messages";import{isWindowProxy,readTargets}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export{getClientMessages,getHostMessages}from"./messages";export function getAutoConnector({id:e,label:t,strictTargets:o=!0,messagesTypes:s,channel:n,logger:i=console,onSendData:a,onConnect:r}){const d=e||uuid(),g=t||d,u=new Map,l="open"===n?new Map:void 0;let c,f;const p=(e,t,o,s,n)=>{if(window!==t)if(isWindowProxy(t)){t.postMessage(e,o,n);const a=t===window.parent?"iframe parent":"iframe";i.debug(`${g}: Post message to ${a} (uid=${s},self.uid=${d},origin=${o}):`,e)}else t.postMessage(e,n&&{transfer:n}),i.debug(`${g}: Post message to MessageEventSource (uid=${s},self.uid=${d}):`,e)},v=(e,t,o)=>{p({uid:d,type:s.Ping},e,t,o)},m=e=>{var t,f,m,w;if(!e.source||e.source===window)return;if(!isPingMessage(e.data,s)&&!isTargetReadyMessage(e.data,s))return;if(e.data.uid===d)return;const h=e.source,M=e.data.uid;if(i.debug(`${g}: Receive message from iframe (uid=${M},self.uid=${d},origin=${e.origin}):`,e.data),o&&c&&!c.has(h))return void i.warn(`${g}: Could not find target (uid=${M},self.uid=${d}) by message.source.`);const y=getOriginFromMessage(e);if(isPingMessage(e.data,s)&&!(null===(t=u.get(M))||void 0===t?void 0:t.Ping))return u.set(M,Object.assign(Object.assign({},u.get(M)),{Ping:!0})),void v(h,y,M);let $=!1;if((null===(f=u.get(M))||void 0===f?void 0:f.Ping)&&!(null===(m=u.get(M))||void 0===m?void 0:m.SelfReady)){u.set(M,Object.assign(Object.assign({},u.get(M)),{SelfReady:!0}));const e={target:h,origin:y},t=l?(()=>{var t,o;const s=null!==(o=null===(t=l.get(M))||void 0===t?void 0:t[0])&&void 0!==o?o:new MessageChannel;return l.set(M,[s,e]),s.port2})():void 0;((e,t,o,n,i)=>{p({uid:d,type:s.SelfReady,data:e},t,o,n,i?[i]:void 0)})(a?a(e):void 0,h,y,M,t),$=!1}if(isTargetReadyMessage(e.data,s)&&(null===(w=u.get(M))||void 0===w?void 0:w.SelfReady)){u.delete(M),null==c||c.delete(h);const t=(()=>{var t;if("open"===n){const e=null===(t=null==l?void 0:l.get(M))||void 0===t?void 0:t[0].port1;if(!e)throw new Error("Something went wrong: MessageChannel is not created despite the fact that the `channel` option is `open`.");return e}if("use"===n){const t=e.ports[0];if(!t)throw new Error("MessagePort is not received despite the fact that the `channel` option is `use`. The `channel` option of connector on another side must be equals `open`.");return t}})(),{data:o}=e.data,s=()=>{i.debug(`${g}: Connection established (self.uid=${d} + uid=${M}).`),r({data:o,target:h,origin:y},t)};$?setTimeout(s,0):s()}},w=()=>{f&&(f(),f=void 0)};return{start:(e,t={})=>{if(f&&!t.append)return void i.warn(`${g}: Already started. You should first call \`stop\`.`);if(t.append){const e=c;w(),c=e}const o=()=>{const o=(()=>{const t="function"==typeof e?e():e;return t.length>0?t:void 0})(),s=o&&readTargets(o);if(!s)return;const n=new Set(s);t.append?(c||(c=new Set),n.forEach((e=>c.add(e)))):c=n,window.addEventListener("message",m);(t.append?n:c).forEach((e=>{e!==window&&v(e,"*","")}))},s="function"==typeof e?onDOMReady(o):o();f=()=>{s&&s(),window.removeEventListener("message",m),c=void 0}},stop:w,isStarted:()=>!!f,close:e=>{const t=e instanceof Set?e:new Set(readTargets(e));if(0!==t.size&&(l&&l.forEach((([e,o],s)=>{t.has(o.target)&&(e.port1.close(),e.port2.close(),l.delete(s))})),c)){const e=c;t.forEach((t=>e.delete(t)))}},destroy:()=>{w(),u.clear(),l&&(l.forEach((([e])=>{e.port1.close(),e.port2.close()})),l.clear())}}}
|
package/iframe/utils.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export type Target = HTMLIFrameElement | Window;
|
|
|
2
2
|
export declare function selectFrames(): HTMLCollectionOf<HTMLIFrameElement>;
|
|
3
3
|
export declare function findTarget<T extends Target>(source: Window, targets: ArrayLike<T>): T | undefined;
|
|
4
4
|
export declare function isWindowProxy(target: MessageEventSource): target is Window;
|
|
5
|
+
export declare function readTargets(list: ArrayLike<Target>): Window[];
|
package/iframe/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function selectFrames(){return document.getElementsByTagName("iframe")}export function findTarget(e,n){for(let t=0;t<n.length;t+=1){const o=n[t];if((o instanceof HTMLIFrameElement?o.contentWindow:o)===e)return o}}export function isWindowProxy(e){return!(void 0!==window.MessagePort&&e instanceof MessagePort||void 0!==window.ServiceWorker&&e instanceof ServiceWorker)}
|
|
1
|
+
export function selectFrames(){return document.getElementsByTagName("iframe")}export function findTarget(e,n){for(let t=0;t<n.length;t+=1){const o=n[t];if((o instanceof HTMLIFrameElement?o.contentWindow:o)===e)return o}}export function isWindowProxy(e){return!(void 0!==window.MessagePort&&e instanceof MessagePort||void 0!==window.ServiceWorker&&e instanceof ServiceWorker)}export function readTargets(e){const n=new Array;for(let t=0;t<e.length;t+=1){const o=e[t],r=o instanceof HTMLIFrameElement?o.contentWindow:o;r&&n.push(r)}return n}
|
|
@@ -39,6 +39,8 @@ export declare namespace TextTracksController {
|
|
|
39
39
|
readonly emitNativeEvents?: boolean | undefined;
|
|
40
40
|
/** Default `true`. */
|
|
41
41
|
readonly hideActiveTrack?: boolean | undefined;
|
|
42
|
+
/** */
|
|
43
|
+
readonly preferCueRowLength?: number | undefined;
|
|
42
44
|
}
|
|
43
45
|
enum Events {
|
|
44
46
|
TextTrackListChanged = "TrackListChanged",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,i){t.dispatchEvent(new CustomEvent(e,{detail:i}))}export class TextTracksController extends EventEmitter{get Events(){return TextTracksController.Events}constructor(t){var e,i;super(),this.eventListeners=new EventListeners,this.addedTracks=[],this.textTrackList=[],this.options=Object.assign(Object.assign({},t),{emitNativeEvents:null===(e=null==t?void 0:t.emitNativeEvents)||void 0===e||e,hideActiveTrack:null===(i=null==t?void 0:t.hideActiveTrack)||void 0===i||i})}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach(),this.media=t;const{textTracks:e}=t;let i=!1;const s=(()=>{const e=[];return i=>{var s;const{activeCues:n}=i.target;if(!n)return;let a=e.length!==n.length;const r=new Array(n.length);for(let t=0;t<r.length;t+=1){const i=n[t];i.id=i.id||buildCueId(i,t),r[t]=i,r[t].rows=splitRows(i.text),a||(null===(s=e[t])||void 0===s?void 0:s.id)===i.id||(a=!0),e[t]=i}e.length>r.length&&e.splice(r.length-e.length),a&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:i.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:i.target,cues:r}))}})(),n=()=>{var e;this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,null!==(e=this.textTrack)&&void 0!==e?e:this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(t))},a=t=>{i||n(),this.eventListeners.scope(t).on("cuechange",s)},r=t=>{n(),this.eventListeners.scope(t).off("cuechange",s)};if(this.eventListeners.scope(e).on("change",(()=>{var e,i,s;const{textTracks:n}=t,{nextTextTrack:a}=this;let r=-1;for(let e=0;e<n.length;e+=1){const i=n[e];if(i.language===(null==a?void 0:a.language)&&i.kind===(null==a?void 0:a.kind)||isIOSFullscreen(t)||(i.mode="disabled"),"disabled"!==i.mode&&r>=0&&(i.mode="disabled"),"disabled"!==i.mode){if(r=e,!i.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";i.mode!==t&&(i.mode=t)}i.native&&i.language===(null==a?void 0:a.language)&&i.kind===a.kind&&(i.mode="showing")}}const c=n[r]&&(null!==(e=this.textTrackList[r])&&void 0!==e?e:{id:n[r].id,kind:n[r].kind,language:n[r].language,label:n[r].label});(null===(i=this.textTrack)||void 0===i?void 0:i.language)===(null==c?void 0:c.language)&&(null===(s=this.textTrack)||void 0===s?void 0:s.kind)===(null==c?void 0:c.kind)||(this.textTrack=c,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:r}))})).on("addtrack",(({track:t})=>t&&a(t))).on("removetrack",(({track:t})=>t&&r(t))),e.length>0){i=!0;try{Array.prototype.forEach.call(e,a),n()}finally{i=!1}}}setTextTracks(t){const e=this.getMediaElement();if(this.eventListeners.scope(e,"@@setTextTracks").removeAllListeners(),this.addedTracks.forEach((t=>t.remove())),0===t.length)return;const i=()=>{addTextTracks(e,t,(t=>this.addedTracks.push(t)))};e.readyState>=e.HAVE_CURRENT_DATA?i():this.eventListeners.scope(e,"@@setTextTracks").once("loadeddata",i)}getActiveTextTrack(){return this.textTrack}setActiveTextTrack(t){const e=this.getMediaElement();this.nextTextTrack=t&&this.textTrackList.find((e=>e.language===t.language&&(!t.kind||e.kind===t.kind))),setActiveTextTrack(e,this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(e))}destroy(){this.detach(),this.removeAllListeners()}}!function(t){let e;!function(t){t.TextTrackListChanged="TrackListChanged",t.CurrentTextTrackChanged="CurrentTextTrackChanged",t.TextTrackCueChanged="TextTrackCueChanged"}(e=t.Events||(t.Events={}))}(TextTracksController||(TextTracksController={}));
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,i){t.dispatchEvent(new CustomEvent(e,{detail:i}))}export class TextTracksController extends EventEmitter{get Events(){return TextTracksController.Events}constructor(t){var e,i,s;super(),this.eventListeners=new EventListeners,this.addedTracks=[],this.textTrackList=[],this.options=Object.assign(Object.assign({},t),{emitNativeEvents:null===(e=null==t?void 0:t.emitNativeEvents)||void 0===e||e,hideActiveTrack:null===(i=null==t?void 0:t.hideActiveTrack)||void 0===i||i,preferCueRowLength:null!==(s=null==t?void 0:t.preferCueRowLength)&&void 0!==s?s:0})}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach(),this.media=t;const{textTracks:e}=t;let i=!1;const s=(()=>{const e=[];return i=>{var s;const{activeCues:n}=i.target;if(!n)return;let a=e.length!==n.length;const r=new Array(n.length);for(let t=0;t<r.length;t+=1){const i=n[t];i.id=i.id||buildCueId(i,t),r[t]=i,r[t].rows=splitRows(i.text,this.options.preferCueRowLength),a||(null===(s=e[t])||void 0===s?void 0:s.id)===i.id||(a=!0),e[t]=i}e.length>r.length&&e.splice(r.length-e.length),a&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:i.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:i.target,cues:r}))}})(),n=()=>{var e;this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,null!==(e=this.textTrack)&&void 0!==e?e:this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(t))},a=t=>{i||n(),this.eventListeners.scope(t).on("cuechange",s)},r=t=>{n(),this.eventListeners.scope(t).off("cuechange",s)};if(this.eventListeners.scope(e).on("change",(()=>{var e,i,s;const{textTracks:n}=t,{nextTextTrack:a}=this;let r=-1;for(let e=0;e<n.length;e+=1){const i=n[e];if(i.language===(null==a?void 0:a.language)&&i.kind===(null==a?void 0:a.kind)||isIOSFullscreen(t)||(i.mode="disabled"),"disabled"!==i.mode&&r>=0&&(i.mode="disabled"),"disabled"!==i.mode){if(r=e,!i.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";i.mode!==t&&(i.mode=t)}i.native&&i.language===(null==a?void 0:a.language)&&i.kind===a.kind&&(i.mode="showing")}}const c=n[r]&&(null!==(e=this.textTrackList[r])&&void 0!==e?e:{id:n[r].id,kind:n[r].kind,language:n[r].language,label:n[r].label});(null===(i=this.textTrack)||void 0===i?void 0:i.language)===(null==c?void 0:c.language)&&(null===(s=this.textTrack)||void 0===s?void 0:s.kind)===(null==c?void 0:c.kind)||(this.textTrack=c,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:r}))})).on("addtrack",(({track:t})=>t&&a(t))).on("removetrack",(({track:t})=>t&&r(t))),e.length>0){i=!0;try{Array.prototype.forEach.call(e,a),n()}finally{i=!1}}}setTextTracks(t){const e=this.getMediaElement();if(this.eventListeners.scope(e,"@@setTextTracks").removeAllListeners(),this.addedTracks.forEach((t=>t.remove())),0===t.length)return;const i=()=>{addTextTracks(e,t,(t=>this.addedTracks.push(t)))};e.readyState>=e.HAVE_CURRENT_DATA?i():this.eventListeners.scope(e,"@@setTextTracks").once("loadeddata",i)}getActiveTextTrack(){return this.textTrack}setActiveTextTrack(t){const e=this.getMediaElement();this.nextTextTrack=t&&this.textTrackList.find((e=>e.language===t.language&&(!t.kind||e.kind===t.kind))),setActiveTextTrack(e,this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(e))}destroy(){this.detach(),this.removeAllListeners()}}!function(t){let e;!function(t){t.TextTrackListChanged="TrackListChanged",t.CurrentTextTrackChanged="CurrentTextTrackChanged",t.TextTrackCueChanged="TextTrackCueChanged"}(e=t.Events||(t.Events={}))}(TextTracksController||(TextTracksController={}));
|
|
@@ -16,4 +16,4 @@ export declare function setActiveTextTrack(media: HTMLMediaElement, tt: Activate
|
|
|
16
16
|
/** Dynamically add text tracks */
|
|
17
17
|
export declare function addTextTracks(media: HTMLMediaElement, textTrackList: readonly TextTrackItem[], onAdd: (el: HTMLTrackElement) => void): void;
|
|
18
18
|
export declare function buildCueId(cue: Pick<TextTrackCue, 'startTime'>, index: number): string;
|
|
19
|
-
export declare function splitRows(text: string): string[];
|
|
19
|
+
export declare function splitRows(text: string, preferLineLength: number): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(
|
|
1
|
+
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(t){[].forEach.call(t.textTracks,(t=>{const e=t;e.customGroupId&&(e.customGroupId="__detached__")}))}export function parseTextTracks(t){return 0===t.textTracks.length?[]:Array.prototype.filter.call(t.textTracks,(t=>"__detached__"!==t.customGroupId&&!!t.language)).map((({id:t,kind:e,language:n,label:l})=>({id:t,kind:e,language:n,label:null!=l?l:""})))}export function isIOSFullscreen(t){return isIOS()&&!!t.webkitDisplayingFullscreen}export function setActiveTextTrack(t,e,n){const{textTracks:l}=t;if(0===l.length)return;let r=!1;for(let t=0;t<l.length;t+=1){const a=l[t];if(r||a.language!==(null==e?void 0:e.language)||e.kind&&a.kind!==e.kind)a.mode="disabled";else{const t=n?"hidden":"showing";a.mode=t,r=!0}}}export function addTextTracks(t,e,n){const l=Array.prototype.reduce.call(t.textTracks,((t,e)=>(e.language&&(t[e.language]=e),t)),{});e.forEach((e=>{var r;if(!l[e.language]){const l=document.createElement("track");l.src=e.src,l.srclang=e.language,l.label=e.label,l.kind=null!==(r=e.kind)&&void 0!==r?r:"captions",l.default=!1,n(t.appendChild(l))}}))}export function buildCueId(t,e){return`${t.startTime}-${e}`}export function splitRows(t,e){var n;if(e<=0)return t.split(/\r?\n/);const l=[];let r=0,a=r,i="";for(let o=0;o<=t.length;o+=1){const c=t[o];i.length>0&&r<a&&(l[a]=null==c?i.trim():i.trimStart(),i=""),r=a;let s=null!==(n=l[r])&&void 0!==n?n:"";if("\n"===c||"\r\n"===c)i.length>0&&s.length+i.length<=e&&(s+=s.length>0?i:i.trimStart(),i=""),a+=1;else if(" "===c){if(i.length>0){s.length+i.length>e&&s.length>0?(a+=1,s=s.trimEnd()):(s+=0===s.length?i.trimStart():i,i="")}i+=c}else if(null==c&&i.length>0){s.length+i.length>e&&0!==s.length?(r+=1,s=i.trim()):s+=i}else c&&(i+=c);l[r]=s}return l}
|
package/media/parseCueText.d.ts
CHANGED
|
@@ -2,11 +2,15 @@ export interface CueSegment {
|
|
|
2
2
|
readonly id: string;
|
|
3
3
|
readonly startTime: number | undefined;
|
|
4
4
|
readonly tag: keyof typeof TAG_NAME;
|
|
5
|
-
readonly node:
|
|
5
|
+
readonly node: HTMLElement;
|
|
6
6
|
}
|
|
7
7
|
declare const TAG_NAME: Record<string, string>;
|
|
8
|
-
export interface
|
|
9
|
-
readonly
|
|
8
|
+
export interface ParseCueTextOptions {
|
|
9
|
+
readonly preferLength?: number | undefined;
|
|
10
10
|
}
|
|
11
|
-
export
|
|
11
|
+
export interface ParseCueTextResult<P> {
|
|
12
|
+
readonly segments: P[][];
|
|
13
|
+
readonly rawText: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function parseCueText<P = CueSegment>(input0: string, map?: (segment: CueSegment, prevSegment: P | undefined) => P, { preferLength }?: ParseCueTextOptions): ParseCueTextResult<P>;
|
|
12
16
|
export {};
|
package/media/parseCueText.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,r
|
|
1
|
+
import{splitRows}from"./TextTracksController/utils";const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,l,r]=t;return r?computeSeconds(n,o,l.replace(":",""),r):+n>59?computeSeconds(n,o,"",r):computeSeconds("",n,o,r)}function unescape(e){let t,n=e;for(;t=n.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)n=n.replace(t[0],(e=>ESCAPE[e]));return n}function nextToken(e){if(!e)return[e,void 0];const t=e.match(/^([^<]*)(<[^>]+>?)?/);if(!t)return[e,void 0];const n=t[1]?t[1]:t[2];return[e.substring(n.length),n]}function shouldAdd(e,t){return!NEEDS_PARENT[t.localName]||NEEDS_PARENT[t.localName]===e.localName}function createHtmlNode(e,t){const n=TAG_NAME[e];if(!n)return;const o=window.document.createElement(n),l=TAG_ANNOTATION[e];return l&&t&&(o[l]=t.trim()),o}export function parseCueText(e,t,{preferLength:n=0}={}){let o,l,r=e,s=-1;const a=[],c=[],u=[],i=e=>{var n,o;0===c.length&&c.push([]),c.at(-1).push(t?t(e,null===(o=null!==(n=c.at(-1))&&void 0!==n?n:c.at(-2))||void 0===o?void 0:o.at(-1)):e)},d=e=>{var t;const n=null!==(t=a.pop())&&void 0!==t?t:"",l=o;if(o=l.parentElement||void 0,null==o){i({id:e,startTime:s>=0?s:void 0,tag:n,node:l})}},p=(e,t)=>{t?u.push(e):u[u.length-1]+=e,t&&c.push([]),null==o?(e=>{const t=createHtmlNode("c","");t.appendChild(window.document.createTextNode(unescape(e)));const n={id:m(),node:t,tag:"c",startTime:s>=0?s:void 0};i(n)})(e):o.appendChild(window.document.createTextNode(unescape(e)))},m=()=>{var e,t;return`${c.length}-${(null!==(t=null===(e=c.at(-1))||void 0===e?void 0:e.length)&&void 0!==t?t:0)+1}`};for(;null!=([r,l]=nextToken(r),l);)if("<"===l[0])if("/"===l[1])a.at(-1)===l.substring(2).replace(">","")&&d(m());else{const e=parseTimeStamp(l.substring(1,l.length-1));if(e)s=e;else{const e=l.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/),t=e&&createHtmlNode(e[1],e[3]);!t||o&&!shouldAdd(o,t)||(e[2]&&(t.className=e[2].substring(1).replace("."," ")),a.push(e[1]),null==o||o.appendChild(t),o=t)}}else if(0===u.length||n>0&&u.at(-1).length+l.length>n){const e=splitRows(l,n);for(let t=0;t<e.length;t+=1)p(e[t],!0)}else p(l,!1);return{segments:c,rawText:u}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.54.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,26 +20,32 @@
|
|
|
20
20
|
"@js-toolkit/node-utils": "^1.2.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@
|
|
24
|
-
"@
|
|
25
|
-
"@
|
|
26
|
-
"@
|
|
27
|
-
"@
|
|
23
|
+
"@eslint/compat": "^1.1.0",
|
|
24
|
+
"@eslint/eslintrc": "^3.1.0",
|
|
25
|
+
"@eslint/js": "^9.6.0",
|
|
26
|
+
"@js-toolkit/configs": "^3.93.0",
|
|
27
|
+
"@js-toolkit/utils": "^1.54.0",
|
|
28
|
+
"@types/eslint": "^8.56.10",
|
|
29
|
+
"@types/eslint__eslintrc": "^2.1.1",
|
|
30
|
+
"@types/eslint__js": "^8.42.3",
|
|
31
|
+
"@types/lodash.throttle": "^4.1.9",
|
|
32
|
+
"@types/uuid": "^10.0.0",
|
|
28
33
|
"copyfiles": "^2.4.1",
|
|
29
|
-
"eslint": "^
|
|
30
|
-
"eslint-config-airbnb-base": "^15.0.0",
|
|
34
|
+
"eslint": "^9.6.0",
|
|
31
35
|
"eslint-config-prettier": "^9.1.0",
|
|
32
36
|
"eslint-plugin-import": "^2.29.1",
|
|
33
37
|
"eslint-plugin-prettier": "^5.1.3",
|
|
34
38
|
"eventemitter3": "^5.0.1",
|
|
35
|
-
"
|
|
39
|
+
"lodash.throttle": "^4.1.1",
|
|
40
|
+
"prettier": "^3.3.2",
|
|
36
41
|
"reconnecting-websocket": "^4.4.0",
|
|
37
42
|
"rimraf": "^5.0.7",
|
|
38
|
-
"terser": "^5.31.
|
|
39
|
-
"typescript": "^5.
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
+
"terser": "^5.31.1",
|
|
44
|
+
"typescript": "^5.5.2",
|
|
45
|
+
"typescript-eslint": "^7.14.1",
|
|
46
|
+
"ua-parser-js": "^2.0.0-beta.3",
|
|
47
|
+
"uuid": "^10.0.0",
|
|
48
|
+
"webpack": "^5.92.1",
|
|
43
49
|
"yargs": "^17.7.2"
|
|
44
50
|
}
|
|
45
51
|
}
|
package/serviceWorker/utils.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference lib="webworker" />
|
|
2
1
|
export declare function isLocalhost(hostname?: string): boolean;
|
|
3
2
|
/** Delete all caches that aren't named in `caches`. */
|
|
4
3
|
export declare function removeUnknownCaches<T extends Record<string, string>>(expectedCaches: T): Promise<unknown>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ViewableTrackerOptions {
|
|
2
|
+
/** Visibility part to detect state as viewable. */
|
|
3
|
+
readonly visiblePart?: boolean | number | undefined;
|
|
4
|
+
readonly scrollThrottle?: number | undefined;
|
|
5
|
+
readonly documentVisibility?: boolean | undefined;
|
|
6
|
+
readonly onChange: (viewable: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
export interface ViewableTracker {
|
|
9
|
+
readonly check: VoidFunction;
|
|
10
|
+
readonly destroy: VoidFunction;
|
|
11
|
+
}
|
|
12
|
+
export declare function getViewableTracker(element: HTMLElement, { visiblePart: visiblePartOption, scrollThrottle, documentVisibility, onChange, }: ViewableTrackerOptions): ViewableTracker;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import throttleFn from"lodash.throttle";export function getViewableTracker(t,{visiblePart:e=.8,scrollThrottle:i=200,documentVisibility:n=!0,onChange:o}){const r=+e;let s,l=0,c="visible"===document.visibilityState;const a=()=>{if(n&&"visible"!==document.visibilityState)return;const{top:e,bottom:i,height:l}=t.getBoundingClientRect(),c=l*r,a=e+c,d=window.innerHeight>=a&&i>c;s!==d&&(s=d,o(d))},d=()=>{const t="visible"===document.visibilityState;c!==t&&(c=t,t&&r>0?(s=void 0,a()):(r<=0||s!==t)&&o(t))},v=i&&i>0?throttleFn(a,i):()=>{n&&"visible"!==document.visibilityState||(l=window.requestAnimationFrame(a))};r>0&&window.addEventListener("scroll",v,{capture:!1,passive:!0}),n&&document.addEventListener("visibilitychange",d);return{check:()=>{r>0&&a(),n&&d()},destroy:()=>{cancelAnimationFrame(l),window.removeEventListener("scroll",v,{capture:!1}),document.removeEventListener("visibilitychange",d)}}}
|