using xml

** Contains human-readable text.
** @see The [Text]`` Construct
class Text {
    private static const XNs xmlNs  := XNs("xml", ``)
    ** *(Required)*
    ** The human-readable text. This should not be XML escaped.
    Str         content
    ** *(Required)*
    ** Determines how the 'content' is encoded / escaped.
    TextType    type

    ** *(Optional)* Used to control how relative URIs are resolved.
    Uri? xmlBase

    ** *(Optional)* Used to identify the language of any human readable text.  
    Str? xmlLang

    ** Creates a 'Text' with the required fields.
    ** Note that 'content' should *not* be XML escaped in any way as this will be done 
    ** automatically, dependent on the 'TextType' value.
    new make(Str content, TextType type := TextType.text) {
        this.content    = content
        this.type       = type
    ** Creates a Text element with the given element name.
    virtual XElem toXml(Str elementName) {
        text := XElem(elementName)

        if (xmlLang != null)
            text.addAttr("lang", xmlLang.toStr, xmlNs)

        if (xmlBase != null)
            text.addAttr("base", xmlBase.encode, xmlNs)

        text.addAttr("type", type.toStr)
        return text