pygments.rb 0.3.7 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. data/CHANGELOG +9 -0
  2. data/CHANGELOG.md +6 -0
  3. data/LICENSE +1 -1
  4. data/README.md +1 -1
  5. data/lexers +0 -0
  6. data/lib/pygments/version.rb +1 -1
  7. data/test/test_pygments.rb +0 -1
  8. data/vendor/pygments-main/AUTHORS +14 -1
  9. data/vendor/pygments-main/CHANGES +56 -6
  10. data/vendor/pygments-main/LICENSE +1 -1
  11. data/vendor/pygments-main/Makefile +1 -1
  12. data/vendor/pygments-main/REVISION +1 -0
  13. data/vendor/pygments-main/docs/generate.py +1 -1
  14. data/vendor/pygments-main/docs/src/api.txt +1 -1
  15. data/vendor/pygments-main/docs/src/index.txt +1 -1
  16. data/vendor/pygments-main/docs/src/integrate.txt +5 -0
  17. data/vendor/pygments-main/docs/src/java.txt +70 -0
  18. data/vendor/pygments-main/external/autopygmentize +64 -0
  19. data/vendor/pygments-main/external/markdown-processor.py +2 -2
  20. data/vendor/pygments-main/external/moin-parser.py +1 -1
  21. data/vendor/pygments-main/external/rst-directive-old.py +1 -1
  22. data/vendor/pygments-main/external/rst-directive.py +1 -1
  23. data/vendor/pygments-main/pygments/__init__.py +2 -2
  24. data/vendor/pygments-main/pygments/cmdline.py +14 -6
  25. data/vendor/pygments-main/pygments/console.py +1 -1
  26. data/vendor/pygments-main/pygments/filter.py +1 -1
  27. data/vendor/pygments-main/pygments/filters/__init__.py +1 -1
  28. data/vendor/pygments-main/pygments/formatter.py +1 -1
  29. data/vendor/pygments-main/pygments/formatters/__init__.py +1 -1
  30. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -1
  31. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  32. data/vendor/pygments-main/pygments/formatters/html.py +73 -2
  33. data/vendor/pygments-main/pygments/formatters/img.py +1 -1
  34. data/vendor/pygments-main/pygments/formatters/latex.py +1 -1
  35. data/vendor/pygments-main/pygments/formatters/other.py +1 -1
  36. data/vendor/pygments-main/pygments/formatters/rtf.py +1 -1
  37. data/vendor/pygments-main/pygments/formatters/svg.py +1 -1
  38. data/vendor/pygments-main/pygments/formatters/terminal.py +1 -1
  39. data/vendor/pygments-main/pygments/formatters/terminal256.py +1 -1
  40. data/vendor/pygments-main/pygments/lexer.py +76 -12
  41. data/vendor/pygments-main/pygments/lexers/__init__.py +2 -2
  42. data/vendor/pygments-main/pygments/lexers/_asybuiltins.py +1 -1
  43. data/vendor/pygments-main/pygments/lexers/_clbuiltins.py +1 -1
  44. data/vendor/pygments-main/pygments/lexers/_lassobuiltins.py +4 -1
  45. data/vendor/pygments-main/pygments/lexers/_luabuiltins.py +1 -1
  46. data/vendor/pygments-main/pygments/lexers/_mapping.py +26 -10
  47. data/vendor/pygments-main/pygments/lexers/_openedgebuiltins.py +11 -0
  48. data/vendor/pygments-main/pygments/lexers/_phpbuiltins.py +2 -2
  49. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +4 -2
  50. data/vendor/pygments-main/pygments/lexers/_robotframeworklexer.py +14 -3
  51. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +11 -0
  52. data/vendor/pygments-main/pygments/lexers/_sourcemodbuiltins.py +2 -2
  53. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +6 -6
  54. data/vendor/pygments-main/pygments/lexers/agile.py +6 -4
  55. data/vendor/pygments-main/pygments/lexers/asm.py +40 -2
  56. data/vendor/pygments-main/pygments/lexers/compiled.py +751 -438
  57. data/vendor/pygments-main/pygments/lexers/dalvik.py +2 -2
  58. data/vendor/pygments-main/pygments/lexers/dotnet.py +1 -1
  59. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  60. data/vendor/pygments-main/pygments/lexers/functional.py +6 -5
  61. data/vendor/pygments-main/pygments/lexers/hdl.py +3 -3
  62. data/vendor/pygments-main/pygments/lexers/jvm.py +130 -16
  63. data/vendor/pygments-main/pygments/lexers/math.py +250 -9
  64. data/vendor/pygments-main/pygments/lexers/other.py +518 -13
  65. data/vendor/pygments-main/pygments/lexers/parsers.py +3 -2
  66. data/vendor/pygments-main/pygments/lexers/shell.py +48 -2
  67. data/vendor/pygments-main/pygments/lexers/special.py +1 -1
  68. data/vendor/pygments-main/pygments/lexers/sql.py +1 -1
  69. data/vendor/pygments-main/pygments/lexers/templates.py +7 -6
  70. data/vendor/pygments-main/pygments/lexers/text.py +9 -9
  71. data/vendor/pygments-main/pygments/lexers/web.py +264 -51
  72. data/vendor/pygments-main/pygments/plugin.py +1 -1
  73. data/vendor/pygments-main/pygments/scanner.py +1 -1
  74. data/vendor/pygments-main/pygments/style.py +1 -1
  75. data/vendor/pygments-main/pygments/styles/__init__.py +1 -1
  76. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  77. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  78. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  79. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  80. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  81. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  82. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  83. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  84. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  85. data/vendor/pygments-main/pygments/styles/monokai.py +1 -1
  86. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  87. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  88. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  89. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  90. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  91. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  92. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  93. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  94. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  95. data/vendor/pygments-main/pygments/token.py +1 -1
  96. data/vendor/pygments-main/pygments/unistring.py +1 -1
  97. data/vendor/pygments-main/pygments/util.py +1 -1
  98. data/vendor/pygments-main/scripts/check_sources.py +2 -2
  99. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +2 -0
  100. data/vendor/pygments-main/scripts/find_codetags.py +1 -1
  101. data/vendor/pygments-main/scripts/find_error.py +5 -6
  102. data/vendor/pygments-main/setup.cfg +1 -0
  103. data/vendor/pygments-main/setup.py +6 -4
  104. data/vendor/pygments-main/tests/examplefiles/BOM.js +1 -0
  105. data/vendor/pygments-main/tests/examplefiles/autoit_submit.au3 +25 -0
  106. data/vendor/pygments-main/tests/examplefiles/bigtest.nsi +308 -0
  107. data/vendor/pygments-main/tests/examplefiles/ca65_example +284 -0
  108. data/vendor/pygments-main/tests/examplefiles/cbmbas_example +9 -0
  109. data/vendor/pygments-main/tests/examplefiles/classes.dylan +89 -4
  110. data/vendor/pygments-main/tests/examplefiles/example.cob +3556 -0
  111. data/vendor/pygments-main/tests/examplefiles/example.prg +161 -0
  112. data/vendor/pygments-main/tests/examplefiles/example.shell-session +45 -0
  113. data/vendor/pygments-main/tests/examplefiles/example.ts +28 -0
  114. data/vendor/pygments-main/tests/examplefiles/inet_pton6.dg +2 -2
  115. data/vendor/pygments-main/tests/examplefiles/logos_example.xm +28 -0
  116. data/vendor/pygments-main/tests/examplefiles/mg_sample.pro +73 -0
  117. data/vendor/pygments-main/tests/examplefiles/minehunt.qml +112 -0
  118. data/vendor/pygments-main/tests/examplefiles/nanomsg.intr +95 -0
  119. data/vendor/pygments-main/tests/examplefiles/phpMyAdmin.spec +163 -0
  120. data/vendor/pygments-main/tests/examplefiles/rust_example.rs +191 -701
  121. data/vendor/pygments-main/tests/examplefiles/session.dylan-console +9 -0
  122. data/vendor/pygments-main/tests/examplefiles/test.opa +10 -0
  123. data/vendor/pygments-main/tests/examplefiles/test2.pypylog +120 -0
  124. data/vendor/pygments-main/tests/examplefiles/unix-io.lid +37 -0
  125. data/vendor/pygments-main/tests/old_run.py +1 -1
  126. data/vendor/pygments-main/tests/run.py +3 -2
  127. data/vendor/pygments-main/tests/support/tags +36 -0
  128. data/vendor/pygments-main/tests/test_basic_api.py +3 -2
  129. data/vendor/pygments-main/tests/test_clexer.py +1 -1
  130. data/vendor/pygments-main/tests/test_cmdline.py +1 -1
  131. data/vendor/pygments-main/tests/test_examplefiles.py +1 -1
  132. data/vendor/pygments-main/tests/test_html_formatter.py +17 -1
  133. data/vendor/pygments-main/tests/test_latex_formatter.py +1 -1
  134. data/vendor/pygments-main/tests/test_perllexer.py +1 -1
  135. data/vendor/pygments-main/tests/test_regexlexer.py +1 -1
  136. data/vendor/pygments-main/tests/test_token.py +1 -1
  137. data/vendor/pygments-main/tests/test_using_api.py +1 -1
  138. data/vendor/pygments-main/tests/test_util.py +5 -4
  139. metadata +26 -2
