minpkg/lib/min_xml.nim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
import
std/xmlparser,
std/xmltree,
std/parsexml,
std/strtabs
import
../core/parser,
../core/value,
../core/interpreter,
../core/utils
let xmltypes = "dict:xml-text|dict:xml-verbatim-text|xml-element|xml-cdata|xml-comment"
proc newXDict(i: In, xml: XmlNode): MinValue =
result = newDict(i.scope)
case xml.kind:
of xnText:
result.objType = "xml-text"
i.dset(result, "text", xml.text.newVal)
of xnVerbatimText:
result.objType = "xml-verbatim-text"
i.dset(result, "text", xml.text.newVal)
of xnElement:
result.objType = "xml-element"
var children = newSeq[MinValue](0)
var attributes = newDict(i.scope)
for child in xml.items:
children.add i.newXDict(child)
i.dset(result, "children", children.newVal)
for attr in xml.attrs.pairs:
i.dset(attributes, attr.key, attr.value.newVal)
i.dset(result, "attributes", attributes)
of xnCData:
result.objType = "xml-cdata"
i.dset(result, "text", xml.text.newVal)
of xnEntity:
result.objType = "xml-entity"
i.dset(result, "text", xml.text.newVal)
of xnComment:
result.objType = "xml-comment"
i.dset(result, "text", xml.text.newVal)
proc xml_module*(i: In) =
let def = i.define()
def.symbol("xparse") do (i: In):
let vals = i.expect("str")
let s = vals[0].getString()
try:
let xml = parseXml(s, {reportComments, allowUnquotedAttribs, allowEmptyAttribs})
i.push(i.newXDict(xml))
except CatchableError:
let msg = getCurrentExceptionMsg()
raiseInvalid(msg)
def.symbol("xcomment") do (i: In):
let vals = i.expect("'sym")
i.push i.newXDict(newComment(vals[0].getString))
def.symbol("xcdata") do (i: In):
let vals = i.expect("'sym")
i.push i.newXDict(newCData(vals[0].getString))
def.symbol("xtext") do (i: In):
let vals = i.expect("'sym")
i.push i.newXDict(newText(vals[0].getString))
def.symbol("xverbatimtext") do (i: In):
let vals = i.expect("'sym")
i.push i.newXDict(newVerbatimText(vals[0].getString))
def.symbol("xentity") do (i: In):
let vals = i.expect("'sym")
i.push i.newXDict(newEntity(vals[0].getString))
def.symbol("xchildren") do (i: In):
let vals = i.expect("dict:xml")
def.finalize("xml")
|