Compare commits

...

2 commits

Author SHA1 Message Date
2cc899e9c6
change format 2024-10-30 15:49:27 -05:00
310347304d
add dev setup 2024-10-30 15:49:21 -05:00
2 changed files with 86 additions and 25 deletions

View file

@ -2,6 +2,8 @@ task build, "build":
switch("outdir", "bin") switch("outdir", "bin")
setCommand "c", "src/typstgen.nim" setCommand "c", "src/typstgen.nim"
task dev, "dev":
exec "nimble setup -l"
# begin Nimble config (version 2) # begin Nimble config (version 2)
--noNimblePath --noNimblePath

View file

@ -1,39 +1,90 @@
import std/[streams, tables, strutils, os] import std/[os, sequtils, streams, strutils, tables]
import yaml, hwylterm import yaml, hwylterm
type type
Component = Table[string, string]
TypstTemplate = object
keys: seq[string]
src: string
Config = object Config = object
components {.defaultVal: @[]}: seq[Table[string, string]] components {.defaultVal: @[]}: seq[Component]
templates {.defaultVal: initTable[string, string]()}: Table[string, string] templates {.defaultVal: initTable[string, TypstTemplate]()}: Table[string, TypstTemplate]
func `%`(t: TypstTemplate, a: openArray[string]): string =
t.src % a
proc checkTemplates(templates: Table[string, TypstTemplate]) =
## quit if any templates have the same keys
var keyTable: Table[string, seq[string]]
for name, templ in templates.pairs():
let k = templ.keys.join(";")
if k in keyTable:
keyTable[k].add name
else:
keyTable[k] = @[name]
for keys, names in keyTable.pairs():
if names.len > 1:
quit("non-unique key combos in templates: " & names.join(","))
proc typstGen(configPath: string) = proc addDefaultTemplates(c: var Config) =
# TODO: more default templates?
if "raw" notin c.templates:
c.templates["raw"] = TypstTemplate(keys: @["raw"], src: "$raw")
if "image" notin c.templates:
c.templates["image"] = TypstTemplate(keys: @["image"], src: """
#figure(
image("$image"),
caption: [$image]
)
"""
)
if "figure" notin c.templates:
c.templates["figure"] = TypstTemplate(keys: @["image", "caption"], src: """
#align(center)[
#figure(
image("$image"),
caption: [
$image
]
)
$caption
]
"""
)
proc loadConfig(configPath: string): Config =
var config: Config
var s = newFileStream(configPath) var s = newFileStream(configPath)
load(s, config) load(s, result)
s.close() close s
var output: string addDefaultTemplates result
checkTemplates result.templates
if not config.templates.hasKey("raw"): proc getTemplate(c: Config, component: Component): TypstTemplate =
config.templates["raw"] = "$text" let k = component.keys().toSeq()
for _, templ in c.templates.pairs():
if templ.keys == k:
return templ
quit($bb("[red]error[/] failed to find template for component:\n") & $component)
func componentToFmtArgs(t: Table[string, string]): seq[string] = func toFmtArgs(comp: Component): seq[string] =
for k, v in t.pairs: for k, v in comp.pairs: result.add k; result.add v
result.add k
result.add v
for component in config.components: proc applyTemplate(c: Config, component: Component): string =
var kind = "figure" let templ = c.getTemplate(component)
var component = component result = templ % component.toFmtArgs()
discard component.pop("kind", kind)
output &= config.templates[kind] % componentToFmtArgs(component)
echo output
proc typstGen(c: Config): string =
for component in c.components:
result &= c.applyTemplate(component)
when isMainModule: when isMainModule:
import hwylterm/[cli, parseopt3] import hwylterm/[cli, parseopt3]
@ -45,10 +96,13 @@ when isMainModule:
[ [
("h", "help", "show this help"), ("h", "help", "show this help"),
("c","config", "path to config file"), ("c","config", "path to config file"),
("","check", "load config and exit"),
] ]
) )
var p = initOptParser() var
var configPath = "typstgen.yml" p = initOptParser(longNoVal= @["check"])
configPath = "typstgen.yml"
check: bool
for kind, key, val in p.getopt(): for kind, key, val in p.getopt():
case kind case kind
of cmdError: quit($bb"[red]cli error[/]: " & p.message) of cmdError: quit($bb"[red]cli error[/]: " & p.message)
@ -60,9 +114,14 @@ when isMainModule:
writeHelp(); quit 0 writeHelp(); quit 0
of "config", "c": of "config", "c":
configPath = val configPath = val
of "check":
check = true
if not fileExists(configPath): if not fileExists(configPath):
quit($bbfmt("file: [b]{configPath}[/] does not exist")) quit($bbfmt("file: [b]{configPath}[/] does not exist"))
typstGen(configPath)
let config = loadConfig(configPath)
if check: quit 0
echo typstGen(config)