| 195 | |
| 196 | |
| 197 | class TextGrid(object): |
| 198 | def __init__(self, text): |
| 199 | text = remove_empty_lines(text) |
| 200 | self.text = text |
| 201 | self.line_count = 0 |
| 202 | self._get_type() |
| 203 | self._get_time_intval() |
| 204 | self._get_size() |
| 205 | self.tier_list = [] |
| 206 | self._get_item_list() |
| 207 | |
| 208 | def _extract_pattern(self, pattern, inc): |
| 209 | """ |
| 210 | Parameters |
| 211 | ---------- |
| 212 | pattern : regex to extract pattern |
| 213 | inc : increment of line count after extraction |
| 214 | Returns |
| 215 | ------- |
| 216 | group : extracted info |
| 217 | """ |
| 218 | try: |
| 219 | group = re.match(pattern, self.text[self.line_count]).group(1) |
| 220 | self.line_count += inc |
| 221 | except AttributeError: |
| 222 | raise ValueError("File format error at line %d:%s" % (self.line_count, self.text[self.line_count])) |
| 223 | return group |
| 224 | |
| 225 | def _get_type(self): |
| 226 | self.file_type = self._extract_pattern(r"File type = \"(.*)\"", 2) |
| 227 | |
| 228 | def _get_time_intval(self): |
| 229 | self.xmin = self._extract_pattern(r"xmin = (.*)", 1) |
| 230 | self.xmax = self._extract_pattern(r"xmax = (.*)", 2) |
| 231 | |
| 232 | def _get_size(self): |
| 233 | self.size = int(self._extract_pattern(r"size = (.*)", 2)) |
| 234 | |
| 235 | def _get_item_list(self): |
| 236 | """Only supports IntervalTier currently""" |
| 237 | for itemIdx in range(1, self.size + 1): |
| 238 | tier = OrderedDict() |
| 239 | item_list = [] |
| 240 | tier_idx = self._extract_pattern(r"item \[(.*)\]:", 1) |
| 241 | tier_class = self._extract_pattern(r"class = \"(.*)\"", 1) |
| 242 | if tier_class != "IntervalTier": |
| 243 | raise NotImplementedError("Only IntervalTier class is supported currently") |
| 244 | tier_name = self._extract_pattern(r"name = \"(.*)\"", 1) |
| 245 | tier_xmin = self._extract_pattern(r"xmin = (.*)", 1) |
| 246 | tier_xmax = self._extract_pattern(r"xmax = (.*)", 1) |
| 247 | tier_size = self._extract_pattern(r"intervals: size = (.*)", 1) |
| 248 | for i in range(int(tier_size)): |
| 249 | item = OrderedDict() |
| 250 | item["idx"] = self._extract_pattern(r"intervals \[(.*)\]", 1) |
| 251 | item["xmin"] = self._extract_pattern(r"xmin = (.*)", 1) |
| 252 | item["xmax"] = self._extract_pattern(r"xmax = (.*)", 1) |
| 253 | item["text"] = self._extract_pattern(r"text = \"(.*)\"", 1) |
| 254 | item_list.append(item) |