@@ -27,7 +27,7 @@
27
27
 
28
28
  .. _Markdown: http://www.freewisdom.org/projects/python-markdown/
29
29
 
30
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
30
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
31
31
  :license: BSD, see LICENSE for details.
32
32
  """
33
33
 
@@ -64,4 +64,4 @@ class CodeBlockPreprocessor(TextPreprocessor):
64
64
  code = code.replace('\n\n', '\n&nbsp;\n').replace('\n', '<br />')
65
65
  return '\n\n<div class="code">%s</div>\n\n' % code
66
66
  return self.pattern.sub(
67
- repl, lines)
67
+ repl, lines)
@@ -31,7 +31,7 @@
31
31
  If you do not want to do that and are willing to accept larger HTML
32
32
  output, you can set the INLINESTYLES option below to True.
33
33
 
34
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
34
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
35
35
  :license: BSD, see LICENSE for details.
36
36
  """
37
37
 
@@ -31,7 +31,7 @@
31
31
  .. _directive documentation:
32
32
  http://docutils.sourceforge.net/docs/howto/rst-directives.html
33
33
 
34
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
34
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
35
35
  :license: BSD, see LICENSE for details.
36
36
  """
37
37
 
@@ -31,7 +31,7 @@
31
31
  .. _directive documentation:
32
32
  http://docutils.sourceforge.net/docs/howto/rst-directives.html
33
33
 
34
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
34
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
35
35
  :license: BSD, see LICENSE for details.
36
36
  """
