summaryrefslogtreecommitdiff
path: root/pygments/lexers/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'pygments/lexers/__init__.py')
-rw-r--r--pygments/lexers/__init__.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/pygments/lexers/__init__.py b/pygments/lexers/__init__.py
index 99ec4a79..0f7c0483 100644
--- a/pygments/lexers/__init__.py
+++ b/pygments/lexers/__init__.py
@@ -16,7 +16,8 @@ from pygments.lexers._mapping import LEXERS
from pygments.plugin import find_plugin_lexers
-__all__ = ['get_lexer_by_name', 'get_lexer_for_filename'] + LEXERS.keys()
+__all__ = ['get_lexer_by_name', 'get_lexer_for_filename',
+ 'guess_lexer'] + LEXERS.keys()
_lexer_cache = {}
@@ -68,6 +69,34 @@ def get_lexer_for_filename(fn, **options):
raise ValueError('no lexer for filename %r found' % fn)
+def guess_lexer(text, **options):
+ """
+ Guess a lexer by strong distinctions in the text (eg, shebang).
+ """
+ best_lexer = [0.0, None]
+ # builtin lexers
+ for module_name, name, _, _ in LEXERS.itervalues():
+ if name not in _lexer_cache:
+ _load_lexers(module_name)
+ lexer = _lexer_cache[name]
+ rv = lexer.analyse_text(text)
+ if rv == 1.0:
+ return lexer(**options)
+ if rv > best_lexer[0]:
+ best_lexer[:] = (rv, lexer)
+ # plugin lexers
+ for lexer in find_plugin_lexers():
+ rv = lexer.analyse_text(text)
+ if rv == 1.0:
+ return lexer(**options)
+ if rv > best_lexer[0]:
+ best_lexer[:] = (rv, lexer)
+ if best_lexer[0] == 0.0 or best_lexer[1] is None:
+ from pygments.lexers.special import TextLexer
+ return TextLexer(**options)
+ return best_lexer[1](**options)
+
+
class _automodule(types.ModuleType):
def __getattr__(self, name):