98 lines
4.1 KiB
JavaScript
98 lines
4.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const path_1 = __importDefault(require("path"));
|
|
const promise_1 = __importDefault(require("../utils/promise"));
|
|
const error_1 = __importDefault(require("../utils/error"));
|
|
const timing_1 = __importDefault(require("../utils/timing"));
|
|
const templating_1 = __importDefault(require("../templating"));
|
|
const json_1 = __importDefault(require("../json"));
|
|
const createTemplateEngine_1 = __importDefault(require("./createTemplateEngine"));
|
|
const callPageHook_1 = __importDefault(require("./callPageHook"));
|
|
const page_cache_1 = require("./page-cache");
|
|
const page_1 = __importDefault(require("../models/page"));
|
|
/**
|
|
* Prepare and generate HTML for a page
|
|
*
|
|
* @param {Output} output
|
|
* @param {Page} page
|
|
* @return {Promise<Page>}
|
|
*/
|
|
function generatePage(output, page) {
|
|
const book = output.getBook();
|
|
const engine = (0, createTemplateEngine_1.default)(output);
|
|
const cache = (0, page_cache_1.getCache)();
|
|
return timing_1.default.measure("page.generate", (0, promise_1.default)(page).then((resultPage) => {
|
|
const file = resultPage.getFile();
|
|
const filePath = file.getPath();
|
|
const parser = file.getParser();
|
|
const context = json_1.default.encodeOutputWithPage(output, resultPage);
|
|
if (!parser) {
|
|
return promise_1.default.reject(error_1.default.FileNotParsableError({
|
|
filename: filePath
|
|
}));
|
|
}
|
|
// Call hook "page:before"
|
|
// const start = Date.now();
|
|
return ((0, callPageHook_1.default)("page:before", output, resultPage)
|
|
// Escape code blocks with raw tags
|
|
.then((currentPage) => {
|
|
// console.log("page:before", Date.now() - start);
|
|
return parser.preparePage(currentPage.getContent());
|
|
})
|
|
// Render templating syntax
|
|
.then(async (content) => {
|
|
// console.log("page:preparePage", Date.now() - start);
|
|
const absoluteFilePath = path_1.default.join(book.getContentRoot(), filePath);
|
|
// if has compiled pages, use it instead of compiling page
|
|
const pageHash = page.hash();
|
|
const cachedPage = cache.getKey(pageHash);
|
|
if (cachedPage) {
|
|
return {
|
|
filePath: absoluteFilePath,
|
|
output: page_1.default.fromJSON(output)
|
|
};
|
|
}
|
|
try {
|
|
const output = await templating_1.default.render(engine, absoluteFilePath, content, context);
|
|
// update cache
|
|
cache.setKey(pageHash, page_1.default.toJSON(output));
|
|
return {
|
|
filePath: absoluteFilePath,
|
|
output
|
|
};
|
|
}
|
|
catch (error) {
|
|
console.error("Template Rendering Error", error);
|
|
console.log("Template content", content);
|
|
throw error;
|
|
}
|
|
})
|
|
.then(({ filePath, output }) => {
|
|
// console.log("page:render", Date.now() - start);
|
|
const content = output.getContent();
|
|
const baseDirectory = path_1.default.dirname(filePath);
|
|
return parser.parsePage(content, { baseDirectory }).then((result) => {
|
|
return output.setContent(result.content);
|
|
});
|
|
})
|
|
// Post processing for templating syntax
|
|
.then((output) => {
|
|
// console.log("page:parsePage", Date.now() - start);
|
|
return templating_1.default.postRender(engine, output);
|
|
})
|
|
// Return new page
|
|
.then((content) => {
|
|
// console.log("page:postRender", Date.now() - start);
|
|
return resultPage.set("content", content);
|
|
})
|
|
// Call final hook
|
|
.then((currentPage) => {
|
|
return (0, callPageHook_1.default)("page", output, currentPage);
|
|
}));
|
|
}));
|
|
}
|
|
exports.default = generatePage;
|