forked from EVOgeek/Vmeda.Online
115 lines
4.3 KiB
TypeScript
115 lines
4.3 KiB
TypeScript
// (C) Copyright 2015 Moodle Pty Ltd.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import { Injectable } from '@angular/core';
|
|
import { CoreLoggerProvider } from '@providers/logger';
|
|
import { CoreDomUtilsProvider } from '@providers/utils/dom';
|
|
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
|
import { AddonModPageProvider } from './page';
|
|
import { CoreFileProvider } from '@providers/file';
|
|
import { CoreSitesProvider } from '@providers/sites';
|
|
import { Http, Response } from '@angular/http';
|
|
|
|
/**
|
|
* Service that provides some features for page.
|
|
*/
|
|
@Injectable()
|
|
export class AddonModPageHelperProvider {
|
|
|
|
protected logger;
|
|
|
|
constructor(logger: CoreLoggerProvider, private domUtils: CoreDomUtilsProvider, private filepoolProvider: CoreFilepoolProvider,
|
|
private fileProvider: CoreFileProvider, private textUtils: CoreTextUtilsProvider, private http: Http,
|
|
private sitesProvider: CoreSitesProvider) {
|
|
this.logger = logger.getInstance('AddonModPageHelperProvider');
|
|
}
|
|
|
|
/**
|
|
* Gets the page HTML.
|
|
*
|
|
* @param contents The module contents.
|
|
* @param moduleId The module ID.
|
|
* @return The HTML of the page.
|
|
*/
|
|
getPageHtml(contents: any, moduleId: number): Promise<string> {
|
|
let indexUrl,
|
|
promise;
|
|
const paths = {};
|
|
|
|
// Extract the information about paths from the module contents.
|
|
contents.forEach((content) => {
|
|
const url = content.fileurl;
|
|
|
|
if (this.isMainPage(content)) {
|
|
// This seems to be the most reliable way to spot the index page.
|
|
indexUrl = url;
|
|
} else {
|
|
let key = content.filename;
|
|
if (content.filepath !== '/') {
|
|
// Add the folders without the leading slash.
|
|
key = content.filepath.substr(1) + key;
|
|
}
|
|
paths[this.textUtils.decodeURIComponent(key)] = url;
|
|
}
|
|
});
|
|
|
|
// Promise handling when we are in a browser.
|
|
if (!indexUrl) {
|
|
// If ever that happens.
|
|
this.logger.debug('Could not locate the index page');
|
|
promise = Promise.reject(null);
|
|
} else if (this.fileProvider.isAvailable()) {
|
|
// The file system is available.
|
|
promise = this.filepoolProvider.downloadUrl(this.sitesProvider.getCurrentSiteId(), indexUrl, false,
|
|
AddonModPageProvider.COMPONENT, moduleId);
|
|
} else {
|
|
// We return the live URL.
|
|
promise = this.sitesProvider.getCurrentSite().checkAndFixPluginfileURL(indexUrl);
|
|
}
|
|
|
|
return promise.then((url) => {
|
|
|
|
// Fetch the URL content.
|
|
const promise = this.http.get(url).toPromise();
|
|
|
|
return promise.then((response: Response): any => {
|
|
const content = response.text();
|
|
if (typeof content !== 'string') {
|
|
return Promise.reject(null);
|
|
}
|
|
|
|
// Now that we have the content, we update the SRC to point back to the external resource.
|
|
// That will be caught by core-format-text.
|
|
return this.domUtils.restoreSourcesInHtml(content, paths);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Returns whether the file is the main page of the module.
|
|
*
|
|
* @param file An object returned from WS containing file info.
|
|
* @return Whether the file is the main page or not.
|
|
*/
|
|
protected isMainPage(file: any): boolean {
|
|
const filename = file.filename || '',
|
|
fileurl = file.fileurl || '',
|
|
url = '/mod_page/content/index.html',
|
|
encodedUrl = encodeURIComponent(url);
|
|
|
|
return (filename === 'index.html' && (fileurl.indexOf(url) > 0 || fileurl.indexOf(encodedUrl) > 0 ));
|
|
}
|
|
}
|