Changeset 2025

Show
Ignore:
Timestamp:
04/15/10 16:33:38 (5 months ago)
Author:
x.pechoultres@…
Message:

Dom3: improve encoding support

Location:
trunk/modules/Dom3/source
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/modules/Dom3/source/read.cl

    r2013 r2025  
    4949        if (attrs["version"] != "") _x.xmlVersion := attrs["version"], 
    5050        if (attrs["encoding"] != "") ( 
    51                 _x.inputEncoding := attrs["encoding"], 
    5251                _x.xmlEncoding := attrs["encoding"]), 
    5352        _x] 
     
    8079                Sax/sax(parser), 
    8180                d)] 
    82 /* 
    83 [file2document!(pathFile:string) : Document 
    84 -> let d := Document() 
    85                 p := fopen(pathFile,"r") 
    86    in (Sax/sax(p,domStartHandler,domEndHandler,d), d)] 
    8781 
    88  
    89 // @chapter 2 
    90 // construct a node base XML tree given a raw of string 
    91 [makeXMLNode(rawtext:string) : XMLNode 
    92 -> let d := XMLNode(), 
    93                 p := port!(rawtext) 
    94    in (Sax/sax(p,domStartHandler,domEndHandler,d), 
    95                 d.children[1])] 
    96 /*              parseXMLStr(rawtext),  */ 
    97 //              d)] 
    98 /* 
    99 // @chapter 2 
    100 // nodes count in a XML tree 
    101 [count(n:(XMLNode U XMLDoc)) : integer  
    102 -> let i := 1  
    103    in (for sn in n.children (i :+ count(sn)),i)] 
    104  
    105  
    106  
    107 // @chapter 2 
    108 // access to named sub node  
    109 [subNodeOfName(self:XMLNode,nodeName:string) : (XMLNode U {unknown}) 
    110 -> some(i in self.children | insensitive=(i.tagname,nodeName))] 
    111  
    112 // @chapter 2 
    113 // access to named sub nodes  
    114 [subNodesOfName(self:Dom/XMLNode,nodeName:string) : set[Dom/XMLNode] 
    115 -> {i in self.children | insensitive=(i.tagname,nodeName)}] 
    116  
    117 // @chapter 2 
    118 // add named sub nodes  
    119 [addSubNodeWithName(self:Dom/XMLNode,keyname:string) : Dom/XMLNode 
    120 ->      let node := Dom/XMLNode(tagname = upper(keyname)) in (self.children :add node, node)] 
    121 */ 
     82[file(s:string) : Document 
     83-> let f := fopen(s,"r"), res := document!(f) in (fclose(f),res)] 
  • trunk/modules/Dom3/source/xmlcore.cl

    r2018 r2025  
    8080                        prefix:string, 
    8181                        localName:string, 
    82                         inputEncoding:string = "UTF-8", // An attribute specifying the encoding used for this document at the time of the parsing 
    83                         interfaceEncoding:string = "UTF-8", // encoding used when getting string 
    84                         xmlEncoding:string = "UTF-8", // An attribute specifying, as part of the XML declaration, the encoding of this document 
    8582                        xmlStandalone:boolean = false, // An attribute specifying, as part of the XML declaration, whether this document is standalone. This is false when unspecified 
    8683                        xmlVersion:string = "1.0" // An attribute specifying, as part of the XML declaration, the version number of this document. 
     
    9390                doctype:DocumentType, 
    9491                implementation:DOMImplementation = DOMImplementation(), 
    95                 documentElement:Element) 
     92                documentElement:Element, 
     93                mime:string = "application/xml", 
     94                interfaceEncoding:string = "UTF-8", // encoding used when getting string 
     95                xmlEncoding:string = "UTF-8") // An attribute specifying, as part of the XML declaration, the encoding of this document 
    9696 
    9797DocumentFragment <: Node() 
     
    104104 
    105105[createElement(doc:Document,tagname:string) : Element -> Element(ownerDocument = doc, tagName = tagname)] 
     106 
     107[createElement(elem:Element,tagname:string) : Element -> 
     108        let e := Element(ownerDocument = elem.ownerDocument, 
     109                        tagName = tagname) 
     110        in (appendChild(elem,e), 
     111                e)] 
     112 
    106113[createDocumentFragment(doc:Document) : DocumentFragment -> DocumentFragment()] 
    107114[createTextNode(doc:Document,_data:string) : Text -> Text(data = _data, ownerDocument = doc)] 
     
    178185        newChild] 
    179186 
     187[appendChild(node:Node,newChilds:list[Node]) : Node -> 
     188        //[3] appendChild(~S,~S) // node, newChilds, 
     189        for n in newChilds appendChild(node,n), 
     190        if (length(newChilds) > 0) last(newChilds) 
     191        else node] 
     192 
     193 
    180194 
    181195[hasChildNodes(node:Node) : boolean -> length(node.childNodes) > 0] 
     
    194208[nth(self:Node,key:string) : string 
    195209->      when attrib := some( a in self.attributes | (a.name = key)) in  
    196                 (if (attrib.ownerDocument.inputEncoding != attrib.ownerDocument.interfaceEncoding) 
    197                         Iconv/iconv(attrib.value,attrib.ownerDocument.interfaceEncoding,attrib.ownerDocument.inputEncoding) 
     210                (if (attrib.ownerDocument.xmlEncoding != attrib.ownerDocument.interfaceEncoding) 
     211                        Iconv/iconv(attrib.value,attrib.ownerDocument.interfaceEncoding,attrib.ownerDocument.xmlEncoding) 
    198212                else attrib.value ) else ""] 
    199213 
     
    201215// setting XML Node attribute 
    202216[nth=(self:Node,key:string,val:string) : void 
    203 ->      if (self.ownerDocument.inputEncoding != self.ownerDocument.interfaceEncoding) 
    204                 val := Iconv/iconv(val,self.ownerDocument.inputEncoding,self.ownerDocument.interfaceEncoding), 
     217->      if (self.ownerDocument.xmlEncoding != self.ownerDocument.interfaceEncoding) 
     218                val := Iconv/iconv(val,self.ownerDocument.xmlEncoding,self.ownerDocument.interfaceEncoding), 
    205219        when attrib := some( a in self.attributes | (a.name = key)) in ( 
    206220                attrib.value := val ) 
    207221        else self.attributes :add Attr(parentNode = self, ownerDocument = self.ownerDocument, name = key, value = val)] 
    208222 
     223[nth=(self:Node,key:string,val:integer) : void -> nth=(self,key,string!(val))] 
     224[nth=(self:Node,key:string,val:float) : void -> nth=(self,key,string!(val))] 
    209225 
    210226 
     
    235251Element <: Node(tagName:string) 
    236252 
    237 [getAttribute(elem:Element,attrname:string) : string -> elem[attrname]] 
    238  
    239 [setAttribute(elem:Element,attrname:string,val:string) : void -> elem[attrname] := val] 
     253[getAttribute(elem:Element,attrname:string) : string -> 
     254        if (elem.ownerDocument.interfaceEncoding != elem.ownerDocument.xmlEncoding) 
     255                Iconv/iconv(elem[attrname],elem.ownerDocument.interfaceEncoding,elem.ownerDocument.xmlEncoding) 
     256        else elem[attrname]] 
     257 
     258[setAttribute(elem:Element,attrname:string,val:string) : void -> 
     259        if (elem.ownerDocument.interfaceEncoding != elem.ownerDocument.xmlEncoding) 
     260                elem[attrname] := Iconv/iconv(val,elem.ownerDocument.xmlEncoding,elem.ownerDocument.interfaceEncoding) 
     261        else elem[attrname] := val] 
     262 
    240263[removeAttribute(elem:Element,attrname:string) : void -> when attrib := some( a in elem.attributes | (a.name = attrname)) in delete(elem.attributes,attrib)] 
    241264