# HG changeset patch # User Paul Boddie # Date 1383863192 -3600 # Node ID 1fa2c8a69d68d7f7146a267b4b5b8eabab9a7b38 # Parent 73d84e37fc21ab13b577a4f4f1ea00035e819d41 Added a parser that tries to link to a populated form given some form data. Added a "FORMAT" directive to subpage form data in order to get the parser invoked for such data. Fixed the acquisition of form data headers, stripping whitespace from header keys and values. diff -r 73d84e37fc21 -r 1fa2c8a69d68 MoinForms.py --- a/MoinForms.py Thu Nov 07 19:55:56 2013 +0100 +++ b/MoinForms.py Thu Nov 07 23:26:32 2013 +0100 @@ -349,7 +349,16 @@ submission 'number', returning the metadata headers and field structure. """ - f = StringIO(store[number]) + return loadFieldsFromString(store[number]) + +def loadFieldsFromString(s): + + """ + Load the fields from the given string 's', returning the metadata headers + and field structure. + """ + + f = StringIO(s) headers = [] lines = [] @@ -369,7 +378,8 @@ if text: for line in lines: - headers.append(line.strip().split(":", 1)) + name, value = [s.strip() for s in line.split(":", 1)] + headers.append((name, value)) # Otherwise, rewind to obtain the entire item text for field data. @@ -548,6 +558,10 @@ acl = self.handler.getSubpageACL() item = acl.getString() + item + # Add a format header to the page for parsers to use. + + item = "#FORMAT formdata\n" + item + ItemStoreBase.append(self, item) def __getitem__(self, number): diff -r 73d84e37fc21 -r 1fa2c8a69d68 parsers/form.py --- a/parsers/form.py Thu Nov 07 19:55:56 2013 +0100 +++ b/parsers/form.py Thu Nov 07 23:26:32 2013 +0100 @@ -2,7 +2,7 @@ """ MoinMoin - form (MoinForms) - @copyright: 2012 by Paul Boddie + @copyright: 2012, 2013 by Paul Boddie @license: GNU GPL (v2 or later), see COPYING.txt for details. """ @@ -38,9 +38,9 @@ def format(self, fmt, write=None): """ - Format an event using the given formatter 'fmt'. If the 'write' - parameter is specified, use it to write output; otherwise, write output - using the request. + Format a form using the given formatter 'fmt'. If the 'write' parameter + is specified, use it to write output; otherwise, write output using the + request. """ formatForm(self.raw, self.request, fmt, self.attrs, write=write) @@ -50,7 +50,7 @@ def formatForOutputType(self, mimetype, write=None): """ - Format an event for the given 'mimetype'. If the 'write' parameter is + Format a form for the given 'mimetype'. If the 'write' parameter is specified, use it to write output; otherwise, write output using the request. """ diff -r 73d84e37fc21 -r 1fa2c8a69d68 parsers/formdata.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parsers/formdata.py Thu Nov 07 23:26:32 2013 +0100 @@ -0,0 +1,68 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - formdata (MoinForms) + + @copyright: 2013 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinMoin.Page import Page +from MoinForms import loadFieldsFromString +from MoinSupport import * + +Dependencies = ["pages"] + +# Parser support. + +class Parser: + + "Manipulate and display forms." + + Dependencies = Dependencies + extensions = [] + + def __init__(self, raw, request, **kw): + + """ + Initialise the parser with the given 'raw' data, 'request' and any + keyword arguments that may have been supplied. + """ + + self.raw = raw + self.request = request + self.attrs = parseAttributes(kw.get("format_args", ""), False) + + def format(self, fmt, write=None): + + """ + Format the form data using the given formatter 'fmt'. If the 'write' + parameter is specified, use it to write output; otherwise, write output + using the request. + + Currently, this just writes a link to the form. + """ + + request = self.request + page = request.page + _ = fmt._ + + number = page.page_name.rsplit("/", 1)[1] + + # Obtain the details of the form data. + + headers, data = loadFieldsFromString(self.raw) + headers = dict(headers) + + form_pagename = headers.get("Form-Page") + fragment = headers.get("Form-Fragment") + + write = write or request.write + + if form_pagename and number.isdigit(): + form_page = Page(request, form_pagename) + query = {"fragment" : fragment, "load" : number, "action" : "MoinFormHandler"} + write(linkToPage(request, form_page, _("Follow this link to view the form."), query, fragment)) + else: + write(fmt.text(_("The form data does not specify the original form."))) + +# vim: tabstop=4 expandtab shiftwidth=4