From dc190ae1b06450d72f32c14e9a4f2d8114a01af0 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sat, 16 Mar 2013 17:43:05 +0000 Subject: [PATCH] cgi.py: Implement a wrapping operation. Organization: Straylight/Edgeware From: Mark Wooding That is, a format control obtained as an argument can be invoked, passing it a number of other formatting controls, which it can then invoke in turn as it wishes. No use for this yet, but it seems like a cool thing to have lying about. --- cgi.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cgi.py b/cgi.py index b25d2d2..0ecdfe2 100644 --- a/cgi.py +++ b/cgi.py @@ -238,6 +238,29 @@ class FormatHTML (F.SimpleFormatOperation): else: return htmlescape(arg) FORMATOPS['H'] = FormatHTML +class FormatWrap (F.BaseFormatOperation): + """ + ~<...~@>: wrap enclosed material in another formatting control string. + + The argument is a formatting control. The enclosed material is split into + pieces separated by `~;' markers. The formatting control is performed, and + passed the list of pieces (as compiled formatting operations) in the + keyword argument `wrapped'. + """ + def __init__(me, *args): + super(FormatWrap, me).__init__(*args) + pieces = [] + while True: + piece, delim = F.collect_subformat('>;') + pieces.append(piece) + if delim.char == '>': break + me.pieces = pieces + def _format(me, atp, colonp): + op = F.compile(me.getarg.get()) + with F.FORMAT.bind(argmap = dict(F.FORMAT.argmap, wrapped = me.pieces)): + op.format() +FORMATOPS['<'] = FormatWrap + def format_tmpl(control, **kw): with F.COMPILE.bind(opmaps = [FORMATOPS, F.BASEOPS]): with tmplkw(**kw): -- [mdw]