aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/PyYAML/py2/yaml/error.py
blob: 905e265ab18d84f6eab7160b2e7989edb9ad9415 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] 
 
class Mark(object): 
 
    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 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_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)