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,52 @@
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 path_1 = __importDefault(require("path"));
7
+ const promise_1 = __importDefault(require("../utils/promise"));
8
+ const generatePage_1 = __importDefault(require("./generatePage"));
9
+ const page_cache_1 = require("./page-cache");
10
+ /**
11
+ Output all pages using a generator
12
+
13
+ @param {Generator} generator
14
+ @param {Output} output
15
+ @return {Promise<Output>}
16
+ */
17
+ function generatePages(generator, output) {
18
+ const cache = page_cache_1.getCache();
19
+ const pages = output.getPages();
20
+ const logger = output.getLogger();
21
+ // Is generator ignoring assets?
22
+ if (!generator.onPage) {
23
+ return promise_1.default(output);
24
+ }
25
+ const root = output.book.getContentRoot();
26
+ const isIncrementBuilding = output.incrementalChangeFileSet.size !== 0;
27
+ const pageList = pages.map((page) => {
28
+ const file = page.getFile();
29
+ const absoluteFilePath = path_1.default.join(root, file.getPath());
30
+ // When incremental build
31
+ if (isIncrementBuilding && !output.incrementalChangeFileSet.has(absoluteFilePath)) {
32
+ logger.debug.ln(`skip generate page "${file.getPath()}"`);
33
+ return; // Skip build
34
+ }
35
+ return generatePage_1.default(output, page)
36
+ .then((resultPage) => {
37
+ // It call renderToString
38
+ // Create page file
39
+ return generator.onPage(output, resultPage);
40
+ })
41
+ .fail((err) => {
42
+ logger.error.ln(`error while generating page "${file.getPath()}":`);
43
+ throw err;
44
+ });
45
+ });
46
+ return promise_1.default.all(pageList.toArray()).then(() => {
47
+ // update caches
48
+ cache.save();
49
+ return output;
50
+ });
51
+ }
52
+ exports.default = generatePages;
@@ -0,0 +1,63 @@
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 modifiers_1 = __importDefault(require("./modifiers"));
7
+ const resolveFileToURL_1 = __importDefault(require("./helper/resolveFileToURL"));
8
+ const api_1 = __importDefault(require("../api"));
9
+ const plugins_1 = __importDefault(require("../plugins"));
10
+ const promise_1 = __importDefault(require("../utils/promise"));
11
+ const defaultBlocks_1 = __importDefault(require("../constants/defaultBlocks"));
12
+ const fileToOutput_1 = __importDefault(require("./helper/fileToOutput"));
13
+ const CODEBLOCK = "code";
14
+ /**
15
+ * Return default modifier to prepare a page for
16
+ * rendering.
17
+ *
18
+ * @return {Array<Modifier>}
19
+ */
20
+ function getModifiers(output, page) {
21
+ const book = output.getBook();
22
+ const plugins = output.getPlugins();
23
+ const glossary = book.getGlossary();
24
+ const file = page.getFile();
25
+ // Glossary entries
26
+ const entries = glossary.getEntries();
27
+ const glossaryFile = glossary.getFile();
28
+ const glossaryFilename = fileToOutput_1.default(output, glossaryFile.getPath());
29
+ // Current file path
30
+ const currentFilePath = file.getPath();
31
+ // Get TemplateBlock for highlighting
32
+ const blocks = plugins_1.default.listBlocks(plugins);
33
+ const code = blocks.get(CODEBLOCK) || defaultBlocks_1.default.get(CODEBLOCK);
34
+ // Current context
35
+ const context = api_1.default.encodeGlobal(output);
36
+ return [
37
+ // Normalize IDs on headings
38
+ modifiers_1.default.addHeadingId,
39
+ // Annotate text with glossary entries
40
+ modifiers_1.default.annotateText.bind(null, entries, glossaryFilename),
41
+ // Resolve images
42
+ modifiers_1.default.resolveImages.bind(null, currentFilePath),
43
+ // Resolve links (.md -> .html)
44
+ modifiers_1.default.resolveLinks.bind(null, currentFilePath, resolveFileToURL_1.default.bind(null, output)),
45
+ // Highlight code blocks using "code" block
46
+ modifiers_1.default.highlightCode.bind(null, (lang, source) => {
47
+ return promise_1.default(code.applyBlock({
48
+ body: source,
49
+ kwargs: {
50
+ language: lang,
51
+ },
52
+ }, context)).then((result) => {
53
+ if (result.html === false) {
54
+ return { text: result.body };
55
+ }
56
+ else {
57
+ return { html: result.body };
58
+ }
59
+ });
60
+ }),
61
+ ];
62
+ }
63
+ exports.default = getModifiers;
@@ -0,0 +1,30 @@
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 path_1 = __importDefault(require("path"));
7
+ const path_2 = __importDefault(require("../../utils/path"));
8
+ const location_1 = __importDefault(require("../../utils/location"));
9
+ const OUTPUT_EXTENSION = ".html";
10
+ /**
11
+ * Convert a filePath (absolute) to a filename for output
12
+ *
13
+ * @param {Output} output
14
+ * @param {string} filePath
15
+ * @return {string}
16
+ */
17
+ function fileToOutput(output, filePath) {
18
+ const book = output.getBook();
19
+ const readme = book.getReadme();
20
+ const fileReadme = readme.getFile();
21
+ if (path_1.default.basename(filePath, path_1.default.extname(filePath)) == "README" ||
22
+ (fileReadme.exists() && filePath == fileReadme.getPath())) {
23
+ filePath = path_1.default.join(path_1.default.dirname(filePath), `index${OUTPUT_EXTENSION}`);
24
+ }
25
+ else {
26
+ filePath = path_2.default.setExtension(filePath, OUTPUT_EXTENSION);
27
+ }
28
+ return location_1.default.normalize(filePath);
29
+ }
30
+ exports.default = fileToOutput;
@@ -0,0 +1,30 @@
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 path_1 = __importDefault(require("path"));
7
+ const location_1 = __importDefault(require("../../utils/location"));
8
+ const fileToOutput_1 = __importDefault(require("./fileToOutput"));
9
+ /**
10
+ Convert a filePath (absolute) to an url (without hostname).
11
+ It returns an absolute path.
12
+
13
+ "README.md" -> "/"
14
+ "test/hello.md" -> "test/hello.html"
15
+ "test/README.md" -> "test/"
16
+
17
+ @param {Output} output
18
+ @param {string} filePath
19
+ @return {string}
20
+ */
21
+ function fileToURL(output, filePath) {
22
+ const options = output.getOptions();
23
+ const directoryIndex = options.get("directoryIndex");
24
+ filePath = fileToOutput_1.default(output, filePath);
25
+ if (directoryIndex && path_1.default.basename(filePath) == "index.html") {
26
+ filePath = `${path_1.default.dirname(filePath)}/`;
27
+ }
28
+ return location_1.default.normalize(filePath);
29
+ }
30
+ exports.default = fileToURL;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {};
@@ -0,0 +1,25 @@
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 location_1 = __importDefault(require("../../utils/location"));
7
+ const fileToURL_1 = __importDefault(require("./fileToURL"));
8
+ /**
9
+ * Resolve an absolute path (extracted from a link)
10
+ *
11
+ * @param {Output} output
12
+ * @param {string} filePath
13
+ * @return {string}
14
+ */
15
+ function resolveFileToURL(output, filePath) {
16
+ // Convert /test.png -> test.png
17
+ filePath = location_1.default.toAbsolute(filePath, "", "");
18
+ const page = output.getPage(filePath);
19
+ // if file is a page, return correct .html url
20
+ if (page) {
21
+ filePath = fileToURL_1.default(output, filePath);
22
+ }
23
+ return location_1.default.normalize(filePath);
24
+ }
25
+ exports.default = resolveFileToURL;
@@ -0,0 +1,26 @@
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 path_1 = __importDefault(require("path"));
7
+ const fs_1 = __importDefault(require("../../utils/fs"));
8
+ /**
9
+ Write a file to the output folder
10
+
11
+ @param {Output} output
12
+ @param {string} filePath
13
+ @param {Buffer|String} content
14
+ @return {Promise}
15
+ */
16
+ function writeFile(output, filePath, content) {
17
+ const rootFolder = output.getRoot();
18
+ filePath = path_1.default.join(rootFolder, filePath);
19
+ return fs_1.default
20
+ .ensureFile(filePath)
21
+ .then(() => {
22
+ return fs_1.default.writeFile(filePath, content);
23
+ })
24
+ .thenResolve(output);
25
+ }
26
+ exports.default = writeFile;
@@ -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 immutable_1 = __importDefault(require("immutable"));
7
+ const generateBook_1 = require("./generateBook");
8
+ const json_1 = __importDefault(require("./json"));
9
+ const website_1 = __importDefault(require("./website"));
10
+ const ebook_1 = __importDefault(require("./ebook"));
11
+ const generators = immutable_1.default.List([json_1.default, website_1.default, ebook_1.default]);
12
+ /**
13
+ Return a specific generator by its name
14
+
15
+ @param {string}
16
+ @return {Generator}
17
+ */
18
+ function getGenerator(name) {
19
+ return generators.find((generator) => {
20
+ return generator.name == name;
21
+ });
22
+ }
23
+ exports.default = {
24
+ generate: generateBook_1.generateBook,
25
+ incrementalBuild: generateBook_1.incrementalBuild,
26
+ getGenerator: getGenerator,
27
+ };
@@ -0,0 +1,14 @@
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 onFinish_1 = require("./onFinish");
7
+ const onPage_1 = require("./onPage");
8
+ const options_1 = __importDefault(require("./options"));
9
+ exports.default = {
10
+ name: "json",
11
+ Options: options_1.default,
12
+ onPage: onPage_1.onPage,
13
+ onFinish: onFinish_1.onFinish,
14
+ };
@@ -0,0 +1,39 @@
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
+ exports.onFinish = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const promise_1 = __importDefault(require("../../utils/promise"));
9
+ const fs_1 = __importDefault(require("../../utils/fs"));
10
+ const json_1 = __importDefault(require("../../json"));
11
+ /**
12
+ Finish the generation
13
+ @param {Output} output
14
+ @return {Output}
15
+ */
16
+ function onFinish(output) {
17
+ const book = output.getBook();
18
+ const outputRoot = output.getRoot();
19
+ if (!book.isMultilingual()) {
20
+ return promise_1.default(output);
21
+ }
22
+ // Get main language
23
+ const languages = book.getLanguages();
24
+ const mainLanguage = languages.getDefaultLanguage();
25
+ // Read the main JSON
26
+ return (fs_1.default
27
+ .readFile(path_1.default.resolve(outputRoot, mainLanguage.getID(), "README.json"), "utf8")
28
+ // Extend the JSON
29
+ .then((content) => {
30
+ const json = JSON.parse(content);
31
+ json.languages = json_1.default.encodeLanguages(languages);
32
+ return json;
33
+ })
34
+ .then((json) => {
35
+ return fs_1.default.writeFile(path_1.default.resolve(outputRoot, "README.json"), JSON.stringify(json, null, 4));
36
+ })
37
+ .thenResolve(output));
38
+ }
39
+ exports.onFinish = onFinish;
@@ -0,0 +1,37 @@
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
+ exports.onPage = void 0;
7
+ const json_1 = __importDefault(require("../../json"));
8
+ const path_1 = __importDefault(require("../../utils/path"));
9
+ const modifiers_1 = __importDefault(require("../modifiers"));
10
+ const writeFile_1 = __importDefault(require("../helper/writeFile"));
11
+ const getModifiers_1 = __importDefault(require("../getModifiers"));
12
+ const JSON_VERSION = "3";
13
+ /**
14
+ * Write a page as a json file
15
+ *
16
+ * @param {Output} output
17
+ * @param {Page} page
18
+ */
19
+ function onPage(output, page) {
20
+ const file = page.getFile();
21
+ const readme = output.getBook().getReadme().getFile();
22
+ return modifiers_1.default.modifyHTML(page, getModifiers_1.default(output, page)).then((resultPage) => {
23
+ // Generate the JSON
24
+ const json = json_1.default.encodeBookWithPage(output.getBook(), resultPage);
25
+ // Delete some private properties
26
+ delete json.config;
27
+ // Specify JSON output version
28
+ // @ts-expect-error ts-migrate(2339) FIXME: Property 'version' does not exist on type '{ summa... Remove this comment to see the full error message
29
+ json.version = JSON_VERSION;
30
+ // File path in the output folder
31
+ let filePath = file.getPath() == readme.getPath() ? "README.json" : file.getPath();
32
+ filePath = path_1.default.setExtension(filePath, ".json");
33
+ // Write it to the disk
34
+ return writeFile_1.default(output, filePath, JSON.stringify(json, null, 4));
35
+ });
36
+ }
37
+ exports.onPage = onPage;
@@ -0,0 +1,11 @@
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 immutable_1 = __importDefault(require("immutable"));
7
+ const Options = immutable_1.default.Record({
8
+ // Root folder for the output
9
+ root: String(),
10
+ });
11
+ exports.default = Options;
@@ -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 cheerio_1 = __importDefault(require("cheerio"));
7
+ const addHeadingId_1 = __importDefault(require("../addHeadingId"));
8
+ describe("addHeadingId", () => {
9
+ test("should add an ID if none", () => {
10
+ const $ = cheerio_1.default.load("<h1>Hello World</h1><h2>Cool !!</h2>");
11
+ return addHeadingId_1.default($).then(() => {
12
+ const html = $.html();
13
+ expect(html).toBe("<h1 id=\"hello-world\">Hello World</h1><h2 id=\"cool-\">Cool !!</h2>");
14
+ });
15
+ });
16
+ test("should not change existing IDs", () => {
17
+ const $ = cheerio_1.default.load("<h1 id=\"awesome\">Hello World</h1>");
18
+ return addHeadingId_1.default($).then(() => {
19
+ const html = $.html();
20
+ expect(html).toBe("<h1 id=\"awesome\">Hello World</h1>");
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,39 @@
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 immutable_1 = __importDefault(require("immutable"));
7
+ const cheerio_1 = __importDefault(require("cheerio"));
8
+ const glossaryEntry_1 = __importDefault(require("../../../models/glossaryEntry"));
9
+ const annotateText_1 = __importDefault(require("../annotateText"));
10
+ describe("annotateText", () => {
11
+ const entries = immutable_1.default.List([
12
+ new glossaryEntry_1.default({ name: "Word" }),
13
+ new glossaryEntry_1.default({ name: "Multiple Words" }),
14
+ ]);
15
+ test("should annotate text", () => {
16
+ const $ = cheerio_1.default.load("<p>This is a word, and multiple words</p>");
17
+ annotateText_1.default(entries, "GLOSSARY.md", $);
18
+ const links = $("a");
19
+ expect(links.length).toBe(2);
20
+ const word = $(links.get(0));
21
+ expect(word.attr("href")).toBe("/GLOSSARY.md#word");
22
+ expect(word.text()).toBe("word");
23
+ expect(word.hasClass("glossary-term")).toBeTruthy();
24
+ const words = $(links.get(1));
25
+ expect(words.attr("href")).toBe("/GLOSSARY.md#multiple-words");
26
+ expect(words.text()).toBe("multiple words");
27
+ expect(words.hasClass("glossary-term")).toBeTruthy();
28
+ });
29
+ test("should not annotate scripts", () => {
30
+ const $ = cheerio_1.default.load("<script>This is a word, and multiple words</script>");
31
+ annotateText_1.default(entries, "GLOSSARY.md", $);
32
+ expect($("a").length).toBe(0);
33
+ });
34
+ test('should not annotate when has class "no-glossary"', () => {
35
+ const $ = cheerio_1.default.load('<p class="no-glossary">This is a word, and multiple words</p>');
36
+ annotateText_1.default(entries, "GLOSSARY.md", $);
37
+ expect($("a").length).toBe(0);
38
+ });
39
+ });
@@ -0,0 +1,32 @@
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 cheerio_1 = __importDefault(require("cheerio"));
7
+ const tmp_1 = __importDefault(require("tmp"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const fetchRemoteImages_1 = __importDefault(require("../fetchRemoteImages"));
10
+ const URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png";
11
+ describe.skip("fetchRemoteImages", () => {
12
+ let dir;
13
+ beforeEach(() => {
14
+ dir = tmp_1.default.dirSync();
15
+ });
16
+ test("should download image file", () => {
17
+ const $ = cheerio_1.default.load(`<img src="${URL}" />`);
18
+ return fetchRemoteImages_1.default(dir.name, "index.html", $).then(() => {
19
+ const $img = $("img");
20
+ const src = $img.attr("src");
21
+ expect(dir.name).toHaveFile(src);
22
+ });
23
+ });
24
+ test("should download image file and replace with relative path", () => {
25
+ const $ = cheerio_1.default.load(`<img src="${URL}" />`);
26
+ return fetchRemoteImages_1.default(dir.name, "test/index.html", $).then(() => {
27
+ const $img = $("img");
28
+ const src = $img.attr("src");
29
+ expect(dir.name).toHaveFile(path_1.default.join("test", src));
30
+ });
31
+ });
32
+ });