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

View File

@ -0,0 +1,9 @@
/**
Generate options for ebook-convert
@param {Output}
@return {Promise<Object>}
*/
declare function getConvertOptions(output: any): any;
export default getConvertOptions;
//# sourceMappingURL=getConvertOptions.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"getConvertOptions.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/getConvertOptions.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,iBAAS,iBAAiB,CAAC,MAAM,KAAA,OA8DhC;AAED,eAAe,iBAAiB,CAAC"}

View File

@ -0,0 +1,69 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const extend_1 = __importDefault(require("extend"));
const promise_1 = __importDefault(require("../../utils/promise"));
const getPDFTemplate_1 = __importDefault(require("./getPDFTemplate"));
const getCoverPath_1 = __importDefault(require("./getCoverPath"));
/**
Generate options for ebook-convert
@param {Output}
@return {Promise<Object>}
*/
function getConvertOptions(output) {
const options = output.getOptions();
const format = options.get("format");
const book = output.getBook();
const config = book.getConfig();
return (0, promise_1.default)().then(() => {
const coverPath = (0, getCoverPath_1.default)(output);
let options = {
"--cover": coverPath,
"--title": config.getValue("title"),
"--comments": config.getValue("description"),
"--isbn": config.getValue("isbn"),
"--authors": config.getValue("author"),
"--author-sort": config.getValue("authorSort"),
"--language": book.getLanguage() || config.getValue("language"),
"--book-producer": config.getValue("producer") || "HonKit",
"--publisher": config.getValue("publisher") || "HonKit",
"--pubdate": config.getValue("pubdate"),
"--series": config.getValue("series"),
"--series-index": config.getValue("seriesIndex"),
"--chapter": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter ')]",
"--level1-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-1 ')]",
"--level2-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-2 ')]",
"--level3-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-3 ')]",
"--max-levels": "1",
"--no-chapters-in-toc": true,
"--breadth-first": true,
"--dont-split-on-page-breaks": format === "epub" ? true : undefined
};
if (format !== "pdf") {
return options;
}
return promise_1.default.all([(0, getPDFTemplate_1.default)(output, "header"), (0, getPDFTemplate_1.default)(output, "footer")]).spread((headerTpl, footerTpl) => {
const pdfOptions = config.getValue("pdf").toJS();
return (options = (0, extend_1.default)(options, {
"--chapter-mark": String(pdfOptions.chapterMark),
"--page-breaks-before": String(pdfOptions.pageBreaksBefore),
"--pdf-page-margin-left": String(pdfOptions.margin.left),
"--pdf-page-margin-right": String(pdfOptions.margin.right),
"--pdf-page-margin-top": String(pdfOptions.margin.top),
"--pdf-page-margin-bottom": String(pdfOptions.margin.bottom),
"--pdf-default-font-size": String(pdfOptions.fontSize),
"--pdf-mono-font-size": String(pdfOptions.fontSize),
"--paper-size": String(pdfOptions.paperSize),
"--pdf-page-numbers": Boolean(pdfOptions.pageNumbers),
"--pdf-sans-family": String(pdfOptions.fontFamily),
"--pdf-header-template": headerTpl,
"--pdf-footer-template": footerTpl,
"--embed-all-fonts": Boolean(pdfOptions.embedFonts)
}));
});
});
}
exports.default = getConvertOptions;

View File

@ -0,0 +1,9 @@
/**
Resolve path to cover file to use
@param {Output}
@return {string}
*/
declare function getCoverPath(output: any): string;
export default getCoverPath;
//# sourceMappingURL=getCoverPath.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"getCoverPath.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/getCoverPath.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,iBAAS,YAAY,CAAC,MAAM,KAAA,UAkB3B;AAED,eAAe,YAAY,CAAC"}

View File

