/deps/build/Pygments/build/lib.linux-x86_64-2.6/pygments/lexers/__init__.py

https://github.com/smorstabilini/ilmioquartiere · Python · 208 lines · 143 code · 21 blank · 44 comment · 31 complexity · 71f97ad9861e8e4747aaba6f9ae4ffb0 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """
  3. pygments.lexers
  4. ~~~~~~~~~~~~~~~
  5. Pygments lexers.
  6. :copyright: 2006-2007 by Georg Brandl.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import fnmatch
  10. import types
  11. from os.path import basename
  12. try:
  13. set
  14. except NameError:
  15. from sets import Set as set
  16. from pygments.lexers._mapping import LEXERS
  17. from pygments.plugin import find_plugin_lexers
  18. from pygments.util import ClassNotFound
  19. __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
  20. 'guess_lexer'] + LEXERS.keys()
  21. _lexer_cache = {}
  22. def _load_lexers(module_name):
  23. """
  24. Load a lexer (and all others in the module too).
  25. """
  26. mod = __import__(module_name, None, None, ['__all__'])
  27. for lexer_name in mod.__all__:
  28. cls = getattr(mod, lexer_name)
  29. _lexer_cache[cls.name] = cls
  30. def get_all_lexers():
  31. """
  32. Return a generator of tuples in the form ``(name, aliases,
  33. filenames, mimetypes)`` of all know lexers.
  34. """
  35. for item in LEXERS.itervalues():
  36. yield item[1:]
  37. for lexer in find_plugin_lexers():
  38. yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes
  39. def find_lexer_class(name):
  40. """
  41. Lookup a lexer class by name. Return None if not found.
  42. """
  43. if name in _lexer_cache:
  44. return _lexer_cache[name]
  45. # lookup builtin lexers
  46. for module_name, lname, aliases, _, _ in LEXERS.itervalues():
  47. if name == lname:
  48. _load_lexers(module_name)
  49. return _lexer_cache[name]
  50. # continue with lexers from setuptools entrypoints
  51. for cls in find_plugin_lexers():
  52. if cls.name == name:
  53. return cls
  54. def get_lexer_by_name(_alias, **options):
  55. """
  56. Get a lexer by an alias.
  57. """
  58. # lookup builtin lexers
  59. for module_name, name, aliases, _, _ in LEXERS.itervalues():
  60. if _alias in aliases:
  61. if name not in _lexer_cache:
  62. _load_lexers(module_name)
  63. return _lexer_cache[name](**options)
  64. # continue with lexers from setuptools entrypoints
  65. for cls in find_plugin_lexers():
  66. if _alias in cls.aliases:
  67. return cls(**options)
  68. raise ClassNotFound('no lexer for alias %r found' % _alias)
  69. def get_lexer_for_filename(_fn, **options):
  70. """
  71. Get a lexer for a filename.
  72. """
  73. fn = basename(_fn)
  74. for modname, name, _, filenames, _ in LEXERS.itervalues():
  75. for filename in filenames:
  76. if fnmatch.fnmatch(fn, filename):
  77. if name not in _lexer_cache:
  78. _load_lexers(modname)
  79. return _lexer_cache[name](**options)
  80. for cls in find_plugin_lexers():
  81. for filename in cls.filenames:
  82. if fnmatch.fnmatch(fn, filename):
  83. return cls(**options)
  84. raise ClassNotFound('no lexer for filename %r found' % _fn)
  85. def get_lexer_for_mimetype(_mime, **options):
  86. """
  87. Get a lexer for a mimetype.
  88. """
  89. for modname, name, _, _, mimetypes in LEXERS.itervalues():
  90. if _mime in mimetypes:
  91. if name not in _lexer_cache:
  92. _load_lexers(modname)
  93. return _lexer_cache[name](**options)
  94. for cls in find_plugin_lexers():
  95. if _mime in cls.mimetypes:
  96. return cls(**options)
  97. raise ClassNotFound('no lexer for mimetype %r found' % _mime)
  98. def _iter_lexerclasses():
  99. """
  100. Return an iterator over all lexer classes.
  101. """
  102. for module_name, name, _, _, _ in LEXERS.itervalues():
  103. if name not in _lexer_cache:
  104. _load_lexers(module_name)
  105. yield _lexer_cache[name]
  106. for lexer in find_plugin_lexers():
  107. yield lexer
  108. def guess_lexer_for_filename(_fn, _text, **options):
  109. """
  110. Lookup all lexers that handle those filenames primary (``filenames``)
  111. or secondary (``alias_filenames``). Then run a text analysis for those
  112. lexers and choose the best result.
  113. usage::
  114. >>> from pygments.lexers import guess_lexer_for_filename
  115. >>> guess_lexer_for_filename('hello.html', '<%= @foo %>')
  116. <pygments.lexers.templates.RhtmlLexer object at 0xb7d2f32c>
  117. >>> guess_lexer_for_filename('hello.html', '<h1>{{ title|e }}</h1>')
  118. <pygments.lexers.templates.HtmlDjangoLexer object at 0xb7d2f2ac>
  119. >>> guess_lexer_for_filename('style.css', 'a { color: <?= $link ?> }')
  120. <pygments.lexers.templates.CssPhpLexer object at 0xb7ba518c>
  121. """
  122. fn = basename(_fn)
  123. primary = None
  124. matching_lexers = set()
  125. for lexer in _iter_lexerclasses():
  126. for filename in lexer.filenames:
  127. if fnmatch.fnmatch(fn, filename):
  128. matching_lexers.add(lexer)
  129. primary = lexer
  130. for filename in lexer.alias_filenames:
  131. if fnmatch.fnmatch(fn, filename):
  132. matching_lexers.add(lexer)
  133. if not matching_lexers:
  134. raise ClassNotFound('no lexer for filename %r found' % fn)
  135. if len(matching_lexers) == 1:
  136. return matching_lexers.pop()(**options)
  137. result = []
  138. for lexer in matching_lexers:
  139. rv = lexer.analyse_text(_text)
  140. if rv == 1.0:
  141. return lexer(**options)
  142. result.append((rv, lexer))
  143. result.sort()
  144. if not result[-1][0] and primary is not None:
  145. return primary(**options)
  146. return result[-1][1](**options)
  147. def guess_lexer(_text, **options):
  148. """
  149. Guess a lexer by strong distinctions in the text (eg, shebang).
  150. """
  151. best_lexer = [0.0, None]
  152. for lexer in _iter_lexerclasses():
  153. rv = lexer.analyse_text(_text)
  154. if rv == 1.0:
  155. return lexer(**options)
  156. if rv > best_lexer[0]:
  157. best_lexer[:] = (rv, lexer)
  158. if not best_lexer[0] or best_lexer[1] is None:
  159. raise ClassNotFound('no lexer matching the text found')
  160. return best_lexer[1](**options)
  161. class _automodule(types.ModuleType):
  162. """Automatically import lexers."""
  163. def __getattr__(self, name):
  164. info = LEXERS.get(name)
  165. if info:
  166. _load_lexers(info[0])
  167. cls = _lexer_cache[info[1]]
  168. setattr(self, name, cls)
  169. return cls
  170. raise AttributeError(name)
  171. import sys
  172. oldmod = sys.modules['pygments.lexers']
  173. newmod = _automodule('pygments.lexers')
  174. newmod.__dict__.update(oldmod.__dict__)
  175. sys.modules['pygments.lexers'] = newmod
  176. del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types