1.1 --- a/MoinForms.py Fri Feb 15 00:39:42 2013 +0100
1.2 +++ b/MoinForms.py Sat Feb 16 00:39:44 2013 +0100
1.3 @@ -679,9 +679,13 @@
1.4 # Substitute the macro and modified arguments.
1.5
1.6 else:
1.7 - result.append("<<Form%s(%s)>>" % (type, ",".join(
1.8 - adjustMacroArguments(parseMacroArguments(match), path, fragment, repeating, index)
1.9 - )))
1.10 + result.append("<<Form%s(%s)>>" % (type,
1.11 + quoteMacroArguments(
1.12 + adjustMacroArguments(
1.13 + parseMacroArguments(match), path, fragment, repeating, index
1.14 + )
1.15 + )
1.16 + ))
1.17
1.18 return "".join(result)
1.19
1.20 @@ -702,27 +706,28 @@
1.21 old_path = None
1.22 found_name = None
1.23
1.24 - for arg in args:
1.25 - if arg.startswith("path="):
1.26 - old_path = arg[5:]
1.27 - elif arg.startswith("fragment=") and fragment:
1.28 + for name, value in args:
1.29 + if name == "path":
1.30 + old_path = value
1.31 + elif name == "fragment" and fragment:
1.32 pass
1.33 else:
1.34 - result.append(arg)
1.35 - if arg.startswith("name="):
1.36 - found_name = arg[5:]
1.37 - elif found_name is None:
1.38 - found_name = arg
1.39 + result.append((name, value))
1.40 +
1.41 + # Remember any explicitly given name or where a keyword appears.
1.42 +
1.43 + if name == "name" or name is None and found_name is None:
1.44 + found_name = value
1.45
1.46 if path:
1.47 qualified = old_path and ("%s/%s" % (old_path, path)) or path
1.48 - result.append("path=%s" % qualified)
1.49 + result.append(("path", qualified))
1.50
1.51 if fragment:
1.52 - result.append("fragment=%s" % fragment)
1.53 + result.append(("fragment", fragment))
1.54
1.55 if repeating and repeating == found_name:
1.56 - result.append("index=%s" % index)
1.57 + result.append(("index", index))
1.58
1.59 return result
1.60
1.61 @@ -740,45 +745,75 @@
1.62 except AttributeError:
1.63 parsed_args = args.split(",")
1.64
1.65 - return [arg for arg in parsed_args if arg]
1.66 + pairs = []
1.67 + for arg in parsed_args:
1.68 + if arg:
1.69 + pair = arg.split("=", 1)
1.70 + if len(pair) < 2:
1.71 + pairs.append((None, arg))
1.72 + else:
1.73 + pairs.append(tuple(pair))
1.74 +
1.75 + return pairs
1.76 +
1.77 +def quoteMacroArguments(args):
1.78 +
1.79 + """
1.80 + Quote the given 'args' - a collection of (name, value) tuples - returning a
1.81 + string containing the comma-separated, quoted arguments.
1.82 + """
1.83 +
1.84 + quoted = []
1.85 +
1.86 + for name, value in args:
1.87 + value = value.replace('"', '""')
1.88 + if name is None:
1.89 + quoted.append('"%s"' % value)
1.90 + else:
1.91 + quoted.append('"%s=%s"' % (name, value))
1.92 +
1.93 + return ",".join(quoted)
1.94
1.95 def getMacroArguments(parsed_args):
1.96
1.97 "Return the macro arguments decoded from 'parsed_args'."
1.98
1.99 - name = None
1.100 + found_name = None
1.101 path = None
1.102 dictpage = None
1.103 label = None
1.104 section = None
1.105 fragment = None
1.106
1.107 - for arg in parsed_args:
1.108 - if arg.startswith("name="):
1.109 - name = arg[5:]
1.110 + for name, value in parsed_args:
1.111 + if name == "name":
1.112 + found_name = value
1.113
1.114 - elif arg.startswith("path="):
1.115 - path = arg[5:]
1.116 + elif name == "path":
1.117 + path = value
1.118 +
1.119 + elif name == "dict":
1.120 + dictpage = value
1.121
1.122 - elif arg.startswith("dict="):
1.123 - dictpage = arg[5:]
1.124 -
1.125 - elif arg.startswith("label="):
1.126 - label = arg[6:]
1.127 + elif name == "label":
1.128 + label = value
1.129
1.130 - elif arg.startswith("section="):
1.131 - section = arg[8:]
1.132 + elif name == "section":
1.133 + section = value
1.134
1.135 - elif arg.startswith("fragment="):
1.136 - fragment = arg[9:]
1.137 + elif name == "fragment":
1.138 + fragment = value
1.139 +
1.140 + # Keywords are interpreted as certain kinds of values.
1.141
1.142 elif name is None:
1.143 - name = arg
1.144 + if found_name is None:
1.145 + found_name = value
1.146
1.147 - elif dictpage is None:
1.148 - dictpage = arg
1.149 + elif dictpage is None:
1.150 + dictpage = value
1.151
1.152 - return name, path, dictpage, label, section, fragment
1.153 + return found_name, path, dictpage, label, section, fragment
1.154
1.155 def getFields(d, remove=False):
1.156
2.1 --- a/macros/FormMessage.py Fri Feb 15 00:39:42 2013 +0100
2.2 +++ b/macros/FormMessage.py Sat Feb 16 00:39:44 2013 +0100
2.3 @@ -44,21 +44,21 @@
2.4 fragment = None
2.5 index = None
2.6
2.7 - for arg in parsed_args:
2.8 - if arg.startswith("name="):
2.9 - name = arg[5:]
2.10 + for argname, argvalue in parsed_args:
2.11 + if argname == "name":
2.12 + name = argvalue
2.13
2.14 - elif arg.startswith("path="):
2.15 - path = arg[5:]
2.16 + elif argname == "path":
2.17 + path = argvalue
2.18
2.19 - if arg.startswith("fragment="):
2.20 - fragment = arg[9:]
2.21 + if argname == "fragment":
2.22 + fragment = argvalue
2.23
2.24 - elif arg.startswith("index="):
2.25 - index = arg[6:]
2.26 + elif argname == "index":
2.27 + index = argvalue
2.28
2.29 - elif name is None:
2.30 - name = arg
2.31 + elif argname is None and name is None:
2.32 + name = argvalue
2.33
2.34 if not name:
2.35 return showError(_("No field name specified."), request)
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/tests/arguments.py Sat Feb 16 00:39:44 2013 +0100
3.3 @@ -0,0 +1,19 @@
3.4 +#!/usr/bin/env python
3.5 +
3.6 +from MoinForms import parseMacroArguments, quoteMacroArguments
3.7 +
3.8 +tests = [
3.9 + (u'a=b,b=c', 2),
3.10 + (u'"a=b","b=c"', 2),
3.11 + (u'"a=""b""",b=c', 2),
3.12 + (u'"a=b,b=c"', 1)
3.13 + ]
3.14 +
3.15 +for args, n in tests:
3.16 + parsed_args = parseMacroArguments(args)
3.17 + print len(parsed_args) == n, n, parsed_args
3.18 + quoted_args = quoteMacroArguments(parsed_args)
3.19 + parsed_again = parseMacroArguments(quoted_args)
3.20 + print parsed_args == parsed_again, parsed_args, parsed_again
3.21 +
3.22 +# vim: tabstop=4 expandtab shiftwidth=4