blob: b1c80e0d8ee52fce47c77f07e63e552eaf9ad74d [file] [log] [blame]
__all__ = ["Mark", "YAMLError", "MarkedYAMLError"]
class Mark:
def __init__(self, name, index, line, column, buffer, pointer):
self.name = name
self.index = index
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 "\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 "\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]
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_mark=None,
problem=None,
problem_mark=None,
note=None,
):
self.context = context
self.context_mark = context_mark
self.problem = problem
self.problem_mark = problem_mark
self.note = note
def __str__(self):
lines = []
if self.context is not None:
lines.append(self.context)
if self.context_mark is not None and (
self.problem is None
or self.problem_mark is None
or self.context_mark.name != self.problem_mark.name
or self.context_mark.line != self.problem_mark.line
or self.context_mark.column != self.problem_mark.column
):
lines.append(str(self.context_mark))
if self.problem is not None:
lines.append(self.problem)
if self.problem_mark is not None:
lines.append(str(self.problem_mark))
if self.note is not None:
lines.append(self.note)
return "\n".join(lines)