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