Compare commits

...

3 Commits

Author SHA1 Message Date
def17c7072 feat: add cover 2022-04-29 23:53:01 +09:00
d0ea5d1b1b feat: print to PDF 2022-04-29 01:00:41 +09:00
1f1e99e690 feat: add serve 2022-04-28 23:04:51 +09:00
4 changed files with 132 additions and 15 deletions

3
.gitattributes vendored
View File

@ -1 +1,2 @@
* text eol=lf * text eol=lf
*.pdf binary

75
cli.py
View File

@ -5,6 +5,20 @@ import subprocess
import sys import sys
import os import os
def updateIssue(issuePath: str, verbose = False):
if verbose:
print("get issues")
p = subprocess.run(["deno", "run", "-A","tools/getIssue.ts", "--path",issuePath])
p.check_returncode()
def printDocument(issuePath:str, outDir:str, watch = False, verbose = False):
if verbose:
print("build document")
cmd = ["deno", "run", "-A","tools/printDocument.ts", "--issue_path", issuePath, "--outDir", outDir]
if watch:
cmd.append("--watch")
p = subprocess.run(cmd)
p.check_returncode()
def build(args): def build(args):
parser = argparse.ArgumentParser(description='Compiling the documentation', prog="cli.py build") parser = argparse.ArgumentParser(description='Compiling the documentation', prog="cli.py build")
@ -19,17 +33,26 @@ def build(args):
issuePath = os.path.join(args.outDir,"issues.json") issuePath = os.path.join(args.outDir,"issues.json")
if args.update_issues: if args.update_issues:
if args.verbose: updateIssue(issuePath, args.verbose)
print("get issues") printDocument(issuePath, args.outDir, args.watch, args.verbose)
p = subprocess.run(["deno", "run", "-A","tools/getIssue.ts", "--path",issuePath])
p.check_returncode() def serve(args):
"""serve the documentation and reload on changes"""
parser = argparse.ArgumentParser(description='Serve the documentation and reload changes', prog="cli.py serve")
parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode')
parser.add_argument('-p', '--port', default=3000, help='port')
parser.add_argument('--update_issues', action='store_true', help='update issues')
outDir = "build"
issuePath = os.path.join(outDir,"issues.json")
args = parser.parse_args(args)
if args.verbose: if args.verbose:
print("build issues") print("serve start")
cmd = ["deno", "run", "-A","tools/printDocument.ts", "--issue_path", issuePath, "--outDir", args.outDir] cmd = ["mdbook", "serve", "--port", str(args.port)]
if args.watch: p = subprocess.Popen(cmd)
cmd.append("--watch") printDocument(issuePath, outDir, True, args.verbose)
p = subprocess.run(cmd) p.wait()
p.check_returncode() if p.returncode != 0:
sys.exit(p.returncode)
def help(_args): def help(_args):
global commandList global commandList
@ -42,16 +65,40 @@ def issueUpdate(args):
parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode') parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode')
parser.add_argument('--outDir', default="build", help='output directory') parser.add_argument('--outDir', default="build", help='output directory')
args = parser.parse_args(args) args = parser.parse_args(args)
if args.verbose:
print("update issues")
issuePath = os.path.join(args.outDir,"issues.json") issuePath = os.path.join(args.outDir,"issues.json")
p = subprocess.run(["deno", "run", "-A","tools/getIssue.ts", "--path",issuePath]) updateIssue(issuePath, args.verbose)
def buildPdf(args):
parser = argparse.ArgumentParser(description='Print to pdf', prog="cli.py buildPdf")
parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode')
parser.add_argument('--outDir', default="build/doc.pdf", help='output directory')
parser.add_argument('--browser-path', help='path to the browser')
args = parser.parse_args(args)
absPath = os.path.normpath(os.path.join( os.getcwd(),'book' , 'print.html' )).replace('\\', '/')
url = f"file://{absPath}"
if args.verbose:
print("build start")
print("print url", url)
cmd = ["deno", "run","--no-check","--unstable" ,"-A","tools/printPdf.ts", "--outDir", args.outDir, "--url", url]
if args.browser_path:
cmd.append("--chromeDir")
cmd.append(args.browser_path)
if args.verbose:
print("cmd: ", " ".join(cmd))
p = subprocess.run(cmd)
p.check_returncode()
cmd = ["java", "-jar", "tools/pdfbox-app-2.0.26.jar", "PDFMerger", "cover.pdf", args.outDir, args.outDir]
if args.verbose:
print("merge cmd: ", " ".join(cmd))
p = subprocess.run(cmd)
p.check_returncode() p.check_returncode()
commandList = { commandList = {
'build': build, 'build': build,
'help': help, 'help': help,
'issueUpdate': issueUpdate 'issueUpdate': issueUpdate,
'serve': serve,
'buildPdf': buildPdf
} }
def main(): def main():

BIN
cover.pdf Normal file

Binary file not shown.

69
tools/printPdf.ts Normal file
View File

@ -0,0 +1,69 @@
import puppeteer from "https://deno.land/x/puppeteer@9.0.2/mod.ts";
import { parse as argParse } from "https://deno.land/std@0.136.0/flags/mod.ts";
import {join as pathJoin} from "https://deno.land/std@0.136.0/path/mod.ts";
const executablePathMap = {
windows: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
//"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
darwin: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
linux: "/usr/bin/chromium-browser",
};
function findChromeDir(){
const dir = executablePathMap[Deno.build.os];
if (Deno.build.os === "linux"){
const pathes = Deno.env.get("PATH")?.split(";");
if(!pathes){
return dir;
}
for (const path of pathes){
const entries = [...Deno.readDirSync(path)];
const chrome = entries.find((entry) => entry.name === "chrome");
if(chrome) {
return pathJoin(path, chrome.name);
}
}
}
return dir;
}
async function main() {
const args = argParse(Deno.args);
let { url, outDir, chromeDir } = args;
if (!url) {
console.error("No url provided.");
Deno.exit(1);
}
outDir = outDir ?? "out.pdf";
if(!chromeDir) {
console.log("No chromeDir provided. Try to find chrome.");
chromeDir = findChromeDir();
console.log(`chromeDir: ${chromeDir}`);
}
const browser = await puppeteer.launch({
product: "chrome",
headless: true,
executablePath: chromeDir,
});
const page = await browser.newPage();
console.log(`goto url ${url}`);
await page.goto(url, {
waitUntil: "networkidle2",
});
await page.pdf({
path: outDir,
margin: {
bottom: "1cm",
left: "1cm",
right: "1cm",
top: "1cm",
}
});
await browser.close();
}
if (import.meta.main) {
main();
}