This commit is contained in:
2025-05-12 05:38:44 +09:00
parent dced21c3f8
commit 6d78bfa46e
8120 changed files with 1161564 additions and 0 deletions

174
book/node_modules/honkit/lib/output/generateBook.js generated vendored Normal file
View File

@ -0,0 +1,174 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateBook = generateBook;
exports.incrementalBuild = incrementalBuild;
const path_1 = __importDefault(require("path"));
const immutable_1 = __importDefault(require("immutable"));
const output_1 = __importDefault(require("../models/output"));
const promise_1 = __importDefault(require("../utils/promise"));
const fs_1 = __importDefault(require("../utils/fs"));
const callHook_1 = __importDefault(require("./callHook"));
const preparePlugins_1 = __importDefault(require("./preparePlugins"));
const preparePages_1 = __importDefault(require("./preparePages"));
const prepareAssets_1 = __importDefault(require("./prepareAssets"));
const generateAssets_1 = __importDefault(require("./generateAssets"));
const generatePages_1 = __importDefault(require("./generatePages"));
const updateBookConfig = callHook_1.default.bind(null, "config", (output) => {
const book = output.getBook();
const config = book.getConfig();
const values = config.getValues();
return values.toJS();
}, (output, result) => {
let book = output.getBook();
let config = book.getConfig();
config = config.updateValues(result);
book = book.set("config", config);
return output.set("book", book);
});
/**
* Update multiple languages books if the book has LANGS.md
* @param generator
* @param output
*/
const generateMultipleLanguages = (generator, output) => {
const book = output.getBook();
if (!book.isMultilingual()) {
return;
}
const logger = book.getLogger();
const books = book.getBooks();
const outputRoot = output.getRoot();
const plugins = output.getPlugins();
const state = output.getState();
const options = output.getOptions();
const bookList = books.map((langBook) => {
// Inherits plugins list, options and state
const langOptions = options.set("root", path_1.default.join(outputRoot, langBook.getLanguage()));
const langOutput = new output_1.default({
book: langBook,
options: langOptions,
state: state,
generator: generator.name,
plugins: plugins
});
logger.info.ln("");
logger.info.ln(`generating language "${langBook.getLanguage()}"`);
return processOutput(generator, langOutput);
});
return promise_1.default.all(bookList.toArray()).thenResolve(output);
};
/**
* Process an output to generate the book
*
* @param {Generator} generator
* @param {Output} output
* @return {Promise<Output>}
*/
function processOutput(generator, output) {
return (0, promise_1.default)(output)
.then(preparePlugins_1.default)
.then(preparePages_1.default)
.then(prepareAssets_1.default)
.then(updateBookConfig)
.then(callHook_1.default.bind(null, "init", (output) => {
return {};
}, (output) => {
return output;
}))
.then((output) => {
if (!generator.onInit) {
return output;
}
return generator.onInit(output);
})
.then((output) => (0, generateAssets_1.default)(generator, output))
.then((output) => (0, generatePages_1.default)(generator, output))
.tap((output) => generateMultipleLanguages(generator, output))
.then(callHook_1.default.bind(null, "finish:before", (output) => {
return {};
}, (output) => {
return output;
}))
.then((output) => {
if (!generator.onFinish) {
return output;
}
return generator.onFinish(output);
})
.then(callHook_1.default.bind(null, "finish", (output) => {
return {};
}, (output) => {
return output;
}));
}
/**
* Generate a book using a generator.
*
* The overall process is:
* 1. List and load plugins for this book
* 2. Call hook "config"
* 3. Call hook "init"
* 4. Initialize generator
* 5. List all assets and pages
* 6. Copy all assets to output
* 7. Generate all pages
* 8. Call hook "finish:before"
* 9. Finish generation
* 10. Call hook "finish"
*
*
* @param {Generator} generator
* @param {Book} book
* @param {Object} [options = {}]
* @return {Promise<Output>}
*/
function generateBook(generator, book, options = {}) {
options = generator.Options(options);
const state = generator.State ? new generator.State({}) : immutable_1.default.Map();
const start = Date.now();
return ((0, promise_1.default)(new output_1.default({
book: book,
options: options,
state: state,
generator: generator.name
}))
// Cleanup output folder
.then((output) => {
const logger = output.getLogger();
const rootFolder = output.getRoot();
logger.debug.ln(`cleanup folder "${rootFolder}"`);
return fs_1.default.ensureFolder(rootFolder).thenResolve(output);
})
.then(processOutput.bind(null, generator))
// Log duration and end message
.then((output) => {
const logger = output.getLogger();
const end = Date.now();
const duration = (end - start) / 1000;
logger.info.ok(`generation finished with success in ${duration.toFixed(1)}s !`);
return output;
}));
}
/**
* Incremental build for pages
* output should be prepared plugins
* @param generator
* @param output
* @returns {Promise<Promise<Output>>}
*/
function incrementalBuild(generator, output) {
const start = Date.now();
return (0, generateAssets_1.default)(generator, output)
.then((output) => (0, generatePages_1.default)(generator, output))
.then((output) => {
const logger = output.getLogger();
const end = Date.now();
const duration = (end - start) / 1000;
logger.info.ok(`generation finished with success in ${duration.toFixed(1)}s !`);
return output;
})
.tap((output) => generateMultipleLanguages(generator, output));
}