# User Jiang Xin <worldhello.net AT gmail.com>
# Changes: 
# * NewPage macro support multiple template selection.

--- a/MoinMoin/macro/NewPage.py	2008-10-16 20:01:25.000000000 +0800
+++ b/MoinMoin/macro/NewPage.py	2008-10-17 02:49:19.000000000 +0800
@@ -41,12 +41,19 @@
             and create the page as a subpage of MoinMoinBugs.
     """
 
-    def __init__(self, macro, template=u'', button_label=u'',
-                 parent_page=u'', name_template=u'%s'):
+    def __init__(self, macro, template="",  button_label=u'',
+                 parent_page=u'', name_template=u'%s', selection_type=u'select', layout=u''):
         self.macro = macro
         self.request = macro.request
         self.formatter = macro.formatter
-        self.template = template
+        if isinstance(template, (list,tuple)):
+            self.template = {}
+            for item in template:
+                self.template[item] = item
+        else:
+            self.template = template
+        self.selection_type = selection_type
+        self.layout = layout
         _ = self.request.getText
         if button_label:
             # Try to get a translation, this will probably not work in
@@ -77,7 +84,16 @@
         _ = self.request.getText
 
         requires_input = '%s' in self.nametemplate
-
+        if not self.layout:
+            self.layout = """
+<table class="borderless">
+  <tr>
+    <td>""" + _("Input title: ") + """</td><td>%(input)s</td></tr>
+  <tr>
+    <td>""" + _("Select template: ") + """</td><td>%(select)s</td></tr>
+  <tr><td colspan="2" align="right">%(button)s</td></tr>
+</table>
+"""
 
         # TODO: better abstract this using the formatter
         # OSSXP: self.request.page.page_name and self.formatter.page.page_name may different, 
@@ -91,26 +107,72 @@
                 except:
                     self.parent = self.formatter.page.page_name
             
-        html = [
+        header = [
             u'<form class="macro" method="POST" action="%s/%s"><div>' % (self.request.getScriptname(), wikiutil.quoteWikinameURL(self.formatter.page.page_name)),
             u'<input type="hidden" name="action" value="newpage">',
             u'<input type="hidden" name="parent" value="%s">' % wikiutil.escape(self.parent, 1),
-            u'<input type="hidden" name="template" value="%s">' % wikiutil.escape(self.template, 1),
             u'<input type="hidden" name="nametemplate" value="%s">' % wikiutil.escape(self.nametemplate, 1),
         ]
-
+        header = '\n'.join(header)
+        footer = u'</div></form>'
+        button = u'<input type="submit" value="%s">' % wikiutil.escape(self.label, 1)
+        
+        if isinstance(self.template, basestring):
+            select = u''
+            header += u'\n<input type="hidden" name="template" value="%s">' % wikiutil.escape(self.template, 1)
+        elif isinstance(self.template, dict):
+            select = []
+            if self.selection_type == "select":
+                select.append(u'<select name="template" size="0">')
+                for k,v in self.template.iteritems():
+                    select.append(u'<option value="%(key)s" label="%(key)s">%(value)s</option>' % \
+                               {'key':k, 'value':v})
+                select.append(u'</select>')
+            else: # selection_type == radio
+                for k,v in self.template.iteritems():
+                    select.append(u'<input type="radio" name="template" value="%(key)s">%(value)s' % \
+                               {'key':k, 'value':v})
+            select = '\n'.join(select)
         if requires_input:
-            html += [
-                u'<input type="text" name="pagename" size="30">',
-            ]
-        html += [
-            u'<input type="submit" value="%s">' % wikiutil.escape(self.label, 1),
-            u'</div></form>',
-            ]
-        return self.formatter.rawHTML('\n'.join(html))
+            input = u'<input type="text" name="pagename" size="30">'
+        else:
+            input = u''
+        
+        if input and select and self.layout:
+            html = '\n'.join([header,
+                              self.layout % {'button': button, 'select':select, 'input':input},
+                              footer])
+        else:
+            html = '\n'.join([header, select, input, button,footer])
+
+        return self.formatter.rawHTML(html)
+
 
-def macro_NewPage(macro, template=u'', button_label=u'',
-                  parent_page=u'', name_template=u'%s'):
+def execute(macro, args):
     """ Temporary glue code to use with moin current macro system """
-    return NewPage(macro, template, button_label, parent_page, name_template).renderInPage()
+    request = macro.request
+    import re
+    pattern = re.compile(ur"""
+^(?P<template>
+      \[.*?\] # list
+    |
+      \(.*?\) # tuple
+    |
+      \{.*?\} # dict
+    |
+      (?P<mark>"').*?(?P=mark) # string with mark
+    |
+      [^,]* # string without mark
+),?(?P<args>.*)$    # others arguments
+""", re.UNICODE|re.VERBOSE)
+    template = ""
+    if args:
+        match = pattern.search(args)
+        if match:
+            template = match.group('template')
+            args = match.group('args')
+            if template:
+                if template[0] in '[({\'"':
+                    template = eval(template)
 
+    return wikiutil.invoke_extension_function(request, NewPage, args, fixed_args=[macro, template]).renderInPage()
