cgi.py: Implement a wrapping operation.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 16 Mar 2013 17:43:05 +0000 (17:43 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 16 Mar 2013 17:45:05 +0000 (17:45 +0000)
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

diff --git a/cgi.py b/cgi.py
index b25d2d2..0ecdfe2 100644 (file)
--- 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):