1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - FormField Macro 4 5 @copyright: 2012 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinMoin import wikiutil 10 from MoinSupport import * 11 12 Dependencies = ['pages'] 13 14 escape = wikiutil.escape 15 16 # Macro functions. 17 18 def execute(macro, args): 19 20 """ 21 Execute the 'macro' with the given 'args' to produce a form field element: 22 23 * A field name 24 * The WikiDict describing form fields 25 26 The following optional named arguments are also supported: 27 28 label=TEXT The label employed by button-like fields 29 30 The nature of each field is described by a WikiDict entry for the given 31 field name. 32 """ 33 34 request = macro.request 35 fmt = macro.formatter 36 page = fmt.page 37 _ = request.getText 38 39 # Interpret the arguments. 40 # NOTE: The argument parsing should really be more powerful in order to 41 # NOTE: support labels. 42 43 try: 44 parsed_args = args and wikiutil.parse_quoted_separated(args, name_value=False) or [] 45 except AttributeError: 46 parsed_args = args.split(",") 47 48 parsed_args = [arg for arg in parsed_args if arg] 49 50 # Get special arguments. 51 52 name = None 53 dictpage = None 54 label = None 55 56 for arg in parsed_args: 57 if arg.startswith("name="): 58 name = arg[5:] 59 60 elif arg.startswith("dict="): 61 dictpage = arg[5:] 62 63 elif arg.startswith("label="): 64 label = arg[6:] 65 66 elif name is None: 67 name = arg 68 69 elif dictpage is None: 70 dictpage = arg 71 72 if not name: 73 return showError(_("No field name specified."), request) 74 75 if not dictpage: 76 return showError(_("No WikiDict specified."), request) 77 78 # Get the WikiDict and the field's definition. 79 80 wikidict = getWikiDict(dictpage, request) 81 82 if not wikidict: 83 return showError(_("WikiDict %s cannot be loaded.") % dictpage, request) 84 85 try: 86 field_definition = wikidict[name] 87 except KeyError: 88 return showError(_("No entry for %s in %s.") % (name, dictpage), request) 89 90 field_args = {} 91 92 for field_arg in field_definition.split(): 93 94 # Record the key-value details. 95 96 try: 97 argname, argvalue = field_arg.split("=", 1) 98 field_args[argname] = argvalue 99 100 # Single keywords are interpreted as type descriptions. 101 102 except ValueError: 103 if not field_args.has_key("type"): 104 field_args["type"] = field_arg 105 106 # Obtain any request parameters corresponding to the field. 107 108 form = get_form(request) 109 value = form.get(name, [""])[0] 110 111 # Render the field. 112 113 type = field_args.get("type", "text") 114 115 if type == "text": 116 return fmt.rawHTML('<input name="%s" type="%s" size="%s" value="%s" />' % ( 117 escattr(name), escattr(type), escattr(field_args.get("size", "10")), escattr(value) 118 )) 119 120 elif type == "textarea": 121 return fmt.rawHTML('<textarea name="%s" cols="%s" rows="%s">%s</textarea>' % ( 122 escattr(name), escattr(field_args.get("cols", "60")), escattr(field_args.get("rows", "5")), escape(value) 123 )) 124 125 elif type == "submit": 126 return fmt.rawHTML('<input name="%s" type="submit" value="%s" />' % ( 127 escattr(name), escattr(_(label or name)) 128 )) 129 130 # NOTE: Support select fields at the very least. 131 132 else: 133 return '' 134 135 def showError(text, request): 136 fmt = request.formatter 137 138 output = [] 139 append = output.append 140 141 append(fmt.span(on=1, attrs={"class" : "form-field-error"})) 142 append(fmt.text(text)) 143 append(fmt.span(on=0)) 144 145 return "".join(output) 146 147 # vim: tabstop=4 expandtab shiftwidth=4