parser.py

Go to the documentation of this file.
00001 from silme.core.entity import EntityList, Entity
00002 from structure import *
00003 import re
00004 
00005 class IncParser():
00006     patterns = {}
00007     patterns['entity'] = re.compile('^#define[ \t]*([^ \t]+)[ \t]*(.*)',re.M)
00008     patterns['comment'] = re.compile('^(# [^\n]*\n?)+',re.M)
00009 #define firefox_about About Us
00010 
00011 
00012     @classmethod
00013     def parse(cls, text, code='default'):
00014         prop = IncStructure()
00015         cls.build_element_list(text, prop, code=code)
00016         prop.fallback = code
00017         return prop
00018 
00019     # problem with commented out entities
00020     @classmethod
00021     def parse_to_entitylist(cls, text, code='default'):
00022         entitylist = EntityList()
00023         text = cls.patterns['comment'].sub('', text)
00024         matchlist = cls.patterns['entity'].findall(text)
00025         for match in matchlist:
00026             entitylist.add_entity(Entity(match[0], match[1], code))
00027         return entitylist
00028     
00029     @classmethod
00030     def parse_entity(cls, text, code='default'):
00031         match = self.patterns['entity'].match(text)
00032         if not match:
00033             raise Exception()
00034         entity = Entity(match.group(1))
00035         entity.set_value(match.group(2), code=code)
00036         return entity
00037 
00038     @classmethod
00039     def build_element_list (cls, text, object, type='comment', code='default', pointer=0, end=None):
00040         cls.split_comments(text, object, code=code)
00041 
00042     @classmethod
00043     def split_comments(cls, text, object, code='default', pointer=0, end=None):
00044         pattern = cls.patterns['comment']
00045         if end:
00046             match = pattern.search(text, pointer, end)
00047         else:
00048             match = pattern.search(text, pointer)
00049         while match:
00050             st0 = match.start(0)
00051             if st0 > pointer:
00052                 cls.split_entities(text, object, code=code, pointer=pointer, end=st0)
00053             groups = match.groups()
00054             comment = Comment()
00055             cls.split_entities(match.group(0)[2:].replace('\n# ','\n'), comment, code=code)
00056             object.append(comment)
00057             pointer = match.end(0)
00058             if end:
00059                 match = pattern.search(text, pointer, end)
00060             else:
00061                 match = pattern.search(text, pointer)
00062         if (not end or (end > pointer)) and len(text) > pointer:
00063             cls.split_entities(text, object, code=code, pointer=pointer)
00064 
00065     @classmethod
00066     def split_entities(cls, text, object, code='default', pointer=0, end=None):
00067         pattern = cls.patterns['entity']
00068         if end:
00069             match = pattern.search(text, pointer, end)
00070         else:
00071             match = pattern.search(text, pointer)
00072         while match:
00073             st0 = match.start(0)
00074             if st0 > pointer:
00075                 object.append(text[pointer:st0])
00076             groups = match.groups()
00077             entity = Entity(groups[0])
00078             entity.set_value(groups[1], code)
00079             entity.params['source'] = {'type':'inc',
00080                                         'string':match.group(0),
00081                                         'valpos':match.start(2)-st0}
00082             object.append(entity)
00083             pointer = match.end(0)
00084             if end:
00085                 match = pattern.search(text, pointer, end)
00086             else:
00087                 match = pattern.search(text, pointer)
00088         if (not end or (end > pointer)) and len(text) > pointer:
00089             if end:
00090                 object.append(text[pointer:end])
00091             else:
00092                 object.append(text[pointer:])

Generated on Tue May 12 17:37:27 2009 for silme by  doxygen 1.5.8