From 2316e185bd1326d8228c55f66fca6230cda843f7 Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Sun, 20 Nov 2016 15:35:45 -0700 Subject: [PATCH] Updates to try to get arround brackets problems. Not yet. --- requirements.txt | 3 +++ tests/test_parsing_commands.py | 5 ++++- xmd/nodes.py | 41 ++++++++++++++++++++++------------ xmd/parser.py | 21 ++++++++--------- 4 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ede671a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +google-api-python-client +markdown +pyparsing diff --git a/tests/test_parsing_commands.py b/tests/test_parsing_commands.py index 1ff9323..42c0271 100644 --- a/tests/test_parsing_commands.py +++ b/tests/test_parsing_commands.py @@ -1,6 +1,6 @@ from __future__ import print_function import unittest -from xmd.parser import command +from xmd.parser import command, Command from xmd.parser import variable_name import pyparsing as pp @@ -80,6 +80,9 @@ def test_arg_type(self): # print(arg_float.parseString("1.0eE02")) # self.assertRaises(pp.ParseException, arg_float.parseString, "abc") + def test_Command(self): + t = Command.parseString('[>command]{hi}') + print(t) if __name__ == '__main__': diff --git a/xmd/nodes.py b/xmd/nodes.py index 5b2a061..26cf1f8 100644 --- a/xmd/nodes.py +++ b/xmd/nodes.py @@ -22,9 +22,10 @@ def count(self, name): class XmdNode(object): - def __init__(self, s, loc, raw): - self.loc = loc - self.raw = raw + def __init__(self, string, location, ppinput): + self.string = string + self.location = location + self.ppinput = ppinput self.parse() def parse(self): @@ -43,18 +44,28 @@ def context(self, val): def parseArguments(self): # print(self.args) - inner = self.args[0].strip('(').strip(')') + inner = self.command.args[0].strip('(').strip(')') args = [_.strip() for _ in inner.split(',')] # print(args) return args +class CommandArguments(object): + def __init__(self, ppinput): + # print('here', ppinput) + self.ppinput = ppinput + self.name = ppinput[0] + self.args = ppinput[1] + + def __repr__(self): + return "<{name} #{n}>".format(name=self.name, n=len(self.args)) + + class Command(XmdNode): def parse(self): - self.name = self.raw[0][0] - self.args = self.raw[0][1] - self.content = self.raw[0][2] + self.command = self.ppinput[0][0] + self.content = self.ppinput[1] def render(self): inner = '\n'.join([x.render() for x in self.content]) @@ -92,14 +103,16 @@ def render(self): class Markdown(XmdNode): def render(self): - return markdown.markdown(self.raw[0][0], extensions=[ + return markdown.markdown(self.ppinput[0][0], extensions=[ mdx_math.makeExtension(enable_dollar_delimiter=True) ]) -def chooseCommand(s, loc, raw): - if raw[0][0] == 'sidenote': - return Sidenote(s, loc, raw) - if raw[0][0] == 'figure': - return Figure(s, loc, raw) - return Command(s, loc, raw) +def chooseCommand(string, location, ppinput): + # ppinput = ppinput[0] + # print('r: ', ppinput[0][0]) + if ppinput[0][0].name == 'sidenote': + return Sidenote(string, location, ppinput) + if ppinput[0][0].name == 'figure': + return Figure(string, location, ppinput) + return Command(string, location, ppinput) diff --git a/xmd/parser.py b/xmd/parser.py index ef4b9a6..63c525e 100644 --- a/xmd/parser.py +++ b/xmd/parser.py @@ -2,7 +2,7 @@ import pyparsing as pp import nodes -mdObject = pp.Forward() +xmdObject = pp.Forward() def createKwarg(z): @@ -14,7 +14,7 @@ def createArg(z): def recurse(s, b, c): - out = mdObject.parseString(s[c[0]+1: c[2]-1]) + out = xmdObject.parseString(s[c[0]+1: c[2]-1]) return [out] @@ -25,7 +25,6 @@ def recurse(s, b, c): arg_string = pp.Group( pp.Suppress(pp.Word("'") | pp.Word('"')) + - # pp.Word(pp.alphanums + '._-') + pp.Word("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-./:;<=>?@[\]^_`{|}~ ") + pp.Suppress(pp.Word("'") | pp.Word('"')) ) @@ -39,19 +38,17 @@ def recurse(s, b, c): ).setParseAction(createKwarg) command = ( - pp.Suppress(">") + variable_name + + variable_name + pp.Group(pp.Optional( - # pp.Suppress('(') + - # pp.delimitedList(arg) + - # pp.Suppress(')') pp.originalTextFor( pp.nestedExpr(opener='(', closer=')') ) )) -) +).setParseAction(nodes.CommandArguments) -Command = pp.Group( - pp.Suppress('[') + command + pp.Suppress(']') + pp.FollowedBy('{') + +Command = ( + pp.nestedExpr(opener='[>', closer=']', content=command) + + pp.FollowedBy('{') + pp.originalTextFor( pp.nestedExpr(opener='{', closer='}') ).setParseAction(recurse) @@ -82,11 +79,11 @@ def recurse(s, b, c): pp.OneOrMore(pp.Word(chars)) ).setParseAction(nodes.Markdown) -mdObject << pp.ZeroOrMore(pp.MatchFirst([Command, injector, text_block])) +xmdObject << pp.ZeroOrMore(Command | injector | text_block) def transform(text): - return mdObject.parseString(text) + return xmdObject.parseString(text) def render(text):