PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 1ms

/tortoisehg/hgqt/lexers.py

http://tortoisehg.codeplex.com
Python | 216 lines | 156 code | 41 blank | 19 comment | 23 complexity | 4f7592b6a0f150a250c704f626771af8 MD5 | raw file
Possible License(s): GPL-2.0
  1. # lexers.py - select Qsci lexer for a filename and contents
  2. #
  3. # Copyright 2010 Steve Borho <steve@borho.org>
  4. #
  5. # This software may be used and distributed according to the terms of the
  6. # GNU General Public License version 2, incorporated herein by reference.
  7. import re
  8. from PyQt4 import Qsci
  9. from PyQt4.QtGui import *
  10. from tortoisehg.hgqt import qtlib
  11. class _LexerSelector(object):
  12. _lexer = None
  13. def match(self, filename, filedata):
  14. return False
  15. def lexer(self, parent):
  16. """
  17. Return a configured instance of the lexer
  18. """
  19. return self.cfg_lexer(self._lexer(parent))
  20. def cfg_lexer(self, lexer):
  21. font = qtlib.getfont('fontlog').font()
  22. lexer.setFont(font, -1)
  23. return lexer
  24. class _FilenameLexerSelector(_LexerSelector):
  25. """
  26. Base class for lexer selector based on file name matching
  27. """
  28. extensions = ()
  29. def match(self, filename, filedata):
  30. filename = filename.lower()
  31. for ext in self.extensions:
  32. if filename.endswith(ext):
  33. return True
  34. return False
  35. class _ScriptLexerSelector(_FilenameLexerSelector):
  36. """
  37. Base class for lexer selector based on content pattern matching
  38. """
  39. regex = None
  40. headersize = 3
  41. def match(self, filename, filedata):
  42. if super(_ScriptLexerSelector, self).match(filename, filedata):
  43. return True
  44. if self.regex and filedata:
  45. for line in filedata.splitlines()[:self.headersize]:
  46. if len(line)<1000 and self.regex.match(line):
  47. return True
  48. return False
  49. class PythonLexerSelector(_ScriptLexerSelector):
  50. extensions = ('.py', '.pyw')
  51. _lexer = Qsci.QsciLexerPython
  52. regex = re.compile(r'^#[!].*python')
  53. class BashLexerSelector(_ScriptLexerSelector):
  54. extensions = ('.sh', '.bash')
  55. _lexer = Qsci.QsciLexerBash
  56. regex = re.compile(r'^#[!].*sh')
  57. class PerlLexerSelector(_ScriptLexerSelector):
  58. extensions = ('.pl', '.perl')
  59. _lexer = Qsci.QsciLexerPerl
  60. regex = re.compile(r'^#[!].*perl')
  61. class RubyLexerSelector(_ScriptLexerSelector):
  62. extensions = ('.rb', '.ruby')
  63. _lexer = Qsci.QsciLexerRuby
  64. regex = re.compile(r'^#[!].*ruby')
  65. class LuaLexerSelector(_ScriptLexerSelector):
  66. extensions = ('.lua', )
  67. _lexer = Qsci.QsciLexerLua
  68. regex = None
  69. class CppLexerSelector(_FilenameLexerSelector):
  70. extensions = ('.c', '.cpp', '.cxx', '.h', '.hpp', '.hxx')
  71. _lexer = Qsci.QsciLexerCPP
  72. class DLexerSelector(_FilenameLexerSelector):
  73. extensions = ('.d',)
  74. _lexer = Qsci.QsciLexerD
  75. class PascalLexerSelector(_FilenameLexerSelector):
  76. extensions = ('.pas',)
  77. _lexer = Qsci.QsciLexerPascal
  78. class CSSLexerSelector(_FilenameLexerSelector):
  79. extensions = ('.css',)
  80. _lexer = Qsci.QsciLexerCSS
  81. class XMLLexerSelector(_FilenameLexerSelector):
  82. extensions = ('.xhtml', '.xml', '.csproj', 'app.config', 'web.config')
  83. _lexer = Qsci.QsciLexerXML
  84. class HTMLLexerSelector(_FilenameLexerSelector):
  85. extensions = ('.htm', '.html')
  86. _lexer = Qsci.QsciLexerHTML
  87. class YAMLLexerSelector(_FilenameLexerSelector):
  88. extensions = ('.yml',)
  89. _lexer = Qsci.QsciLexerYAML
  90. class VerilogLexerSelector(_FilenameLexerSelector):
  91. extensions = ('.v', '.vh')
  92. _lexer = Qsci.QsciLexerVerilog
  93. class VHDLLexerSelector(_FilenameLexerSelector):
  94. extensions = ('.vhd', '.vhdl')
  95. _lexer = Qsci.QsciLexerVHDL
  96. class BatchLexerSelector(_FilenameLexerSelector):
  97. extensions = ('.cmd', '.bat')
  98. _lexer = Qsci.QsciLexerBatch
  99. class MakeLexerSelector(_FilenameLexerSelector):
  100. extensions = ('.mk', 'makefile')
  101. _lexer = Qsci.QsciLexerMakefile
  102. class CMakeLexerSelector(_FilenameLexerSelector):
  103. extensions = ('.cmake', 'cmakelists.txt')
  104. _lexer = Qsci.QsciLexerCMake
  105. class SQLLexerSelector(_FilenameLexerSelector):
  106. extensions = ('.sql',)
  107. _lexer = Qsci.QsciLexerSQL
  108. class JSLexerSelector(_FilenameLexerSelector):
  109. extensions = ('.js', '.json')
  110. _lexer = Qsci.QsciLexerJavaScript
  111. class JavaLexerSelector(_FilenameLexerSelector):
  112. extensions = ('.java',)
  113. _lexer = Qsci.QsciLexerJava
  114. class TeXLexerSelector(_FilenameLexerSelector):
  115. extensions = ('.tex', '.latex',)
  116. _lexer = Qsci.QsciLexerTeX
  117. class CSharpLexerSelector(_FilenameLexerSelector):
  118. extensions = ('.cs',)
  119. _lexer = Qsci.QsciLexerCSharp
  120. class TCLLexerSelector(_FilenameLexerSelector):
  121. extensions = ('.tcl', '.do', '.fdo', '.udo')
  122. _lexer = Qsci.QsciLexerTCL
  123. class MatlabLexerSelector(_FilenameLexerSelector):
  124. extensions = ('.m',)
  125. try:
  126. _lexer = Qsci.QsciLexerMatlab
  127. except AttributeError: # QScintilla<2.5.1
  128. # Python lexer is quite similar
  129. _lexer = Qsci.QsciLexerPython
  130. class FortranLexerSelector(_FilenameLexerSelector):
  131. extensions = ('.f90', '.f95', '.f03',)
  132. _lexer = Qsci.QsciLexerFortran
  133. class Fortran77LexerSelector(_FilenameLexerSelector):
  134. extensions = ('.f', '.f77',)
  135. _lexer = Qsci.QsciLexerFortran77
  136. class SpiceLexerSelector(_FilenameLexerSelector):
  137. extensions = ('.cir', '.sp',)
  138. _lexer = Qsci.QsciLexerSpice
  139. class PropertyLexerSelector(_FilenameLexerSelector):
  140. extensions = ('.ini', '.properties')
  141. _lexer = Qsci.QsciLexerProperties
  142. class DiffLexerSelector(_ScriptLexerSelector):
  143. extensions = ()
  144. _lexer = Qsci.QsciLexerDiff
  145. regex = re.compile(r'^@@ [-]\d+,\d+ [+]\d+,\d+ @@$')
  146. def cfg_lexer(self, lexer):
  147. #lexer.setDefaultPaper(QtGui.QColor(cfg.getDiffBGColor()))
  148. #lexer.setColor(QtGui.QColor(cfg.getDiffFGColor()), -1)
  149. for label, i in (('diff.inserted', 6),
  150. ('diff.deleted', 5),
  151. ('diff.hunk', 4)):
  152. effect = qtlib.geteffect(label)
  153. for e in effect.split(';'):
  154. if e.startswith('color:'):
  155. lexer.setColor(QColor(e[7:]), i)
  156. if e.startswith('background-color:'):
  157. lexer.setEolFill(True, i)
  158. lexer.setPaper(QColor(e[18:]), i)
  159. font = qtlib.getfont('fontdiff').font()
  160. lexer.setFont(font, -1)
  161. return lexer
  162. lexers = []
  163. for clsname, cls in globals().items():
  164. if clsname.startswith('_'):
  165. continue
  166. if isinstance(cls, type) and issubclass(cls, _LexerSelector):
  167. #print clsname
  168. lexers.append(cls())
  169. def get_diff_lexer(parent):
  170. return DiffLexerSelector().lexer(parent)
  171. def get_lexer(filename, filedata, parent):
  172. for lselector in lexers:
  173. if lselector.match(filename, filedata):
  174. return lselector.lexer(parent)
  175. return None