69 lines
1.6 KiB
Nim
69 lines
1.6 KiB
Nim
|
import std/[streams, tables, strutils, os]
|
||
|
import yaml, hwylterm
|
||
|
|
||
|
|
||
|
type
|
||
|
Config = object
|
||
|
components {.defaultVal: @[]}: seq[Table[string, string]]
|
||
|
templates {.defaultVal: initTable[string, string]()}: Table[string, string]
|
||
|
|
||
|
|
||
|
proc typstGen(configPath: string) =
|
||
|
|
||
|
var config: Config
|
||
|
var s = newFileStream(configPath)
|
||
|
load(s, config)
|
||
|
s.close()
|
||
|
|
||
|
var output: string
|
||
|
|
||
|
if not config.templates.hasKey("raw"):
|
||
|
config.templates["raw"] = "$text"
|
||
|
|
||
|
|
||
|
func componentToFmtArgs(t: Table[string, string]): seq[string] =
|
||
|
for k, v in t.pairs:
|
||
|
result.add k
|
||
|
result.add v
|
||
|
|
||
|
for component in config.components:
|
||
|
var kind = "figure"
|
||
|
var component = component
|
||
|
discard component.pop("kind", kind)
|
||
|
output &= config.templates[kind] % componentToFmtArgs(component)
|
||
|
|
||
|
echo output
|
||
|
|
||
|
|
||
|
when isMainModule:
|
||
|
import hwylterm/[cli, parseopt3]
|
||
|
proc writeHelp() =
|
||
|
echo newHwylCli(
|
||
|
"[bold]typstgen[/] [[[faint]-h[/]]",
|
||
|
"""
|
||
|
typstgen --config typstgen.yml""",
|
||
|
[
|
||
|
("h", "help", "show this help"),
|
||
|
("c","config", "path to config file"),
|
||
|
]
|
||
|
)
|
||
|
var p = initOptParser()
|
||
|
var configPath = "typstgen.yml"
|
||
|
for kind, key, val in p.getopt():
|
||
|
case kind
|
||
|
of cmdError: quit($bb"[red]cli error[/]: " & p.message)
|
||
|
of cmdEnd: assert false
|
||
|
of cmdArgument: quit($bb"[red] unexpected argument[/]: " & key)
|
||
|
of cmdShortOption, cmdLongOption:
|
||
|
case key
|
||
|
of "help", "h":
|
||
|
writeHelp(); quit 0
|
||
|
of "config", "c":
|
||
|
configPath = val
|
||
|
|
||
|
if not fileExists(configPath):
|
||
|
quit($bbfmt("file: [b] {configPath} does not exist"))
|
||
|
typstGen(configPath)
|
||
|
|
||
|
|