diff --git a/uml.py b/uml.py index 58f91dc..0a2ce6d 100644 --- a/uml.py +++ b/uml.py @@ -1,6 +1,7 @@ from fileinput import input as finput +import re -class UntitledError: pass +class UntitledError(BaseException): pass class InternalError(UntitledError): pass class ParsingError(UntitledError): pass class MiscError(UntitledError): pass @@ -11,8 +12,42 @@ class Element: else: self.data = data self.element = element def append(self, string, space=False): - if space: self.data += " " - self.data += string + if type(data) == str: + if space: self.data += " " + self.data += string + else: raise InternalError("Appending to object!") + def set(self, data): + self.data = data + def __str__(self): + return str((str(self.element), str(self.data))) + def __repl__(self): return self.__str__() +class Table: + def __init__(self, data=None): + if data == None: self.data = [] + else: + self.data = [] + self.addrow(data) + def addrow(self, data): + if type(data) == str: + buf = [i.rstrip().lstrip() for i in data.split("|")] + if len(self.data) > 0: + if len(self.data[-1]) == len(buf): + self.data.append(buf) + else: + raise ParsingError("tables must have uniform dimensions throughout") + else: + self.data.append(buf) + elif type(data) == list: + if len(self.data) > 0: + if len(self.data[-1]) == len(data): + self.data.append(data) + else: + raise ParsingError("tables must have uniform dimensions throughout") + else: + self.data.append(data) + def __str__(self): + return str(self.data) + def __repl__(self): return self.__str__() def printchain(chain): for i in chain: @@ -20,35 +55,50 @@ def printchain(chain): else: print(i.element) chain = [] -for i in finput(): - i = i.rstrip() +flags = { + "TABLE_PREV": False, +} +def main(): + for i in finput(): + i = i.rstrip() - # ignore blank lines - if len(i) == 0: continue + # ignore blank lines + if len(i) == 0: continue - # lines with text - if i[0].isalpha(): chain.append(Element("p", i)) + # lines with text + if i[0].isalpha(): chain.append(Element("p", i)) - # we have a processing command - if not i[0].isalpha(): - command = "" - params = "" - counter = 0 - for j in i: - if not j.isalpha() \ - and not j == ' ': - command += j - else: - if j == ' ': - params = i[counter + 1:] + # we have a processing command + if not i[0].isalpha(): + command = "" + params = "" + counter = 0 + for j in i: + if not j.isalpha() \ + and not j == ' ': + command += j else: - params = i[counter:] - break - counter += 1 - if command[0] == "#": chain.append(Element("h" + str(len(command)), params)) - elif command == "%": chain.append(Element("c", params)) - elif command == "*": chain.append(Element("l", params)) - elif command == "-": chain.append(Element("l", params)) - elif command == ">": chain.append(Element("q", params)) - elif command == "=": chain.append(Element("r", params)) -printchain(chain) + if j == ' ': + params = i[counter + 1:] + else: + params = i[counter:] + break + counter += 1 + if command[0] == "#": chain.append(Element("h" + str(len(command)), params)) + elif command == "%": chain.append(Element("c", params)) + elif command == "*": chain.append(Element("l", params)) + elif command == "-": chain.append(Element("l", params)) + elif command == ">": chain.append(Element("q", params)) + elif command == "=": chain.append(Element("r", params)) + elif command == "|": + if flags["TABLE_PREV"]: + chain[-1].data.addrow(params) + continue + else: + chain.append(Element("t", Table(params))) + flags["TABLE_PREV"] = True + continue + flags["TABLE_PREV"] = False + printchain(chain) + +if __name__ == "__main__": main()