@ -0,0 +1,30 @@
"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 fs_1 = __importDefault(require("../../utils/fs"));
/**
Resolve path to cover file to use
@param {Output}
@return {string}
*/
function getCoverPath(output) {
const outputRoot = output.getRoot();
const book = output.getBook();
const config = book.getConfig();
const coverName = config.getValue("cover", "cover.jpg");
// Resolve to absolute
let cover = fs_1.default.pickFile(outputRoot, coverName);
if (cover) {
return cover;
}
// Multilingual? try parent folder
if (book.isLanguageBook()) {
cover = fs_1.default.pickFile(path_1.default.join(outputRoot, ".."), coverName);
}
return cover;
}
exports.default = getCoverPath;

View File

@ -0,0 +1,10 @@
/**
Generate PDF header/footer templates
@param {Output} output
@param {string} type
@return {string}
*/
declare function getPDFTemplate(output: any, type: any): any;
export default getPDFTemplate;
//# sourceMappingURL=getPDFTemplate.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"getPDFTemplate.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/getPDFTemplate.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AAEH,iBAAS,cAAc,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,OA2BnC;AAED,eAAe,cAAc,CAAC"}

View File

@ -0,0 +1,42 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const juice_1 = __importDefault(require("juice"));
const website_1 = __importDefault(require("../website"));
const json_1 = __importDefault(require("../../json"));
const templating_1 = __importDefault(require("../../templating"));
const promise_1 = __importDefault(require("../../utils/promise"));
/**
Generate PDF header/footer templates
@param {Output} output
@param {string} type
@return {string}
*/
function getPDFTemplate(output, type) {
const filePath = `pdf_${type}.html`;
const outputRoot = output.getRoot();
const engine = website_1.default.createTemplateEngine(output, filePath);
// Generate context
const context = json_1.default.encodeOutput(output);
// @ts-expect-error ts-migrate(2339) FIXME: Property 'page' does not exist on type '{ summary:... Remove this comment to see the full error message
context.page = {
num: "_PAGENUM_",
title: "_SECTION_"
};
// Render the theme
return (templating_1.default.renderFile(engine, `ebook/${filePath}`, context)
// Inline css and assets
.then((tplOut) => {
return promise_1.default.nfcall(juice_1.default.juiceResources, tplOut.getContent(), {
webResources: {
relativeTo: outputRoot
}
});
})
.then((tplOut) => tplOut.replace(/\n/g, " ")) // PDF templates need to be on one line for inclusion in spawned command
);
}
exports.default = getPDFTemplate;

3
book/node_modules/honkit/lib/output/ebook/index.d.ts generated vendored Normal file
View File

@ -0,0 +1,3 @@
declare const _default: any;
export default _default;
//# sourceMappingURL=index.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/index.ts"],"names":[],"mappings":";AAMA,wBAKG"}

16
book/node_modules/honkit/lib/output/ebook/index.js generated vendored Normal file
View File

@ -0,0 +1,16 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const extend_1 = __importDefault(require("extend"));
const website_1 = __importDefault(require("../website"));
const options_1 = __importDefault(require("./options"));
const onPage_1 = __importDefault(require("./onPage"));
const onFinish_1 = __importDefault(require("./onFinish"));
exports.default = (0, extend_1.default)({}, website_1.default, {
name: "ebook",
Options: options_1.default,
onPage: onPage_1.default,
onFinish: onFinish_1.default
});

View File

@ -0,0 +1,9 @@
/**
Finish the generation, generates the SUMMARY.html
@param {Output}
@return {Output}
*/
declare function onFinish(output: any): any;
export default onFinish;
//# sourceMappingURL=onFinish.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"onFinish.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/onFinish.ts"],"names":[],"mappings":"AAqFA;;;;;GAKG;AACH,iBAAS,QAAQ,CAAC,MAAM,KAAA,OAEvB;AAED,eAAe,QAAQ,CAAC"}

84
book/node_modules/honkit/lib/output/ebook/onFinish.js generated vendored Normal file
View File

