#! /usr/bin/env runjs requireJAR('markdown4j-2.2.jar'); var argsjs = require('component-args.js'); var counterjs = require('component-counter.js'); var File = java.io.File; var FileUtil = Packages.me.hatter.tools.commons.file.FileUtil; var Markdown4jProcessor = Packages.org.markdown4j.Markdown4jProcessor; var BOOTSTRAP = 'https://play.hatter.me/css/bootstrap.css'; var BOOTSTRAP_THEME = 'https://play.hatter.me/css/bootstrap-theme.css'; var main = () => { var args = argsjs.parseDefARGs(); if (args.length < 1) { xprintln('[ERROR] Need arguments.'); xprintln(); xprintln('markdownconvert.js [output.htm|output.pdf]'); xprintln(); xprintln(' -t, --title [PDF] Title'); //xprintln(' --author [PDF] Author') return; } var mdFile = $$.file(args[0]); if (!mdFile.exists()) { xprintln('[ERROR] File not exists: ' + mdFile); return; } xprintln('[INFO] Make tmp dir: .tmp') var tmpDir = $$.file('.tmp'); tmpDir.mkdirs(); if (!$$.file(tmpDir, 'bootstrap.css').exists()) { print('[INFO] Download file: bootstrap.css'); var fos = new java.io.FileOutputStream($$.file(tmpDir, 'bootstrap.css')); $$.httpRequest().skipCertCheck().url(BOOTSTRAP).get(fos, counterjs.getCounter()); fos.close(); println(); } if (!$$.file(tmpDir, 'bootstrap-theme.css').exists()) { print('[INFO] Download file: bootstrap-theme.css'); var fos = new java.io.FileOutputStream($$.file(tmpDir, 'bootstrap-theme.css')); $$.httpRequest().skipCertCheck().url(BOOTSTRAP_THEME).get(fos, counterjs.getCounter()); fos.close(); println(); } var isPDF = false; var targetFile = (args.length > 1) ? $$.file(args[1]) : $$.file(mdFile.getAbsoluteFile().getParentFile(), mdFile.getName() + '.pdf'); if (targetFile.getName().toLowerCase().endsWith('.pdf')) { isPDF = true; } var htmlFile = (isPDF) ? $$.file('.tmp.htm') : targetFile; xprintln('[INFO] Render markdown file to html file: ' + htmlFile.getName()); var md = $$.rFile(mdFile).string(); var html = new Markdown4jProcessor().process(md); html = '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n\n\n' + html + '\n\n\n\n' + '\n'; $$.rFile(htmlFile).write(html); if (isPDF) { xprintln('[INFO] Render html file to pdf file: ' + targetFile.getName()); var title = (args.val('t', 'title') || targetFile.getName()).replace('"', '\\"'); // https://manual.calibre-ebook.com/conversion.html $$.shell().commands('sh', '-c', 'ebook-convert ' + htmlFile.getAbsolutePath() + ' ' + targetFile.getAbsolutePath() + ' --title="' + title + '" --comments="" --language="en"' //+ '--authors="' + (args.val('author') || $$.env('USER')) + '"' + ' --book-producer="markdownconvert.js" --publisher="markdownconvert.js"' //+ ' --chapter="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter \')]"' // DEFAULT: //*[((name()='h1' or name()='h2') and re:test(., 'chapter|book|section|part\s+', 'i')) or @class = 'chapter'] + ' --chapter="//*[(name()=\'h2\') or @class = \'chapter\']"' + ' --chapter-mark="pagebreak" --page-breaks-before="/"' + ' --level1-toc="//*[(name()=\'h3\') or @class = \'section\']"' //+ ' --level1-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-1 \')]"' //+ ' --level2-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-2 \')]"' //+ ' --level3-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-3 \')]"' //+ ' --no-chapters-in-toc' //+ ' --pdf-add-toc' + ' --max-levels="1" --breadth-first' + ' --margin-left="62" --margin-right="62" --margin-top="56" --margin-bottom="56"' + ' --pdf-default-font-size="12" --pdf-mono-font-size="12"' + ' --paper-size="a4"' + ' --pdf-header-template="

_TITLE_

"' + ' --pdf-footer-template="

_SECTION_ _PAGENUM_

"') .run(); xprintln('[INFO] Clean up tmp files.'); htmlFile.delete(); FileUtil.deleteDirectory(tmpDir); } }; main();