167 lines
3.9 KiB
TypeScript
167 lines
3.9 KiB
TypeScript
![]() |
|
||
|
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 );
|
||
|
}
|
||
|
|
||
|
}
|