34 |
|
|
35 |
dbg = config.dbg.shorthand('parser') |
dbg = config.dbg.shorthand('parser') |
36 |
|
|
37 |
class Factor: |
class ElementFactor: |
38 |
""" |
""" |
39 |
Gather available linktypes from modules. |
Gather available linktypes from modules. |
40 |
""" |
""" |
41 |
|
|
42 |
types = {} |
top_class = navidoc.Element |
43 |
|
|
44 |
def __init__(self, element_list, module_paths, top_class): |
def __init__(self, module_paths): |
45 |
self.types.clear() |
self.types = {} |
|
self.element_list = element_list |
|
46 |
for module_path in module_paths: |
for module_path in module_paths: |
47 |
dbg ("Checking module: "+str(module_path)) |
dbg ("Checking module: "+str(module_path)) |
48 |
self.types.update(keys_for_classes(module_path, top_class)) |
self.types.update(keys_for_classes(module_path, self.top_class)) |
49 |
for module in dir(module_path): |
for module in dir(module_path): |
50 |
module = getattr(module_path, module) |
module = getattr(module_path, module) |
51 |
if type(module) == type(navidoc): |
if type(module) == type(navidoc): |
52 |
dbg ("Checking module: "+str(module)) |
dbg ("Checking module: "+str(module)) |
53 |
self.types.update(keys_for_classes(module, top_class)) |
# XXX Needs check and exception for conflicting element types |
54 |
|
self.types.update(keys_for_classes(module, self.top_class)) |
55 |
dbg("Collected: "+str(self.types)) |
dbg("Collected: "+str(self.types)) |
56 |
|
|
57 |
def is_type(self, key): return self.types.has_key(key) |
def is_type(self, key): return self.types.has_key(key) |
61 |
Return an element type class reference for key. |
Return an element type class reference for key. |
62 |
""" |
""" |
63 |
if self.types.has_key(key): |
if self.types.has_key(key): |
|
dbg("Internal: "+self.types[key]) |
|
64 |
return self.types[key] |
return self.types[key] |
65 |
else: raise ParserException("Unknown element key: "+key) |
else: raise ParserException("Unknown element key: "+key) |
66 |
|
|
|
class LinkFactor(Factor): |
|
|
""" |
|
|
""" |
|
|
def create_new(self, key, target): |
|
|
type = self.get_type(key) |
|
|
new = type(target) |
|
|
return new |
|
|
|
|
|
class ElementFactor(Factor): |
|
|
""" |
|
|
""" |
|
67 |
def create_new(self, key, var, s, list): |
def create_new(self, key, var, s, list): |
68 |
type = self.get_type(key) |
type = self.get_type(key) |
69 |
|
dbg("Found element: "+str(type)) |
70 |
new = type(var, s, list) |
new = type(var, s, list) |
|
new.list = self.element_list |
|
71 |
return new |
return new |
72 |
|
|
73 |
class ElementList: |
class ElementList: |
79 |
""" |
""" |
80 |
Initializes ElementList by parsing all elements in list. |
Initializes ElementList by parsing all elements in list. |
81 |
""" |
""" |
82 |
self.element_factor = ElementFactor(self, [mp], navidoc.Element) |
dbg("List: "+str(list)) |
83 |
self.link_factor = LinkFactor(self, [link], link.Link) |
config.element_list = self # XXX |
84 |
self.linkpackage = None |
self.factor = ElementFactor([mp, link]) |
85 |
self.extras = [] |
self.extras = [] |
86 |
self.list = [self.parse_element(element) for element in list] |
self.list = [self.parse_element(element) for element in list] |
87 |
self.list.extend(self.extras) |
self.list.extend(self.extras) |
88 |
|
|
89 |
def add_sub_element(self, super_name, element): |
def add_contained_element(self, super_name, element): |
90 |
""" |
""" |
91 |
Add a subelement. |
Add a subelement. |
92 |
""" |
""" |
93 |
s = element[0] |
s = element[0] |
94 |
(w,s) = match_remove("^\s*(\w+)\s*", s) |
(w,s) = match_remove("^\s*(\w+)\s*", s) |
95 |
key = w.group(1) |
key = w.group(1) |
96 |
element = self.element_factor.create_new(key, None, super_name + " " + s, element[1:]) |
element = self.factor.create_new(key, None, super_name + " " + s, element[1:]) |
97 |
self.extras.append(element) |
self.extras.append(element) |
98 |
|
|
99 |
def parse_element(self, element): |
def parse_element(self, element): |
100 |
""" |
""" |
106 |
if m: name = m.group(1) |
if m: name = m.group(1) |
107 |
(w,s) = match_remove("^\s*(\w+)\s*", s) |
(w,s) = match_remove("^\s*(\w+)\s*", s) |
108 |
key = w.group(1) |
key = w.group(1) |
|
if key == "linkpackage": |
|
|
self.linkpackage = s |
|
|
return None |
|
109 |
dbg('Creating %s %s %s %s.' % (key, name, s, element[1:])) |
dbg('Creating %s %s %s %s.' % (key, name, s, element[1:])) |
110 |
element = self.element_factor.create_new(key, name, s, element[1:]) |
element = self.factor.create_new(key, name, s, element[1:]) |
111 |
return element |
return element |
112 |
|
|
113 |
def setup_code(self): |
def setup_code(self): |