37
37
 
@@ -22,11 +22,11 @@
22
22
  .. _Pygments tip:
23
23
  http://bitbucket.org/birkenfeld/pygments-main/get/tip.zip#egg=Pygments-dev
24
24
 
25
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
25
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
26
26
  :license: BSD, see LICENSE for details.
27
27
  """
28
28
 
29
- __version__ = '1.5'
29
+ __version__ = '1.6'
30
30
  __docformat__ = 'restructuredtext'
31
31
 
32
32
  __all__ = ['lex', 'format', 'highlight']
@@ -5,7 +5,7 @@
5
5
 
6
6
  Command line interface.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
  import sys
@@ -192,6 +192,14 @@ def main(args=sys.argv):
192
192
 
193
193
  usage = USAGE % ((args[0],) * 6)
194
194
 
195
+ if sys.platform in ['win32', 'cygwin']:
196
+ try:
197
+ # Provide coloring under Windows, if possible
198
+ import colorama
199
+ colorama.init()
200
+ except ImportError:
201
+ pass
202
+
195
203
  try:
196
204
  popts, args = getopt.getopt(args[1:], "l:f:F:o:O:P:LS:a:N:hVHg")
197
205
  except getopt.GetoptError, err:
@@ -219,7 +227,7 @@ def main(args=sys.argv):
219
227
  return 0
220
228
 
221
229
  if opts.pop('-V', None) is not None:
222
- print 'Pygments version %s, (c) 2006-2012 by Georg Brandl.' % __version__
230
+ print 'Pygments version %s, (c) 2006-2013 by Georg Brandl.' % __version__
223
231
  return 0
224
232
 
225
233
  # handle ``pygmentize -L``
@@ -370,9 +378,9 @@ def main(args=sys.argv):
370
378
  except ClassNotFound, err:
371
379
  if '-g' in opts:
372
380
  try:
373
- lexer = guess_lexer(code)
381
+ lexer = guess_lexer(code, **parsed_opts)
374
382
  except ClassNotFound:
375
- lexer = TextLexer()
383
+ lexer = TextLexer(**parsed_opts)
376
384
  else:
377
385
  print >>sys.stderr, 'Error:', err
378
386
  return 1
@@ -384,9 +392,9 @@ def main(args=sys.argv):
384
392
  if '-g' in opts:
385
393
  code = sys.stdin.read()
386
394
  try:
387
- lexer = guess_lexer(code)
395
+ lexer = guess_lexer(code, **parsed_opts)
388
396
  except ClassNotFound:
389
- lexer = TextLexer()
397
+ lexer = TextLexer(**parsed_opts)
390
398
  elif not lexer:
391
399
  print >>sys.stderr, 'Error: no lexer name given and reading ' + \
392
400
  'from stdin (try using -g or -l <lexer>)'
@@ -5,7 +5,7 @@
5
5
 
6
6
  Format colored console output.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Module that implements the default filter.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -6,7 +6,7 @@
6
6
  Module containing filter lookup functions and default
7
7
  filters.
8
8
 
9
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
9
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
10
10
  :license: BSD, see LICENSE for details.
11
11
  """
