91 for modname, name, _, filenames, _ in LEXERS.values(): |
91 for modname, name, _, filenames, _ in LEXERS.values(): |
92 for filename in filenames: |
92 for filename in filenames: |
93 if fnmatch.fnmatch(fn, filename): |
93 if fnmatch.fnmatch(fn, filename): |
94 if name not in _lexer_cache: |
94 if name not in _lexer_cache: |
95 _load_lexers(modname) |
95 _load_lexers(modname) |
96 matches.append(_lexer_cache[name]) |
96 matches.append((_lexer_cache[name], filename)) |
97 for cls in find_plugin_lexers(): |
97 for cls in find_plugin_lexers(): |
98 for filename in cls.filenames: |
98 for filename in cls.filenames: |
99 if fnmatch.fnmatch(fn, filename): |
99 if fnmatch.fnmatch(fn, filename): |
100 matches.append(cls) |
100 matches.append((cls, filename)) |
101 |
101 |
102 if sys.version_info > (3,) and isinstance(code, bytes): |
102 if sys.version_info > (3,) and isinstance(code, bytes): |
103 # decode it, since all analyse_text functions expect unicode |
103 # decode it, since all analyse_text functions expect unicode |
104 code = code.decode('latin1') |
104 code = code.decode('latin1') |
105 |
105 |
106 def get_rating(cls): |
106 def get_rating(info): |
|
107 cls, filename = info |
|
108 # explicit patterns get a bonus |
|
109 bonus = '*' not in filename and 0.5 or 0 |
107 # The class _always_ defines analyse_text because it's included in |
110 # The class _always_ defines analyse_text because it's included in |
108 # the Lexer class. The default implementation returns None which |
111 # the Lexer class. The default implementation returns None which |
109 # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py |
112 # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py |
110 # to find lexers which need it overridden. |
113 # to find lexers which need it overridden. |
111 d = cls.analyse_text(code) |
114 if code: |
112 #print "Got %r from %r" % (d, cls) |
115 return cls.analyse_text(code) + bonus |
113 return d |
116 return bonus |
114 |
117 |
115 if code: |
118 if matches: |
116 matches.sort(key=get_rating) |
119 matches.sort(key=get_rating) |
117 if matches: |
|
118 #print "Possible lexers, after sort:", matches |
120 #print "Possible lexers, after sort:", matches |
119 return matches[-1](**options) |
121 return matches[-1][0](**options) |
120 raise ClassNotFound('no lexer for filename %r found' % _fn) |
122 raise ClassNotFound('no lexer for filename %r found' % _fn) |
121 |
123 |
122 |
124 |
123 def get_lexer_for_mimetype(_mime, **options): |
125 def get_lexer_for_mimetype(_mime, **options): |
124 """ |
126 """ |
137 |
139 |
138 def _iter_lexerclasses(): |
140 def _iter_lexerclasses(): |
139 """ |
141 """ |
140 Return an iterator over all lexer classes. |
142 Return an iterator over all lexer classes. |
141 """ |
143 """ |
142 for module_name, name, _, _, _ in LEXERS.values(): |
144 for key in sorted(LEXERS): |
|
145 module_name, name = LEXERS[key][:2] |
143 if name not in _lexer_cache: |
146 if name not in _lexer_cache: |
144 _load_lexers(module_name) |
147 _load_lexers(module_name) |
145 yield _lexer_cache[name] |
148 yield _lexer_cache[name] |
146 for lexer in find_plugin_lexers(): |
149 for lexer in find_plugin_lexers(): |
147 yield lexer |
150 yield lexer |