Changeset 1733:548d1187a29f in orange-bioinformatics for _bioinformatics/obiKEGG/entry/parser.py


Ignore:
Timestamp:
03/05/13 19:48:00 (14 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Porting obiKEGG to use the new REST KEGG API.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _bioinformatics/obiKEGG/entry/parser.py

    r1716 r1733  
    11""" 
    2 A parser for DBGET entries 
    3   
     2A parser for DBGET database entries 
     3 
    44""" 
     5from StringIO import StringIO 
     6 
    57 
    68class DBGETEntryParser(object): 
    7     """ A DBGET entry parser (inspired by ``xml.dom.pulldom``) 
     9    r""" 
     10    A DBGET entry parser (inspired by ``xml.dom.pulldom``). 
     11 
     12    :: 
     13 
     14        >>> stream = StringIO("ENTRY foo\n" 
     15        ...                   "NAME  foo's name\n" 
     16        ...                   "  BAR A subsection of 'NAME'\n") 
     17        ... 
     18        >>> parser = DBGETEntryParser() 
     19        >>> for event, title, contents_part in parser.parse(stream): 
     20        ...    print parser.EVENTS[event], title, repr(contents_part) 
     21        ... 
     22        ENTRY_START None None 
     23        SECTION_START ENTRY 'foo\n' 
     24        SECTION_END ENTRY None 
     25        SECTION_START NAME "foo's name\n" 
     26        SUBSECTION_START BAR "A subsection of 'NAME'\n" 
     27        SUBSECTION_END BAR None 
     28        SECTION_END NAME None 
     29        ENTRY_END None None 
     30 
    831    """ 
     32    #: Entry start events 
    933    ENTRY_START = 0 
     34 
     35    #: Entry end event 
    1036    ENTRY_END = 1 
     37 
     38    #: Section start event 
    1139    SECTION_START = 2 
     40 
     41    #: Section end event 
    1242    SECTION_END = 3 
     43 
     44    #: Subsection start event 
    1345    SUBSECTION_START = 4 
     46 
     47    #: Subsection end event 
    1448    SUBSECTION_END = 5 
     49 
     50    #: Text element event 
    1551    TEXT = 6 
    16      
     52 
     53    EVENTS = ["ENTRY_START", "ENTRY_END", 'SECTION_START', 
     54              'SECTION_END', 'SUBSECTION_START', 'SUBSECTION_END', 
     55              'TEXT'] 
     56 
    1757    def __init__(self): 
    1858        pass 
    19      
     59 
    2060    def parse(self, stream): 
    2161        entry_offset = None 
    22         section_offset = None 
    2362        section_title = None 
    24         subsection_offset = None 
    2563        subsection_title = None 
    2664        textline_start = None 
    27          
     65 
    2866        for line in stream: 
    2967            startswith = line.startswith 
    30             # TODO: Reorder by frequency  
     68            # TODO: Reorder by frequency (for faster fallthrough) 
    3169            if startswith("ENTRY"): 
    3270                # Start parsing new entry 
     
    3775                yield (self.SECTION_START, title, rest) 
    3876                yield (self.SECTION_END, title, None) 
    39                  
     77 
    4078            elif startswith("///"): 
    4179                # End entry 
     
    4482                    yield (self.SUBSECTION_END, subsection_title, None) 
    4583                    subsection_title = None 
    46                     subsection_offset = None 
    47                      
     84 
    4885                if section_title is not None: 
    4986                    # End current section if any 
    5087                    yield (self.SECTION_END, section_title, None) 
    5188                    section_title = None 
    52                     subsection_offset = None 
    53                      
     89 
    5490                yield (self.ENTRY_END, None, None) 
    5591                entry_offset = None 
    5692                textline_start = None 
    57                  
     93 
    5894            elif not startswith(" "): 
    5995                # Start new section 
     
    6298                    yield (self.SUBSECTION_END, subsection_title, None) 
    6399                    subsection_title = None 
    64                     subsection_offset = None 
    65                      
     100 
    66101                if section_title is not None: 
    67102                    # End current section if any 
    68103                    yield (self.SECTION_END, section_title, None) 
    69104                    section_title = None 
    70                     subsection_offset = None 
     105 
    71106                title, rest = self._partition_section_title(line) 
    72                 section_offset = len(line) - len(rest) 
    73107                section_title = title 
    74108                yield (self.SECTION_START, section_title, rest) 
    75                  
     109 
    76110            elif startswith(textline_start): 
    77111                # A line of text 
    78112                # TODO: pass the current subsection/section title 
    79113                yield (self.TEXT, None, line[entry_offset:]) 
    80                  
     114 
    81115            elif startswith(" "): 
    82116                # Start a new subsection 
     
    85119                    yield (self.SUBSECTION_END, subsection_title, None) 
    86120                title, rest = self._partition_subsection_title(line) 
    87                 subsection_offset = len(line) - len(rest) 
    88121                subsection_title = title 
    89122                yield (self.SUBSECTION_START, subsection_title, rest) 
    90                  
     123 
    91124        # Close any remaining sections/entries 
    92125        if subsection_title is not None: 
     
    96129        if entry_offset is not None: 
    97130            yield (self.ENTRY_END, None, None) 
    98      
     131 
    99132    def parse_string(self, string): 
    100         from StringIO import StringIO 
    101133        return self.parse(StringIO(string)) 
    102      
     134 
    103135    def _partition_section_title(self, line): 
    104         """ Split the section title from the rest of the line 
     136        """ 
     137        Split the section title from the rest of the line 
    105138        """ 
    106139        title, rest = line.split(" ", 1) 
    107140        rest = rest.lstrip(" ") 
    108141        return title, rest 
    109      
     142 
    110143    def _partition_subsection_title(self, line): 
    111         """ Split the subsection title from the rest of the line 
     144        """ 
     145        Split the subsection title from the rest of the line 
    112146        """ 
    113147        line = line.lstrip(" ") 
    114148        return self._partition_section_title(line) 
    115      
Note: See TracChangeset for help on using the changeset viewer.