Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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)