diff options
-rw-r--r-- | pygments/cmdline.py | 2 | ||||
-rw-r--r-- | pygments/lexers/__init__.py | 26 | ||||
-rw-r--r-- | tests/examplefiles/matlab_sample (renamed from tests/examplefiles/sample.m) | 0 |
3 files changed, 23 insertions, 5 deletions
diff --git a/pygments/cmdline.py b/pygments/cmdline.py index d1d21412..b9fe870a 100644 --- a/pygments/cmdline.py +++ b/pygments/cmdline.py @@ -366,7 +366,7 @@ def main(args=sys.argv): if not lexer: try: - lexer = get_lexer_for_filename(infn, **parsed_opts) + lexer = get_lexer_for_filename(infn, code, **parsed_opts) except ClassNotFound, err: if '-g' in opts: try: diff --git a/pygments/lexers/__init__.py b/pygments/lexers/__init__.py index 255fa022..fc242ae8 100644 --- a/pygments/lexers/__init__.py +++ b/pygments/lexers/__init__.py @@ -83,21 +83,39 @@ def get_lexer_by_name(_alias, **options): raise ClassNotFound('no lexer for alias %r found' % _alias) -def get_lexer_for_filename(_fn, **options): +def get_lexer_for_filename(_fn, code=None, **options): """ - Get a lexer for a filename. + Get a lexer for a filename. If multiple lexers match the filename + pattern, use ``analyze_text()`` to figure out which one is more + appropriate. """ + matches = [] fn = basename(_fn) for modname, name, _, filenames, _ in LEXERS.itervalues(): for filename in filenames: if fnmatch.fnmatch(fn, filename): if name not in _lexer_cache: _load_lexers(modname) - return _lexer_cache[name](**options) + matches.append(_lexer_cache[name]) for cls in find_plugin_lexers(): for filename in cls.filenames: if fnmatch.fnmatch(fn, filename): - return cls(**options) + matches.append(cls) + + def get_rating(cls): + # The class _always_ defines analyse_text because it's included in + # the Lexer class. The default implementation returns None which + # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py + # to find lexers which need it overridden. + d = cls.analyse_text(code) + #print "Got %r from %r" % (d, cls) + return d + + if code: + matches.sort(key=get_rating) + if matches: + #print "Possible lexers, after sort:", matches + return matches[-1](**options) raise ClassNotFound('no lexer for filename %r found' % _fn) diff --git a/tests/examplefiles/sample.m b/tests/examplefiles/matlab_sample index 1834050c..1834050c 100644 --- a/tests/examplefiles/sample.m +++ b/tests/examplefiles/matlab_sample |