OK, I figured it out: http://code.google.com/p/json-template/issues/detail?id=32
Let me know if that doesn't make sense. You just need to be able to write an is-moderator? predicate with access to the top level "moderator" variable. Andy On Mon, Sep 21, 2009 at 11:05 PM, Andy Chu <[email protected]> wrote: > I have run into this issue of needing a "template global variable" in > a formatter before, say for a base URL. Now you're asking for this in > predicates. I looked it up and Django has this scheme: > > http://stackoverflow.com/questions/1030249/defining-global-variable-in-django-templates > > Perhaps the template constructor or expand() function can have some > sort of object to be available to both formatters and predicates. > > I'm thinking of something like the "stacking namespaces" approach > which seems to be mentioned in the RequestContext docs. > > The goal would be to write your thing as: > > {.section post} > Title: {title} > Body: {body} > {section @ is-moderator?} <-- The problem here is that the > predicate is passed "post" and has no other context > <button id="{id}"> > {.end} > {.end} > > Although I don't think it's the end of the world of "post" needs to > have a key to say whether to show the button. > > Andy > > > > On Mon, Sep 21, 2009 at 10:37 PM, Andy Chu <[email protected]> wrote: >> On Mon, Sep 21, 2009 at 11:58 AM, Steven Roussey <[email protected]> wrote: >>> >>> >>>> I'm not sure what you're getting at here. Can you post a real >>>> example? "foo" and "advancedSetting" are BOTH keys in your JSON >>>> dictionary. >>> >>> Yes, exactly. >>> >>>> The predicate is a function which receives a JSON node. The JSON node >>>> is named in the section. >>> >>> Yes, but... >>> >>> data={ moderator:true, post: {id:52, title:"Hi", >>> message:"there"},... } >>> >>> {.section post moderator|true?} >>> <button id="{id}">Delete</button> >>> {.end} >>> >>> The way I implemented it, if the text "moderator|" was omitted, the >>> meaning would simply be a test on post|true? Having both json nodes >>> means that I can step into the post node while testing on the >>> moderator node. >> >> OK, so you want to only display a delete button if the current user is >> a moderator. That's an interesting case because the moderator is >> global and not part of the post. >> >> I guess the short answer now is that you have to craft your JSON for >> the template, and you would to put {"show-delete-button": true, >> "title": ...} inside every post. >> >> So the logic goes in the app instead of the template. The philosophy >> is to put "business logic" in the app and the template only deals with >> display. I would be interested to see how you would do this in other >> template languages. >> >> But I think there are too many degrees of freedom in what you propose. >> You aren't using the predicate part in your example. Another option >> is to have the predicate have access to the entire dictionary, rather >> than just the current node. Then the predicate could see "moderator". >> It is sort of a waste of space to put the same truth value in every >> node. I'll have to think about it. >> >> >>> Also, I implemented parameters (to formatters and predicates). >>> >>> {.section post role|isValue("moderator")?} >>> <button id="{id}">Delete</button> >>> {.or post role|isValue("writer")?} >>> <button id="{id}">Reply</button> >>> {.end} >>> >>> {.section post|cleanlanguage("G") } >>> {.message} >>> {.end} >>> >>> or >>> >>> {.section post } >>> {.message|cleanlanguage("G")} >>> {.end} >>> >>> The parameters are appended. I'm not sure why you omitted parameters. >>> (I only allow parameters that can be encoded as json). I can see now >>> why you omitted expressions, and changed my version to strip that out >>> and use predicate functions. But I don't see why there are no >>> parameters. Yet. >> >> So this is already possible. See formatters.py for a Python example. >> It will be possible in JS too, because the more_formatters arg is a >> function *which returns functions*. So you need to use closures in >> JS. This is the most flexible scheme, and doesn't confine users to >> one kind of parameter passing syntax. You can do what you did solely >> with more_formatters and without touching the source. >> >> The most prominent example is the 'template-file' formatter: >> {node|template-file another_file.jsont} >> >> TemplateFileInclude in formatters.py is a callable that returns >> another function (a bound method) >> >> thanks, >> Andy >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "JSON Template" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/json-template?hl=en -~----------~----~----~----~------~----~------~--~---
