summaryrefslogtreecommitdiff
path: root/examples/nested_markup.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/nested_markup.py')
-rw-r--r--examples/nested_markup.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/examples/nested_markup.py b/examples/nested_markup.py
new file mode 100644
index 0000000..40267e6
--- /dev/null
+++ b/examples/nested_markup.py
@@ -0,0 +1,48 @@
+#
+# nested_markup.py
+#
+# Example markup parser to recursively transform nested markup directives.
+#
+# Copyright 2019, Paul McGuire
+#
+import pyparsing as pp
+
+wiki_markup = pp.Forward()
+
+# a method that will construct and return a parse action that will
+# do the proper wrapping in opening and closing HTML, and recursively call
+# wiki_markup.transformString on the markup body text
+def convert_markup_to_html(opening,closing):
+ def conversionParseAction(s, l, t):
+ return opening + wiki_markup.transformString(t[1][1:-1]) + closing
+ return conversionParseAction
+
+# use a nestedExpr with originalTextFor to parse nested braces, but return the
+# parsed text as a single string containing the outermost nested braces instead
+# of a nested list of parsed tokens
+markup_body = pp.originalTextFor(pp.nestedExpr('{', '}'))
+italicized = ('ital' + markup_body).setParseAction(convert_markup_to_html("<I>", "</I>"))
+bolded = ('bold' + markup_body).setParseAction(convert_markup_to_html("<B>", "</B>"))
+
+# another markup and parse action to parse links - again using transform string
+# to recursively parse any markup in the link text
+def convert_link_to_html(s, l, t):
+ t['link_text'] = wiki_markup.transformString(t['link_text'])
+ return '<A href="{url}">{link_text}</A>'.format_map(t)
+urlRef = ('link'
+ + '{' + pp.SkipTo('->')('link_text') + '->' + pp.SkipTo('}')('url') + '}'
+ ).setParseAction(convert_link_to_html)
+
+# now inject all the markup bits as possible markup expressions
+wiki_markup <<= urlRef | italicized | bolded
+
+# try it out!
+wiki_input = """
+Here is a simple Wiki input:
+
+ ital{This is in italics}.
+ bold{This is in bold}!
+ bold{This is in ital{bold italics}! But this is just bold.}
+ Here's a URL to link{Pyparsing's bold{Wiki Page}!->https://github.com/pyparsing/pyparsing/wiki}
+"""
+print(wiki_markup.transformString(wiki_input))