Re: [Tclxml-users] itcl/tk-like calling syntax for TclDom
by Detlef Groth other posts by this author
Sep 15 2004 8:26AM messages near this date
[Tclxml-users] RE: Tclxml 3.0 problems
|
[Tclxml-users] Tclxml 3.0 problems
Hello, Ok I modified the the file dom.tcl inside TclDom3.0 in order to (get|set|remove)Attri
butes:
Here is the diff:
$ diff /d/home/dgroth/cvs/tclhttpd/customlib/tcldom3.0/dom.tcl /d/tcl-lib/tcldo
m3.0/dom.tcl
1211,1222d1210
< *Attribute {
< switch $node(node:nodeType) {
< textNode {}
< default {
< if {[llength $args] == 1} {
< set result [dom::element $method $token [lindex $args
0]]
< } else {
< set result [dom::element $method $token [lindex $args
0] [lindex $args 1]]
< }
< }
< }
< }
Might add something for (get|set|remove)AttributeNS too.
Now the following works for TclDom/tcl:
% lappend auto_path d:/home/dgroth/cvs/tclhttpd/customlib
D:/tcl-programme/tclkit/tclkit8.4.7-mingw.exe/lib/tcl8.4 D:/tcl-programme/tclkit/tclkit8.4.7
-mingw.exe/lib D:/tcl-programme/tclkit/tclkit8.4.7-mingw.exe/lib/tk8.4 d:/home/dgroth/cvs/tc
lhttpd/customlib
(tclkit) 2 % package require dom
3.0
(tclkit) 3 % set doc [dom::DOMImplementation create]
::dom::tcl::document1::Document
(tclkit) 4 % set top [$doc createElement html]
::dom::tcl::document1::node2
(tclkit) 5 % set head [$doc createElement head]
::dom::tcl::document1::node6
(tclkit) 6 % $top appendChild $head
::dom::tcl::document1::node6
(tclkit) 7 % set title [$doc createElement title]
::dom::tcl::document1::node13
(tclkit) 8 % $head appendChild $title
::dom::tcl::document1::node13
(tclkit) 9 % $title appendChild [$doc createTextNode "MPIMG Berlin - Mouse Database"]
::dom::tcl::document1::node20
(tclkit) 10 % set body [$doc createElement body]
::dom::tcl::document1::node30
(tclkit) 11 % $top appendChild $body
::dom::tcl::document1::node30
(tclkit) 12 % $body setAttribute bgcolor black
black
(tclkit) 13 % $body getAttribute bgcolor
black
(tclkit) 14 % dom::serialize $doc
<?xml version='1.0'?>
<!DOCTYPE html>
<html> <head><title>MPIMG Berlin - Mouse Database</title></head><body bgcolor="black"/></html
>
Looks good.
Should I add this to the feature requests?
regards,
Detlef
>
> On 15/09/2004, at 12:37 AM, Detlef Groth wrote:
>
> > I like the itcl/tk- and Tdom-like calling conventions for tdom:
>
> TclDOM version 3.0 has introduced that style of API, but not uniformly
> throughout the package (yet).
>
> At the time that I was implementing this feature I had an issue with
> overloading the document/node commands with methods for multiple node
> classes. For example, an element node is both a Node and an Element
> class object, so should have the methods for both the ::dom::node and
> ::dom::element commands. However, a TextNode or a Document node will
> have a different set a methods.
>
> > (tclkit) 82 % set doc [dom::DOMImplementation create]
> > ::dom::tcl::document7::Document
> > (tclkit) 83 % set top [dom::document createElement $doc html]
> > ::dom::tcl::document7::node2
> > (tclkit) 84 % set title [$doc createElement title]
> > ::dom::tcl::document7::node6
> > (tclkit) 85 % $top appendChild $title
> > ::dom::tcl::document7::node6
> > (tclkit) 86 % set body [$doc createElement body]
> > ::dom::tcl::document7::node13
> > (tclkit) 87 % $top appendChild $body
> > ::dom::tcl::document7::node13
> > (tclkit) 88 % $body setAttribute bgcolor black
> > unknown method "setAttribute"
> >
> > This does not work, however this:
> >
> > (tclkit) 90 % dom::element setAttribute $body bgcolor black
> > black
>
> Yes, that exactly the issue raised above. "setAttribute" is a method
> of the ::dom::element command. You'd like to be able to do:
>
> $body setAttribute bgcolor black
>
> What happens if you do:
>
> $doc setAttribute bgcolor black
>
> The latter should probably throw an exception.
>
> Making the former work would mean either defining the node command as a
> separate function and implementing every method from every node class
> command (for both Tcl and libxml2), or modifying the node command to
> call the class-specific function if the method is not defined
> (actually, the latter would be the best approach).
>
> > which is for me a little bit awkward, and I always forget to add the
> > nodename after the (get|set)Attribute-command. I am used to javascript
> > where we say something like:
> >
> > var input = window.document.createElement("input");
> > input.setAttribute("name", "inputvalue");
>
> Having to remember to add the node token does make the API a bit
> awkward, I agree.
>
> > It should be not to difficult to write some simple wrapper classes
> > with Snit or something similar. But using snit may slow down the code.
> > Did
> > anyone have a better suggestion?
>
> Do it in the TclDOM package itself; please submit a feature request to
> SF.
>
> At the moment I'm flat-out with other (paid-for) projects so I won't be
> able to do anything about it in the short-term. However, maybe someone
> else will step up to the plate and give it a go.
>
> > As a side effect the same code might run with tdom also.
>
> Ah... that's a sore point. You go talk to the tDOM people about
> compatibility :-(
>
> Cheers,
> Steve Ball
>
> ---
>
> Steve Ball | XSLT Standard Library | Training & Seminars
> Zveno Pty Ltd | Web Tcl Complete | XML XSL Schemas
> http://www.zveno.com/ | TclXML TclDOM | Tcl, Web Development
> Steve.Ball@[...].com +---------------------------+---------------------
> Ph. +61 2 6242 4099 | Mobile (0413) 594 462 | Fax +61 2 6242 4099
>
--
Dr. Detlef Groth
Max-Planck-Institut
fuer Molekulare Genetik
Ihnestr. 63/73
D-14195 Berlin
Tel.: + 49 30 - 8413 1235
-------------------------------------------------------
This SF.Net email is sponsored by: thawte's Crypto Challenge Vl
Crack the code and win a Sony DCRHC40 MiniDV Digital Handycam
Camcorder. More prizes in the weekly Lunch Hour Challenge.
Sign up NOW http://ad.doubleclick.net/clk;10740251;10262165;m
_______________________________________________
Tclxml-users mailing list
Tclxml-users@[...].net
https://lists.sourceforge.net/lists/listinfo/tclxml-users
|