gmi-web/cli.js
Talon Poole 9184e2c792 enable stdio API
--body returns just the innerHTML of the body
gmi.min.css is created in the script not by Makefile
refactor yargs code, better --help menu
2021-02-11 20:57:08 +00:00

121 lines
2.5 KiB
JavaScript
Executable file

#!/usr/bin/env node
import { readFileSync } from "fs";
import path from "path";
import fs from "vinyl-fs";
import map from "map-stream";
import yargs from "yargs";
import CleanCSS from "clean-css";
import toHTML, { BASE_CSS, html } from "./gmi.html.js";
const cli = yargs(process.argv.slice(2))
.scriptName("gmi-web")
.command("$0 [files..]", "Convert text/gemini to text/html.", (yargs) => yargs
//yargs.positional("files")
)
.options({
language: {
alias: "lang",
required: true,
},
css: {
type: "boolean",
default: true,
},
});
cli.options({
images: {
type: "boolean",
},
audio: {
type: "boolean",
},
video: {
type: "boolean",
},
});
// TODO: automatically pull these in from gmi.css (also for gmi.css(5))
const GMI_CSS_VARS = [
"body-width",
"foreground",
"background",
"p-size",
"p-indent",
"p-line-height",
"a-size",
"pre-size",
"pre-line-height",
"h1-size",
"h2-size",
"h3-size",
"heading-line-height",
"ul-size",
"ul-line-height",
"blockquote-size",
"blockquote-line-height",
"mono",
"serif",
"sans-serif",
].map((key) => {
cli.option(key);
return key;
});
const argv = cli
.group(["language", "css"], "Core:")
.group(GMI_CSS_VARS, "CSS Variables:")
.group(["images", "audio", "video"], "Inline Media:")
.config()
.example("$0 --lang en $(find ~/my-capsule -name '*.gmi')")
.example("cat ~/my-capsule/index.gmi | $0 --lang en")
.epilog("See the gmi-web(1) man page for more information!")
.showHelpOnFail(true)
.help().argv;
argv.css = argv.css || BASE_CSS;
let styles = "";
if (argv.css) {
styles = GMI_CSS_VARS.reduce((style, key) => {
if (argv[key]) {
style += `--${key}: ${argv[key]};`;
}
}, styles);
argv.css = new CleanCSS().minify(
readFileSync(
// TODO import.meta.resolve is supposed to accomplish this without "path"
path.resolve(
path.dirname(new URL(import.meta.url).pathname),
"./gmi.css"
),
"utf8"
)
).styles;
}
if (!argv.files) {
let gemtext
try {
gemtext = readFileSync(process.stdin.fd)
} catch (e) {
console.error("Either send a file to this program from stdin")
console.error("or provide [files..]\n")
console.error("See --help or read gmi-web(1) for usage details.")
process.exit(1)
}
console.log(html({ contents: gemtext }, argv))
} else {
fs.src(argv.files)
.pipe(
map(
toHTML({
...argv,
styles,
})
)
)
.pipe(fs.dest((file) => path.dirname(file.path)));
}