source: orange-bioinformatics/obiKEGG2/entry/parser.py @ 1532:14a377419a09

Revision 1532:14a377419a09, 4.2 KB checked in by ales_erjavec, 2 years ago (diff)

Added KEGG interface using web services

Line 
1"""
2A parser for DBGET entries
3 
4"""
5
6class DBGETEntryParser(object):
7    """ A DBGET entry parser (inspired by ``xml.dom.pulldom``)
8    """
9    ENTRY_START = 0
10    ENTRY_END = 1
11    SECTION_START = 2
12    SECTION_END = 3
13    SUBSECTION_START = 4
14    SUBSECTION_END = 5
15    TEXT = 6
16   
17    def __init__(self):
18        pass
19   
20    def parse(self, stream):
21        entry_offset = None
22        section_offset = None
23        section_title = None
24        subsection_offset = None
25        subsection_title = None
26        textline_start = None
27       
28        for line in stream:
29            startswith = line.startswith
30            # TODO: Reorder by frequency
31            if startswith("ENTRY"):
32                # Start parsing new entry
33                yield (self.ENTRY_START, None, None)
34                title, rest = self._partition_section_title(line)
35                entry_offset = len(line) - len(rest)
36                textline_start = " " * entry_offset
37                yield (self.SECTION_START, title, rest)
38                yield (self.SECTION_END, title, None)
39               
40            elif startswith("///"):
41                # End entry
42                if subsection_title is not None:
43                    # End current subsection if any
44                    yield (self.SUBSECTION_END, subsection_title, None)
45                    subsection_title = None
46                    subsection_offset = None
47                   
48                if section_title is not None:
49                    # End current section if any
50                    yield (self.SECTION_END, section_title, None)
51                    section_title = None
52                    subsection_offset = None
53                   
54                yield (self.ENTRY_END, None, None)
55                entry_offset = None
56                textline_start = None
57               
58            elif not startswith(" "):
59                # Start new section
60                if subsection_title is not None:
61                    # End current subsection if any
62                    yield (self.SUBSECTION_END, subsection_title, None)
63                    subsection_title = None
64                    subsection_offset = None
65                   
66                if section_title is not None:
67                    # End current section if any
68                    yield (self.SECTION_END, section_title, None)
69                    section_title = None
70                    subsection_offset = None
71                title, rest = self._partition_section_title(line)
72                section_offset = len(line) - len(rest)
73                section_title = title
74                yield (self.SECTION_START, section_title, rest)
75               
76            elif startswith(textline_start):
77                # A line of text
78                # TODO: pass the current subsection/section title
79                yield (self.TEXT, None, line[entry_offset:])
80               
81            elif startswith(" "):
82                # Start a new subsection
83                if subsection_title is not None:
84                    # End current subsection
85                    yield (self.SUBSECTION_END, subsection_title, None)
86                title, rest = self._partition_subsection_title(line)
87                subsection_offset = len(line) - len(rest)
88                subsection_title = title
89                yield (self.SUBSECTION_START, subsection_title, rest)
90               
91        # Close any remaining sections/entries
92        if subsection_title is not None:
93            yield (self.SUBSECTION_END, subsection_title, None)
94        if section_title is not None:
95            yield (self.SECTION_END, section_title, None)
96        if entry_offset is not None:
97            yield (self.ENTRY_END, None, None)
98   
99    def parse_string(self, string):
100        from StringIO import StringIO
101        return self.parse(StringIO(string))
102   
103    def _partition_section_title(self, line):
104        """ Split the section title from the rest of the line
105        """
106        title, rest = line.split(" ", 1)
107        rest = rest.lstrip(" ")
108        return title, rest
109   
110    def _partition_subsection_title(self, line):
111        """ Split the subsection title from the rest of the line
112        """
113        line = line.lstrip(" ")
114        return self._partition_section_title(line)
115   
Note: See TracBrowser for help on using the repository browser.