added xml-loader
This commit is contained in:
@ -1,13 +1,10 @@
|
||||
#import "config.typ" as conf
|
||||
#import "renderer.typ"
|
||||
#import "structure.typ"
|
||||
#import "xml-loader.typ"
|
||||
|
||||
#let valid-extensions = ("yaml", "json", "xml")
|
||||
|
||||
#let parse-xml(path) = {
|
||||
panic("TODO")
|
||||
}
|
||||
|
||||
#let parse-file(path) = {
|
||||
let ext = path.split(".").last()
|
||||
|
||||
@ -22,7 +19,7 @@
|
||||
} else if ext == "json" {
|
||||
return json(path)
|
||||
} else if ext == "xml" {
|
||||
return parse-xml(path)
|
||||
return xml-loader.load(path)
|
||||
}
|
||||
}
|
||||
|
||||
|
100
src/xml-loader.typ
Normal file
100
src/xml-loader.typ
Normal file
@ -0,0 +1,100 @@
|
||||
#let find(elmt, tag) = {
|
||||
if not "children" in elmt {
|
||||
return none
|
||||
}
|
||||
|
||||
return elmt.children.find(e => "tag" in e and e.tag == tag)
|
||||
}
|
||||
|
||||
#let find-all(elmt, tag) = {
|
||||
if not "children" in elmt {
|
||||
return ()
|
||||
}
|
||||
|
||||
return elmt.children.filter(e => "tag" in e and e.tag == tag)
|
||||
}
|
||||
|
||||
#let parse-values(elmt) = {
|
||||
let values = (:)
|
||||
let case-elmts = find-all(elmt, "case")
|
||||
|
||||
for case-elmt in case-elmts {
|
||||
let val = case-elmt.attrs.value
|
||||
let desc = case-elmt.children.first()
|
||||
let struct = none
|
||||
if "structure" in case-elmt.attrs {
|
||||
struct = case-elmt.attrs.structure
|
||||
}
|
||||
|
||||
values.insert(val,
|
||||
if struct != none {
|
||||
(
|
||||
description: desc,
|
||||
structure: struct
|
||||
)
|
||||
} else {
|
||||
desc
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return values
|
||||
}
|
||||
|
||||
#let parse-range(elmt) = {
|
||||
let range_ = (
|
||||
name: elmt.attrs.name
|
||||
)
|
||||
let desc = none
|
||||
if "children" in elmt {
|
||||
desc = find(elmt, "description")
|
||||
}
|
||||
|
||||
if desc != none {
|
||||
range_.insert("description", desc.children.first())
|
||||
}
|
||||
|
||||
let values-elmt = find(elmt, "values")
|
||||
if values-elmt != none {
|
||||
range_.insert("values", parse-values(values-elmt))
|
||||
}
|
||||
|
||||
if "depends-on" in elmt.attrs {
|
||||
range_.insert("depends-on", elmt.attrs.depends-on)
|
||||
}
|
||||
|
||||
return range_
|
||||
}
|
||||
|
||||
#let parse-structure(elmt) = {
|
||||
let ranges = (:)
|
||||
let range-elmts = elmt.children.filter(e => "tag" in e and e.tag == "range")
|
||||
|
||||
for range-elmt in range-elmts {
|
||||
let span = range-elmt.attrs.end + "-" + range-elmt.attrs.start
|
||||
ranges.insert(span, parse-range(range-elmt))
|
||||
}
|
||||
|
||||
return (
|
||||
bits: elmt.attrs.bits,
|
||||
ranges: ranges
|
||||
)
|
||||
}
|
||||
|
||||
#let load(path) = {
|
||||
let content = xml(path).first()
|
||||
let struct-elmts = content.children.filter(e => "tag" in e and e.tag == "structure")
|
||||
|
||||
let structures = (:)
|
||||
|
||||
for struct-elmt in struct-elmts {
|
||||
structures.insert(
|
||||
struct-elmt.attrs.id,
|
||||
parse-structure(struct-elmt)
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
structures: structures
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user