library-ts/browser/dom/PageData.ts

167 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-03-25 06:42:27 +00:00
import { Loader } from "../xhttp/Loader";
import { PageHandler } from "./PageHandler";
export enum PageDataState
{
INITIAL,
LOADING,
SUCCESSED,
FAILED
}
export class PageData
{
private _pageHandler:PageHandler;
private _rawHTML:string;
get rawHTML(){ return this._rawHTML;}
private _pageRootStartIndex:number;
private _pageRootEndIndex:number;
private _title:string;
private _state:PageDataState = PageDataState.INITIAL;
private _absolutePath:string;
private _relativePath:string;
private _cacheTime:number;
private _language:string = null;
scrollTop:number;
constructor( pageHandler:PageHandler, absolutePath:string, relativePath:string )
{
this._pageHandler = pageHandler;
this._absolutePath = absolutePath;
this._relativePath = relativePath;
this._state = PageDataState.INITIAL;
this.scrollTop = 0;
}
async load():Promise<void>
{
if ( this.isLoading )
{
return await this._waitUntilLoaded();
}
this._state = PageDataState.LOADING;
let path = this._absolutePath;
let rawHTML:string = null;
try
{
let pageParameters = this._pageHandler.pageParameters;
this._cacheTime = new Date().getTime();
let pageURL = path + pageParameters + "&time=" + this._cacheTime;
console.log( pageURL );
rawHTML = await Loader.loadText( pageURL );
this._rawHTML = rawHTML;
this._state = PageDataState.SUCCESSED;
}
catch( e )
{
this._rawHTML = null;
this._state = PageDataState.FAILED;
}
return Promise.resolve();
}
private async _waitUntilLoaded():Promise<void>
{
let pageData = this;
let promise = new Promise<void>
(
( resolve, reject ) =>
{
let checkForReadiness = ()=>
{
if ( pageData.ready )
{
resolve();
return;
}
setTimeout( checkForReadiness, 100 );
}
checkForReadiness();
}
);
return Promise.resolve( promise );
}
get ready()
{
return this._state === PageDataState.SUCCESSED || this._state === PageDataState.FAILED;
}
get isLoading()
{
return this._state === PageDataState.LOADING;
}
get title()
{
if ( ! this._title )
{
let titleStartTag = "<title>";
let titleEndTag = "</title>";
let titleStart = this._rawHTML.indexOf( titleStartTag ) + titleStartTag.length;
let titleEnd = this._rawHTML.indexOf( titleEndTag, titleStart )
this._title = this._rawHTML.substring( titleStart, titleEnd );
}
return this._title;
}
get language()
{
if ( ! this._language )
{
let langStartMatcher = "<html lang=\"";
let langEndMatcher = "\"";
let langStart = this._rawHTML.indexOf( langStartMatcher );
if ( langStart === -1 )
{
this._language = "en";
return this._language;
}
let langEnd = this._rawHTML.indexOf( langEndMatcher, langStart + langStartMatcher.length + 1 );
let snippet = this._rawHTML.substring( langStart, langEnd );
let result = /\"(.+)/.exec( snippet );
this._language = result[ 1 ];
}
return this._language;
}
get pageRootInnerHTML()
{
if ( ! this._pageRootStartIndex )
{
let pageRootTag = this._pageHandler.pageRootTag;
let pageRootStartTagBegin = this._rawHTML.indexOf( `<${pageRootTag}` );
let pageRootStartEnd = this._rawHTML.indexOf( ">", pageRootStartTagBegin ) + 1;
let pageRootEnd = this._rawHTML.lastIndexOf( `</${pageRootTag}>` );
this._pageRootStartIndex = pageRootStartEnd;
this._pageRootEndIndex = pageRootEnd;
}
return this._rawHTML.substring( this._pageRootStartIndex, this._pageRootEndIndex );
}
}