Add XHTML to schema, translate XML to Preserves

This commit is contained in:
Emery Hemingway 2021-12-25 20:20:32 +01:00
parent cffcac71df
commit e2e5cbd1d9
2 changed files with 62 additions and 3 deletions

View File

@ -1,14 +1,61 @@
import
std/typetraits, preserves, std/tables
std/typetraits, preserves, std/tables, std/tables, std/tables, std/tables
type
XmlNodeKind* {.pure.} = enum
`XmlElement`, `XmlText`
`XmlNode`* {.preservesOr.} = object
case orKind*: XmlNodeKind
of XmlNodeKind.`XmlElement`:
`xmlelement`*: XmlElement
of XmlNodeKind.`XmlText`:
`xmltext`*: XmlText
XmlText* {.preservesTuple.} = object
`data`*: string
Svui*[E] {.preservesRecord: "svui".} = ref object
`attrs`*: Table[string, Preserve[E]]
`svg`*: string
`data`*: Content
XmlElement* {.preservesTuple.} = object
`name`* {.preservesSymbol.}: string
`attrs`*: Table[string, string]
`elements`* {.preservesTupleTail.}: seq[XmlNode]
Svg* {.preservesTuple.} = object
`data`* {.preservesLiteral: "svg".}: bool
`attrs`*: Table[string, string]
`elements`* {.preservesTupleTail.}: seq[XmlNode]
Xhtml* {.preservesTuple.} = object
`data`* {.preservesLiteral: "html".}: bool
`attrs`*: Table[string, string]
`elements`* {.preservesTupleTail.}: seq[XmlNode]
ContentKind* {.pure.} = enum
`Svg`, `Xhtml`
`Content`* {.preservesOr.} = object
case orKind*: ContentKind
of ContentKind.`Svg`:
`svg`*: Svg
of ContentKind.`Xhtml`:
`xhtml`*: Xhtml
proc `$`*[E](x: Svui[E]): string =
`$`(toPreserve(x, E))
proc encode*[E](x: Svui[E]): seq[byte] =
encode(toPreserve(x, E))
proc `$`*(x: XmlNode | XmlText | XmlElement | Svg | Xhtml | Content): string =
`$`(toPreserve(x))
proc encode*(x: XmlNode | XmlText | XmlElement | Svg | Xhtml | Content): seq[
byte] =
encode(toPreserve(x))

View File

@ -1,3 +1,15 @@
version 1.
Svui = <svui @attrs {symbol: any ...:...} @svg string>.
XmlText = [ string ].
XmlElement = [@name symbol @attrs {string: string ...:...} @elements XmlNode ...].
XmlNode = XmlElement / XmlText .
Svg = [=svg @attrs {string: string ...:...} @elements XmlNode ...].
Xhtml = [=html @attrs {string: string ...:...} @elements XmlNode ...].
Content = Svg / Xhtml .
Svui = <svui @attrs {string: any ...:...} @data Content>.