summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pygments/lexers/__init__.py20
1 files changed, 11 insertions, 9 deletions
diff --git a/pygments/lexers/__init__.py b/pygments/lexers/__init__.py
index 152f2457..a7031dbb 100644
--- a/pygments/lexers/__init__.py
+++ b/pygments/lexers/__init__.py
@@ -93,30 +93,32 @@ def get_lexer_for_filename(_fn, code=None, **options):
if fnmatch.fnmatch(fn, filename):
if name not in _lexer_cache:
_load_lexers(modname)
- matches.append(_lexer_cache[name])
+ matches.append((_lexer_cache[name], filename))
for cls in find_plugin_lexers():
for filename in cls.filenames:
if fnmatch.fnmatch(fn, filename):
- matches.append(cls)
+ matches.append((cls, filename))
if sys.version_info > (3,) and isinstance(code, bytes):
# decode it, since all analyse_text functions expect unicode
code = code.decode('latin1')
- def get_rating(cls):
+ def get_rating(info):
+ cls, filename = info
+ # explicit patterns get a bonus
+ bonus = '*' not in filename and 0.5 or 0
# 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:
+ return cls.analyse_text(code) + bonus
+ return bonus
- if code:
- matches.sort(key=get_rating)
if matches:
+ matches.sort(key=get_rating)
#print "Possible lexers, after sort:", matches
- return matches[-1](**options)
+ return matches[-1][0](**options)
raise ClassNotFound('no lexer for filename %r found' % _fn)