1.1 --- a/xmlparser.py Tue Jun 11 14:21:03 2013 +0200
1.2 +++ b/xmlparser.py Tue Jun 11 15:23:18 2013 +0200
1.3 @@ -129,6 +129,7 @@
1.4 # Confluence macro MoinMoin syntax
1.5 "anchor" : "<<Anchor(%(anchor)s)>>",
1.6 "color" : "<<Color2(%(content)s, %(args)s)>>",
1.7 + "toc" : "<<TableOfContents>>",
1.8 }
1.9
1.10 normalise_regexp_str = r"\s+"
1.11 @@ -150,8 +151,8 @@
1.12
1.13 # Macro information.
1.14
1.15 - self.macro = None
1.16 - self.macro_parameters = {}
1.17 + self.macros = []
1.18 + self.macro_parameters = []
1.19 self.held_anchors = []
1.20
1.21 # Indentation and element nesting states.
1.22 @@ -205,7 +206,8 @@
1.23 # Remember macro information for use within the element.
1.24
1.25 if name == "ac:macro":
1.26 - self.macro = self.attributes[-1].get("ac:name")
1.27 + self.macros.append(self.attributes[-1].get("ac:name"))
1.28 + self.macro_parameters.append({})
1.29
1.30 def endElement(self, name):
1.31
1.32 @@ -231,8 +233,8 @@
1.33 # Discard macro state.
1.34
1.35 if name == "ac:macro":
1.36 - self.macro = None
1.37 - self.macro_parameters = {}
1.38 + self.macros.pop()
1.39 + self.macro_parameters.pop()
1.40
1.41 def characters(self, content):
1.42 if not self.is_preformatted():
1.43 @@ -323,11 +325,11 @@
1.44 # Remember macro information.
1.45
1.46 elif name == "ac:parameter":
1.47 - self.macro_parameters[self.attributes[-1].get("ac:name")] = text
1.48 + self.macro_parameters[-1][self.attributes[-1].get("ac:name")] = text
1.49 text = ""
1.50
1.51 elif name == "ac:default-parameter":
1.52 - self.macro_parameters[self.attributes[-2].get("ac:name")] = text
1.53 + self.macro_parameters[-1][self.attributes[-2].get("ac:name")] = text
1.54 text = ""
1.55
1.56 # Handle single-level tags.
1.57 @@ -347,9 +349,9 @@
1.58
1.59 # Macro name information is used to style rich text body regions.
1.60
1.61 - if name != "table" and self.macro and macro_rich_text_styles.has_key(self.macro):
1.62 - details = macro_rich_text_styles[self.macro]
1.63 - title = self.macro_parameters.get("title")
1.64 + if name != "table" and self.macros and macro_rich_text_styles.has_key(self.macros[-1]):
1.65 + details = macro_rich_text_styles[self.macros[-1]]
1.66 + title = self.macro_parameters[-1].get("title")
1.67 if title:
1.68 details = "%s\n\n%s" % (details, title)
1.69
1.70 @@ -394,16 +396,16 @@
1.71 # simpler macros are handled here.
1.72
1.73 elif name == "ac:macro":
1.74 - conversion = macrotypes.get(self.macro)
1.75 + conversion = macrotypes.get(self.macros[-1])
1.76 if conversion:
1.77 parameters = {"content" : text}
1.78 - parameters.update(self.macro_parameters)
1.79 - argnames = macroargs.get(self.macro)
1.80 + parameters.update(self.macro_parameters[-1])
1.81 + argnames = macroargs.get(self.macros[-1])
1.82 if argnames:
1.83 confargname, moinargname = argnames
1.84 - parameters["args"] = quote_macro_argument("%s=%s" % (moinargname, self.macro_parameters[confargname]))
1.85 + parameters["args"] = quote_macro_argument("%s=%s" % (moinargname, self.macro_parameters[-1][confargname]))
1.86 text = conversion % parameters
1.87 - if self.macro == "anchor" and self.forbids_macros():
1.88 + if self.macros[-1] == "anchor" and self.forbids_macros():
1.89 self.held_anchors.append(text)
1.90 text = ""
1.91