gitlab-pygments.rb 0.3.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +71 -0
  4. data/Gemfile +1 -1
  5. data/LICENSE +17 -0
  6. data/README.md +28 -1
  7. data/Rakefile +2 -5
  8. data/lexers +0 -0
  9. data/lib/pygments/mentos.py +19 -12
  10. data/lib/pygments/popen.rb +21 -4
  11. data/lib/pygments/version.rb +1 -1
  12. data/pygments.rb.gemspec +2 -0
  13. data/test/test_pygments.rb +13 -2
  14. data/vendor/custom_lexers/github.py +206 -3
  15. data/vendor/pygments-main/AUTHORS +41 -3
  16. data/vendor/pygments-main/CHANGES +132 -5
  17. data/vendor/pygments-main/LICENSE +1 -1
  18. data/vendor/pygments-main/Makefile +1 -1
  19. data/vendor/pygments-main/REVISION +1 -1
  20. data/vendor/pygments-main/docs/generate.py +1 -1
  21. data/vendor/pygments-main/docs/src/api.txt +1 -1
  22. data/vendor/pygments-main/docs/src/index.txt +1 -1
  23. data/vendor/pygments-main/docs/src/integrate.txt +5 -0
  24. data/vendor/pygments-main/docs/src/java.txt +70 -0
  25. data/vendor/pygments-main/docs/src/lexerdevelopment.txt +52 -0
  26. data/vendor/pygments-main/external/autopygmentize +64 -0
  27. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +144 -0
  28. data/vendor/pygments-main/external/markdown-processor.py +2 -2
  29. data/vendor/pygments-main/external/moin-parser.py +1 -1
  30. data/vendor/pygments-main/external/rst-directive-old.py +1 -1
  31. data/vendor/pygments-main/external/rst-directive.py +1 -1
  32. data/vendor/pygments-main/pygmentize +1 -1
  33. data/vendor/pygments-main/pygments/__init__.py +2 -2
  34. data/vendor/pygments-main/pygments/cmdline.py +14 -6
  35. data/vendor/pygments-main/pygments/console.py +1 -1
  36. data/vendor/pygments-main/pygments/filter.py +1 -1
  37. data/vendor/pygments-main/pygments/filters/__init__.py +3 -4
  38. data/vendor/pygments-main/pygments/formatter.py +4 -1
  39. data/vendor/pygments-main/pygments/formatters/__init__.py +1 -1
  40. data/vendor/pygments-main/pygments/formatters/_mapping.py +3 -3
  41. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  42. data/vendor/pygments-main/pygments/formatters/html.py +73 -2
  43. data/vendor/pygments-main/pygments/formatters/img.py +2 -2
  44. data/vendor/pygments-main/pygments/formatters/latex.py +9 -9
  45. data/vendor/pygments-main/pygments/formatters/other.py +1 -3
  46. data/vendor/pygments-main/pygments/formatters/rtf.py +1 -1
  47. data/vendor/pygments-main/pygments/formatters/svg.py +1 -1
  48. data/vendor/pygments-main/pygments/formatters/terminal.py +1 -1
  49. data/vendor/pygments-main/pygments/formatters/terminal256.py +1 -1
  50. data/vendor/pygments-main/pygments/lexer.py +78 -10
  51. data/vendor/pygments-main/pygments/lexers/__init__.py +13 -2
  52. data/vendor/pygments-main/pygments/lexers/_asybuiltins.py +1 -1
  53. data/vendor/pygments-main/pygments/lexers/_clbuiltins.py +1 -1
  54. data/vendor/pygments-main/pygments/lexers/_lassobuiltins.py +5172 -0
  55. data/vendor/pygments-main/pygments/lexers/_luabuiltins.py +1 -1
  56. data/vendor/pygments-main/pygments/lexers/_mapping.py +92 -36
  57. data/vendor/pygments-main/pygments/lexers/_openedgebuiltins.py +562 -0
  58. data/vendor/pygments-main/pygments/lexers/_phpbuiltins.py +2 -2
  59. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +4 -3
  60. data/vendor/pygments-main/pygments/lexers/_robotframeworklexer.py +557 -0
  61. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +11 -0
  62. data/vendor/pygments-main/pygments/lexers/_sourcemodbuiltins.py +1072 -0
  63. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +360 -0
  64. data/vendor/pygments-main/pygments/lexers/_vimbuiltins.py +13 -3
  65. data/vendor/pygments-main/pygments/lexers/agile.py +525 -38
  66. data/vendor/pygments-main/pygments/lexers/asm.py +45 -7
  67. data/vendor/pygments-main/pygments/lexers/compiled.py +1257 -425
  68. data/vendor/pygments-main/pygments/lexers/dalvik.py +104 -0
  69. data/vendor/pygments-main/pygments/lexers/dotnet.py +97 -62
  70. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  71. data/vendor/pygments-main/pygments/lexers/functional.py +931 -32
  72. data/vendor/pygments-main/pygments/lexers/github.py +206 -3
  73. data/vendor/pygments-main/pygments/lexers/hdl.py +3 -3
  74. data/vendor/pygments-main/pygments/lexers/jvm.py +309 -44
  75. data/vendor/pygments-main/pygments/lexers/math.py +876 -30
  76. data/vendor/pygments-main/pygments/lexers/other.py +956 -517
  77. data/vendor/pygments-main/pygments/lexers/parsers.py +85 -2
  78. data/vendor/pygments-main/pygments/lexers/shell.py +81 -18
  79. data/vendor/pygments-main/pygments/lexers/special.py +1 -1
  80. data/vendor/pygments-main/pygments/lexers/sql.py +2 -2
  81. data/vendor/pygments-main/pygments/lexers/templates.py +119 -8
  82. data/vendor/pygments-main/pygments/lexers/text.py +155 -15
  83. data/vendor/pygments-main/pygments/lexers/web.py +1578 -397
  84. data/vendor/pygments-main/pygments/modeline.py +40 -0
  85. data/vendor/pygments-main/pygments/plugin.py +1 -1
  86. data/vendor/pygments-main/pygments/scanner.py +1 -1
  87. data/vendor/pygments-main/pygments/style.py +1 -1
  88. data/vendor/pygments-main/pygments/styles/__init__.py +1 -1
  89. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  90. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  91. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  92. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  93. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  94. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  95. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  96. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  97. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  98. data/vendor/pygments-main/pygments/styles/monokai.py +1 -1
  99. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  100. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  101. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  102. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  103. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  104. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  105. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  106. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  107. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  108. data/vendor/pygments-main/pygments/token.py +1 -1
  109. data/vendor/pygments-main/pygments/unistring.py +36 -26
  110. data/vendor/pygments-main/pygments/util.py +46 -1
  111. data/vendor/pygments-main/scripts/check_sources.py +2 -2
  112. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +2 -0
  113. data/vendor/pygments-main/scripts/find_codetags.py +1 -1
  114. data/vendor/pygments-main/scripts/find_error.py +5 -6
  115. data/vendor/pygments-main/setup.cfg +1 -0
  116. data/vendor/pygments-main/setup.py +6 -4
  117. data/vendor/pygments-main/tests/examplefiles/BOM.js +1 -0
  118. data/vendor/pygments-main/tests/examplefiles/Config.in.cache +1973 -0
  119. data/vendor/pygments-main/tests/examplefiles/Deflate.fs +578 -0
  120. data/vendor/pygments-main/tests/examplefiles/Get-CommandDefinitionHtml.ps1 +66 -0
  121. data/vendor/pygments-main/tests/examplefiles/IPDispatchC.nc +104 -0
  122. data/vendor/pygments-main/tests/examplefiles/IPDispatchP.nc +671 -0
  123. data/vendor/pygments-main/tests/examplefiles/RoleQ.pm6 +23 -0
  124. data/vendor/pygments-main/tests/examplefiles/autoit_submit.au3 +25 -0
  125. data/vendor/pygments-main/tests/examplefiles/bigtest.nsi +308 -0
  126. data/vendor/pygments-main/tests/examplefiles/ca65_example +284 -0
  127. data/vendor/pygments-main/tests/examplefiles/cbmbas_example +9 -0
  128. data/vendor/pygments-main/tests/examplefiles/classes.dylan +89 -4
  129. data/vendor/pygments-main/tests/examplefiles/example.Rd +78 -0
  130. data/vendor/pygments-main/tests/examplefiles/example.bug +54 -0
  131. data/vendor/pygments-main/tests/examplefiles/example.ceylon +52 -0
  132. data/vendor/pygments-main/tests/examplefiles/example.clay +33 -0
  133. data/vendor/pygments-main/tests/examplefiles/example.cob +3556 -0
  134. data/vendor/pygments-main/tests/examplefiles/example.hx +142 -0
  135. data/vendor/pygments-main/tests/examplefiles/example.jag +48 -0
  136. data/vendor/pygments-main/tests/examplefiles/example.lagda +19 -0
  137. data/vendor/pygments-main/tests/examplefiles/example.monkey +152 -0
  138. data/vendor/pygments-main/tests/examplefiles/example.msc +43 -0
  139. data/vendor/pygments-main/tests/examplefiles/example.prg +161 -0
  140. data/vendor/pygments-main/tests/examplefiles/example.reg +19 -0
  141. data/vendor/pygments-main/tests/examplefiles/example.rexx +50 -0
  142. data/vendor/pygments-main/tests/examplefiles/example.rkt +95 -0
  143. data/vendor/pygments-main/tests/examplefiles/example.rpf +4 -0
  144. data/vendor/pygments-main/tests/examplefiles/example.shell-session +45 -0
  145. data/vendor/pygments-main/tests/examplefiles/example.stan +108 -0
  146. data/vendor/pygments-main/tests/examplefiles/example.ts +28 -0
  147. data/vendor/pygments-main/tests/examplefiles/example.xtend +34 -0
  148. data/vendor/pygments-main/tests/examplefiles/example2.msc +79 -0
  149. data/vendor/pygments-main/tests/examplefiles/garcia-wachs.kk +133 -0
  150. data/vendor/pygments-main/tests/examplefiles/grammar-test.p6 +22 -0
  151. data/vendor/pygments-main/tests/examplefiles/hello.smali +40 -0
  152. data/vendor/pygments-main/tests/examplefiles/hello.sp +9 -0
  153. data/vendor/pygments-main/tests/examplefiles/http_request_example +2 -1
  154. data/vendor/pygments-main/tests/examplefiles/http_response_example +4 -2
  155. data/vendor/pygments-main/tests/examplefiles/inet_pton6.dg +71 -0
  156. data/vendor/pygments-main/tests/examplefiles/json.lasso +301 -0
  157. data/vendor/pygments-main/tests/examplefiles/json.lasso9 +213 -0
  158. data/vendor/pygments-main/tests/examplefiles/livescript-demo.ls +41 -0
  159. data/vendor/pygments-main/tests/examplefiles/logos_example.xm +28 -0
  160. data/vendor/pygments-main/tests/examplefiles/matlab_sample +5 -2
  161. data/vendor/pygments-main/tests/examplefiles/metagrammar.treetop +455 -0
  162. data/vendor/pygments-main/tests/examplefiles/mg_sample.pro +73 -0
  163. data/vendor/pygments-main/tests/examplefiles/minehunt.qml +112 -0
  164. data/vendor/pygments-main/tests/examplefiles/nanomsg.intr +95 -0
  165. data/vendor/pygments-main/tests/examplefiles/objc_example.m +7 -0
  166. data/vendor/pygments-main/tests/examplefiles/phpMyAdmin.spec +163 -0
  167. data/vendor/pygments-main/tests/examplefiles/py3tb_test.py3tb +4 -0
  168. data/vendor/pygments-main/tests/examplefiles/pytb_test3.pytb +4 -0
  169. data/vendor/pygments-main/tests/examplefiles/robotframework.txt +39 -0
  170. data/vendor/pygments-main/tests/examplefiles/rust_example.rs +233 -0
  171. data/vendor/pygments-main/tests/examplefiles/session.dylan-console +9 -0
  172. data/vendor/pygments-main/tests/examplefiles/swig_java.swg +1329 -0
  173. data/vendor/pygments-main/tests/examplefiles/swig_std_vector.i +225 -0
  174. data/vendor/pygments-main/tests/examplefiles/test.R +149 -115
  175. data/vendor/pygments-main/tests/examplefiles/test.agda +102 -0
  176. data/vendor/pygments-main/tests/examplefiles/test.bb +95 -0
  177. data/vendor/pygments-main/tests/examplefiles/test.cu +36 -0
  178. data/vendor/pygments-main/tests/examplefiles/test.ebnf +31 -0
  179. data/vendor/pygments-main/tests/examplefiles/test.opa +10 -0
  180. data/vendor/pygments-main/tests/examplefiles/test.p6 +252 -0
  181. data/vendor/pygments-main/tests/examplefiles/test2.pypylog +120 -0
  182. data/vendor/pygments-main/tests/examplefiles/type.lisp +16 -0
  183. data/vendor/pygments-main/tests/examplefiles/unix-io.lid +37 -0
  184. data/vendor/pygments-main/tests/old_run.py +1 -1
  185. data/vendor/pygments-main/tests/run.py +3 -2
  186. data/vendor/pygments-main/tests/support/tags +36 -0
  187. data/vendor/pygments-main/tests/test_basic_api.py +4 -3
  188. data/vendor/pygments-main/tests/test_clexer.py +1 -1
  189. data/vendor/pygments-main/tests/test_cmdline.py +1 -1
  190. data/vendor/pygments-main/tests/test_examplefiles.py +3 -1
  191. data/vendor/pygments-main/tests/test_html_formatter.py +17 -1
  192. data/vendor/pygments-main/tests/test_latex_formatter.py +1 -1
  193. data/vendor/pygments-main/tests/test_lexers_other.py +68 -0
  194. data/vendor/pygments-main/tests/test_perllexer.py +1 -1
  195. data/vendor/pygments-main/tests/test_regexlexer.py +1 -1
  196. data/vendor/pygments-main/tests/test_token.py +1 -1
  197. data/vendor/pygments-main/tests/test_using_api.py +1 -1
  198. data/vendor/pygments-main/tests/test_util.py +22 -3
  199. metadata +84 -16
