Mercurial > traipse_dev
comparison orpg/tools/InterParse.py @ 196:0bc44a57ae6c alpha
Traipse Alpha 'OpenRPG' {100425-00}
Traipse is a distribution of OpenRPG that is designed to be easy to setup and go. Traipse also makes it easy for
developers to work on code without fear of sacrifice. 'Ornery-Orc' continues the trend of 'Grumpy' and adds fixes to
the code. 'Ornery-Orc's main goal is to offer more advanced features and enhance the productivity of the user.
Update Summary (Patch-2)
New Features:
New Namespace method with two new syntaxes
New Namespace Internal is context sensitive, always!
New Namespace External is 'as narrow as you make it'
New PluginDB access for URL2Link plugin
New to Forms, they now show their content in Design Mode
Fixes:
Fix to Server GUI startup errors
Fix to Server GUI Rooms tab updating
Fix to Chat and Settings if non existant die roller is picked
Fix to Dieroller and .open() used with .vs(). Successes are correctly calculated
Fix to Alias Lib's Export to Tree, Open, Save features
Fix to alias node, now works properly
Fix to Splitter node, minor GUI cleanup
Fix to Backgrounds not loading through remote loader
Fix to Node name errors
Fix to rolling dice in chat Whispers
Fix to Splitters Sizing issues
author | sirebral |
---|---|
date | Sun, 25 Apr 2010 23:26:55 -0500 |
parents | b633f4c64aae |
children | fcd6aafbe232 |
comparison
equal
deleted
inserted
replaced
195:b633f4c64aae | 196:0bc44a57ae6c |
---|---|
29 | 29 |
30 from orpg.orpgCore import component | 30 from orpg.orpgCore import component |
31 import re | 31 import re |
32 from orpg.tools.orpg_log import logger | 32 from orpg.tools.orpg_log import logger |
33 from wx import TextEntryDialog, ID_OK | 33 from wx import TextEntryDialog, ID_OK |
34 from xml.etree.ElementTree import iselement | |
34 | 35 |
35 class InterParse(): | 36 class InterParse(): |
36 | 37 |
37 def __init__(self): | 38 def __init__(self): |
38 pass | 39 pass |
39 | 40 |
40 def Post(self, s, send=False, myself=False): | 41 def Post(self, s, tab=True, send=False, myself=False): |
41 s = self.Normalize(s) | 42 if tab: tab = component.get('chat') |
42 component.get('chat').set_colors() | 43 s = self.Normalize(s, tab) |
43 component.get('chat').Post(s, send, myself) | 44 tab.set_colors() |
45 tab.Post(s, send, myself) | |
44 | 46 |
45 def ParseLogic(self, s, node): | 47 def ParseLogic(self, s, node): |
46 'Nodes now parse through ParsLogic. Easily add new parse rules right here!!' | 48 'Nodes now parse through ParsLogic. Easily add new parse rules right here!!' |
47 s = self.NameSpaceE(s) | 49 s = self.NameSpaceE(s) |
48 s = self.NameSpaceI(s, node) | 50 s = self.NameSpaceI(s, node) |
49 s = self.NodeMap(s, node) | 51 s = self.NodeMap(s, node) |
50 s = self.NodeParent(s, node.get('map')) | 52 s = self.NodeParent(s, node.get('map')) |
51 return s | 53 return s |
52 | 54 |
53 def Normalize(self, s): | 55 def Normalize(self, s, tab): |
54 for plugin_fname in component.get('chat').activeplugins.keys(): | 56 for plugin_fname in tab.activeplugins.keys(): |
55 plugin = component.get('chat').activeplugins[plugin_fname] | 57 plugin = tab.activeplugins[plugin_fname] |
56 try: s = plugin.pre_parse(s) | 58 try: s = plugin.pre_parse(s) |
57 except Exception, e: | 59 except Exception, e: |
58 if str(e) != "'module' object has no attribute 'post_msg'": | 60 if str(e) != "'module' object has no attribute 'post_msg'": |
59 logger.general(traceback.format_exc()) | 61 logger.general(traceback.format_exc()) |
60 logger.general("EXCEPTION: " + str(e)) | 62 logger.general("EXCEPTION: " + str(e)) |
61 if component.get('chat').parsed == 0: | 63 if tab.parsed == 0: |
62 s = self.NameSpaceE(s) | 64 s = self.NameSpaceE(s) |
63 s = self.Node(s) | 65 s = self.Node(s) |
64 s = self.Dice(s) | 66 s = self.Dice(s) |
65 s = self.Filter(s) | 67 s = self.Filter(s, tab) |
66 component.get('chat').parsed = 1 | 68 tab.parsed = 1 |
67 return s | 69 return s |
68 | 70 |
69 def Filter(self, s): | 71 def Filter(self, s, tab): |
70 s = component.get('chat').GetFilteredText(s) | 72 s = tab.GetFilteredText(s) |
71 return s | 73 return s |
72 | 74 |
73 def Node(self, s): | 75 def Node(self, s): |
74 """Parses player input for embedded nodes rolls""" | 76 """Parses player input for embedded nodes rolls""" |
75 cur_loc = 0 | 77 cur_loc = 0 |
126 return s | 128 return s |
127 | 129 |
128 def NameSpaceI(self, s, node): | 130 def NameSpaceI(self, s, node): |
129 reg = re.compile("(!=(.*?)=!)") | 131 reg = re.compile("(!=(.*?)=!)") |
130 matches = reg.findall(s) | 132 matches = reg.findall(s) |
133 newstr = False | |
131 for i in xrange(0,len(matches)): | 134 for i in xrange(0,len(matches)): |
132 tree_map = node.get('map').split('::') | 135 tree_map = node.get('map').split('::') |
133 root = self.get_node(tree_map[0]) | 136 roots = []; root_list = [] |
134 find = matches[i][1].split('::') | 137 find = matches[i][1].split('::') |
135 names = root.getiterator('nodehandler') | 138 for x in xrange(0, len(tree_map)): |
136 for name in names: | 139 roots.append(tree_map[x]) |
137 if find[0] == name.get('name'): | 140 root_list.append(self.get_node(roots)) |
138 if name.get('class') == 'rpg_grid_handler': | 141 namespace = root_list[x].getiterator('nodehandler') |
139 newstr = self.NameSpaceGrid(find, name); break | 142 for node in namespace: |
140 else: newstr = str(name.find('text').text); break | 143 if find[0] == node.get('name'): |
141 else: newstr = 'Invalid Reference!' | 144 if node.get('class') == 'rpg_grid_handler': |
142 s = s.replace(matches[i][0], newstr, 1) | 145 newstr = self.NameSpaceGrid(find[1], node); break |
143 s = self.ParseLogic(s, name) | 146 else: |
147 newstr = str(node.find('text').text); break | |
148 if not newstr: newstr = 'Invalid Reference!'; break | |
149 s = s.replace(matches[i][0], newstr, 1) | |
150 s = self.ParseLogic(s, node) | |
144 return s | 151 return s |
145 | 152 |
146 def NameSpaceE(self, s): | 153 def NameSpaceE(self, s): |
147 reg = re.compile("(!&(.*?)&!)") | 154 reg = re.compile("(!&(.*?)&!)") |
148 matches = reg.findall(s) | 155 matches = reg.findall(s) |
156 newstr = 'False'; x = 0 | |
149 for i in xrange(0,len(matches)): | 157 for i in xrange(0,len(matches)): |
150 find = matches[i][1].split('::') | 158 find = matches[i][1].split('::') |
151 root = find[0] | 159 node = self.get_node([find[0]]) |
152 root = self.get_node(root) | 160 last = find[len(find)-1] |
153 names = root.getiterator('nodehandler') | 161 if not iselement(node): |
154 for name in names: | 162 s = s.replace(matches[i][0], 'Invalid Reference!', 1); |
155 if find[1] == name.get('name'): | 163 s = self.NameSpaceE(s) |
156 if name.get('class') == 'rpg_grid_handler': | 164 return s |
157 newstr = self.NameSpaceGrid([find[1], find[2]], name); break | 165 while newstr == 'False': |
158 else: newstr = str(name.find('text').text); break | 166 namespace = node.getiterator('nodehandler'); x += 1 |
159 else: newstr = 'Invalid Reference!' | 167 for node in namespace: |
160 s = s.replace(matches[i][0], newstr, 1) | 168 if find[x] == node.get('name'): |
161 s = self.ParseLogic(s, name) | 169 if node.get('class') == 'map_miniature_handler': continue |
170 elif node.get('class') == 'rpg_grid_handler': | |
171 newstr = self.NameSpaceGrid(last, node); break | |
172 elif x == len(find)-1: newstr = str(node.find('text').text); break | |
173 else: break | |
174 else: newstr = 'Invalid Reference!'; break | |
175 s = s.replace(matches[i][0], newstr, 1) | |
176 s = self.ParseLogic(s, node) | |
162 return s | 177 return s |
163 | 178 |
164 def NameSpaceGrid(self, s, node): | 179 def NameSpaceGrid(self, s, node): |
165 cell = tuple(s[1].strip('(').strip(')').split(',')) | 180 cell = tuple(s.strip('(').strip(')').split(',')) |
166 grid = node.find('grid') | 181 grid = node.find('grid') |
167 rows = grid.findall('row') | 182 rows = grid.findall('row') |
168 col = rows[int(self.Dice(cell[0]))-1].findall('cell') | 183 try: |
169 try: s = self.ParseLogic(col[int(self.Dice(cell[1]))-1].text, node) or 'No Cell Data' | 184 col = rows[int(self.Dice(cell[0]))-1].findall('cell') |
185 s = self.ParseLogic(col[int(self.Dice(cell[1]))-1].text, node) or 'No Cell Data' | |
170 except: s = 'Invalid Grid Reference!' | 186 except: s = 'Invalid Grid Reference!' |
171 return s | 187 return s |
172 | 188 |
173 def NodeMap(self, s, node): | 189 def NodeMap(self, s, node): |
174 """Parses player input for embedded nodes rolls""" | 190 """Parses player input for embedded nodes rolls""" |
193 ## Build the new tree_map | 209 ## Build the new tree_map |
194 new_map = tree_map.split('::') | 210 new_map = tree_map.split('::') |
195 del new_map[len(new_map)-1] | 211 del new_map[len(new_map)-1] |
196 parent_map = matches[i][1].split('::') | 212 parent_map = matches[i][1].split('::') |
197 ## Backwards Reference the Parent Children | 213 ## Backwards Reference the Parent Children |
198 child_node = self.get_node('::'.join(new_map)) | 214 child_node = self.get_node(new_map) |
199 newstr = self.get_root(child_node, tree_map, new_map, parent_map) | 215 newstr = self.get_root(child_node, tree_map, new_map, parent_map) |
200 s = s.replace(matches[i][0], newstr, 1) | 216 s = s.replace(matches[i][0], newstr, 1) |
201 s = self.Node(s) | 217 s = self.Node(s) |
202 return s | 218 return s |
203 | 219 |
211 if parent_map[0] == root.get('name'): | 227 if parent_map[0] == root.get('name'): |
212 newstr = '!@' + '::'.join(new_map[:len(tr)-t]) + '::' + '::'.join(parent_map) + '@!' | 228 newstr = '!@' + '::'.join(new_map[:len(tr)-t]) + '::' + '::'.join(parent_map) + '@!' |
213 if newstr != '': return newstr | 229 if newstr != '': return newstr |
214 else: | 230 else: |
215 del new_map[len(new_map)-1] | 231 del new_map[len(new_map)-1] |
216 child_node = self.get_node('::'.join(new_map)) | 232 child_node = self.get_node(new_map) |
217 newstr = self.get_root(child_node, tree_map, new_map, parent_map) | 233 newstr = self.get_root(child_node, tree_map, new_map, parent_map) |
218 return newstr | 234 return newstr |
219 | 235 |
220 def get_node(self, s): | 236 def get_node(self, path): |
221 return_node = 'Invalid Reference!' | 237 return_node = 'Invalid Reference!' |
222 value = "" | 238 value = "" |
223 path = s.split('::') | |
224 depth = len(path) | 239 depth = len(path) |
225 try: node = component.get('tree').tree_map[path[0]]['node'] | 240 try: node = component.get('tree').tree_map[path[0]]['node'] |
226 except Exception, e: return return_node | 241 except Exception, e: return return_node |
227 return_node = self.resolve_get_loop(node, path, 1, depth) | 242 return_node = self.resolve_get_loop(node, path, 1, depth) |
228 return return_node | 243 return return_node |
229 | 244 |
230 def resolve_get_loop(self, node, path, step, depth): | 245 def resolve_get_loop(self, node, path, step, depth): |
231 if step == depth: return node | 246 if step == depth: return node |
232 else: | 247 else: |
233 child_list = node.findall('nodehandler') | 248 child_list = node.getiterator('nodehandler') |
234 for child in child_list: | 249 for child in child_list: |
235 if step == depth: break | 250 if step == depth: break |
236 if child.get('name') == path[step]: | 251 if child.get('name') == path[step]: |
237 node = self.resolve_get_loop(child, path, step+1, depth) | 252 node = self.resolve_get_loop(child, path, step+1, depth) |
238 return node | 253 return node |