Skip to content
Snippets Groups Projects
Commit a56530e0 authored by Robin Sonnabend's avatar Robin Sonnabend
Browse files

Do not accept broken Tag-like structures

e.g. [todo:who:what]
e.g. [todo;who]

/close #95
parent 2d22bca3
No related branches found
No related tags found
No related merge requests found
...@@ -170,7 +170,7 @@ class Protocol(DatabaseModel): ...@@ -170,7 +170,7 @@ class Protocol(DatabaseModel):
def create_localtops(self): def create_localtops(self):
local_tops = [] local_tops = []
for default_top in self.protocoltype.default_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="")) protocol_id=self.id, description=""))
return local_tops return local_tops
......
...@@ -251,7 +251,11 @@ class Tag: ...@@ -251,7 +251,11 @@ class Tag:
# v1: matches [text without semicolons] # v1: matches [text without semicolons]
#PATTERN = r"\[(?<content>(?:[^;\]]*;)*(?:[^;\]]*))\]" #PATTERN = r"\[(?<content>(?:[^;\]]*;)*(?:[^;\]]*))\]"
# v2: needs at least two parts separated by a semicolon # 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): class Empty(Element):
...@@ -514,7 +518,7 @@ def main(test_file_name=None): ...@@ -514,7 +518,7 @@ def main(test_file_name=None):
source = f.read() source = f.read()
try: try:
tree = parse(source) tree = parse(source)
tree.dump() print(tree.dump())
except ParserException as e: except ParserException as e:
print(e) print(e)
else: else:
......
...@@ -477,7 +477,7 @@ def new_protocol(): ...@@ -477,7 +477,7 @@ def new_protocol():
form.populate_obj(protocol) form.populate_obj(protocol)
db.session.add(protocol) db.session.add(protocol)
db.session.commit() db.session.commit()
for local_top in protocol.create_localtops: for local_top in protocol.create_localtops():
db.session.add(local_top) db.session.add(local_top)
db.session.commit() db.session.commit()
tasks.push_tops_to_calendar(protocol) tasks.push_tops_to_calendar(protocol)
......
...@@ -18,8 +18,8 @@ latex_chars = [ ...@@ -18,8 +18,8 @@ latex_chars = [
('_', '\\_'), ('_', '\\_'),
('{', '\\{'), ('{', '\\{'),
('}', '\\}'), ('}', '\\}'),
#('[', '\\['), ('[', '\\['),
#(']', '\\]'), (']', '\\]'),
#('"', '"\''), #('"', '"\''),
('~', r'$\sim{}$'), ('~', r'$\sim{}$'),
('^', r'\textasciicircum{}'), ('^', r'\textasciicircum{}'),
......
...@@ -148,6 +148,17 @@ def parse_protocol_async_inner(protocol, encoded_kwargs): ...@@ -148,6 +148,17 @@ def parse_protocol_async_inner(protocol, encoded_kwargs):
db.session.add(error) db.session.add(error)
db.session.commit() db.session.commit()
return 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 # todos
old_todo_number_map = {} old_todo_number_map = {}
for todo in protocol.todos: for todo in protocol.todos:
...@@ -158,14 +169,14 @@ def parse_protocol_async_inner(protocol, encoded_kwargs): ...@@ -158,14 +169,14 @@ def parse_protocol_async_inner(protocol, encoded_kwargs):
for todo in old_todos: for todo in old_todos:
protocol.todos.remove(todo) protocol.todos.remove(todo)
db.session.commit() db.session.commit()
tags = tree.get_tags()
todo_tags = [tag for tag in tags if tag.name == "todo"] todo_tags = [tag for tag in tags if tag.name == "todo"]
for todo_tag in todo_tags: for todo_tag in todo_tags:
if len(todo_tag.values) < 2: if len(todo_tag.values) < 2:
error = protocol.create_error("Parsing", "Invalid todo-tag", error = protocol.create_error("Parsing", "Invalid todo-tag",
"The todo tag in line {} needs at least " "The todo tag in line {} needs at least "
"information on who and what, " "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.add(error)
db.session.commit() db.session.commit()
return return
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment