2024-05-19 10:11:41 +00:00
|
|
|
#import "config.typ" as conf
|
|
|
|
#import "renderer.typ"
|
|
|
|
#import "structure.typ"
|
2024-05-19 10:47:52 +00:00
|
|
|
#import "xml-loader.typ"
|
2024-05-19 10:11:41 +00:00
|
|
|
|
|
|
|
#let valid-extensions = ("yaml", "json", "xml")
|
|
|
|
|
|
|
|
#let parse-file(path) = {
|
|
|
|
let ext = path.split(".").last()
|
|
|
|
|
|
|
|
if not ext in valid-extensions {
|
|
|
|
let fmts = valid-extensions.map(fmt => "." + fmt).join(", ")
|
|
|
|
fmts = "(" + fmts + ")"
|
|
|
|
panic("." + ext + " files are not supported. Valid formats: " + fmts)
|
|
|
|
}
|
|
|
|
|
|
|
|
if ext == "yaml" {
|
|
|
|
return yaml(path)
|
|
|
|
} else if ext == "json" {
|
|
|
|
return json(path)
|
|
|
|
} else if ext == "xml" {
|
2024-05-19 10:47:52 +00:00
|
|
|
return xml-loader.load(path)
|
2024-05-19 10:11:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-19 15:29:16 +00:00
|
|
|
#let parse-raw(schema) = {
|
|
|
|
let lang = schema.lang
|
|
|
|
let content = schema.text
|
|
|
|
if not lang in valid-extensions {
|
2024-05-19 15:34:55 +00:00
|
|
|
let fmts = valid-extensions.join(", ")
|
2024-05-19 15:29:16 +00:00
|
|
|
fmts = "(" + fmts + ")"
|
|
|
|
panic("Unsupported format '" + lang + "'. Valid formats: " + fmts)
|
|
|
|
}
|
|
|
|
|
|
|
|
if lang == "yaml" {
|
|
|
|
return yaml.decode(content)
|
|
|
|
} else if lang == "json" {
|
|
|
|
return json.decode(content)
|
|
|
|
} else if lang == "xml" {
|
|
|
|
return xml-loader.parse(xml.decode(content).first())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#let load(path-or-schema) = {
|
2024-05-19 10:11:41 +00:00
|
|
|
let schema = if type(path-or-schema) == str {
|
|
|
|
parse-file(path-or-schema)
|
2024-06-14 08:17:19 +00:00
|
|
|
} else if type(path-or-schema) == dictionary {
|
|
|
|
path-or-schema
|
2024-05-19 10:11:41 +00:00
|
|
|
} else {
|
|
|
|
parse-raw(path-or-schema)
|
|
|
|
}
|
|
|
|
|
|
|
|
let structures = (:)
|
|
|
|
for (id, data) in schema.structures {
|
|
|
|
id = str(id)
|
|
|
|
structures.insert(id, structure.load(id, data))
|
|
|
|
}
|
2024-06-14 09:20:32 +00:00
|
|
|
return (
|
|
|
|
structures: structures,
|
|
|
|
colors: schema.at("colors", default: (:))
|
|
|
|
)
|
2024-05-19 10:11:41 +00:00
|
|
|
}
|
|
|
|
|
2024-06-14 09:20:32 +00:00
|
|
|
#let render(schema, width: 100%, config: auto) = {
|
2024-05-19 10:11:41 +00:00
|
|
|
if config == auto {
|
|
|
|
config = conf.config()
|
|
|
|
}
|
|
|
|
let renderer_ = renderer.make(config)
|
2024-06-14 09:20:32 +00:00
|
|
|
(renderer_.render)(schema, width: width)
|
2024-05-19 10:11:41 +00:00
|
|
|
}
|