__all__ = ['Marker', 'YAMLError', 'MarkedYAMLError'] class Marker: def __init__(self, name, line, column, buffer, pointer): self.name = name self.line = line self.column = column self.buffer = buffer self.pointer = pointer def get_snippet(self, indent=4, max_length=75): if self.buffer is None: return None head = '' start = self.pointer while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029': start -= 1 if self.pointer-start > max_length/2-1: head = ' ... ' start += 5 break tail = '' end = self.pointer while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029': end += 1 if end-self.pointer > max_length/2-1: tail = ' ... ' end -= 5 break snippet = self.buffer[start:end].encode('utf-8') return ' '*indent + head + snippet + tail + '\n' \ + ' '*(indent+self.pointer-start+len(head)) + '^' def __str__(self): snippet = self.get_snippet() where = " in \"%s\", line %d, column %d" \ % (self.name, self.line+1, self.column+1) if snippet is not None: where += ":\n"+snippet return where class YAMLError(Exception): pass class MarkedYAMLError(YAMLError): def __init__(self, context=None, context_marker=None, problem=None, problem_marker=None): self.context = context self.context_marker = context_marker self.problem = problem self.problem_marker = problem_marker def __str__(self): lines = [] #for (place, marker) in [(self.context, self.context_marker), # (self.problem, self.problem_marker)]: # if place is not None: # lines.append(place) # if marker is not None: # lines.append(str(marker)) if self.context is not None: lines.append(self.context) if self.context_marker is not None \ and (self.problem is None or self.problem_marker is None or self.context_marker.name != self.problem_marker.name or self.context_marker.line != self.problem_marker.line or self.context_marker.column != self.problem_marker.column): lines.append(str(self.context_marker)) if self.problem is not None: lines.append(self.problem) if self.problem_marker is not None: lines.append(str(self.problem_marker)) return '\n'.join(lines)