1.1 --- a/wikiparser.py Tue Jun 11 14:21:03 2013 +0200
1.2 +++ b/wikiparser.py Tue Jun 11 15:23:18 2013 +0200
1.3 @@ -418,7 +418,7 @@
1.4 macrotypes = {
1.5 "anchor" : "<<Anchor(%(args)s)>>",
1.6 "color" : "<<Color2(%(content)s, %(args)s)>>",
1.7 - "toc" : "<<TableOfContents(%(args)s)>>",
1.8 + "toc" : "<<TableOfContents>>",
1.9 }
1.10
1.11 class ConfluenceParser:
2.1 --- a/xmlparser.py Tue Jun 11 14:21:03 2013 +0200
2.2 +++ b/xmlparser.py Tue Jun 11 15:23:18 2013 +0200
2.3 @@ -129,6 +129,7 @@
2.4 # Confluence macro MoinMoin syntax
2.5 "anchor" : "<<Anchor(%(anchor)s)>>",
2.6 "color" : "<<Color2(%(content)s, %(args)s)>>",
2.7 + "toc" : "<<TableOfContents>>",
2.8 }
2.9
2.10 normalise_regexp_str = r"\s+"
2.11 @@ -150,8 +151,8 @@
2.12
2.13 # Macro information.
2.14
2.15 - self.macro = None
2.16 - self.macro_parameters = {}
2.17 + self.macros = []
2.18 + self.macro_parameters = []
2.19 self.held_anchors = []
2.20
2.21 # Indentation and element nesting states.
2.22 @@ -205,7 +206,8 @@
2.23 # Remember macro information for use within the element.
2.24
2.25 if name == "ac:macro":
2.26 - self.macro = self.attributes[-1].get("ac:name")
2.27 + self.macros.append(self.attributes[-1].get("ac:name"))
2.28 + self.macro_parameters.append({})
2.29
2.30 def endElement(self, name):
2.31
2.32 @@ -231,8 +233,8 @@
2.33 # Discard macro state.
2.34
2.35 if name == "ac:macro":
2.36 - self.macro = None
2.37 - self.macro_parameters = {}
2.38 + self.macros.pop()
2.39 + self.macro_parameters.pop()
2.40
2.41 def characters(self, content):
2.42 if not self.is_preformatted():
2.43 @@ -323,11 +325,11 @@
2.44 # Remember macro information.
2.45
2.46 elif name == "ac:parameter":
2.47 - self.macro_parameters[self.attributes[-1].get("ac:name")] = text
2.48 + self.macro_parameters[-1][self.attributes[-1].get("ac:name")] = text
2.49 text = ""
2.50
2.51 elif name == "ac:default-parameter":
2.52 - self.macro_parameters[self.attributes[-2].get("ac:name")] = text
2.53 + self.macro_parameters[-1][self.attributes[-2].get("ac:name")] = text
2.54 text = ""
2.55
2.56 # Handle single-level tags.
2.57 @@ -347,9 +349,9 @@
2.58
2.59 # Macro name information is used to style rich text body regions.
2.60
2.61 - if name != "table" and self.macro and macro_rich_text_styles.has_key(self.macro):
2.62 - details = macro_rich_text_styles[self.macro]
2.63 - title = self.macro_parameters.get("title")
2.64 + if name != "table" and self.macros and macro_rich_text_styles.has_key(self.macros[-1]):
2.65 + details = macro_rich_text_styles[self.macros[-1]]
2.66 + title = self.macro_parameters[-1].get("title")
2.67 if title:
2.68 details = "%s\n\n%s" % (details, title)
2.69
2.70 @@ -394,16 +396,16 @@
2.71 # simpler macros are handled here.
2.72
2.73 elif name == "ac:macro":
2.74 - conversion = macrotypes.get(self.macro)
2.75 + conversion = macrotypes.get(self.macros[-1])
2.76 if conversion:
2.77 parameters = {"content" : text}
2.78 - parameters.update(self.macro_parameters)
2.79 - argnames = macroargs.get(self.macro)
2.80 + parameters.update(self.macro_parameters[-1])
2.81 + argnames = macroargs.get(self.macros[-1])
2.82 if argnames:
2.83 confargname, moinargname = argnames
2.84 - parameters["args"] = quote_macro_argument("%s=%s" % (moinargname, self.macro_parameters[confargname]))
2.85 + parameters["args"] = quote_macro_argument("%s=%s" % (moinargname, self.macro_parameters[-1][confargname]))
2.86 text = conversion % parameters
2.87 - if self.macro == "anchor" and self.forbids_macros():
2.88 + if self.macros[-1] == "anchor" and self.forbids_macros():
2.89 self.held_anchors.append(text)
2.90 text = ""
2.91