@@ -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,12 +5,11 @@
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
 
12
12
  import sys
13
- from commands import getstatusoutput
14
13
 
15
14
  from pygments.formatter import Formatter
16
15
  from pygments.util import get_bool_opt, get_int_opt, \
@@ -73,6 +72,7 @@ class FontManager(object):
73
72
  self._create_nix()
74
73
 
75
74
  def _get_nix_font_path(self, name, style):
75
+ from commands import getstatusoutput
76
76
  exit, out = getstatusoutput('fc-list "%s:style=%s" file' %
77
77
  (name, style))
78
78
  if not exit:
@@ -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
 
@@ -306,17 +306,17 @@ class LatexFormatter(Formatter):
306
306
  realoutfile = outfile
307
307
  outfile = StringIO()
308
308
 
309
- outfile.write(r'\begin{Verbatim}[commandchars=\\\{\}')
309
+ outfile.write(ur'\begin{Verbatim}[commandchars=\\\{\}')
310
310
  if self.linenos:
311
311
  start, step = self.linenostart, self.linenostep
312
- outfile.write(',numbers=left' +
313
- (start and ',firstnumber=%d' % start or '') +
314
- (step and ',stepnumber=%d' % step or ''))
312
+ outfile.write(u',numbers=left' +
313
+ (start and u',firstnumber=%d' % start or u'') +
314
+ (step and u',stepnumber=%d' % step or u''))
315
315
  if self.mathescape or self.texcomments:
