
__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)



