1# -*- coding: utf-8 -*-
2"""
3    pygments.lexers.resource
4    ~~~~~~~~~~~~~~~~~~~~~~~~
5
6    Lexer for resource definition files.
7
8    :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS.
9    :license: BSD, see LICENSE for details.
10"""
11
12import re
13
14from pygments.lexer import RegexLexer, bygroups, words
15from pygments.token import Comment, String, Number, Operator, Text, \
16    Keyword, Name
17
18__all__ = ['ResourceLexer']
19
20
21class ResourceLexer(RegexLexer):
22    """Lexer for `ICU Resource bundles
23    <http://userguide.icu-project.org/locale/resources>`_.
24
25    .. versionadded:: 2.0
26    """
27    name = 'ResourceBundle'
28    aliases = ['resource', 'resourcebundle']
29    filenames = []
30
31    _types = (':table', ':array', ':string', ':bin', ':import', ':intvector',
32              ':int', ':alias')
33
34    flags = re.MULTILINE | re.IGNORECASE
35    tokens = {
36        'root': [
37            (r'//.*?$', Comment),
38            (r'"', String, 'string'),
39            (r'-?\d+', Number.Integer),
40            (r'[,{}]', Operator),
41            (r'([^\s{:]+)(\s*)(%s?)' % '|'.join(_types),
42             bygroups(Name, Text, Keyword)),
43            (r'\s+', Text),
44            (words(_types), Keyword),
45        ],
46        'string': [
47            (r'(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|'
48             r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+', String),
49            (r'\{', String.Escape, 'msgname'),
50            (r'"', String, '#pop')
51        ],
52        'msgname': [
53            (r'([^{},]+)(\s*)', bygroups(Name, String.Escape), ('#pop', 'message'))
54        ],
55        'message': [
56            (r'\{', String.Escape, 'msgname'),
57            (r'\}', String.Escape, '#pop'),
58            (r'(,)(\s*)([a-z]+)(\s*\})',
59             bygroups(Operator, String.Escape, Keyword, String.Escape), '#pop'),
60            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)',
61             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
62                      String.Escape, Operator.Word, String.Escape, Operator,
63                      String.Escape, Number.Integer, String.Escape), 'choice'),
64            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)',
65             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
66                      String.Escape), 'choice'),
67            (r'\s+', String.Escape)
68        ],
69        'choice': [
70            (r'(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)',
71             bygroups(Operator, Number.Integer, String.Escape), 'message'),
72            (r'([a-z]+)(\s*\{)', bygroups(Keyword.Type, String.Escape), 'str'),
73            (r'\}', String.Escape, ('#pop', '#pop')),
74            (r'\s+', String.Escape)
75        ],
76        'str': [
77            (r'\}', String.Escape, '#pop'),
78            (r'\{', String.Escape, 'msgname'),
79            (r'[^{}]+', String)
80        ]
81    }
82
83    def analyse_text(text):
84        if text.startswith('root:table'):
85            return 1.0
86