From a56530e05bec97856446d49711aaf078978724e5 Mon Sep 17 00:00:00 2001 From: Robin Sonnabend <robin@fsmpi.rwth-aachen.de> Date: Wed, 12 Apr 2017 18:07:01 +0200 Subject: [PATCH] Do not accept broken Tag-like structures e.g. [todo:who:what] e.g. [todo;who] /close #95 --- models/database.py | 2 +- parser.py | 8 ++++++-- server.py | 2 +- shared.py | 4 ++-- tasks.py | 15 +++++++++++++-- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/models/database.py b/models/database.py index c731dfa..eee2db6 100644 --- a/models/database.py +++ b/models/database.py @@ -170,7 +170,7 @@ class Protocol(DatabaseModel): def create_localtops(self): local_tops = [] for default_top in self.protocoltype.default_tops: - local_tops.append(LocalTOP(defaulttop_id=defaul_top.id, + local_tops.append(LocalTOP(defaulttop_id=default_top.id, protocol_id=self.id, description="")) return local_tops diff --git a/parser.py b/parser.py index bc14ef1..9da40c7 100644 --- a/parser.py +++ b/parser.py @@ -251,7 +251,11 @@ class Tag: # v1: matches [text without semicolons] #PATTERN = r"\[(?<content>(?:[^;\]]*;)*(?:[^;\]]*))\]" # v2: needs at least two parts separated by a semicolon - PATTERN = r"\[(?<content>(?:[^;\]]*;)+(?:[^;\]]*))\]" + #PATTERN = r"\[(?<content>(?:[^;\]]*;)+(?:[^;\]]*))\]" + # v3: also match [] without semicolons inbetween, as there is not other use for that + PATTERN = r"\[(?<content>[^\]]*)\]" + + KNOWN_TAGS = ["todo", "url", "beschluss"] class Empty(Element): @@ -514,7 +518,7 @@ def main(test_file_name=None): source = f.read() try: tree = parse(source) - tree.dump() + print(tree.dump()) except ParserException as e: print(e) else: diff --git a/server.py b/server.py index 9bb9361..f8a183a 100755 --- a/server.py +++ b/server.py @@ -477,7 +477,7 @@ def new_protocol(): form.populate_obj(protocol) db.session.add(protocol) db.session.commit() - for local_top in protocol.create_localtops: + for local_top in protocol.create_localtops(): db.session.add(local_top) db.session.commit() tasks.push_tops_to_calendar(protocol) diff --git a/shared.py b/shared.py index 6492f4a..c2aeaaa 100644 --- a/shared.py +++ b/shared.py @@ -18,8 +18,8 @@ latex_chars = [ ('_', '\\_'), ('{', '\\{'), ('}', '\\}'), - #('[', '\\['), - #(']', '\\]'), + ('[', '\\['), + (']', '\\]'), #('"', '"\''), ('~', r'$\sim{}$'), ('^', r'\textasciicircum{}'), diff --git a/tasks.py b/tasks.py index 14f99ed..3a4dce3 100644 --- a/tasks.py +++ b/tasks.py @@ -148,6 +148,17 @@ def parse_protocol_async_inner(protocol, encoded_kwargs): db.session.add(error) db.session.commit() return + # tags + tags = tree.get_tags() + for tag in tags: + if tag.name not in Tag.KNOWN_TAGS: + error = protocol.create_error("Parsing", "Invalid tag", + "The tag in line {} has the kind '{}', which is " + "not defined. This is probably an error mit a missing " + "semicolon.".format(tag.linenumber, tag.name)) + db.session.add(error) + db.session.commit() + return # todos old_todo_number_map = {} for todo in protocol.todos: @@ -158,14 +169,14 @@ def parse_protocol_async_inner(protocol, encoded_kwargs): for todo in old_todos: protocol.todos.remove(todo) db.session.commit() - tags = tree.get_tags() todo_tags = [tag for tag in tags if tag.name == "todo"] for todo_tag in todo_tags: if len(todo_tag.values) < 2: error = protocol.create_error("Parsing", "Invalid todo-tag", "The todo tag in line {} needs at least " "information on who and what, " - "but has less than that.".format(todo_tag.linenumber)) + "but has less than that. This is probably " + "a missing semicolon.".format(todo_tag.linenumber)) db.session.add(error) db.session.commit() return -- GitLab