1
0
Files
world/book/node_modules/honkit/lib/output/generatePage.js
2025-05-12 05:38:44 +09:00

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;