316
- outfile.write(r',codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}')
316
+ outfile.write(ur',codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}')
317
317
  if self.verboptions:
318
- outfile.write(',' + self.verboptions)
319
- outfile.write(']\n')
318
+ outfile.write(u',' + self.verboptions)
319
+ outfile.write(u']\n')
320
320
 
321
321
  for ttype, value in tokensource:
322
322
  if ttype in Token.Comment:
@@ -366,7 +366,7 @@ class LatexFormatter(Formatter):
366
366
  else:
367
367
  outfile.write(value)
368
368
 
369
- outfile.write('\\end{Verbatim}\n')
369
+ outfile.write(u'\\end{Verbatim}\n')
370
370
 
371
371
  if self.full:
372
372
  realoutfile.write(DOC_TEMPLATE %
@@ -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
 
@@ -102,8 +102,6 @@ class RawTokenFormatter(Formatter):
102
102
  outfile.write(text.encode())
103
103
  flush = outfile.flush
104
104
 
105
- lasttype = None
106
- lastval = u''
107
105
  if self.error_color:
108
106
  for ttype, value in tokensource:
109
107
  line = "%s\t%r\n" % (ttype, value)
@@ -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):
@@ -163,6 +166,10 @@ class Lexer(object):
163
166
  text = decoded
