summaryrefslogtreecommitdiff
path: root/pygments/lexers/__init__.py
blob: 0ef200db9db49f66660b56ca8d51d78d35746526 (plain)
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
# -*- coding: utf-8 -*-
"""
    pygments.lexers
    ~~~~~~~~~~~~~~

    Pygments lexers.

    :copyright: 2006 by Georg Brandl.
    :license: GNU LGPL, see LICENSE for more details.
"""
import fnmatch
import types
from os.path import basename

from pygments.lexers._mapping import LEXERS


__all__ = ['get_lexer_by_name', 'get_lexer_for_filename'] + LEXERS.keys()

_lexer_cache = {}


def _load_lexers(module_name):
    """
    Loads a lexer (and all others in the module too)
    """
    mod = __import__(module_name, None, None, ['__all__'])
    for lexer_name in mod.__all__:
        cls = getattr(mod, lexer_name)
        _lexer_cache[cls.name] = cls


def get_lexer_by_name(alias, **options):
    """
    Get a lexer by an alias
    """
    for module_name, name, aliases, _ in LEXERS.itervalues():
        if alias in aliases:
            if name not in _lexer_cache:
                _load_lexers(module_name)
            return _lexer_cache[name](**options)
    raise ValueError('no lexer for alias %r found' % alias)


def get_lexer_for_filename(fn, **options):
    """
    Guess a lexer by a filename
    """
    fn = basename(fn)
    for module_name, name, _, filenames in LEXERS.itervalues():
        for filename in filenames:
            if fnmatch.fnmatch(fn, filename):
                if name not in _lexer_cache:
                    _load_lexers(module_name)
                return _lexer_cache[name](**options)
    raise ValueError('no lexer for filename %r found' % fn)


class _automodule(types.ModuleType):

    def __getattr__(self, name):
        """Automatically import lexers."""
        info = LEXERS.get(name)
        if info:
            _load_lexers(info[0])
            cls = _lexer_cache[info[1]]
            setattr(self, name, cls)
            return cls
        raise AttributeError(name)


import sys
oldmod = sys.modules['pygments.lexers']
newmod = _automodule('pygments.lexers')
newmod.__dict__.update(oldmod.__dict__)
sys.modules['pygments.lexers'] = newmod
del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types