honkit 3.6.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +10 -0
- package/bin/honkit.js +8 -0
- package/lib/BuildGenerator.js +2 -0
- package/lib/__tests__/__fixtures__/honkit/book.js +9 -0
- package/lib/__tests__/githon.js +11 -0
- package/lib/__tests__/init.js +19 -0
- package/lib/__tests__/snapshot-honkit.js +45 -0
- package/lib/api/decodeConfig.js +17 -0
- package/lib/api/decodeGlobal.js +21 -0
- package/lib/api/decodePage.js +41 -0
- package/lib/api/deprecate.js +113 -0
- package/lib/api/encodeConfig.js +30 -0
- package/lib/api/encodeGlobal.js +226 -0
- package/lib/api/encodeNavigation.js +60 -0
- package/lib/api/encodePage.js +37 -0
- package/lib/api/encodeProgress.js +58 -0
- package/lib/api/encodeSummary.js +52 -0
- package/lib/api/index.js +15 -0
- package/lib/bin.js +46 -0
- package/lib/browser.js +41 -0
- package/lib/cli/build.js +36 -0
- package/lib/cli/buildEbook.js +63 -0
- package/lib/cli/getBook.js +24 -0
- package/lib/cli/getOutputFolder.js +19 -0
- package/lib/cli/index.js +11 -0
- package/lib/cli/init.js +17 -0
- package/lib/cli/options.js +38 -0
- package/lib/cli/parse.js +65 -0
- package/lib/cli/serve.js +184 -0
- package/lib/cli/server.js +116 -0
- package/lib/cli/watch.js +35 -0
- package/lib/constants/__tests__/configSchema.js +41 -0
- package/lib/constants/configDefault.js +9 -0
- package/lib/constants/configFiles.js +3 -0
- package/lib/constants/configSchema.js +235 -0
- package/lib/constants/defaultBlocks.js +48 -0
- package/lib/constants/defaultFilters.js +18 -0
- package/lib/constants/defaultPlugins.js +20 -0
- package/lib/constants/extsAsciidoc.js +3 -0
- package/lib/constants/extsMarkdown.js +3 -0
- package/lib/constants/ignoreFiles.js +3 -0
- package/lib/constants/pluginAssetsFolder.js +3 -0
- package/lib/constants/pluginHooks.js +3 -0
- package/lib/constants/pluginPrefix.js +3 -0
- package/lib/constants/pluginResources.js +7 -0
- package/lib/constants/templatesFolder.js +3 -0
- package/lib/constants/themePrefix.js +3 -0
- package/lib/fs/__tests__/mock.js +68 -0
- package/lib/fs/mock.js +88 -0
- package/lib/fs/node.js +44 -0
- package/lib/honkit.js +34 -0
- package/lib/index.js +17 -0
- package/lib/init.js +79 -0
- package/lib/json/encodeBook.js +41 -0
- package/lib/json/encodeBookWithPage.js +25 -0
- package/lib/json/encodeFile.js +20 -0
- package/lib/json/encodeGlossary.js +22 -0
- package/lib/json/encodeGlossaryEntry.js +16 -0
- package/lib/json/encodeLanguages.js +29 -0
- package/lib/json/encodeOutput.js +26 -0
- package/lib/json/encodeOutputWithPage.js +26 -0
- package/lib/json/encodePage.js +38 -0
- package/lib/json/encodeReadme.js +19 -0
- package/lib/json/encodeSummary.js +22 -0
- package/lib/json/encodeSummaryArticle.js +25 -0
- package/lib/json/encodeSummaryPart.js +19 -0
- package/lib/json/index.js +27 -0
- package/lib/models/__tests__/config.js +164 -0
- package/lib/models/__tests__/glossary.js +38 -0
- package/lib/models/__tests__/glossaryEntry.js +16 -0
- package/lib/models/__tests__/page.js +26 -0
- package/lib/models/__tests__/plugin.js +26 -0
- package/lib/models/__tests__/pluginDependency.js +71 -0
- package/lib/models/__tests__/summary.js +115 -0
- package/lib/models/__tests__/summaryArticle.js +62 -0
- package/lib/models/__tests__/summaryPart.js +24 -0
- package/lib/models/__tests__/templateBlock.js +172 -0
- package/lib/models/__tests__/templateEngine.js +49 -0
- package/lib/models/book.js +312 -0
- package/lib/models/config.js +152 -0
- package/lib/models/file.js +83 -0
- package/lib/models/fs.js +255 -0
- package/lib/models/glossary.js +90 -0
- package/lib/models/glossaryEntry.js +34 -0
- package/lib/models/hash.js +191 -0
- package/lib/models/ignore.js +40 -0
- package/lib/models/language.js +22 -0
- package/lib/models/languages.js +64 -0
- package/lib/models/output.js +109 -0
- package/lib/models/page.js +91 -0
- package/lib/models/parser.js +102 -0
- package/lib/models/plugin.js +139 -0
- package/lib/models/pluginDependency.js +192 -0
- package/lib/models/readme.js +38 -0
- package/lib/models/summary.js +199 -0
- package/lib/models/summaryArticle.js +169 -0
- package/lib/models/summaryPart.js +53 -0
- package/lib/models/templateBlock.js +230 -0
- package/lib/models/templateEngine.js +115 -0
- package/lib/models/templateOutput.js +36 -0
- package/lib/models/templateShortcut.js +65 -0
- package/lib/modifiers/config/__tests__/addPlugin.js +30 -0
- package/lib/modifiers/config/__tests__/removePlugin.js +29 -0
- package/lib/modifiers/config/__tests__/togglePlugin.js +28 -0
- package/lib/modifiers/config/addPlugin.js +27 -0
- package/lib/modifiers/config/editPlugin.js +13 -0
- package/lib/modifiers/config/getPluginConfig.js +22 -0
- package/lib/modifiers/config/hasPlugin.js +15 -0
- package/lib/modifiers/config/index.js +21 -0
- package/lib/modifiers/config/isDefaultPlugin.js +17 -0
- package/lib/modifiers/config/removePlugin.js +27 -0
- package/lib/modifiers/config/togglePlugin.js +32 -0
- package/lib/modifiers/index.js +11 -0
- package/lib/modifiers/summary/__tests__/editPartTitle.js +41 -0
- package/lib/modifiers/summary/__tests__/insertArticle.js +72 -0
- package/lib/modifiers/summary/__tests__/insertPart.js +56 -0
- package/lib/modifiers/summary/__tests__/mergeAtLevel.js +45 -0
- package/lib/modifiers/summary/__tests__/moveArticle.js +66 -0
- package/lib/modifiers/summary/__tests__/moveArticleAfter.js +75 -0
- package/lib/modifiers/summary/__tests__/removeArticle.js +54 -0
- package/lib/modifiers/summary/editArticleRef.js +20 -0
- package/lib/modifiers/summary/editArticleTitle.js +20 -0
- package/lib/modifiers/summary/editPartTitle.js +21 -0
- package/lib/modifiers/summary/index.js +27 -0
- package/lib/modifiers/summary/indexArticleLevels.js +21 -0
- package/lib/modifiers/summary/indexLevels.js +18 -0
- package/lib/modifiers/summary/indexPartLevels.js +25 -0
- package/lib/modifiers/summary/insertArticle.js +47 -0
- package/lib/modifiers/summary/insertPart.js +21 -0
- package/lib/modifiers/summary/mergeAtLevel.js +68 -0
- package/lib/modifiers/summary/moveArticle.js +27 -0
- package/lib/modifiers/summary/moveArticleAfter.js +59 -0
- package/lib/modifiers/summary/removeArticle.js +36 -0
- package/lib/modifiers/summary/removePart.js +18 -0
- package/lib/modifiers/summary/unshiftArticle.js +27 -0
- package/lib/output/__tests__/ebook.js +17 -0
- package/lib/output/__tests__/json.js +43 -0
- package/lib/output/__tests__/plugin-hooks.js +57 -0
- package/lib/output/__tests__/website.js +121 -0
- package/lib/output/callHook.js +51 -0
- package/lib/output/callPageHook.js +23 -0
- package/lib/output/createTemplateEngine.js +42 -0
- package/lib/output/ebook/getConvertOptions.js +69 -0
- package/lib/output/ebook/getCoverPath.js +30 -0
- package/lib/output/ebook/getPDFTemplate.js +40 -0
- package/lib/output/ebook/index.js +16 -0
- package/lib/output/ebook/onFinish.js +84 -0
- package/lib/output/ebook/onPage.js +23 -0
- package/lib/output/ebook/options.js +17 -0
- package/lib/output/generateAssets.js +26 -0
- package/lib/output/generateBook.js +167 -0
- package/lib/output/generatePage.js +90 -0
- package/lib/output/generatePages.js +52 -0
- package/lib/output/getModifiers.js +63 -0
- package/lib/output/helper/fileToOutput.js +30 -0
- package/lib/output/helper/fileToURL.js +30 -0
- package/lib/output/helper/index.js +3 -0
- package/lib/output/helper/resolveFileToURL.js +25 -0
- package/lib/output/helper/writeFile.js +26 -0
- package/lib/output/index.js +27 -0
- package/lib/output/json/index.js +14 -0
- package/lib/output/json/onFinish.js +39 -0
- package/lib/output/json/onPage.js +37 -0
- package/lib/output/json/options.js +11 -0
- package/lib/output/modifiers/__tests__/addHeadingId.js +23 -0
- package/lib/output/modifiers/__tests__/annotateText.js +39 -0
- package/lib/output/modifiers/__tests__/fetchRemoteImages.js +32 -0
- package/lib/output/modifiers/__tests__/highlightCode.js +48 -0
- package/lib/output/modifiers/__tests__/inlinePng.js +22 -0
- package/lib/output/modifiers/__tests__/inlineSvg.js +42 -0
- package/lib/output/modifiers/__tests__/resolveImages.js +39 -0
- package/lib/output/modifiers/__tests__/resolveLinks.js +81 -0
- package/lib/output/modifiers/__tests__/svgToImg.js +29 -0
- package/lib/output/modifiers/addHeadingId.js +26 -0
- package/lib/output/modifiers/annotateText.js +76 -0
- package/lib/output/modifiers/editHTMLElement.js +17 -0
- package/lib/output/modifiers/fetchRemoteImages.js +42 -0
- package/lib/output/modifiers/highlightCode.js +59 -0
- package/lib/output/modifiers/index.js +26 -0
- package/lib/output/modifiers/inlineAssets.js +29 -0
- package/lib/output/modifiers/inlinePng.js +43 -0
- package/lib/output/modifiers/inlineSvg.js +39 -0
- package/lib/output/modifiers/modifyHTML.js +27 -0
- package/lib/output/modifiers/resolveImages.js +30 -0
- package/lib/output/modifiers/resolveLinks.js +46 -0
- package/lib/output/modifiers/svgToImg.js +58 -0
- package/lib/output/page-cache.js +15 -0
- package/lib/output/prepareAssets.js +22 -0
- package/lib/output/preparePages.js +25 -0
- package/lib/output/preparePlugins.js +36 -0
- package/lib/output/testing/createMock.js +39 -0
- package/lib/output/testing/generateMock.js +55 -0
- package/lib/output/website/__tests__/i18n.js +40 -0
- package/lib/output/website/copyPluginAssets.js +92 -0
- package/lib/output/website/createTemplateEngine.js +136 -0
- package/lib/output/website/index.js +22 -0
- package/lib/output/website/listSearchPaths.js +20 -0
- package/lib/output/website/onAsset.js +29 -0
- package/lib/output/website/onFinish.js +35 -0
- package/lib/output/website/onInit.js +19 -0
- package/lib/output/website/onPage.js +73 -0
- package/lib/output/website/options.js +15 -0
- package/lib/output/website/prepareI18n.js +28 -0
- package/lib/output/website/prepareResources.js +49 -0
- package/lib/output/website/state.js +20 -0
- package/lib/parse/__tests__/listAssets.js +63 -0
- package/lib/parse/__tests__/parseBook.js +77 -0
- package/lib/parse/__tests__/parseGlossary.js +32 -0
- package/lib/parse/__tests__/parseIgnore.js +37 -0
- package/lib/parse/__tests__/parsePageFromString.js +34 -0
- package/lib/parse/__tests__/parseReadme.js +33 -0
- package/lib/parse/__tests__/parseSummary.js +30 -0
- package/lib/parse/findParsableFile.js +33 -0
- package/lib/parse/index.js +31 -0
- package/lib/parse/listAssets.js +36 -0
- package/lib/parse/lookupStructureFile.js +21 -0
- package/lib/parse/parseBook.js +68 -0
- package/lib/parse/parseConfig.js +52 -0
- package/lib/parse/parseGlossary.js +25 -0
- package/lib/parse/parseIgnore.js +43 -0
- package/lib/parse/parseLanguages.js +26 -0
- package/lib/parse/parsePage.js +21 -0
- package/lib/parse/parsePageFromString.js +25 -0
- package/lib/parse/parsePagesList.js +80 -0
- package/lib/parse/parseReadme.js +26 -0
- package/lib/parse/parseStructureFile.js +64 -0
- package/lib/parse/parseSummary.js +43 -0
- package/lib/parse/validateConfig.js +31 -0
- package/lib/parse/walkSummary.js +34 -0
- package/lib/parsers.js +60 -0
- package/lib/plugins/PluginResolver.js +84 -0
- package/lib/plugins/__tests__/findInstalled.js +25 -0
- package/lib/plugins/__tests__/listDependencies.js +28 -0
- package/lib/plugins/__tests__/sortDependencies.js +28 -0
- package/lib/plugins/__tests__/validatePlugin.js +99 -0
- package/lib/plugins/findInstalled.js +87 -0
- package/lib/plugins/index.js +17 -0
- package/lib/plugins/listBlocks.js +19 -0
- package/lib/plugins/listDependencies.js +33 -0
- package/lib/plugins/listDepsForBook.js +20 -0
- package/lib/plugins/listFilters.js +18 -0
- package/lib/plugins/listResources.js +44 -0
- package/lib/plugins/loadForBook.js +38 -0
- package/lib/plugins/loadPlugin.js +89 -0
- package/lib/plugins/package-name-util.js +48 -0
- package/lib/plugins/sortDependencies.js +30 -0
- package/lib/plugins/toNames.js +16 -0
- package/lib/plugins/validateConfig.js +60 -0
- package/lib/plugins/validatePlugin.js +36 -0
- package/lib/templating/__tests__/conrefsLoader.js +93 -0
- package/lib/templating/__tests__/postRender.js +52 -0
- package/lib/templating/__tests__/replaceShortcuts.js +27 -0
- package/lib/templating/conrefsLoader.js +88 -0
- package/lib/templating/index.js +19 -0
- package/lib/templating/listShortcuts.js +29 -0
- package/lib/templating/postRender.js +46 -0
- package/lib/templating/render.js +41 -0
- package/lib/templating/renderFile.js +39 -0
- package/lib/templating/replaceShortcuts.js +36 -0
- package/lib/templating/themesLoader.js +98 -0
- package/lib/utils/__tests__/git.js +47 -0
- package/lib/utils/__tests__/location.js +81 -0
- package/lib/utils/__tests__/path.js +19 -0
- package/lib/utils/command.js +104 -0
- package/lib/utils/error.js +88 -0
- package/lib/utils/fs.js +163 -0
- package/lib/utils/genKey.js +13 -0
- package/lib/utils/git.js +116 -0
- package/lib/utils/images.js +22 -0
- package/lib/utils/location.js +129 -0
- package/lib/utils/logger.js +158 -0
- package/lib/utils/mergeDefaults.js +18 -0
- package/lib/utils/path.js +62 -0
- package/lib/utils/promise.js +142 -0
- package/lib/utils/reducedObject.js +31 -0
- package/lib/utils/timing.js +90 -0
- package/package.json +112 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const summaryArticle_1 = __importDefault(require("../../models/summaryArticle"));
|
|
7
|
+
const summaryPart_1 = __importDefault(require("../../models/summaryPart"));
|
|
8
|
+
const indexLevels_1 = __importDefault(require("./indexLevels"));
|
|
9
|
+
/**
|
|
10
|
+
Insert an article at the beginning of summary
|
|
11
|
+
|
|
12
|
+
@param {Summary} summary
|
|
13
|
+
@param {Article} article
|
|
14
|
+
@return {Summary}
|
|
15
|
+
*/
|
|
16
|
+
function unshiftArticle(summary, article) {
|
|
17
|
+
article = new summaryArticle_1.default(article);
|
|
18
|
+
let parts = summary.getParts();
|
|
19
|
+
let part = parts.get(0) || new summaryPart_1.default();
|
|
20
|
+
let articles = part.getArticles();
|
|
21
|
+
articles = articles.unshift(article);
|
|
22
|
+
part = part.set("articles", articles);
|
|
23
|
+
parts = parts.set(0, part);
|
|
24
|
+
summary = summary.set("parts", parts);
|
|
25
|
+
return indexLevels_1.default(summary);
|
|
26
|
+
}
|
|
27
|
+
exports.default = unshiftArticle;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const generateMock_1 = __importDefault(require("../testing/generateMock"));
|
|
7
|
+
const ebook_1 = __importDefault(require("../ebook"));
|
|
8
|
+
describe("EbookGenerator", () => {
|
|
9
|
+
test("should generate a SUMMARY.html", () => {
|
|
10
|
+
return generateMock_1.default(ebook_1.default, {
|
|
11
|
+
"README.md": "Hello World"
|
|
12
|
+
}).then((folder) => {
|
|
13
|
+
expect(folder).toHaveFile("SUMMARY.html");
|
|
14
|
+
expect(folder).toHaveFile("index.html");
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const generateMock_1 = __importDefault(require("../testing/generateMock"));
|
|
7
|
+
const json_1 = __importDefault(require("../json"));
|
|
8
|
+
describe("JSONGenerator", () => {
|
|
9
|
+
test("should generate a README.json", () => {
|
|
10
|
+
return generateMock_1.default(json_1.default, {
|
|
11
|
+
"README.md": "Hello World"
|
|
12
|
+
}).then((folder) => {
|
|
13
|
+
expect(folder).toHaveFile("README.json");
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
test("should generate a json file for each articles", () => {
|
|
17
|
+
return generateMock_1.default(json_1.default, {
|
|
18
|
+
"README.md": "Hello World",
|
|
19
|
+
"SUMMARY.md": "# Summary\n\n* [Page](test/page.md)",
|
|
20
|
+
test: {
|
|
21
|
+
"page.md": "Hello 2"
|
|
22
|
+
}
|
|
23
|
+
}).then((folder) => {
|
|
24
|
+
expect(folder).toHaveFile("README.json");
|
|
25
|
+
expect(folder).toHaveFile("test/page.json");
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
test("should generate a multilingual book", () => {
|
|
29
|
+
return generateMock_1.default(json_1.default, {
|
|
30
|
+
"LANGS.md": "# Languages\n\n* [en](en)\n* [fr](fr)",
|
|
31
|
+
en: {
|
|
32
|
+
"README.md": "Hello"
|
|
33
|
+
},
|
|
34
|
+
fr: {
|
|
35
|
+
"README.md": "Bonjour"
|
|
36
|
+
}
|
|
37
|
+
}).then((folder) => {
|
|
38
|
+
expect(folder).toHaveFile("en/README.json");
|
|
39
|
+
expect(folder).toHaveFile("fr/README.json");
|
|
40
|
+
expect(folder).toHaveFile("README.json");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const generateMock_1 = require("../testing/generateMock");
|
|
8
|
+
const immutable_1 = __importDefault(require("immutable"));
|
|
9
|
+
const generatePages_1 = __importDefault(require("../generatePages"));
|
|
10
|
+
const plugin_1 = __importDefault(require("../../models/plugin"));
|
|
11
|
+
const json_1 = __importDefault(require("../json"));
|
|
12
|
+
const createOutputWithPlugin = async ({ Generator, plugin, files }) => {
|
|
13
|
+
const { output } = await generateMock_1.generateMockBook(Generator, files);
|
|
14
|
+
// add plugin
|
|
15
|
+
return output.merge({
|
|
16
|
+
plugins: [plugin],
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
describe("plugin-hooks", function () {
|
|
20
|
+
it(`should be called "page" and "page:before" when generate each pages`, async () => {
|
|
21
|
+
let onPageBeforeCount = 0;
|
|
22
|
+
let onPageCount = 0;
|
|
23
|
+
const plugin = new plugin_1.default({
|
|
24
|
+
name: "testplugin",
|
|
25
|
+
version: "*",
|
|
26
|
+
path: "test.js",
|
|
27
|
+
package: immutable_1.default.fromJS({
|
|
28
|
+
name: "testplugin",
|
|
29
|
+
}),
|
|
30
|
+
content: immutable_1.default.fromJS({
|
|
31
|
+
hooks: {
|
|
32
|
+
"page:before": function (page) {
|
|
33
|
+
onPageBeforeCount++;
|
|
34
|
+
return page;
|
|
35
|
+
},
|
|
36
|
+
page: function (page) {
|
|
37
|
+
onPageCount++;
|
|
38
|
+
return page;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
const output = await createOutputWithPlugin({
|
|
44
|
+
Generator: json_1.default,
|
|
45
|
+
plugin,
|
|
46
|
+
files: {
|
|
47
|
+
"README.md": "Hello World",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
// call twice
|
|
51
|
+
await generatePages_1.default(json_1.default, output);
|
|
52
|
+
await generatePages_1.default(json_1.default, output);
|
|
53
|
+
// assert
|
|
54
|
+
assert_1.default.strictEqual(onPageBeforeCount, 2);
|
|
55
|
+
assert_1.default.strictEqual(onPageCount, 2);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const generateMock_1 = __importDefault(require("../testing/generateMock"));
|
|
8
|
+
const website_1 = __importDefault(require("../website"));
|
|
9
|
+
const longTest = (name, fn) => test(name, fn, 1000 * 30);
|
|
10
|
+
describe("WebsiteGenerator", () => {
|
|
11
|
+
test("should generate an index.html", async () => {
|
|
12
|
+
const folder = await generateMock_1.default(website_1.default, {
|
|
13
|
+
"README.md": "Hello World"
|
|
14
|
+
});
|
|
15
|
+
expect(folder).toHaveFile("index.html");
|
|
16
|
+
});
|
|
17
|
+
describe("Glossary", () => {
|
|
18
|
+
let folder;
|
|
19
|
+
beforeAll(() => {
|
|
20
|
+
return generateMock_1.default(website_1.default, {
|
|
21
|
+
"README.md": "Hello World",
|
|
22
|
+
"SUMMARY.md": "* [Deep](folder/page.md)",
|
|
23
|
+
folder: {
|
|
24
|
+
"page.md": "Hello World"
|
|
25
|
+
},
|
|
26
|
+
"GLOSSARY.md": "# Glossary\n\n## Hello\n\nHello World"
|
|
27
|
+
}).then((_folder) => {
|
|
28
|
+
folder = _folder;
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
longTest("should generate a GLOSSARY.html", () => {
|
|
32
|
+
expect(folder).toHaveFile("GLOSSARY.html");
|
|
33
|
+
});
|
|
34
|
+
longTest("should correctly resolve glossary links in README", () => {
|
|
35
|
+
const html = fs_1.default.readFileSync(`${folder}/index.html`, "utf8");
|
|
36
|
+
expect(html).toHaveDOMElement(".page-inner a[href=\"GLOSSARY.html#hello\"]");
|
|
37
|
+
});
|
|
38
|
+
longTest("should correctly resolve glossary links in directory", () => {
|
|
39
|
+
const html = fs_1.default.readFileSync(`${folder}/folder/page.html`, "utf8");
|
|
40
|
+
expect(html).toHaveDOMElement(".page-inner a[href=\"../GLOSSARY.html#hello\"]");
|
|
41
|
+
});
|
|
42
|
+
longTest("should accept a custom glossary file", () => {
|
|
43
|
+
return generateMock_1.default(website_1.default, {
|
|
44
|
+
"README.md": "Hello World",
|
|
45
|
+
"book.json": "{ \"structure\": { \"glossary\": \"custom.md\" } }",
|
|
46
|
+
"custom.md": "# Glossary\n\n## Hello\n\nHello World"
|
|
47
|
+
}).then((folder) => {
|
|
48
|
+
expect(folder).toHaveFile("custom.html");
|
|
49
|
+
expect(folder).not.toHaveFile("GLOSSARY.html");
|
|
50
|
+
const html = fs_1.default.readFileSync(`${folder}/index.html`, "utf8");
|
|
51
|
+
expect(html).toHaveDOMElement(".page-inner a[href=\"custom.html#hello\"]");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
test.skip("should copy asset files", () => {
|
|
56
|
+
return generateMock_1.default(website_1.default, {
|
|
57
|
+
"README.md": "Hello World",
|
|
58
|
+
"myJsFile.js": "var a = \"test\";",
|
|
59
|
+
folder: {
|
|
60
|
+
"AnotherAssetFile.md": "# Even md"
|
|
61
|
+
}
|
|
62
|
+
}).then((folder) => {
|
|
63
|
+
expect(folder).toHaveFile("index.html");
|
|
64
|
+
expect(folder).toHaveFile("myJsFile.js");
|
|
65
|
+
expect(folder).toHaveFile("folder/AnotherAssetFile.md");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test.skip("should generate an index.html for AsciiDoc", async () => {
|
|
69
|
+
const folder = await generateMock_1.default(website_1.default, {
|
|
70
|
+
"README.adoc": "Hello World"
|
|
71
|
+
});
|
|
72
|
+
expect(folder).toHaveFile("index.html");
|
|
73
|
+
});
|
|
74
|
+
longTest("should generate an HTML file for each articles", () => {
|
|
75
|
+
return generateMock_1.default(website_1.default, {
|
|
76
|
+
"README.md": "Hello World",
|
|
77
|
+
"SUMMARY.md": "# Summary\n\n* [Page](test/page.md)",
|
|
78
|
+
test: {
|
|
79
|
+
"page.md": "Hello 2"
|
|
80
|
+
}
|
|
81
|
+
}).then((folder) => {
|
|
82
|
+
expect(folder).toHaveFile("index.html");
|
|
83
|
+
expect(folder).toHaveFile("test/page.html");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
longTest("should not generate file if entry file doesn't exist", () => {
|
|
87
|
+
return generateMock_1.default(website_1.default, {
|
|
88
|
+
"README.md": "Hello World",
|
|
89
|
+
"SUMMARY.md": "# Summary\n\n* [Page 1](page.md)\n* [Page 2](test/page.md)",
|
|
90
|
+
test: {
|
|
91
|
+
"page.md": "Hello 2"
|
|
92
|
+
}
|
|
93
|
+
}).then((folder) => {
|
|
94
|
+
expect(folder).toHaveFile("index.html");
|
|
95
|
+
expect(folder).not.toHaveFile("page.html");
|
|
96
|
+
expect(folder).toHaveFile("test/page.html");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
longTest("should generate a multilingual book", () => {
|
|
100
|
+
return generateMock_1.default(website_1.default, {
|
|
101
|
+
"LANGS.md": "# Languages\n\n* [en](en)\n* [fr](fr)",
|
|
102
|
+
en: {
|
|
103
|
+
"README.md": "Hello"
|
|
104
|
+
},
|
|
105
|
+
fr: {
|
|
106
|
+
"README.md": "Bonjour"
|
|
107
|
+
}
|
|
108
|
+
}).then((folder) => {
|
|
109
|
+
// It should generate languages
|
|
110
|
+
expect(folder).toHaveFile("en/index.html");
|
|
111
|
+
expect(folder).toHaveFile("fr/index.html");
|
|
112
|
+
// Should not copy languages as assets
|
|
113
|
+
expect(folder).not.toHaveFile("en/README.md");
|
|
114
|
+
expect(folder).not.toHaveFile("fr/README.md");
|
|
115
|
+
// Should copy assets only once
|
|
116
|
+
expect(folder).toHaveFile("gitbook/style.css");
|
|
117
|
+
expect(folder).not.toHaveFile("en/gitbook/style.css");
|
|
118
|
+
expect(folder).toHaveFile("index.html");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const promise_1 = __importDefault(require("../utils/promise"));
|
|
7
|
+
const timing_1 = __importDefault(require("../utils/timing"));
|
|
8
|
+
const api_1 = __importDefault(require("../api"));
|
|
9
|
+
function defaultGetArgument() {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
function defaultHandleResult(output, result) {
|
|
13
|
+
return output;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
Call a "global" hook for an output
|
|
17
|
+
|
|
18
|
+
@param {string} name
|
|
19
|
+
@param {Function(Output) -> Mixed} getArgument
|
|
20
|
+
@param {Function(Output, result) -> Output} handleResult
|
|
21
|
+
@param {Output} output
|
|
22
|
+
@return {Promise<Output>}
|
|
23
|
+
*/
|
|
24
|
+
function callHook(name, getArgument, handleResult, output) {
|
|
25
|
+
getArgument = getArgument || defaultGetArgument;
|
|
26
|
+
handleResult = handleResult || defaultHandleResult;
|
|
27
|
+
const logger = output.getLogger();
|
|
28
|
+
const plugins = output.getPlugins();
|
|
29
|
+
logger.debug.ln(`calling hook "${name}"`);
|
|
30
|
+
// Create the JS context for plugins
|
|
31
|
+
const context = api_1.default.encodeGlobal(output);
|
|
32
|
+
return timing_1.default.measure(`call.hook.${name}`,
|
|
33
|
+
// Get the arguments
|
|
34
|
+
promise_1.default(getArgument(output))
|
|
35
|
+
// Call the hooks in serie
|
|
36
|
+
.then((arg) => {
|
|
37
|
+
return promise_1.default.reduce(plugins, (prev, plugin) => {
|
|
38
|
+
const hook = plugin.getHook(name);
|
|
39
|
+
if (!hook) {
|
|
40
|
+
return prev;
|
|
41
|
+
}
|
|
42
|
+
return hook.call(context, prev);
|
|
43
|
+
}, arg);
|
|
44
|
+
})
|
|
45
|
+
// Handle final result
|
|
46
|
+
.then((result) => {
|
|
47
|
+
output = api_1.default.decodeGlobal(output, context);
|
|
48
|
+
return handleResult(output, result);
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
exports.default = callHook;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const api_1 = __importDefault(require("../api"));
|
|
7
|
+
const callHook_1 = __importDefault(require("./callHook"));
|
|
8
|
+
/**
|
|
9
|
+
Call a hook for a specific page
|
|
10
|
+
|
|
11
|
+
@param {string} name
|
|
12
|
+
@param {Output} output
|
|
13
|
+
@param {Page} page
|
|
14
|
+
@return {Promise<Page>}
|
|
15
|
+
*/
|
|
16
|
+
function callPageHook(name, output, page) {
|
|
17
|
+
return callHook_1.default(name, (out) => {
|
|
18
|
+
return api_1.default.encodePage(out, page);
|
|
19
|
+
}, (out, result) => {
|
|
20
|
+
return api_1.default.decodePage(out, page, result);
|
|
21
|
+
}, output);
|
|
22
|
+
}
|
|
23
|
+
exports.default = callPageHook;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const templating_1 = __importDefault(require("../templating"));
|
|
7
|
+
const templateEngine_1 = __importDefault(require("../models/templateEngine"));
|
|
8
|
+
const api_1 = __importDefault(require("../api"));
|
|
9
|
+
const plugins_1 = __importDefault(require("../plugins"));
|
|
10
|
+
const defaultBlocks_1 = __importDefault(require("../constants/defaultBlocks"));
|
|
11
|
+
const defaultFilters_1 = __importDefault(require("../constants/defaultFilters"));
|
|
12
|
+
/**
|
|
13
|
+
Create template engine for an output.
|
|
14
|
+
It adds default filters/blocks, then add the ones from plugins
|
|
15
|
+
|
|
16
|
+
@param {Output} output
|
|
17
|
+
@return {TemplateEngine}
|
|
18
|
+
*/
|
|
19
|
+
function createTemplateEngine(output) {
|
|
20
|
+
const plugins = output.getPlugins();
|
|
21
|
+
const book = output.getBook();
|
|
22
|
+
const rootFolder = book.getContentRoot();
|
|
23
|
+
const logger = book.getLogger();
|
|
24
|
+
let filters = plugins_1.default.listFilters(plugins);
|
|
25
|
+
let blocks = plugins_1.default.listBlocks(plugins);
|
|
26
|
+
// Extend with default
|
|
27
|
+
blocks = defaultBlocks_1.default.merge(blocks);
|
|
28
|
+
filters = defaultFilters_1.default.merge(filters);
|
|
29
|
+
// Create loader
|
|
30
|
+
const transformFn = templating_1.default.replaceShortcuts.bind(null, blocks);
|
|
31
|
+
// @ts-expect-error: Expected 0 arguments, but got 3.
|
|
32
|
+
const loader = new templating_1.default.ConrefsLoader(rootFolder, transformFn, logger);
|
|
33
|
+
// Create API context
|
|
34
|
+
const context = api_1.default.encodeGlobal(output);
|
|
35
|
+
return new templateEngine_1.default({
|
|
36
|
+
filters: filters,
|
|
37
|
+
blocks: blocks,
|
|
38
|
+
loader: loader,
|
|
39
|
+
context: context,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
exports.default = createTemplateEngine;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const extend_1 = __importDefault(require("extend"));
|
|
7
|
+
const promise_1 = __importDefault(require("../../utils/promise"));
|
|
8
|
+
const getPDFTemplate_1 = __importDefault(require("./getPDFTemplate"));
|
|
9
|
+
const getCoverPath_1 = __importDefault(require("./getCoverPath"));
|
|
10
|
+
/**
|
|
11
|
+
Generate options for ebook-convert
|
|
12
|
+
|
|
13
|
+
@param {Output}
|
|
14
|
+
@return {Promise<Object>}
|
|
15
|
+
*/
|
|
16
|
+
function getConvertOptions(output) {
|
|
17
|
+
const options = output.getOptions();
|
|
18
|
+
const format = options.get("format");
|
|
19
|
+
const book = output.getBook();
|
|
20
|
+
const config = book.getConfig();
|
|
21
|
+
return promise_1.default().then(() => {
|
|
22
|
+
const coverPath = getCoverPath_1.default(output);
|
|
23
|
+
let options = {
|
|
24
|
+
"--cover": coverPath,
|
|
25
|
+
"--title": config.getValue("title"),
|
|
26
|
+
"--comments": config.getValue("description"),
|
|
27
|
+
"--isbn": config.getValue("isbn"),
|
|
28
|
+
"--authors": config.getValue("author"),
|
|
29
|
+
"--author-sort": config.getValue("authorSort"),
|
|
30
|
+
"--language": book.getLanguage() || config.getValue("language"),
|
|
31
|
+
"--book-producer": config.getValue("producer") || "HonKit",
|
|
32
|
+
"--publisher": config.getValue("publisher") || "HonKit",
|
|
33
|
+
"--pubdate": config.getValue("pubdate"),
|
|
34
|
+
"--series": config.getValue("series"),
|
|
35
|
+
"--series-index": config.getValue("seriesIndex"),
|
|
36
|
+
"--chapter": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter ')]",
|
|
37
|
+
"--level1-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-1 ')]",
|
|
38
|
+
"--level2-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-2 ')]",
|
|
39
|
+
"--level3-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-3 ')]",
|
|
40
|
+
"--max-levels": "1",
|
|
41
|
+
"--no-chapters-in-toc": true,
|
|
42
|
+
"--breadth-first": true,
|
|
43
|
+
"--dont-split-on-page-breaks": format === "epub" ? true : undefined,
|
|
44
|
+
};
|
|
45
|
+
if (format !== "pdf") {
|
|
46
|
+
return options;
|
|
47
|
+
}
|
|
48
|
+
return promise_1.default.all([getPDFTemplate_1.default(output, "header"), getPDFTemplate_1.default(output, "footer")]).spread((headerTpl, footerTpl) => {
|
|
49
|
+
const pdfOptions = config.getValue("pdf").toJS();
|
|
50
|
+
return (options = extend_1.default(options, {
|
|
51
|
+
"--chapter-mark": String(pdfOptions.chapterMark),
|
|
52
|
+
"--page-breaks-before": String(pdfOptions.pageBreaksBefore),
|
|
53
|
+
"--pdf-page-margin-left": String(pdfOptions.margin.left),
|
|
54
|
+
"--pdf-page-margin-right": String(pdfOptions.margin.right),
|
|
55
|
+
"--pdf-page-margin-top": String(pdfOptions.margin.top),
|
|
56
|
+
"--pdf-page-margin-bottom": String(pdfOptions.margin.bottom),
|
|
57
|
+
"--pdf-default-font-size": String(pdfOptions.fontSize),
|
|
58
|
+
"--pdf-mono-font-size": String(pdfOptions.fontSize),
|
|
59
|
+
"--paper-size": String(pdfOptions.paperSize),
|
|
60
|
+
"--pdf-page-numbers": Boolean(pdfOptions.pageNumbers),
|
|
61
|
+
"--pdf-sans-family": String(pdfOptions.fontFamily),
|
|
62
|
+
"--pdf-header-template": headerTpl,
|
|
63
|
+
"--pdf-footer-template": footerTpl,
|
|
64
|
+
"--embed-all-fonts": Boolean(pdfOptions.embedFonts),
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.default = getConvertOptions;
|