Compare commits
2 Commits
200e0a0080
...
a466930e6e
Author | SHA1 | Date |
---|---|---|
|
a466930e6e | |
|
7d8c3b29c2 |
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue