source: pyyaml/trunk/lib/yaml/error.py @ 119

Revision 119, 2.7 KB checked in by xi, 8 years ago (diff)

Add an example: yaml highlight script.

Usage:

$ cat your_yaml_document | ./yaml_hl.py                         # Produces colored ASCII output
$ cat your_yaml_document | ./yaml_hl.py -c yaml_hl_html.cfg     # Produces HTML output.
RevLine 
[45]1
[116]2__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError']
[52]3
[116]4class Mark:
[52]5
[119]6    def __init__(self, name, index, line, column, buffer, pointer):
[52]7        self.name = name
[119]8        self.index = index
[52]9        self.line = line
10        self.column = column
11        self.buffer = buffer
12        self.pointer = pointer
13
14    def get_snippet(self, indent=4, max_length=75):
15        if self.buffer is None:
16            return None
17        head = ''
18        start = self.pointer
19        while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029':
20            start -= 1
21            if self.pointer-start > max_length/2-1:
22                head = ' ... '
23                start += 5
24                break
25        tail = ''
26        end = self.pointer
27        while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029':
28            end += 1
29            if end-self.pointer > max_length/2-1:
30                tail = ' ... '
31                end -= 5
32                break
33        snippet = self.buffer[start:end].encode('utf-8')
34        return ' '*indent + head + snippet + tail + '\n'  \
35                + ' '*(indent+self.pointer-start+len(head)) + '^'
36
37    def __str__(self):
38        snippet = self.get_snippet()
39        where = "  in \"%s\", line %d, column %d"   \
40                % (self.name, self.line+1, self.column+1)
41        if snippet is not None:
42            where += ":\n"+snippet
43        return where
44
[45]45class YAMLError(Exception):
46    pass
47
[52]48class MarkedYAMLError(YAMLError):
49
[116]50    def __init__(self, context=None, context_mark=None,
51            problem=None, problem_mark=None):
[52]52        self.context = context
[116]53        self.context_mark = context_mark
[52]54        self.problem = problem
[116]55        self.problem_mark = problem_mark
[52]56
57    def __str__(self):
58        lines = []
[116]59        #for (place, mark) in [(self.context, self.context_mark),
60        #                        (self.problem, self.problem_mark)]:
[52]61        #    if place is not None:
62        #        lines.append(place)
[116]63        #        if mark is not None:
64        #            lines.append(str(mark))
[52]65        if self.context is not None:
66            lines.append(self.context)
[116]67        if self.context_mark is not None  \
68            and (self.problem is None or self.problem_mark is None
69                    or self.context_mark.name != self.problem_mark.name
70                    or self.context_mark.line != self.problem_mark.line
71                    or self.context_mark.column != self.problem_mark.column):
72            lines.append(str(self.context_mark))
[52]73        if self.problem is not None:
74            lines.append(self.problem)
[116]75        if self.problem_mark is not None:
76            lines.append(str(self.problem_mark))
[52]77        return '\n'.join(lines)
78
79
80
Note: See TracBrowser for help on using the repository browser.