Expanding Albatross Macros in custom tags

When writing custom tags, it is often required that the contents of the tag also be searched for Albatross tags, This allows things like <al-value ...> calls inside the contents or arguments of the tag.

This is easily done using the Template class like so:

   1 # A silly test tag that does nothing sensible
   2 class MyTag(EmptyTag):
   3     def __init__(self, ctx, filename, line_num, attribs):
   4         EmptyTag.__init__(self, ctx, filename, line_num, attribs)
   5         self.str = 'A long string containing <al-value expr="name"> albatross tags.'
   7     def to_html(self, ctx):
   8         ctx.write_content('Some HTML at the start of the tag')
   9         Template(ctx, '<magic>', self.str).to_html(ctx) # Expand all the Albatross macros in self.str
  10         ctx.write_content('Some HTML at the end of the tag')

Another, similar, case might be that you need to expand a tag or a macro without necessarily sending the resulting HTML to the application. You can use the ApplicationContext push_context_trap() and pop_context_trap() functions, like so:

   1 # Another silly tag that does nothing sensible
   2 class SafeHref(albatross.Href):
   3     def to_html(self, ctx)
   4         ctx.push_content_trap()
   5         albatross.Href.to_html(self, ctx)
   6         html = ctx.pop_content_trap()
   7         # html contains the HTML representation, but it hasn't been send to the browser
   8         if html.lower().find('sex'):
   9              ctx.write_content('Inappropriate URL  removed')
  10         else:
  11              ctx.write_content(html)

None: Macro_Expand (last edited 2011-02-15 06:05:18 by localhost)