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

76

77

78

79

80

81

82

83

84

# -*- coding: utf-8 -*- 

""" 

    pygments.lexers.resource 

    ~~~~~~~~~~~~~~~~~~~~~~~~ 

 

    Lexer for resource definition files. 

 

    :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. 

    :license: BSD, see LICENSE for details. 

""" 

 

import re 

 

from pygments.lexer import RegexLexer, bygroups, words 

from pygments.token import Comment, String, Number, Operator, Text, \ 

    Keyword, Name 

 

__all__ = ['ResourceLexer'] 

 

 

class ResourceLexer(RegexLexer): 

    """Lexer for `ICU Resource bundles 

    <http://userguide.icu-project.org/locale/resources>`_. 

 

    .. versionadded:: 2.0 

    """ 

    name = 'ResourceBundle' 

    aliases = ['resource', 'resourcebundle'] 

    filenames = ['*.txt'] 

 

    _types = (':table', ':array', ':string', ':bin', ':import', ':intvector', 

              ':int', ':alias') 

 

    flags = re.MULTILINE | re.IGNORECASE 

    tokens = { 

        'root': [ 

            (r'//.*?$', Comment), 

            (r'"', String, 'string'), 

            (r'-?\d+', Number.Integer), 

            (r'[,{}]', Operator), 

            (r'([^\s{:]+)(\s*)(%s?)' % '|'.join(_types), 

             bygroups(Name, Text, Keyword)), 

            (r'\s+', Text), 

            (words(_types), Keyword), 

        ], 

        'string': [ 

            (r'(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|' 

             r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+', String), 

            (r'\{', String.Escape, 'msgname'), 

            (r'"', String, '#pop') 

        ], 

        'msgname': [ 

            (r'([^{},]+)(\s*)', bygroups(Name, String.Escape), ('#pop', 'message')) 

        ], 

        'message': [ 

            (r'\{', String.Escape, 'msgname'), 

            (r'\}', String.Escape, '#pop'), 

            (r'(,)(\s*)([a-z]+)(\s*\})', 

             bygroups(Operator, String.Escape, Keyword, String.Escape), '#pop'), 

            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)', 

             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator, 

                      String.Escape, Operator.Word, String.Escape, Operator, 

                      String.Escape, Number.Integer, String.Escape), 'choice'), 

            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)', 

             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator, 

                      String.Escape), 'choice'), 

            (r'\s+', String.Escape) 

        ], 

        'choice': [ 

            (r'(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)', 

             bygroups(Operator, Number.Integer, String.Escape), 'message'), 

            (r'([a-z]+)(\s*\{)', bygroups(Keyword.Type, String.Escape), 'str'), 

            (r'\}', String.Escape, ('#pop', '#pop')), 

            (r'\s+', String.Escape) 

        ], 

        'str': [ 

            (r'\}', String.Escape, '#pop'), 

            (r'\{', String.Escape, 'msgname'), 

            (r'[^{}]+', String) 

        ] 

    } 

 

    def analyse_text(text): 

        return text.startswith('root:table')