@ -0,0 +1,84 @@
"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 website_1 = __importDefault(require("../website"));
const json_1 = __importDefault(require("../../json"));
const templating_1 = __importDefault(require("../../templating"));
const promise_1 = __importDefault(require("../../utils/promise"));
const error_1 = __importDefault(require("../../utils/error"));
const command_1 = __importDefault(require("../../utils/command"));
const writeFile_1 = __importDefault(require("../helper/writeFile"));
const getConvertOptions_1 = __importDefault(require("./getConvertOptions"));
const SUMMARY_FILE = "SUMMARY.html";
/**
Write the SUMMARY.html
@param {Output}
@return {Output}
*/
function writeSummary(output) {
const options = output.getOptions();
const prefix = options.get("prefix");
const filePath = SUMMARY_FILE;
const engine = website_1.default.createTemplateEngine(output, filePath);
const context = json_1.default.encodeOutput(output);
// Render the theme
return (templating_1.default.renderFile(engine, `${prefix}/summary.html`, context)
// Write it to the disk
.then((tplOut) => {
return (0, writeFile_1.default)(output, filePath, tplOut.getContent());
}));
}
/**
Generate the ebook file as "index.pdf"
@param {Output}
@return {Output}
*/
function runEbookConvert(output) {
const logger = output.getLogger();
const options = output.getOptions();
const format = options.get("format");
const outputFolder = output.getRoot();
if (!format) {
return (0, promise_1.default)(output);
}
return (0, getConvertOptions_1.default)(output)
.then((options) => {
const cmd = [
"ebook-convert",
path_1.default.resolve(outputFolder, SUMMARY_FILE),
path_1.default.resolve(outputFolder, `index.${format}`),
command_1.default.optionsToShellArgs(options)
].join(" ");
return (command_1.default
// @ts-expect-error ts-migrate(2554) FIXME: Expected 2 arguments, but got 1.
.exec(cmd)
.progress((data) => {
logger.debug(data);
})
.fail((err) => {
if (err.code == 127) {
throw error_1.default.RequireInstallError({
cmd: "ebook-convert",
install: "Install it from Calibre: https://calibre-ebook.com"
});
}
throw error_1.default.EbookError(err);
}));
})
.thenResolve(output);
}
/**
Finish the generation, generates the SUMMARY.html
@param {Output}
@return {Output}
*/
function onFinish(output) {
return writeSummary(output).then(runEbookConvert);
}
exports.default = onFinish;

View File

@ -0,0 +1,9 @@
/**
Write a page for ebook output
@param {Output} output
@param {Output}
*/
declare function onPage(output: any, page: any): any;
export default onPage;
//# sourceMappingURL=onPage.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"onPage.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/onPage.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,iBAAS,MAAM,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,OAY3B;AAED,eAAe,MAAM,CAAC"}

23
book/node_modules/honkit/lib/output/ebook/onPage.js generated vendored Normal file
View File

@ -0,0 +1,23 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const website_1 = __importDefault(require("../website"));
const modifiers_1 = __importDefault(require("../modifiers"));
/**
Write a page for ebook output
@param {Output} output
@param {Output}
*/
function onPage(output, page) {
const options = output.getOptions();
// Inline assets
return (modifiers_1.default.modifyHTML(page, [modifiers_1.default.inlineAssets(options.get("root"), page.getFile().getPath())])
// Write page using website generator
.then((resultPage) => {
return website_1.default.onPage(output, resultPage);
}));
}
exports.default = onPage;

View File

@ -0,0 +1,4 @@
import Immutable from "immutable";
declare const Options: Immutable.Record.Class;
export default Options;
//# sourceMappingURL=options.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/output/ebook/options.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC,QAAA,MAAM,OAAO,wBAYX,CAAC;AAEH,eAAe,OAAO,CAAC"}

17
book/node_modules/honkit/lib/output/ebook/options.js generated vendored Normal file
View File

@ -0,0 +1,17 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const immutable_1 = __importDefault(require("immutable"));
const Options = immutable_1.default.Record({
// Root folder for the output
root: String(),
// Prefix for generation
prefix: String("ebook"),
// Format to generate using ebook-convert
format: String(),
// Force use of absolute urls ("index.html" instead of "/")
directoryIndex: Boolean(false)
});
exports.default = Options;