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.
Files changed (278) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +10 -0
  3. package/bin/honkit.js +8 -0
  4. package/lib/BuildGenerator.js +2 -0
  5. package/lib/__tests__/__fixtures__/honkit/book.js +9 -0
  6. package/lib/__tests__/githon.js +11 -0
  7. package/lib/__tests__/init.js +19 -0
  8. package/lib/__tests__/snapshot-honkit.js +45 -0
  9. package/lib/api/decodeConfig.js +17 -0
  10. package/lib/api/decodeGlobal.js +21 -0
  11. package/lib/api/decodePage.js +41 -0
  12. package/lib/api/deprecate.js +113 -0
  13. package/lib/api/encodeConfig.js +30 -0
  14. package/lib/api/encodeGlobal.js +226 -0
  15. package/lib/api/encodeNavigation.js +60 -0
  16. package/lib/api/encodePage.js +37 -0
  17. package/lib/api/encodeProgress.js +58 -0
  18. package/lib/api/encodeSummary.js +52 -0
  19. package/lib/api/index.js +15 -0
  20. package/lib/bin.js +46 -0
  21. package/lib/browser.js +41 -0
  22. package/lib/cli/build.js +36 -0
  23. package/lib/cli/buildEbook.js +63 -0
  24. package/lib/cli/getBook.js +24 -0
  25. package/lib/cli/getOutputFolder.js +19 -0
  26. package/lib/cli/index.js +11 -0
  27. package/lib/cli/init.js +17 -0
  28. package/lib/cli/options.js +38 -0
  29. package/lib/cli/parse.js +65 -0
  30. package/lib/cli/serve.js +184 -0
  31. package/lib/cli/server.js +116 -0
  32. package/lib/cli/watch.js +35 -0
  33. package/lib/constants/__tests__/configSchema.js +41 -0
  34. package/lib/constants/configDefault.js +9 -0
  35. package/lib/constants/configFiles.js +3 -0
  36. package/lib/constants/configSchema.js +235 -0
  37. package/lib/constants/defaultBlocks.js +48 -0
  38. package/lib/constants/defaultFilters.js +18 -0
  39. package/lib/constants/defaultPlugins.js +20 -0
  40. package/lib/constants/extsAsciidoc.js +3 -0
  41. package/lib/constants/extsMarkdown.js +3 -0
  42. package/lib/constants/ignoreFiles.js +3 -0
  43. package/lib/constants/pluginAssetsFolder.js +3 -0
  44. package/lib/constants/pluginHooks.js +3 -0
  45. package/lib/constants/pluginPrefix.js +3 -0
  46. package/lib/constants/pluginResources.js +7 -0
  47. package/lib/constants/templatesFolder.js +3 -0
  48. package/lib/constants/themePrefix.js +3 -0
  49. package/lib/fs/__tests__/mock.js +68 -0
  50. package/lib/fs/mock.js +88 -0
  51. package/lib/fs/node.js +44 -0
  52. package/lib/honkit.js +34 -0
  53. package/lib/index.js +17 -0
  54. package/lib/init.js +79 -0
  55. package/lib/json/encodeBook.js +41 -0
  56. package/lib/json/encodeBookWithPage.js +25 -0
  57. package/lib/json/encodeFile.js +20 -0
  58. package/lib/json/encodeGlossary.js +22 -0
  59. package/lib/json/encodeGlossaryEntry.js +16 -0
  60. package/lib/json/encodeLanguages.js +29 -0
  61. package/lib/json/encodeOutput.js +26 -0
  62. package/lib/json/encodeOutputWithPage.js +26 -0
  63. package/lib/json/encodePage.js +38 -0
  64. package/lib/json/encodeReadme.js +19 -0
  65. package/lib/json/encodeSummary.js +22 -0
  66. package/lib/json/encodeSummaryArticle.js +25 -0
  67. package/lib/json/encodeSummaryPart.js +19 -0
  68. package/lib/json/index.js +27 -0
  69. package/lib/models/__tests__/config.js +164 -0
  70. package/lib/models/__tests__/glossary.js +38 -0
  71. package/lib/models/__tests__/glossaryEntry.js +16 -0
  72. package/lib/models/__tests__/page.js +26 -0
  73. package/lib/models/__tests__/plugin.js +26 -0
  74. package/lib/models/__tests__/pluginDependency.js +71 -0
  75. package/lib/models/__tests__/summary.js +115 -0
  76. package/lib/models/__tests__/summaryArticle.js +62 -0
  77. package/lib/models/__tests__/summaryPart.js +24 -0
  78. package/lib/models/__tests__/templateBlock.js +172 -0
  79. package/lib/models/__tests__/templateEngine.js +49 -0
  80. package/lib/models/book.js +312 -0
  81. package/lib/models/config.js +152 -0
  82. package/lib/models/file.js +83 -0
  83. package/lib/models/fs.js +255 -0
  84. package/lib/models/glossary.js +90 -0
  85. package/lib/models/glossaryEntry.js +34 -0
  86. package/lib/models/hash.js +191 -0
  87. package/lib/models/ignore.js +40 -0
  88. package/lib/models/language.js +22 -0
  89. package/lib/models/languages.js +64 -0
  90. package/lib/models/output.js +109 -0
  91. package/lib/models/page.js +91 -0
  92. package/lib/models/parser.js +102 -0
  93. package/lib/models/plugin.js +139 -0
  94. package/lib/models/pluginDependency.js +192 -0
  95. package/lib/models/readme.js +38 -0
  96. package/lib/models/summary.js +199 -0
  97. package/lib/models/summaryArticle.js +169 -0
  98. package/lib/models/summaryPart.js +53 -0
  99. package/lib/models/templateBlock.js +230 -0
  100. package/lib/models/templateEngine.js +115 -0
  101. package/lib/models/templateOutput.js +36 -0
  102. package/lib/models/templateShortcut.js +65 -0
  103. package/lib/modifiers/config/__tests__/addPlugin.js +30 -0
  104. package/lib/modifiers/config/__tests__/removePlugin.js +29 -0
  105. package/lib/modifiers/config/__tests__/togglePlugin.js +28 -0
  106. package/lib/modifiers/config/addPlugin.js +27 -0
  107. package/lib/modifiers/config/editPlugin.js +13 -0
  108. package/lib/modifiers/config/getPluginConfig.js +22 -0
  109. package/lib/modifiers/config/hasPlugin.js +15 -0
  110. package/lib/modifiers/config/index.js +21 -0
  111. package/lib/modifiers/config/isDefaultPlugin.js +17 -0
  112. package/lib/modifiers/config/removePlugin.js +27 -0
  113. package/lib/modifiers/config/togglePlugin.js +32 -0
  114. package/lib/modifiers/index.js +11 -0
  115. package/lib/modifiers/summary/__tests__/editPartTitle.js +41 -0
  116. package/lib/modifiers/summary/__tests__/insertArticle.js +72 -0
  117. package/lib/modifiers/summary/__tests__/insertPart.js +56 -0
  118. package/lib/modifiers/summary/__tests__/mergeAtLevel.js +45 -0
  119. package/lib/modifiers/summary/__tests__/moveArticle.js +66 -0
  120. package/lib/modifiers/summary/__tests__/moveArticleAfter.js +75 -0
  121. package/lib/modifiers/summary/__tests__/removeArticle.js +54 -0
  122. package/lib/modifiers/summary/editArticleRef.js +20 -0
  123. package/lib/modifiers/summary/editArticleTitle.js +20 -0
  124. package/lib/modifiers/summary/editPartTitle.js +21 -0
  125. package/lib/modifiers/summary/index.js +27 -0
  126. package/lib/modifiers/summary/indexArticleLevels.js +21 -0
  127. package/lib/modifiers/summary/indexLevels.js +18 -0
  128. package/lib/modifiers/summary/indexPartLevels.js +25 -0
  129. package/lib/modifiers/summary/insertArticle.js +47 -0
  130. package/lib/modifiers/summary/insertPart.js +21 -0
  131. package/lib/modifiers/summary/mergeAtLevel.js +68 -0
  132. package/lib/modifiers/summary/moveArticle.js +27 -0
  133. package/lib/modifiers/summary/moveArticleAfter.js +59 -0
  134. package/lib/modifiers/summary/removeArticle.js +36 -0
  135. package/lib/modifiers/summary/removePart.js +18 -0
  136. package/lib/modifiers/summary/unshiftArticle.js +27 -0
  137. package/lib/output/__tests__/ebook.js +17 -0
  138. package/lib/output/__tests__/json.js +43 -0
  139. package/lib/output/__tests__/plugin-hooks.js +57 -0
  140. package/lib/output/__tests__/website.js +121 -0
  141. package/lib/output/callHook.js +51 -0
  142. package/lib/output/callPageHook.js +23 -0
  143. package/lib/output/createTemplateEngine.js +42 -0
  144. package/lib/output/ebook/getConvertOptions.js +69 -0
  145. package/lib/output/ebook/getCoverPath.js +30 -0
  146. package/lib/output/ebook/getPDFTemplate.js +40 -0
  147. package/lib/output/ebook/index.js +16 -0
  148. package/lib/output/ebook/onFinish.js +84 -0
  149. package/lib/output/ebook/onPage.js +23 -0
  150. package/lib/output/ebook/options.js +17 -0
  151. package/lib/output/generateAssets.js +26 -0
  152. package/lib/output/generateBook.js +167 -0
  153. package/lib/output/generatePage.js +90 -0
  154. package/lib/output/generatePages.js +52 -0
  155. package/lib/output/getModifiers.js +63 -0
  156. package/lib/output/helper/fileToOutput.js +30 -0
  157. package/lib/output/helper/fileToURL.js +30 -0
  158. package/lib/output/helper/index.js +3 -0
  159. package/lib/output/helper/resolveFileToURL.js +25 -0
  160. package/lib/output/helper/writeFile.js +26 -0
  161. package/lib/output/index.js +27 -0
  162. package/lib/output/json/index.js +14 -0
  163. package/lib/output/json/onFinish.js +39 -0
  164. package/lib/output/json/onPage.js +37 -0
  165. package/lib/output/json/options.js +11 -0
  166. package/lib/output/modifiers/__tests__/addHeadingId.js +23 -0
  167. package/lib/output/modifiers/__tests__/annotateText.js +39 -0
  168. package/lib/output/modifiers/__tests__/fetchRemoteImages.js +32 -0
  169. package/lib/output/modifiers/__tests__/highlightCode.js +48 -0
  170. package/lib/output/modifiers/__tests__/inlinePng.js +22 -0
  171. package/lib/output/modifiers/__tests__/inlineSvg.js +42 -0
  172. package/lib/output/modifiers/__tests__/resolveImages.js +39 -0
  173. package/lib/output/modifiers/__tests__/resolveLinks.js +81 -0
  174. package/lib/output/modifiers/__tests__/svgToImg.js +29 -0
  175. package/lib/output/modifiers/addHeadingId.js +26 -0
  176. package/lib/output/modifiers/annotateText.js +76 -0
  177. package/lib/output/modifiers/editHTMLElement.js +17 -0
  178. package/lib/output/modifiers/fetchRemoteImages.js +42 -0
  179. package/lib/output/modifiers/highlightCode.js +59 -0
  180. package/lib/output/modifiers/index.js +26 -0
  181. package/lib/output/modifiers/inlineAssets.js +29 -0
  182. package/lib/output/modifiers/inlinePng.js +43 -0
  183. package/lib/output/modifiers/inlineSvg.js +39 -0
  184. package/lib/output/modifiers/modifyHTML.js +27 -0
  185. package/lib/output/modifiers/resolveImages.js +30 -0
  186. package/lib/output/modifiers/resolveLinks.js +46 -0
  187. package/lib/output/modifiers/svgToImg.js +58 -0
  188. package/lib/output/page-cache.js +15 -0
  189. package/lib/output/prepareAssets.js +22 -0
  190. package/lib/output/preparePages.js +25 -0
  191. package/lib/output/preparePlugins.js +36 -0
  192. package/lib/output/testing/createMock.js +39 -0
  193. package/lib/output/testing/generateMock.js +55 -0
  194. package/lib/output/website/__tests__/i18n.js +40 -0
  195. package/lib/output/website/copyPluginAssets.js +92 -0
  196. package/lib/output/website/createTemplateEngine.js +136 -0
  197. package/lib/output/website/index.js +22 -0
  198. package/lib/output/website/listSearchPaths.js +20 -0
  199. package/lib/output/website/onAsset.js +29 -0
  200. package/lib/output/website/onFinish.js +35 -0
  201. package/lib/output/website/onInit.js +19 -0
  202. package/lib/output/website/onPage.js +73 -0
  203. package/lib/output/website/options.js +15 -0
  204. package/lib/output/website/prepareI18n.js +28 -0
  205. package/lib/output/website/prepareResources.js +49 -0
  206. package/lib/output/website/state.js +20 -0
  207. package/lib/parse/__tests__/listAssets.js +63 -0
  208. package/lib/parse/__tests__/parseBook.js +77 -0
  209. package/lib/parse/__tests__/parseGlossary.js +32 -0
  210. package/lib/parse/__tests__/parseIgnore.js +37 -0
  211. package/lib/parse/__tests__/parsePageFromString.js +34 -0
  212. package/lib/parse/__tests__/parseReadme.js +33 -0
  213. package/lib/parse/__tests__/parseSummary.js +30 -0
  214. package/lib/parse/findParsableFile.js +33 -0
  215. package/lib/parse/index.js +31 -0
  216. package/lib/parse/listAssets.js +36 -0
  217. package/lib/parse/lookupStructureFile.js +21 -0
  218. package/lib/parse/parseBook.js +68 -0
  219. package/lib/parse/parseConfig.js +52 -0
  220. package/lib/parse/parseGlossary.js +25 -0
  221. package/lib/parse/parseIgnore.js +43 -0
  222. package/lib/parse/parseLanguages.js +26 -0
  223. package/lib/parse/parsePage.js +21 -0
  224. package/lib/parse/parsePageFromString.js +25 -0
  225. package/lib/parse/parsePagesList.js +80 -0
  226. package/lib/parse/parseReadme.js +26 -0
  227. package/lib/parse/parseStructureFile.js +64 -0
  228. package/lib/parse/parseSummary.js +43 -0
  229. package/lib/parse/validateConfig.js +31 -0
  230. package/lib/parse/walkSummary.js +34 -0
  231. package/lib/parsers.js +60 -0
  232. package/lib/plugins/PluginResolver.js +84 -0
  233. package/lib/plugins/__tests__/findInstalled.js +25 -0
  234. package/lib/plugins/__tests__/listDependencies.js +28 -0
  235. package/lib/plugins/__tests__/sortDependencies.js +28 -0
  236. package/lib/plugins/__tests__/validatePlugin.js +99 -0
  237. package/lib/plugins/findInstalled.js +87 -0
  238. package/lib/plugins/index.js +17 -0
  239. package/lib/plugins/listBlocks.js +19 -0
  240. package/lib/plugins/listDependencies.js +33 -0
  241. package/lib/plugins/listDepsForBook.js +20 -0
  242. package/lib/plugins/listFilters.js +18 -0
  243. package/lib/plugins/listResources.js +44 -0
  244. package/lib/plugins/loadForBook.js +38 -0
  245. package/lib/plugins/loadPlugin.js +89 -0
  246. package/lib/plugins/package-name-util.js +48 -0
  247. package/lib/plugins/sortDependencies.js +30 -0
  248. package/lib/plugins/toNames.js +16 -0
  249. package/lib/plugins/validateConfig.js +60 -0
  250. package/lib/plugins/validatePlugin.js +36 -0
  251. package/lib/templating/__tests__/conrefsLoader.js +93 -0
  252. package/lib/templating/__tests__/postRender.js +52 -0
  253. package/lib/templating/__tests__/replaceShortcuts.js +27 -0
  254. package/lib/templating/conrefsLoader.js +88 -0
  255. package/lib/templating/index.js +19 -0
  256. package/lib/templating/listShortcuts.js +29 -0
  257. package/lib/templating/postRender.js +46 -0
  258. package/lib/templating/render.js +41 -0
  259. package/lib/templating/renderFile.js +39 -0
  260. package/lib/templating/replaceShortcuts.js +36 -0
  261. package/lib/templating/themesLoader.js +98 -0
  262. package/lib/utils/__tests__/git.js +47 -0
  263. package/lib/utils/__tests__/location.js +81 -0
  264. package/lib/utils/__tests__/path.js +19 -0
  265. package/lib/utils/command.js +104 -0
  266. package/lib/utils/error.js +88 -0
  267. package/lib/utils/fs.js +163 -0
  268. package/lib/utils/genKey.js +13 -0
  269. package/lib/utils/git.js +116 -0
  270. package/lib/utils/images.js +22 -0
  271. package/lib/utils/location.js +129 -0
  272. package/lib/utils/logger.js +158 -0
  273. package/lib/utils/mergeDefaults.js +18 -0
  274. package/lib/utils/path.js +62 -0
  275. package/lib/utils/promise.js +142 -0
  276. package/lib/utils/reducedObject.js +31 -0
  277. package/lib/utils/timing.js +90 -0
  278. 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;