Actually I like your solution. It could be even easier. class attr(object): def __init__(self,key,value): self.key=key self.value=value
class DIV(object): def __init__(self,*components,**attributes): self.components = [] self.attributes = attributes for x in components: if isinstance(x,attr): self.attributes[x.key]=x.value else: self.components.append(x) print DIV('hello','world',attr('data-something','value'),_class='myclass') <div data-something='value' class='myclass'>helloworld</div> ... DIV('hello','world',attr('data-something')='value') On Thursday, December 20, 2012 4:02:45 PM UTC-6, Arnon Marcus wrote: > > Pfff... > > The creator of web2py says he wishes he could do web3py some other way, > but can't... > > Am I the only one that finds that funny? :) > > web3py will end up however you wish it to end up as... > > You can do whatever you want with it, as it's already inherently backwards > incompatible (python 3.x), and is not even fully planned yet... > > If anyone at any time could change things, it would be you guys and at > this time... > > How about putting auxiliary attributes "front and center"? > Data-* attributes are already a part of the standard of HTML5 and > most-if-not-all browsers support them. > > Single-Page apps are also not even considered a novelty anymore, and we're > in a Renaissance of data-binding frameworks... > > I mean, I guess I could do this: > > def DATA(name, value): > return {('_data-' + name):str(value)} > > > Then: > > DIV( "{{MyVar}}", **DATA( "ng-controller", "MyController" ) ) > => > DIV( "{{MyVar}}", **{ "_data-ng-controller": "MyController" } ) > => > <div data-ng-controller="MyController">{{MyVar}}</div> > > and: > > DIV( "{{MyVar}}", **DATA( "bind", "text: MyVar" ) ) > => > DIV( "{{MyVar}}", **{ "_data-bind": "text: MyVar" } ) > => > <div data-bind="text: MyVar">{{MyVar}}</div> > > > But hell, you can make the TAG classes able to receive DATA > class-instances, that other people can sub-class/modify to implenet the > interface for different frameworks. > > A generic DATA class may look something like this: > > class DATA: > > namespace = "" > > aggregate = False > seperator = ": " > delimiter = ", " > > def __init__(self, **attrs): > self.attrs = dict(**attrs) > ... > > def parse( self ): > parsed = "" > > if aggregatre: > parsed += 'data-' + ns + '="' > for k, v in items(self.attrs): > parsed += k + seperator + v + delimiter > parsed = parsed[:-len(delimiter)] + '"' > else: > ns = namespace + '-' if namespace else '' > for k, v in items(self.attrs): > parsed += 'data-' + ns + k + '="' + v + '"' > > return parsed > > > And have your TAG classes do something like: > > class <TAG>: > def __init__(self, content, *vars, **args): > ... > parsed = [ var.parsed() for var in *vars if isinstanceof(var, > DATA) ] > ... > <use parsed somehow> > ... > > > Angular guys may then do something like this: > > DATA.namespace = "ng" > BUTTON( "Delete", DATA( click="destroy()", show="project._id".) ) > => > <button data-ng-click="destroy()" > data-ng-show="project._id">Delete</button> > > or: > > class ngDATA( DATA ): > namespace = "ng" > > + <use ngDATA instead of DATA in the html helpers> > > > Knockout guys could do this: > > DATA.namespace = "bind" > DATA.aggregate = True > SELECT( "", DATA( options = "$root.availableMeals", > value = "meal". > optionsText = "'mealName'" ) ) > => > <select data-bind="options: $root.availableMeals, value: meal, > optionsText: 'mealName'"></select> > > or: > > class koDATA( DATA ): > namespace = "bind" > aggregated = False > > + <use koDATA instead of DATA in the html helpers> > > > More advanced usages can then sub-class DATA and just re-implement the > parse function... > > > What say you? > > On Thursday, December 20, 2012 7:17:48 AM UTC-8, Massimo Di Pierro wrote: >> >> Oops. right. I wish there was a simple syntax but I cannot think about >> one. >> >> On Thursday, 20 December 2012 09:07:21 UTC-6, Niphlod wrote: >>> >>> correction, the _ in front is needed as always .... >>> DIV('content',**{'_data-something':'something value'}) >>> >>> Il giorno giovedì 20 dicembre 2012 15:58:25 UTC+1, Massimo Di Pierro ha >>> scritto: >>>> >>>> They always did although the syntax is cumbersone >>>> >>>> DIV('content',**{'data-something':'something value'}) >>>> >>>> On Thursday, 20 December 2012 04:16:54 UTC-6, Arnon Marcus wrote: >>>>> >>>>> Cool (!) >>>>> >>>>> Do the HTML helpers support HTML5's " data-* " attributes? >>>>> Can that be used for javascriupt frameworks like Knockout.js or >>>>> Angular.js ? >>>>> >>>> --