164
167
  else:
165
168
  text = text.decode(self.encoding)
169
+ else:
170
+ if text.startswith(u'\ufeff'):
171
+ text = text[len(u'\ufeff'):]
172
+
166
173
  # text now *is* a unicode string
167
174
  text = text.replace('\r\n', '\n')
168
175
  text = text.replace('\r', '\n')
@@ -238,6 +245,16 @@ class include(str):
238
245
  pass
239
246
 
240
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
+
241
258
  class combined(tuple):
242
259
  """
243
260
  Indicates a state combined from multiple states.
@@ -428,6 +445,9 @@ class RegexLexerMeta(LexerMeta):
428
445
  tokens.extend(cls._process_state(unprocessed, processed,
429
446
  str(tdef)))
430
447
  continue
448
+ if isinstance(tdef, _inherit):
449
+ # processed already
450
+ continue
431
451
 
432
452
  assert type(tdef) is tuple, "wrong rule def %r" % tdef
433
453
 
@@ -456,6 +476,49 @@ class RegexLexerMeta(LexerMeta):
456
476
  cls._process_state(tokendefs, processed, state)
457
477
  return processed
458
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
+
459
522
  def __call__(cls, *args, **kwds):
460
523
  """Instantiate cls after preprocessing its token definitions."""
461
524
  if '_tokens' not in cls.__dict__:
@@ -465,7 +528,7 @@ class RegexLexerMeta(LexerMeta):
465
528
  # don't process yet
466
529
  pass
467
530
  else:
468
- cls._tokens = cls.process_tokendef('', cls.tokens)
531
+ cls._tokens = cls.process_tokendef('', cls.get_tokendefs())
469
532
 
470
533
  return type.__call__(cls, *args, **kwds)
471
534
 
@@ -606,7 +669,13 @@ class ExtendedRegexLexer(RegexLexer):
606
669
  if new_state is not None:
607
670
  # state transition
608
671
  if isinstance(new_state, tuple):
609
- 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)
610
679
  elif isinstance(new_state, int):
611
680
  # pop
612
681
  del ctx.stack[new_state:]
@@ -622,10 +691,10 @@ class ExtendedRegexLexer(RegexLexer):
622
691
  break
623
692
  if text[ctx.pos] == '\n':
624
693
  # at EOL, reset state to "root"
625
- ctx.pos += 1
626
694
  ctx.stack = ['root']
627
695
  statetokens = tokendefs['root']
628
696
  yield ctx.pos, Text, u'\n'
697
+ ctx.pos += 1
629
698
  continue
630
699
  yield ctx.pos, Error, text[ctx.pos]
631
700
  ctx.pos += 1
@@ -694,4 +763,3 @@ def do_insertions(insertions, tokens):
694
763
  except StopIteration:
695
764
  insleft = False
696
765
  break # not strictly necessary
697
-