Show More
Commit Description:
merge with algo and add brython files that were missing
Commit Description:
merge with algo and add brython files that were missing
References:
File last commit:
Show/Diff file:
Action:
lib/assets/libs/_html.js
| 126 lines
| 4.8 KiB
| application/javascript
| JavascriptLexer
|
r584 | // creation of an HTML element | |||
var $module = (function($B){ | ||||
var _b_ = $B.builtins | ||||
var $TagSumDict = $B.$TagSum.$dict | ||||
function makeTagDict(tagName){ | ||||
// return the dictionary for the class associated with tagName | ||||
var dict = {__class__:$B.$type, | ||||
__name__:tagName | ||||
} | ||||
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(_b_.isinstance(first,[_b_.str,_b_.int,_b_.float])){ | ||||
self.elt.appendChild(document.createTextNode(_b_.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 _b_.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)+'",function(){eval("'+value+'")})' | ||||
eval(js) | ||||
}else if(arg.toLowerCase()=="style"){ | ||||
$B.DOMNodeDict.set_style(self,value) | ||||
} else { | ||||
if(value!==false){ | ||||
// option.selected=false sets it to true :-) | ||||
try{ | ||||
arg = arg.toLowerCase().replace('_','-') | ||||
self.elt.setAttribute(arg,value) | ||||
}catch(err){ | ||||
throw _b_.ValueError("can't set attribute "+arg) | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
dict.__mro__ = [dict,$B.DOMNodeDict,$B.builtins.object.$dict] | ||||
dict.__new__ = function(cls){ | ||||
// __new__ must be defined explicitely : it returns an instance of | ||||
// DOMNode for the specified tagName | ||||
var res = $B.DOMNode(document.createElement(tagName)) | ||||
res.__class__ = cls.$dict | ||||
return res | ||||
} | ||||
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.createElement(tagName)) | ||||
res.__class__ = dicts[tagName] | ||||
// apply __init__ | ||||
var args = [res].concat(Array.prototype.slice.call(arguments)) | ||||
dicts[tagName].__init__.apply(null,args) | ||||
return res | ||||
} | ||||
factory.__class__=$B.$factory | ||||
factory.$dict = dicts[tagName] | ||||
return factory | ||||
} | ||||
// All HTML 4, 5.x extracted from | ||||
// https://w3c.github.io/elements-of-html/ | ||||
// HTML4.01 tags | ||||
var $tags = ['A','ABBR','ACRONYM','ADDRESS','APPLET','AREA','B','BASE', | ||||
'BASEFONT','BDO','BIG','BLOCKQUOTE','BODY','BR','BUTTON', | ||||
'CAPTION','CENTER','CITE','CODE','COL','COLGROUP','DD', | ||||
'DEL','DFN','DIR','DIV','DL','DT','EM','FIELDSET','FONT', | ||||
'FORM','FRAME','FRAMESET','H1','H2','H3','H4','H5','H6', | ||||
'HEAD','HR','HTML','I','IFRAME','IMG','INPUT','INS', | ||||
'ISINDEX','KBD','LABEL','LEGEND','LI','LINK','MAP','MENU', | ||||
'META','NOFRAMES','NOSCRIPT','OBJECT','OL','OPTGROUP', | ||||
'OPTION','P','PARAM','PRE','Q','S','SAMP','SCRIPT','SELECT', | ||||
'SMALL','SPAN','STRIKE','STRONG','STYLE','SUB','SUP', | ||||
'TABLE','TBODY','TD','TEXTAREA','TFOOT','TH','THEAD', | ||||
'TITLE','TR','TT','U','UL','VAR', | ||||
// HTML5 tags | ||||
'ARTICLE','ASIDE','AUDIO','BDI','CANVAS','COMMAND','DATA', | ||||
'DATALIST','EMBED','FIGCAPTION','FIGURE','FOOTER','HEADER', | ||||
'KEYGEN','MAIN','MARK','MATH','METER','NAV','OUTPUT', | ||||
'PROGRESS','RB','RP','RT','RTC','RUBY','SECTION','SOURCE', | ||||
'TEMPLATE','TIME','TRACK','VIDEO','WBR', | ||||
// HTML5.1 tags | ||||
'DETAILS','DIALOG','MENUITEM','PICTURE','SUMMARY'] | ||||
// create classes | ||||
var obj = new Object() | ||||
var dicts = {} | ||||
for(var i=0, _len_i = $tags.length; i < _len_i;i++){ | ||||
var tag = $tags[i] | ||||
dicts[tag] = makeTagDict(tag) | ||||
obj[tag] = makeFactory(tag) | ||||
dicts[tag].$factory = obj[tag] | ||||
} | ||||
$B.tag_classes = dicts | ||||
return obj | ||||
})(__BRYTHON__) | ||||