12
12
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Base formatter class.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Pygments formatters.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
  import os.path
@@ -9,7 +9,7 @@
9
9
 
10
10
  Do not alter the FORMATTERS dictionary by hand.
11
11
 
12
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
12
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
13
13
  :license: BSD, see LICENSE for details.
14
14
  """
15
15
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  BBcode formatter.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,18 +5,23 @@
5
5
 
6
6
  Formatter for HTML output.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
12
12
  import os
13
13
  import sys
14
+ import os.path
14
15
  import StringIO
15
16
 
16
17
  from pygments.formatter import Formatter
17
18
  from pygments.token import Token, Text, STANDARD_TYPES
18
19
  from pygments.util import get_bool_opt, get_int_opt, get_list_opt, bytes
19
20
 
21
+ try:
22
+ import ctags
23
+ except ImportError:
24
+ ctags = None
20
25
 
21
26
  __all__ = ['HtmlFormatter']
22
27
 
@@ -141,6 +146,12 @@ class HtmlFormatter(Formatter):
141
146
  the style definitions inside a ``<style>`` tag, or in a separate file if
142
147
  the `cssfile` option is given.
143
148
 
149
+ When `tagsfile` is set to the path of a ctags index file, it is used to
150
+ generate hyperlinks from names to their definition. You must enable
151
+ `anchorlines` and run ctags with the `-n` option for this to work. The
152
+ `python-ctags` module from PyPI must be installed to use this feature;
153
+ otherwise a `RuntimeError` will be raised.
154
+
144
155
  The `get_style_defs(arg='')` method of a `HtmlFormatter` returns a string
145
156
  containing CSS rules for the CSS classes used by the formatter. The
146
157
  argument `arg` can be used to specify additional CSS selectors that
@@ -282,10 +293,27 @@ class HtmlFormatter(Formatter):
282
293
  output line in an anchor tag with a ``name`` of ``foo-linenumber``.
283
294
  This allows easy linking to certain lines. *New in Pygments 0.9.*
284
295
 
296
+ `linespans`
297
+ If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
298
+ output line in a span tag with an ``id`` of ``foo-linenumber``.
299
+ This allows easy access to lines via javascript. *New in Pygments 1.6.*
300
+
285
301
  `anchorlinenos`
286
302
  If set to `True`, will wrap line numbers in <a> tags. Used in
287
303
  combination with `linenos` and `lineanchors`.
288
304
 
305
+ `tagsfile`
306
+ If set to the path of a ctags file, wrap names in anchor tags that
307
+ link to their definitions. `lineanchors` should be used, and the
308
+ tags file should specify line numbers (see the `-n` option to ctags).
309
+ *New in Pygments 1.6.*
310
+
311
+ `tagurlformat`
312
+ A string formatting pattern used to generate links to ctags definitions.
313
+ Available variables are `%(path)s`, `%(fname)s` and `%(fext)s`.
314
+ Defaults to an empty string, resulting in just `#prefix-number` links.
315
+ *New in Pygments 1.6.*
316
+
289
317
 
290
318
  **Subclassing the HTML formatter**
291
319
 
@@ -351,6 +379,14 @@ class HtmlFormatter(Formatter):
351
379
  self.prestyles = self._decodeifneeded(options.get('prestyles', ''))
352
380
  self.cssfile = self._decodeifneeded(options.get('cssfile', ''))
353
381
  self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False)
382
+ self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
383
+ self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
384
+
385
+ if self.tagsfile:
386
+ if not ctags:
387
+ raise RuntimeError('The "ctags" package must to be installed '
388
+ 'to be able to use the "tagsfile" feature.')
389
+ self._ctags = ctags.CTags(self.tagsfile)
354
390
 
355
391
  linenos = options.get('linenos', False)
356
392
  if linenos == 'inline':
@@ -366,6 +402,7 @@ class HtmlFormatter(Formatter):
366
402
  self.nobackground = get_bool_opt(options, 'nobackground', False)
367
403
  self.lineseparator = options.get('lineseparator', '\n')
368
404
  self.lineanchors = options.get('lineanchors', '')
405
+ self.linespans = options.get('linespans', '')
369
406
  self.anchorlinenos = options.get('anchorlinenos', False)
370
407
  self.hl_lines = set()
371
408
  for lineno in get_list_opt(options, 'hl_lines', []):
@@ -596,7 +633,8 @@ class HtmlFormatter(Formatter):
596
633
 
597
634
  def _wrap_lineanchors(self, inner):
598
635
  s = self.lineanchors
599
- i = self.linenostart - 1 # subtract 1 since we have to increment i *before* yielding
636
+ i = self.linenostart - 1 # subtract 1 since we have to increment i
637
+ # *before* yielding
600
638
  for t, line in inner:
601
639
  if t:
602
640
  i += 1
@@ -604,6 +642,16 @@ class HtmlFormatter(Formatter):
604
642
  else:
605
643
  yield 0, line
606
644
 
645
+ def _wrap_linespans(self, inner):
646
+ s = self.linespans
647
+ i = self.linenostart - 1
648
+ for t, line in inner:
649
+ if t:
650
+ i += 1
651
+ yield 1, '<span id="%s-%d">%s</span>' % (s, i, line)
652
+ else:
653
+ yield 0, line
654
+
607
655
  def _wrap_div(self, inner):
608
656
  style = []
609
657
  if (self.noclasses and not self.nobackground and
@@ -643,6 +691,7 @@ class HtmlFormatter(Formatter):
643
691
  getcls = self.ttype2class.get
644
692
  c2s = self.class2style
645
693
  escape_table = _escape_html_table
694
+ tagsfile = self.tagsfile
646
695
 
647
696
  lspan = ''
648
697
  line = ''
@@ -659,6 +708,19 @@ class HtmlFormatter(Formatter):
659
708
 
660
709
  parts = value.translate(escape_table).split('\n')
661
710
 
711
+ if tagsfile and ttype in Token.Name:
712
+ filename, linenumber = self._lookup_ctag(value)
713
+ if linenumber:
714
+ base, filename = os.path.split(filename)
715
+ if base:
716
+ base += '/'
717
+ filename, extension = os.path.splitext(filename)
718
+ url = self.tagurlformat % {'path': base, 'fname': filename,
719
+ 'fext': extension}
720
+ parts[0] = "<a href=\"%s#%s-%d\">%s" % \
721
+ (url, self.lineanchors, linenumber, parts[0])
722
+ parts[-1] = parts[-1] + "</a>"
723
+
662
724
  # for all but the last line
663
725
  for part in parts[:-1]:
664
726
  if line:
@@ -688,6 +750,13 @@ class HtmlFormatter(Formatter):
688
750
  if line:
689
751
  yield 1, line + (lspan and '</span>') + lsep
690
752
 
753
+ def _lookup_ctag(self, token):
754
+ entry = ctags.TagEntry()
755
+ if self._ctags.find(entry, token, 0):
756
+ return entry['file'], entry['lineNumber']
757
+ else:
758
+ return None, None
759
+
691
760
  def _highlight_lines(self, tokensource):
692
761
  """
