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 ?
>>>>>
>>>>
--