Ignore the very last line. Cut and paste error. On Friday, December 21, 2012 12:43:34 AM UTC-6, Massimo Di Pierro wrote: > > 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 ? >>>>>> >>>>>
--