693
762
  Highlighted the lines specified in the `hl_lines` option by
@@ -740,6 +809,8 @@ class HtmlFormatter(Formatter):
740
809
  source = self._wrap_inlinelinenos(source)
741
810
  if self.lineanchors:
742
811
  source = self._wrap_lineanchors(source)
812
+ if self.linespans:
813
+ source = self._wrap_linespans(source)
743
814
  source = self.wrap(source, outfile)
744
815
  if self.linenos == 1:
745
816
  source = self._wrap_tablelinenos(source)
@@ -5,7 +5,7 @@
5
5
 
6
6
  Formatter for Pixmap output.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Formatter for LaTeX fancyvrb output.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Other formatters: NullFormatter, RawTokenFormatter.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  A formatter that generates RTF files.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Formatter for SVG output.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Formatter for terminal output with ANSI sequences.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
@@ -11,7 +11,7 @@
11
11
 
12
12
  Formatter version 1.
13
13
 
14
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
14
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
15
15
  :license: BSD, see LICENSE for details.
16
16
  """
17
17
 
@@ -5,10 +5,10 @@
5
5
 
6
6
  Base lexer classes.
7
7
 
8
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
- import re
11
+ import re, itertools
12
12
 
13
13
  from pygments.filter import apply_filters, Filter
14
14
  from pygments.filters import get_filter_by_name
@@ -18,7 +18,7 @@ from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
18
18
 
19
19
 
20
20
  __all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer',
21
- 'LexerContext', 'include', 'bygroups', 'using', 'this']
21
+ 'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this']
22
22
 
23
23
 
24
24
  _encoding_map = [('\xef\xbb\xbf', 'utf-8'),
@@ -72,15 +72,18 @@ class Lexer(object):
72
72
  #: Shortcuts for the lexer
73
73
  aliases = []
74
74
 
75
- #: fn match rules
75
+ #: File name globs
76
76
  filenames = []
77
77
 
78
- #: fn alias filenames
78
+ #: Secondary file name globs
79
79
  alias_filenames = []
80
80
 
81
- #: mime types
81
+ #: MIME types
82
82
  mimetypes = []
83
83
 
84
+ #: Priority, should multiple lexers match and no content is provided
85
+ priority = 0
86
+
84
87
  __metaclass__ = LexerMeta
85
88
 
86
89
  def __init__(self, **options):
@@ -164,9 +167,9 @@ class Lexer(object):
164
167
  else:
165
168
  text = text.decode(self.encoding)
166
169
  else:
167
- if text.startswith(u'\ufeff'):
170
+ if text.startswith(u'\ufeff'):
168
171
  text = text[len(u'\ufeff'):]
169
-
172
+
170
173
  # text now *is* a unicode string
171
174
  text = text.replace('\r\n', '\n')
172
175
  text = text.replace('\r', '\n')
@@ -242,6 +245,16 @@ class include(str):
242
245
  pass
243
246
 
244
247
 
248
+ class _inherit(object):
249
+ """
250
+ Indicates the a state should inherit from its superclass.
251
+ """
252
+ def __repr__(self):
253
+ return 'inherit'
254
+
255
+ inherit = _inherit()
256
+
257
+
245
258
  class combined(tuple):
246
259
  """
