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 { 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 { let pageData = this; let promise = new Promise ( ( 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 = ""; let titleEndTag = ""; 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 = "", pageRootStartTagBegin ) + 1; let pageRootEnd = this._rawHTML.lastIndexOf( `` ); this._pageRootStartIndex = pageRootStartEnd; this._pageRootEndIndex = pageRootEnd; } return this._rawHTML.substring( this._pageRootStartIndex, this._pageRootEndIndex ); } }