// creation of an HTML element var $module = (function($B){ var _b_ = $B.builtins var $TagSumDict = $B.$TagSum.$dict var $s=[] for(var $b in _b_) $s.push('var ' + $b +'=_b_["'+$b+'"]') eval($s.join(';')) var $svgNS = "http://www.w3.org/2000/svg" var $xlinkNS = "http://www.w3.org/1999/xlink" function makeTagDict(tagName){ // return the dictionary for the class associated with tagName var dict = {__class__:$B.$type, __name__:tagName } dict.__getattribute__ = function(self, attr){ if(self.elt.hasAttributeNS(null, attr)){ return self.elt.getAttributeNS(null,attr) } if(dict[attr]!==undefined){ return function(){ var args = [self].concat(Array.prototype.slice.call(arguments)) return dict[attr].apply(null, args) } } return $B.DOMNodeDict.__getattribute__(self, attr) } dict.__init__ = function(){ var $ns=$B.args('__init__',1,{self:null},['self'], arguments,{},'args','kw') var self = $ns['self'] var args = $ns['args'] if(args.length==1){ var first=args[0] if(isinstance(first,[str,int,float])){ self.elt.appendChild(document.createTextNode(str(first))) } else if(first.__class__===$TagSumDict){ for(var i=0, _len_i = first.children.length; i < _len_i;i++){ self.elt.appendChild(first.children[i].elt) } } else { // argument is another DOMNode instance try{self.elt.appendChild(first.elt)} catch(err){throw ValueError('wrong element '+first)} } } // attributes var items = _b_.list(_b_.dict.$dict.items($ns['kw'])) for(var i=0, _len_i = items.length; i < _len_i;i++){ // keyword arguments var arg = items[i][0] var value = items[i][1] if(arg.toLowerCase().substr(0,2)==="on"){ // Event binding passed as argument "onclick", "onfocus"... // Better use method bind of DOMNode objects var js = '$B.DOMNodeDict.bind(self,"' js += arg.toLowerCase().substr(2) eval(js+'",function(){'+value+'})') }else if(arg.toLowerCase()=="style"){ $B.DOMNodeDict.set_style(self,value) }else if(arg.toLowerCase().indexOf("href") !== -1){ // xlink:href self.elt.setAttributeNS( "http://www.w3.org/1999/xlink","href",value) } else { if(value!==false){ // option.selected=false sets it to true :-) try{ arg = arg.toLowerCase().replace('_','-') self.elt.setAttributeNS(null,arg,value) }catch(err){ throw ValueError("can't set attribute "+arg) } } } } } dict.__mro__ = [dict,$B.DOMNodeDict,$B.builtins.object.$dict] dict.__new__ = function(cls){ var res = $B.DOMNode(document.createElementNS($svgNS,tagName)) res.__class__ = cls.$dict return res } dict.__setattr__ = function(self, key, value){ if(self.elt.hasAttributeNS(null, key)){ self.elt.setAttributeNS(null,key,value) }else{ $B.DOMNodeDict.__setattr__(self, key, value) } } return dict } // the classes used for tag sums, $TagSum and $TagSumClass // are defined in py_dom.js function makeFactory(tagName){ var factory = function(){ var res = $B.DOMNode(document.createElementNS($svgNS,tagName)) res.__class__ = dicts[tagName] // apply __init__ var args = [res] for(var i=0, _len_i = arguments.length; i < _len_i;i++){args.push(arguments[i])} dicts[tagName].__init__.apply(null,args) return res } factory.__class__=$B.$factory factory.$dict = dicts[tagName] return factory } // SVG var $svg_tags = ['a', 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color_profile', // instead of color-profile 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'foreignObject', //patch to enable foreign objects 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'svg', 'text', 'tref', 'tspan', 'use'] // create classes var obj = new Object() var dicts = {} for(var i=0, _len_i = $svg_tags.length; i < _len_i;i++){ var tag = $svg_tags[i] dicts[tag]=makeTagDict(tag) obj[tag] = makeFactory(tag) dicts[tag].$factory = obj[tag] } return obj })(__BRYTHON__)