247
260
  Indicates a state combined from multiple states.
@@ -432,6 +445,9 @@ class RegexLexerMeta(LexerMeta):
432
445
  tokens.extend(cls._process_state(unprocessed, processed,
433
446
  str(tdef)))
434
447
  continue
448
+ if isinstance(tdef, _inherit):
449
+ # processed already
450
+ continue
435
451
 
436
452
  assert type(tdef) is tuple, "wrong rule def %r" % tdef
437
453
 
@@ -460,6 +476,49 @@ class RegexLexerMeta(LexerMeta):
460
476
  cls._process_state(tokendefs, processed, state)
461
477
  return processed
462
478
 
479
+ def get_tokendefs(cls):
480
+ """
481
+ Merge tokens from superclasses in MRO order, returning a single tokendef
482
+ dictionary.
483
+
484
+ Any state that is not defined by a subclass will be inherited
485
+ automatically. States that *are* defined by subclasses will, by
486
+ default, override that state in the superclass. If a subclass wishes to
487
+ inherit definitions from a superclass, it can use the special value
488
+ "inherit", which will cause the superclass' state definition to be
489
+ included at that point in the state.
490
+ """
491
+ tokens = {}
492
+ inheritable = {}
493
+ for c in itertools.chain((cls,), cls.__mro__):
494
+ toks = c.__dict__.get('tokens', {})
495
+
496
+ for state, items in toks.iteritems():
497
+ curitems = tokens.get(state)
498
+ if curitems is None:
499
+ tokens[state] = items
500
+ try:
501
+ inherit_ndx = items.index(inherit)
502
+ except ValueError:
503
+ continue
504
+ inheritable[state] = inherit_ndx
505
+ continue
506
+
507
+ inherit_ndx = inheritable.pop(state, None)
508
+ if inherit_ndx is None:
509
+ continue
510
+
511
+ # Replace the "inherit" value with the items
512
+ curitems[inherit_ndx:inherit_ndx+1] = items
513
+ try:
514
+ new_inh_ndx = items.index(inherit)
515
+ except ValueError:
516
+ pass
517
+ else:
518
+ inheritable[state] = inherit_ndx + new_inh_ndx
519
+
520
+ return tokens
521
+
463
522
  def __call__(cls, *args, **kwds):
