35 lines
1.3 KiB
Nim
35 lines
1.3 KiB
Nim
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
import std/[options, parsexml, xmlparser, xmltree]
|
|
import preserves, preserves/sugar, preserves/xmlhooks
|
|
import syndicate
|
|
|
|
import ../schema/[assertions, config]
|
|
|
|
proc translateXml(s: string): XmlTranslation =
|
|
result.xml = s
|
|
try: result.pr = result.xml.parseXml({allowUnquotedAttribs}).toPreservesHook
|
|
except XmlError: discard
|
|
|
|
proc translatePreserves(pr: Value): XmlTranslation {.gcsafe.} =
|
|
result.pr = pr
|
|
var xn = result.pr.preservesTo(XmlNode)
|
|
if xn.isSome: result.xml = $get(xn)
|
|
|
|
proc spawnXmlTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
|
|
spawnActor(turn, "xml-translator") do (turn: var Turn):
|
|
during(turn, root, ?:XmlTranslatorArguments) do (ds: Cap):
|
|
let xmlPat = observePattern(!XmlTranslation, {@[%0]:grab()})
|
|
during(turn, ds, xmlPat) do (xs: Literal[string]):
|
|
publish(turn, ds, translateXml(xs.value))
|
|
let prPat = observePattern(!XmlTranslation, {@[%1]:grab()})
|
|
during(turn, ds, prPat) do (pr: Literal[Value]):
|
|
publish(turn, ds, translatePreserves(pr.value))
|
|
|
|
when isMainModule:
|
|
import syndicate/relays
|
|
runActor("main") do (turn: var Turn):
|
|
resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
|
|
spawnXmlTranslator(turn, ds)
|