Compare commits

...

2 Commits

Author SHA1 Message Date
Emery Hemingway a466930e6e Hack to unescape \n 2021-12-11 18:32:37 +00:00
Emery Hemingway 7d8c3b29c2 XML conversion 2021-12-06 23:57:47 +00:00
4 changed files with 109 additions and 6 deletions

View File

@ -74,7 +74,7 @@ proc parsePreserves*(text: string): Preserve[void] {.gcsafe.} =
pushStack Value(kind: pkSignedInteger, int: parseInt($0))
Preserves.String <- Preserves.String:
pushStack Value(kind: pkString, string: unescape($0))
pushStack Value(kind: pkString, string: unescape($0).replace("\\n", "\n"))
Preserves.charByteString <- Preserves.charByteString:
let s = unescape($1)

View File

@ -1,10 +1,10 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[json, options, streams]
import std/[json, options, streams, xmlparser, xmltree]
from std/os import extractFilename, paramStr
import ../../preserves, ../../preserves/jsonhooks, ../../preserves/parse
import ../../preserves, ../jsonhooks, ../parse, ../xmlhooks
when isMainModule:
let command = extractFilename(paramStr 0)
@ -21,6 +21,11 @@ when isMainModule:
js = stdin.newFileStream.parseJson
pr = js.toPreserve
stdout.newFileStream.write(pr)
of "preserves_from_xml":
let
xn = stdin.newFileStream.parseXml
pr = xn.toPreserveHook(void)
stdout.newFileStream.write(pr)
of "preserves_to_json":
let
pr = stdin.readAll.decodePreserves
@ -29,6 +34,13 @@ when isMainModule:
stdout.writeLine(get js)
else:
quit("Preserves not convertable to JSON")
of "preserves_to_xml":
let pr = stdin.readAll.decodePreserves
var xn: XmlNode
if fromPreserveHook(xn, pr):
stdout.writeLine(xn)
else:
quit("Preserves not convertable to XML")
else:
quit("no behavior defined for " & command)
except:

View File

@ -0,0 +1,72 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[xmltree, strtabs, tables]
import ../preserves
proc toPreserveHook*(xn: XmlNode; E: typedesc): Preserve[E] =
case xn.kind
of xnElement:
var children = initSequence[E](xn.len)
var i: int
for child in xn.items:
children[i] = toPreserveHook(child, E)
inc i
var attrMap = initDictionary[E]()
if not xn.attrs.isNil:
for key, val in xn.attrs.pairs:
attrMap[toSymbol(key, E)] = toPreserve(val, E)
result = initRecord[E](xn.tag, attrMap, children)
of xnText:
result = toPreserve(xn.text, E)
of xnVerbatimText:
result = initRecord[E]("verbatim", xn.text.toPreserve(E))
of xnComment:
result = initRecord[E]("comment", xn.text.toPreserve(E))
of xnCData:
result = initRecord[E]("cdata", xn.text.toPreserve(E))
of xnEntity:
result = initRecord[E]("entity", xn.text.toPreserve(E))
proc fromPreserveHook*[E](xn: var XmlNode; pr: Preserve[E]): bool =
case pr.kind:
of pkString:
xn = newText(pr.string)
result = true
of pkRecord:
if pr.len == 2 and pr[0].isDictionary and pr[1].isSequence and pr.label.isSymbol:
xn = newElement(pr[2].symbol)
result = true
if pr[0].len > 0:
var attrs = newStringTable()
for key, val in pr[0].dict.items:
if not (key.isSymbol and val.isString):
result = false
break
attrs[key.symbol] = val.string
xn.attrs = attrs
var child: XmlNode
for e in pr[1]:
result = fromPreserveHook(child, e)
if not result: break
xn.add(move child)
if not result: reset xn
elif pr.len == 1 and pr.label.isSymbol:
result = true
case pr.label.symbol:
of "verbatim":
xn = newVerbatimText(pr[0].string)
of "comment":
xn = newComment(pr[0].string)
of "cdata":
xn = newCData(pr[0].string)
of "entity":
xn = newEntity(pr[0].string)
else:
result = false
else: discard
when isMainModule:
var xn = XmlNode()
var pr = xn.toPreserveHook(void)
assert fromPreserveHook(xn, pr)

View File

@ -1,8 +1,8 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[options, tables, unittest]
import preserves
import std/[options, tables, unittest, xmlparser, xmltree]
import preserves, preserves/xmlhooks
suite "conversions":
test "dictionary":
@ -40,7 +40,26 @@ suite "conversions":
check(fromPreserve(c, b))
check(a == c)
suite "%":
test "XML":
var a: XmlNode
var b = parseXML """
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="10cm" height="3cm" viewBox="0 0 1000 300" version="1.1">
<desc>Example text01 - 'Hello, out there' in blue</desc>
<text x="250" y="150" font-family="Verdana" font-size="55" fill="blue">
Hello, out there
</text>
<!-- Show outline of canvas using 'rect' element -->
<rect x="1" y="1" width="998" height="298" fill="none" stroke="blue" stroke-width="2"/>
</svg>
"""
var pr = toPreserve(b, void)
checkpoint $pr
check fromPreserve(a, pr)
suite "toPreserve":
template check(p: Preserve; s: string) =
test s: check($p == s)
check false.toPreserve, "#f"