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))
|
pushStack Value(kind: pkSignedInteger, int: parseInt($0))
|
||||||
|
|
||||||
Preserves.String <- Preserves.String:
|
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:
|
Preserves.charByteString <- Preserves.charByteString:
|
||||||
let s = unescape($1)
|
let s = unescape($1)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
|
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
import std/[json, options, streams]
|
import std/[json, options, streams, xmlparser, xmltree]
|
||||||
from std/os import extractFilename, paramStr
|
from std/os import extractFilename, paramStr
|
||||||
|
|
||||||
import ../../preserves, ../../preserves/jsonhooks, ../../preserves/parse
|
import ../../preserves, ../jsonhooks, ../parse, ../xmlhooks
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
let command = extractFilename(paramStr 0)
|
let command = extractFilename(paramStr 0)
|
||||||
|
@ -21,6 +21,11 @@ when isMainModule:
|
||||||
js = stdin.newFileStream.parseJson
|
js = stdin.newFileStream.parseJson
|
||||||
pr = js.toPreserve
|
pr = js.toPreserve
|
||||||
stdout.newFileStream.write(pr)
|
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":
|
of "preserves_to_json":
|
||||||
let
|
let
|
||||||
pr = stdin.readAll.decodePreserves
|
pr = stdin.readAll.decodePreserves
|
||||||
|
@ -29,6 +34,13 @@ when isMainModule:
|
||||||
stdout.writeLine(get js)
|
stdout.writeLine(get js)
|
||||||
else:
|
else:
|
||||||
quit("Preserves not convertable to JSON")
|
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:
|
else:
|
||||||
quit("no behavior defined for " & command)
|
quit("no behavior defined for " & command)
|
||||||
except:
|
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-FileCopyrightText: 2021 ☭ Emery Hemingway
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
import std/[options, tables, unittest]
|
import std/[options, tables, unittest, xmlparser, xmltree]
|
||||||
import preserves
|
import preserves, preserves/xmlhooks
|
||||||
|
|
||||||
suite "conversions":
|
suite "conversions":
|
||||||
test "dictionary":
|
test "dictionary":
|
||||||
|
@ -40,7 +40,26 @@ suite "conversions":
|
||||||
check(fromPreserve(c, b))
|
check(fromPreserve(c, b))
|
||||||
check(a == c)
|
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) =
|
template check(p: Preserve; s: string) =
|
||||||
test s: check($p == s)
|
test s: check($p == s)
|
||||||
check false.toPreserve, "#f"
|
check false.toPreserve, "#f"
|
||||||
|
|
Loading…
Reference in New Issue