import re
from .Message import *
from .Phase1Result import Tag
blank_re = re.compile( r'^\s*$', re.UNICODE)
def is_blank(str):
return blank_re.match(str)
class AnnotationParser:
def __init__(self, tag, annotations):
self.annotations = annotations
self.tags_parsed = None
self.tag = tag
def __setitem__(self, key, value):
self.annotations[key] = value
def __getitem__(self, key):
return self.annotations[key]
def __parse_tag(self, tag):
if tag == None:
return
if tag.get_value() == None:
return
self.__parse_attrs(tag, re.split("\s*,\s*", tag.get_value()))
def parse(self):
self.__parse_tag(self.tag)
return self.annotations
def __parse_attrs(self, tag, attrs):
for attr in attrs:
self.__parse_attr(tag, attr)
def __parse_attr(self, tag, attr):
kv = re.split("\s*=\s*", attr)
if len(kv) != 2:
fatal(self.file, tag, "invalid annotation attribute definition, use key=value pair")
matched = re.match("\s*\"(?P<value>.*)\"\s*$", kv[1])
if matched: value = matched.group("value")
else: value = kv[1]
if is_blank(kv[0]) or is_blank(value):
fatal(self.file, tag, "invalid annotation attribute definition, key or value cannot be null")
self.__set_key_value(tag, kv[0], value)
def __report_dup_key(self, tag, key):
fatal(self.file, tag, "invalid annotation attribute definition, duplicated \"" + key + "\"")
def __set_key_value(self, tag, key, value):
try:
if self[key] != None and len(self[key]) != 0:
self.__report_dup_key(tag, key)
self[key] = value
except KeyError:
fatal(self.file, tag, "invalid annotation attribute definition, undefined key \""+key+"\"")