464
523
  """Instantiate cls after preprocessing its token definitions."""
465
524
  if '_tokens' not in cls.__dict__:
@@ -469,7 +528,7 @@ class RegexLexerMeta(LexerMeta):
469
528
  # don't process yet
470
529
  pass
471
530
  else:
472
- cls._tokens = cls.process_tokendef('', cls.tokens)
531
+ cls._tokens = cls.process_tokendef('', cls.get_tokendefs())
473
532
 
474
533
  return type.__call__(cls, *args, **kwds)
475
534
 
@@ -610,7 +669,13 @@ class ExtendedRegexLexer(RegexLexer):
610
669
  if new_state is not None:
611
670
  # state transition
612
671
  if isinstance(new_state, tuple):
613
- ctx.stack.extend(new_state)
672
+ for state in new_state:
673
+ if state == '#pop':
674
+ ctx.stack.pop()
675
+ elif state == '#push':
676
+ ctx.stack.append(statestack[-1])
677
+ else:
678
+ ctx.stack.append(state)
614
679
  elif isinstance(new_state, int):
615
680
  # pop
616
681
  del ctx.stack[new_state:]
@@ -626,10 +691,10 @@ class ExtendedRegexLexer(RegexLexer):
626
691
  break
627
692
  if text[ctx.pos] == '\n':
628
693
  # at EOL, reset state to "root"
629
- ctx.pos += 1
630
694
  ctx.stack = ['root']
631
695
  statetokens = tokendefs['root']
632
696
  yield ctx.pos, Text, u'\n'
697
+ ctx.pos += 1
633
698
  continue
634
699
  yield ctx.pos, Error, text[ctx.pos]
635
700
  ctx.pos += 1
@@ -698,4 +763,3 @@ def do_insertions(insertions, tokens):
698
763
  except StopIteration:
699
764
  insleft = False
700
765
  break # not strictly necessary
701
-