pygments.rb 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/README.md +6 -1
  2. data/lexers +0 -0
  3. data/lib/pygments/version.rb +1 -1
  4. data/vendor/pygments-main/AUTHORS +15 -0
  5. data/vendor/pygments-main/CHANGES +28 -1
  6. data/vendor/pygments-main/LICENSE +1 -1
  7. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +121 -0
  8. data/vendor/pygments-main/pygments/cmdline.py +1 -1
  9. data/vendor/pygments-main/pygments/filters/__init__.py +0 -1
  10. data/vendor/pygments-main/pygments/formatters/_mapping.py +2 -2
  11. data/vendor/pygments-main/pygments/formatters/img.py +1 -1
  12. data/vendor/pygments-main/pygments/formatters/latex.py +8 -8
  13. data/vendor/pygments-main/pygments/formatters/other.py +0 -2
  14. data/vendor/pygments-main/pygments/lexers/_lassobuiltins.py +5413 -0
  15. data/vendor/pygments-main/pygments/lexers/_mapping.py +36 -11
  16. data/vendor/pygments-main/pygments/lexers/_openedgebuiltins.py +551 -0
  17. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +0 -1
  18. data/vendor/pygments-main/pygments/lexers/_robotframeworklexer.py +546 -0
  19. data/vendor/pygments-main/pygments/lexers/_sourcemodbuiltins.py +1072 -0
  20. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +174 -0
  21. data/vendor/pygments-main/pygments/lexers/_vimbuiltins.py +13 -3
  22. data/vendor/pygments-main/pygments/lexers/agile.py +145 -33
  23. data/vendor/pygments-main/pygments/lexers/asm.py +2 -2
  24. data/vendor/pygments-main/pygments/lexers/compiled.py +328 -36
  25. data/vendor/pygments-main/pygments/lexers/dalvik.py +104 -0
  26. data/vendor/pygments-main/pygments/lexers/dotnet.py +8 -14
  27. data/vendor/pygments-main/pygments/lexers/functional.py +773 -8
  28. data/vendor/pygments-main/pygments/lexers/jvm.py +184 -36
  29. data/vendor/pygments-main/pygments/lexers/math.py +349 -23
  30. data/vendor/pygments-main/pygments/lexers/other.py +315 -492
  31. data/vendor/pygments-main/pygments/lexers/parsers.py +83 -1
  32. data/vendor/pygments-main/pygments/lexers/shell.py +4 -1
  33. data/vendor/pygments-main/pygments/lexers/templates.py +112 -2
  34. data/vendor/pygments-main/pygments/lexers/text.py +52 -3
  35. data/vendor/pygments-main/pygments/lexers/web.py +382 -36
  36. data/vendor/pygments-main/pygments/unistring.py +35 -25
  37. data/vendor/pygments-main/pygments/util.py +45 -0
  38. data/vendor/pygments-main/tests/examplefiles/Config.in.cache +1973 -0
  39. data/vendor/pygments-main/tests/examplefiles/example.Rd +78 -0
  40. data/vendor/pygments-main/tests/examplefiles/example.bug +54 -0
  41. data/vendor/pygments-main/tests/examplefiles/example.ceylon +33 -0
  42. data/vendor/pygments-main/tests/examplefiles/example.jag +48 -0
  43. data/vendor/pygments-main/tests/examplefiles/example.monkey +152 -0
  44. data/vendor/pygments-main/tests/examplefiles/example.msc +43 -0
  45. data/vendor/pygments-main/tests/examplefiles/example.reg +19 -0
  46. data/vendor/pygments-main/tests/examplefiles/example.rkt +95 -0
  47. data/vendor/pygments-main/tests/examplefiles/example.rpf +4 -0
  48. data/vendor/pygments-main/tests/examplefiles/example.stan +97 -0
  49. data/vendor/pygments-main/tests/examplefiles/example.xtend +34 -0
  50. data/vendor/pygments-main/tests/examplefiles/example2.msc +79 -0
  51. data/vendor/pygments-main/tests/examplefiles/garcia-wachs.kk +123 -0
  52. data/vendor/pygments-main/tests/examplefiles/hello.smali +40 -0
  53. data/vendor/pygments-main/tests/examplefiles/hello.sp +9 -0
  54. data/vendor/pygments-main/tests/examplefiles/http_request_example +2 -1
  55. data/vendor/pygments-main/tests/examplefiles/http_response_example +4 -2
  56. data/vendor/pygments-main/tests/examplefiles/inet_pton6.dg +71 -0
  57. data/vendor/pygments-main/tests/examplefiles/json.lasso +301 -0
  58. data/vendor/pygments-main/tests/examplefiles/json.lasso9 +213 -0
  59. data/vendor/pygments-main/tests/examplefiles/livescript-demo.ls +41 -0
  60. data/vendor/pygments-main/tests/examplefiles/matlab_sample +5 -2
  61. data/vendor/pygments-main/tests/examplefiles/metagrammar.treetop +455 -0
  62. data/vendor/pygments-main/tests/examplefiles/pytb_test3.pytb +4 -0
  63. data/vendor/pygments-main/tests/examplefiles/robotframework.txt +39 -0
  64. data/vendor/pygments-main/tests/examplefiles/rust_example.rs +743 -0
  65. data/vendor/pygments-main/tests/examplefiles/test.R +149 -115
  66. data/vendor/pygments-main/tests/examplefiles/test.cu +36 -0
  67. data/vendor/pygments-main/tests/test_basic_api.py +1 -1
  68. data/vendor/pygments-main/tests/test_util.py +18 -0
  69. metadata +34 -3
  70. data/vendor/pygments-main/REVISION +0 -1
@@ -20,7 +20,8 @@ from pygments import unistring as uni
20
20
 
21
21
 
22
22
  __all__ = ['JavaLexer', 'ScalaLexer', 'GosuLexer', 'GosuTemplateLexer',
23
- 'GroovyLexer', 'IokeLexer', 'ClojureLexer', 'KotlinLexer']
23
+ 'GroovyLexer', 'IokeLexer', 'ClojureLexer', 'KotlinLexer',
24
+ 'XtendLexer', 'AspectJLexer', 'CeylonLexer']
24
25
 
25
26
 
26
27
  class JavaLexer(RegexLexer):
@@ -35,15 +36,12 @@ class JavaLexer(RegexLexer):
35
36
 
36
37
  flags = re.MULTILINE | re.DOTALL
37
38
 
38
- #: optional Comment or Whitespace
39
- _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
40
-
41
39
  tokens = {
42
40
  'root': [
43
41
  # method names
44
- (r'^(\s*(?:[a-zA-Z_][a-zA-Z0-9_\.\[\]]*\s+)+?)' # return arguments
45
- r'([a-zA-Z_][a-zA-Z0-9_]*)' # method name
46
- r'(\s*)(\()', # signature start
42
+ (r'^(\s*(?:[a-zA-Z_][a-zA-Z0-9_\.\[\]<>]*\s+)+?)' # return arguments
43
+ r'([a-zA-Z_][a-zA-Z0-9_]*)' # method name
44
+ r'(\s*)(\()', # signature start
47
45
  bygroups(using(this), Name.Function, Text, Operator)),
48
46
  (r'[^\S\n]+', Text),
49
47
  (r'//.*?\n', Comment.Single),
@@ -62,13 +60,13 @@ class JavaLexer(RegexLexer):
62
60
  (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Text), 'class'),
63
61
  (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
64
62
  (r'"(\\\\|\\"|[^"])*"', String),
65
- (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
63
+ (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
66
64
  (r'(\.)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Operator, Name.Attribute)),
67
65
  (r'[a-zA-Z_][a-zA-Z0-9_]*:', Name.Label),
68
66
  (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name),
69
67
  (r'[~\^\*!%&\[\]\(\)\{\}<>\|+=:;,./?-]', Operator),
70
68
  (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
71
- (r'0x[0-9a-f]+', Number.Hex),
69
+ (r'0x[0-9a-fA-F]+', Number.Hex),
72
70
  (r'[0-9]+L?', Number.Integer),
73
71
  (r'\n', Text)
74
72
  ],
@@ -81,6 +79,45 @@ class JavaLexer(RegexLexer):
81
79
  }
82
80
 
83
81
 
82
+ class AspectJLexer(JavaLexer):
83
+ """
84
+ For `AspectJ <http://www.eclipse.org/aspectj/>`_ source code.
85
+
86
+ *New in Pygments 1.6.*
87
+ """
88
+
89
+ name = 'AspectJ'
90
+ aliases = ['aspectj']
91
+ filenames = ['*.aj']
92
+ mimetypes = ['text/x-aspectj']
93
+
94
+ aj_keywords = [
95
+ 'aspect', 'pointcut', 'privileged', 'call', 'execution',
96
+ 'initialization', 'preinitialization', 'handler', 'get', 'set',
97
+ 'staticinitialization', 'target', 'args', 'within', 'withincode',
98
+ 'cflow', 'cflowbelow', 'annotation', 'before', 'after', 'around',
99
+ 'proceed', 'throwing', 'returning', 'adviceexecution', 'declare',
100
+ 'parents', 'warning', 'error', 'soft', 'precedence', 'thisJoinPoint',
101
+ 'thisJoinPointStaticPart', 'thisEnclosingJoinPointStaticPart',
102
+ 'issingleton', 'perthis', 'pertarget', 'percflow', 'percflowbelow',
103
+ 'pertypewithin', 'lock', 'unlock', 'thisAspectInstance'
104
+ ]
105
+ aj_inter_type = ['parents:', 'warning:', 'error:', 'soft:', 'precedence:']
106
+ aj_inter_type_annotation = ['@type', '@method', '@constructor', '@field']
107
+
108
+ def get_tokens_unprocessed(self, text):
109
+ for index, token, value in JavaLexer.get_tokens_unprocessed(self, text):
110
+ if token is Name and value in self.aj_keywords:
111
+ yield index, Keyword, value
112
+ elif token is Name.Label and value in self.aj_inter_type:
113
+ yield index, Keyword, value[:-1]
114
+ yield index, Operator, value[-1]
115
+ elif token is Name.Decorator and value in self.aj_inter_type_annotation:
116
+ yield index, Keyword, value
117
+ else:
118
+ yield index, token, value
119
+
120
+
84
121
  class ScalaLexer(RegexLexer):
85
122
  """
86
123
  For `Scala <http://www.scala-lang.org>`_ source code.
@@ -93,9 +130,6 @@ class ScalaLexer(RegexLexer):
93
130
 
94
131
  flags = re.MULTILINE | re.DOTALL
95
132
 
96
- #: optional Comment or Whitespace
97
- _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
98
-
99
133
  # don't use raw unicode strings!
100
134
  op = u'[-~\\^\\*!%&\\\\<>\\|+=:/?@\u00a6-\u00a7\u00a9\u00ac\u00ae\u00b0-\u00b1\u00b6\u00d7\u00f7\u03f6\u0482\u0606-\u0608\u060e-\u060f\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0cf1-\u0cf2\u0d79\u0f01-\u0f03\u0f13-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcf\u109e-\u109f\u1360\u1390-\u1399\u1940\u19e0-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2044\u2052\u207a-\u207c\u208a-\u208c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u2140-\u2144\u214a-\u214d\u214f\u2190-\u2328\u232b-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b54\u2ce5-\u2cea\u2e80-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ufb29\ufdfd\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe4\uffe8-\uffee\ufffc-\ufffd]+'
101
135
 
@@ -125,9 +159,9 @@ class ScalaLexer(RegexLexer):
125
159
  (r'(true|false|null)\b', Keyword.Constant),
126
160
  (r'(import|package)(\s+)', bygroups(Keyword, Text), 'import'),
127
161
  (r'(type)(\s+)', bygroups(Keyword, Text), 'type'),
128
- (r'""".*?"""', String),
162
+ (r'""".*?"""(?!")', String),
129
163
  (r'"(\\\\|\\"|[^"])*"', String),
130
- (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
164
+ (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
131
165
  # (ur'(\.)(%s|%s|`[^`]+`)' % (idrest, op), bygroups(Operator,
132
166
  # Name.Attribute)),
133
167
  (idrest, Name),
@@ -137,7 +171,7 @@ class ScalaLexer(RegexLexer):
137
171
  (op, Operator),
138
172
  (r'([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?',
139
173
  Number.Float),
140
- (r'0x[0-9a-f]+', Number.Hex),
174
+ (r'0x[0-9a-fA-F]+', Number.Hex),
141
175
  (r'[0-9]+L?', Number.Integer),
142
176
  (r'\n', Text)
143
177
  ],
@@ -197,9 +231,6 @@ class GosuLexer(RegexLexer):
197
231
 
198
232
  flags = re.MULTILINE | re.DOTALL
199
233
 
200
- #: optional Comment or Whitespace
201
- _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
202
-
203
234
  tokens = {
204
235
  'root': [
205
236
  # method names
@@ -298,9 +329,6 @@ class GroovyLexer(RegexLexer):
298
329
 
299
330
  flags = re.MULTILINE | re.DOTALL
300
331
 
301
- #: optional Comment or Whitespace
302
- _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
303
-
304
332
  tokens = {
305
333
  'root': [
306
334
  # method names
@@ -329,13 +357,13 @@ class GroovyLexer(RegexLexer):
329
357
  (r"'(\\\\|\\'|[^'])*'", String.Single),
330
358
  (r'\$/((?!/\$).)*/\$', String),
331
359
  (r'/(\\\\|\\"|[^/])*/', String),
332
- (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
360
+ (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
333
361
  (r'(\.)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Operator, Name.Attribute)),
334
362
  (r'[a-zA-Z_][a-zA-Z0-9_]*:', Name.Label),
335
363
  (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name),
336
364
  (r'[~\^\*!%&\[\]\(\)\{\}<>\|+=:;,./?-]', Operator),
337
365
  (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
338
- (r'0x[0-9a-f]+', Number.Hex),
366
+ (r'0x[0-9a-fA-F]+', Number.Hex),
339
367
  (r'[0-9]+L?', Number.Integer),
340
368
  (r'\n', Text)
341
369
  ],
@@ -644,7 +672,7 @@ class ClojureLexer(RegexLexer):
644
672
  (r"\\(.|[a-z]+)", String.Char),
645
673
 
646
674
  # keywords
647
- (r':' + valid_name, String.Symbol),
675
+ (r'::?' + valid_name, String.Symbol),
648
676
 
649
677
  # special operators
650
678
  (r'~@|[`\'#^~&]', Operator),
@@ -690,9 +718,6 @@ class TeaLangLexer(RegexLexer):
690
718
 
691
719
  flags = re.MULTILINE | re.DOTALL
692
720
 
693
- #: optional Comment or Whitespace
694
- _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
695
-
696
721
  tokens = {
697
722
  'root': [
698
723
  # method names
@@ -717,7 +742,7 @@ class TeaLangLexer(RegexLexer):
717
742
  (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name),
718
743
  (r'(isa|[.]{3}|[.]{2}|[=#!<>+-/%&;,.\*\\\(\)\[\]\{\}])', Operator),
719
744
  (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
720
- (r'0x[0-9a-f]+', Number.Hex),
745
+ (r'0x[0-9a-fA-F]+', Number.Hex),
721
746
  (r'[0-9]+L?', Number.Integer),
722
747
  (r'\n', Text)
723
748
  ],
@@ -729,6 +754,69 @@ class TeaLangLexer(RegexLexer):
729
754
  ],
730
755
  }
731
756
 
757
+ class CeylonLexer(RegexLexer):
758
+ """
759
+ For `Ceylon <http://ceylon-lang.org/>`_ source code.
760
+
761
+ *New in Pygments 1.6.*
762
+ """
763
+
764
+ name = 'Ceylon'
765
+ aliases = ['ceylon']
766
+ filenames = ['*.ceylon']
767
+ mimetypes = ['text/x-ceylon']
768
+
769
+ flags = re.MULTILINE | re.DOTALL
770
+
771
+ #: optional Comment or Whitespace
772
+ _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
773
+
774
+ tokens = {
775
+ 'root': [
776
+ # method names
777
+ (r'^(\s*(?:[a-zA-Z_][a-zA-Z0-9_\.\[\]]*\s+)+?)' # return arguments
778
+ r'([a-zA-Z_][a-zA-Z0-9_]*)' # method name
779
+ r'(\s*)(\()', # signature start
780
+ bygroups(using(this), Name.Function, Text, Operator)),
781
+ (r'[^\S\n]+', Text),
782
+ (r'//.*?\n', Comment.Single),
783
+ (r'/\*.*?\*/', Comment.Multiline),
784
+ (r'(variable|shared|abstract|doc|by|formal|actual)', Name.Decorator),
785
+ (r'(break|case|catch|continue|default|else|finally|for|in|variable|'
786
+ r'if|return|switch|this|throw|try|while|is|exists|nonempty|then|outer)\b',
787
+ Keyword),
788
+ (r'(abstracts|extends|satisfies|adapts|'
789
+ r'super|given|of|out|assign|'
790
+ r'transient|volatile)\b', Keyword.Declaration),
791
+ (r'(function|value|void)\b',
792
+ Keyword.Type),
793
+ (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)),
794
+ (r'(true|false|null)\b', Keyword.Constant),
795
+ (r'(class|interface|object)(\s+)', bygroups(Keyword.Declaration, Text), 'class'),
796
+ (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
797
+ (r'"(\\\\|\\"|[^"])*"', String),
798
+ (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Quoted),
799
+ (r"`\\.`|`[^\\]`|`\\u[0-9a-fA-F]{4}`", String.Char),
800
+ (r'(\.)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Operator, Name.Attribute)),
801
+ (r'[a-zA-Z_][a-zA-Z0-9_]*:', Name.Label),
802
+ (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name),
803
+ (r'[~\^\*!%&\[\]\(\)\{\}<>\|+=:;,./?-]', Operator),
804
+ (r'\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
805
+ (r'\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?', Number.Float),
806
+ (r'[0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
807
+ (r'[0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?', Number.Float),
808
+ (r'0x[0-9a-fA-F]+', Number.Hex),
809
+ (r'\d{1,3}(_\d{3})+[kMGTP]?', Number.Integer),
810
+ (r'[0-9]+[kMGTP]?', Number.Integer),
811
+ (r'\n', Text)
812
+ ],
813
+ 'class': [
814
+ (r'[a-zA-Z_][a-zA-Z0-9_]*', Name.Class, '#pop')
815
+ ],
816
+ 'import': [
817
+ (r'[a-zA-Z0-9_.]+\w+ \{([a-zA-Z,]+|\.\.\.)\}', Name.Namespace, '#pop')
818
+ ],
819
+ }
732
820
 
733
821
  class KotlinLexer(RegexLexer):
734
822
  """
@@ -764,20 +852,15 @@ class KotlinLexer(RegexLexer):
764
852
  # for the range of allowed unicode characters in identifiers,
765
853
  # see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
766
854
 
767
- def _escape(st):
768
- return st.replace(u'\\', ur'\\').replace(u'-', ur'\-').\
769
- replace(u'[', ur'\[').replace(u']', ur'\]')
770
-
771
855
  levels = {
772
856
  'none': '@?[_a-zA-Z][a-zA-Z0-9_]*',
773
857
  'basic': ('@?[_' + uni.Lu + uni.Ll + uni.Lt + uni.Lm + uni.Nl + ']' +
774
858
  '[' + uni.Lu + uni.Ll + uni.Lt + uni.Lm + uni.Nl +
775
859
  uni.Nd + uni.Pc + uni.Cf + uni.Mn + uni.Mc + ']*'),
776
860
  'full': ('@?(?:_|[^' +
777
- _escape(uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl')) + '])'
778
- + '[^' + _escape(uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo',
779
- 'Nl', 'Nd', 'Pc', 'Cf', 'Mn',
780
- 'Mc')) + ']*'),
861
+ uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])'
862
+ + '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
863
+ 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),
781
864
  }
782
865
 
783
866
  tokens = {}
@@ -845,3 +928,68 @@ class KotlinLexer(RegexLexer):
845
928
  self._tokens = self._all_tokens[level]
846
929
 
847
930
  RegexLexer.__init__(self, **options)
931
+
932
+
933
+ class XtendLexer(RegexLexer):
934
+ """
935
+ For `Xtend <http://xtend-lang.org/>`_ source code.
936
+
937
+ *New in Pygments 1.6.*
938
+ """
939
+
940
+ name = 'Xtend'
941
+ aliases = ['xtend']
942
+ filenames = ['*.xtend']
943
+ mimetypes = ['text/x-xtend']
944
+
945
+ flags = re.MULTILINE | re.DOTALL
946
+
947
+ tokens = {
948
+ 'root': [
949
+ # method names
950
+ (r'^(\s*(?:[a-zA-Z_][a-zA-Z0-9_\.\[\]]*\s+)+?)' # return arguments
951
+ r'([a-zA-Z_$][a-zA-Z0-9_$]*)' # method name
952
+ r'(\s*)(\()', # signature start
953
+ bygroups(using(this), Name.Function, Text, Operator)),
954
+ (r'[^\S\n]+', Text),
955
+ (r'//.*?\n', Comment.Single),
956
+ (r'/\*.*?\*/', Comment.Multiline),
957
+ (r'@[a-zA-Z_][a-zA-Z0-9_\.]*', Name.Decorator),
958
+ (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
959
+ r'if|goto|instanceof|new|return|switch|this|throw|try|while|IF|'
960
+ r'ELSE|ELSEIF|ENDIF|FOR|ENDFOR|SEPARATOR|BEFORE|AFTER)\b',
961
+ Keyword),
962
+ (r'(def|abstract|const|enum|extends|final|implements|native|private|'
963
+ r'protected|public|static|strictfp|super|synchronized|throws|'
964
+ r'transient|volatile)\b', Keyword.Declaration),
965
+ (r'(boolean|byte|char|double|float|int|long|short|void)\b',
966
+ Keyword.Type),
967
+ (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)),
968
+ (r'(true|false|null)\b', Keyword.Constant),
969
+ (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Text),
970
+ 'class'),
971
+ (r'(import)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
972
+ (r"(''')", String, 'template'),
973
+ (ur"(\u00BB)", String, 'template'),
974
+ (r'"(\\\\|\\"|[^"])*"', String),
975
+ (r"'(\\\\|\\'|[^'])*'", String),
976
+ (r'[a-zA-Z_][a-zA-Z0-9_]*:', Name.Label),
977
+ (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name),
978
+ (r'[~\^\*!%&\[\]\(\)\{\}<>\|+=:;,./?-]', Operator),
979
+ (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
980
+ (r'0x[0-9a-fA-F]+', Number.Hex),
981
+ (r'[0-9]+L?', Number.Integer),
982
+ (r'\n', Text)
983
+ ],
984
+ 'class': [
985
+ (r'[a-zA-Z_][a-zA-Z0-9_]*', Name.Class, '#pop')
986
+ ],
987
+ 'import': [
988
+ (r'[a-zA-Z0-9_.]+\*?', Name.Namespace, '#pop')
989
+ ],
990
+ 'template': [
991
+ (r"'''", String, '#pop'),
992
+ (ur"\u00AB", String, '#pop'),
993
+ (r'.', String)
994
+ ],
995
+ }
@@ -18,13 +18,20 @@ from pygments.token import Comment, String, Punctuation, Keyword, Name, \
18
18
 
19
19
  from pygments.lexers.agile import PythonLexer
20
20
  from pygments.lexers import _scilab_builtins
21
+ from pygments.lexers import _stan_builtins
21
22
 
22
23
  __all__ = ['JuliaLexer', 'JuliaConsoleLexer', 'MuPADLexer', 'MatlabLexer',
23
24
  'MatlabSessionLexer', 'OctaveLexer', 'ScilabLexer', 'NumPyLexer',
24
- 'RConsoleLexer', 'SLexer']
25
+ 'RConsoleLexer', 'SLexer', 'JagsLexer', 'BugsLexer', 'StanLexer',
26
+ 'RdLexer']
25
27
 
26
28
 
27
29
  class JuliaLexer(RegexLexer):
30
+ """
31
+ For `Julia <http://julialang.org/>`_ source code.
32
+
33
+ *New in Pygments 1.6.*
34
+ """
28
35
  name = 'Julia'
29
36
  aliases = ['julia','jl']
30
37
  filenames = ['*.jl']
@@ -79,7 +86,7 @@ class JuliaLexer(RegexLexer):
79
86
  (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'", String.Char),
80
87
 
81
88
  # try to match trailing transpose
82
- (r'(?<=[.\w\)\]])\'', Operator),
89
+ (r'(?<=[.\w\)\]])\'+', Operator),
83
90
 
84
91
  # strings
85
92
  (r'(?:[IL])"', String, 'string'),
@@ -90,10 +97,11 @@ class JuliaLexer(RegexLexer):
90
97
  (r'[a-zA-Z_][a-zA-Z0-9_]*', Name),
91
98
 
92
99
  # numbers
93
- (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
94
- (r'\d+[eE][+-]?[0-9]+', Number.Float),
95
- (r'0[0-7]+', Number.Oct),
96
- (r'0[xX][a-fA-F0-9]+', Number.Hex),
100
+ (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
101
+ (r'\d+[eEf][+-]?[0-9]+', Number.Float),
102
+ (r'0b[01]+', Number.Binary),
103
+ (r'0o[0-7]+', Number.Oct),
104
+ (r'0x[a-fA-F0-9]+', Number.Hex),
97
105
  (r'\d+', Number.Integer)
98
106
  ],
99
107
 
@@ -134,6 +142,8 @@ line_re = re.compile('.*?\n')
134
142
  class JuliaConsoleLexer(Lexer):
135
143
  """
136
144
  For Julia console sessions. Modeled after MatlabSessionLexer.
145
+
146
+ *New in Pygments 1.6.*
137
147
  """
138
148
  name = 'Julia console'
139
149
  aliases = ['jlcon']
@@ -251,7 +261,6 @@ class MuPADLexer(RegexLexer):
251
261
  class MatlabLexer(RegexLexer):
252
262
  """
253
263
  For Matlab source code.
254
- Contributed by Ken Schutte <kschutte@csail.mit.edu>.
255
264
 
256
265
  *New in Pygments 0.10.*
257
266
  """
@@ -306,6 +315,7 @@ class MatlabLexer(RegexLexer):
306
315
  # line starting with '!' is sent as a system command. not sure what
307
316
  # label to use...
308
317
  (r'^!.*', String.Other),
318
+ (r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
309
319
  (r'%.*$', Comment),
310
320
  (r'^\s*function', Keyword, 'deffunc'),
311
321
 
@@ -316,6 +326,9 @@ class MatlabLexer(RegexLexer):
316
326
 
317
327
  ("(" + "|".join(elfun+specfun+elmat) + r')\b', Name.Builtin),
318
328
 
329
+ # line continuation with following comment:
330
+ (r'\.\.\..*$', Comment),
331
+
319
332
  # operators:
320
333
  (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
321
334
  # operators requiring escape for re:
@@ -336,6 +349,11 @@ class MatlabLexer(RegexLexer):
336
349
  'string': [
337
350
  (r'[^\']*\'', String, '#pop')
338
351
  ],
352
+ 'blockcomment': [
353
+ (r'^\s*%\}', Comment.Multiline, '#pop'),
354
+ (r'^.*\n', Comment.Multiline),
355
+ (r'.', Comment.Multiline),
356
+ ],
339
357
  'deffunc': [
340
358
  (r'(\s*)(?:(.+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
341
359
  bygroups(Text.Whitespace, Text, Text.Whitespace, Punctuation,
@@ -1002,43 +1020,50 @@ class SLexer(RegexLexer):
1002
1020
 
1003
1021
  name = 'S'
1004
1022
  aliases = ['splus', 's', 'r']
1005
- filenames = ['*.S', '*.R']
1006
- mimetypes = ['text/S-plus', 'text/S', 'text/R']
1023
+ filenames = ['*.S', '*.R', '.Rhistory', '.Rprofile']
1024
+ mimetypes = ['text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r',
1025
+ 'text/x-R', 'text/x-r-history', 'text/x-r-profile']
1007
1026
 
1008
1027
  tokens = {
1009
1028
  'comments': [
1010
1029
  (r'#.*$', Comment.Single),
1011
1030
  ],
1012
1031
  'valid_name': [
1013
- (r'[a-zA-Z][0-9a-zA-Z\._]+', Text),
1014
- (r'`.+`', String.Backtick),
1032
+ (r'[a-zA-Z][0-9a-zA-Z\._]*', Text),
1033
+ # can begin with ., but not if that is followed by a digit
1034
+ (r'\.[a-zA-Z_][0-9a-zA-Z\._]*', Text),
1015
1035
  ],
1016
1036
  'punctuation': [
1017
- (r'\[|\]|\[\[|\]\]|\$|\(|\)|@|:::?|;|,', Punctuation),
1037
+ (r'\[{1,2}|\]{1,2}|\(|\)|;|,', Punctuation),
1018
1038
  ],
1019
1039
  'keywords': [
1020
- (r'for(?=\s*\()|while(?=\s*\()|if(?=\s*\()|(?<=\s)else|'
1021
- r'(?<=\s)break(?=;|$)|return(?=\s*\()|function(?=\s*\()',
1040
+ (r'(if|else|for|while|repeat|in|next|break|return|switch|function)'
1041
+ r'(?![0-9a-zA-Z\._])',
1022
1042
  Keyword.Reserved)
1023
1043
  ],
1024
1044
  'operators': [
1025
- (r'<-|-|==|<=|>=|<|>|&&|&|!=|\|\|?', Operator),
1026
- (r'\*|\+|\^|/|%%|%/%|=', Operator),
1027
- (r'%in%|%*%', Operator)
1045
+ (r'<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\?', Operator),
1046
+ (r'\*|\+|\^|/|!|%[^%]*%|=|~|\$|@|:{1,3}', Operator)
1028
1047
  ],
1029
1048
  'builtin_symbols': [
1030
- (r'(NULL|NA|TRUE|FALSE|NaN)\b', Keyword.Constant),
1049
+ (r'(NULL|NA(_(integer|real|complex|character)_)?|'
1050
+ r'Inf|TRUE|FALSE|NaN|\.\.(\.|[0-9]+))'
1051
+ r'(?![0-9a-zA-Z\._])',
1052
+ Keyword.Constant),
1031
1053
  (r'(T|F)\b', Keyword.Variable),
1032
1054
  ],
1033
1055
  'numbers': [
1034
- (r'(?<![0-9a-zA-Z\)\}\]`\"])(?=\s*)[-\+]?[0-9]+'
1035
- r'(\.[0-9]*)?(E[0-9][-\+]?(\.[0-9]*)?)?', Number),
1036
- (r'\.[0-9]*(E[0-9][-\+]?(\.[0-9]*)?)?', Number),
1056
+ # hex number
1057
+ (r'0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?', Number.Hex),
1058
+ # decimal number
1059
+ (r'[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?',
1060
+ Number),
1037
1061
  ],
1038
1062
  'statements': [
1039
1063
  include('comments'),
1040
1064
  # whitespaces
1041
1065
  (r'\s+', Text),
1066
+ (r'`.*?`', String.Backtick),
1042
1067
  (r'\'', String, 'string_squote'),
1043
1068
  (r'\"', String, 'string_dquote'),
1044
1069
  include('builtin_symbols'),
@@ -1061,12 +1086,313 @@ class SLexer(RegexLexer):
1061
1086
  # ('\}', Punctuation, '#pop')
1062
1087
  #],
1063
1088
  'string_squote': [
1064
- (r'[^\']*\'', String, '#pop'),
1089
+ (r'([^\'\\]|\\.)*\'', String, '#pop'),
1065
1090
  ],
1066
1091
  'string_dquote': [
1067
- (r'[^\"]*\"', String, '#pop'),
1092
+ (r'([^"\\]|\\.)*"', String, '#pop'),
1068
1093
  ],
1069
1094
  }
1070
1095
 
1071
1096
  def analyse_text(text):
1072
1097
  return '<-' in text
1098
+
1099
+
1100
+ class BugsLexer(RegexLexer):
1101
+ """
1102
+ Pygments Lexer for `OpenBugs <http://www.openbugs.info/w/>`_ and WinBugs
1103
+ models.
1104
+
1105
+ *New in Pygments 1.6.*
1106
+ """
1107
+
1108
+ name = 'BUGS'
1109
+ aliases = ['bugs', 'winbugs', 'openbugs']
1110
+ filenames = ['*.bug']
1111
+
1112
+ _FUNCTIONS = [
1113
+ # Scalar functions
1114
+ 'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
1115
+ 'cloglog', 'cos', 'cosh', 'cumulative', 'cut', 'density', 'deviance',
1116
+ 'equals', 'expr', 'gammap', 'ilogit', 'icloglog', 'integral', 'log',
1117
+ 'logfact', 'loggam', 'logit', 'max', 'min', 'phi', 'post.p.value',
1118
+ 'pow', 'prior.p.value', 'probit', 'replicate.post', 'replicate.prior',
1119
+ 'round', 'sin', 'sinh', 'solution', 'sqrt', 'step', 'tan', 'tanh',
1120
+ 'trunc',
1121
+ # Vector functions
1122
+ 'inprod', 'interp.lin', 'inverse', 'logdet', 'mean', 'eigen.vals',
1123
+ 'ode', 'prod', 'p.valueM', 'rank', 'ranked', 'replicate.postM',
1124
+ 'sd', 'sort', 'sum',
1125
+ ## Special
1126
+ 'D', 'I', 'F', 'T', 'C']
1127
+ """ OpenBUGS built-in functions
1128
+
1129
+ From http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAII
1130
+
1131
+ This also includes
1132
+
1133
+ - T, C, I : Truncation and censoring.
1134
+ ``T`` and ``C`` are in OpenBUGS. ``I`` in WinBUGS.
1135
+ - D : ODE
1136
+ - F : Functional http://www.openbugs.info/Examples/Functionals.html
1137
+
1138
+ """
1139
+
1140
+ _DISTRIBUTIONS = ['dbern', 'dbin', 'dcat', 'dnegbin', 'dpois',
1141
+ 'dhyper', 'dbeta', 'dchisqr', 'ddexp', 'dexp',
1142
+ 'dflat', 'dgamma', 'dgev', 'df', 'dggamma', 'dgpar',
1143
+ 'dloglik', 'dlnorm', 'dlogis', 'dnorm', 'dpar',
1144
+ 'dt', 'dunif', 'dweib', 'dmulti', 'ddirch', 'dmnorm',
1145
+ 'dmt', 'dwish']
1146
+ """ OpenBUGS built-in distributions
1147
+
1148
+ Functions from
1149
+ http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAI
1150
+ """
1151
+
1152
+
1153
+ tokens = {
1154
+ 'whitespace' : [
1155
+ (r"\s+", Text),
1156
+ ],
1157
+ 'comments' : [
1158
+ # Comments
1159
+ (r'#.*$', Comment.Single),
1160
+ ],
1161
+ 'root': [
1162
+ # Comments
1163
+ include('comments'),
1164
+ include('whitespace'),
1165
+ # Block start
1166
+ (r'(model)(\s+)({)',
1167
+ bygroups(Keyword.Namespace, Text, Punctuation)),
1168
+ # Reserved Words
1169
+ (r'(for|in)(?![0-9a-zA-Z\._])', Keyword.Reserved),
1170
+ # Built-in Functions
1171
+ (r'(%s)(?=\s*\()'
1172
+ % r'|'.join(_FUNCTIONS + _DISTRIBUTIONS),
1173
+ Name.Builtin),
1174
+ # Regular variable names
1175
+ (r'[A-Za-z][A-Za-z0-9_.]*', Name),
1176
+ # Number Literals
1177
+ (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
1178
+ # Punctuation
1179
+ (r'\[|\]|\(|\)|:|,|;', Punctuation),
1180
+ # Assignment operators
1181
+ # SLexer makes these tokens Operators.
1182
+ (r'<-|~', Operator),
1183
+ # Infix and prefix operators
1184
+ (r'\+|-|\*|/', Operator),
1185
+ # Block
1186
+ (r'[{}]', Punctuation),
1187
+ ]
1188
+ }
1189
+
1190
+ def analyse_text(text):
1191
+ if re.search(r"^\s*model\s*{", text, re.M):
1192
+ return 0.7
1193
+ else:
1194
+ return 0.0
1195
+
1196
+ class JagsLexer(RegexLexer):
1197
+ """
1198
+ Pygments Lexer for JAGS.
1199
+
1200
+ *New in Pygments 1.6.*
1201
+ """
1202
+
1203
+ name = 'JAGS'
1204
+ aliases = ['jags']
1205
+ filenames = ['*.jag', '*.bug']
1206
+
1207
+ ## JAGS
1208
+ _FUNCTIONS = [
1209
+ 'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
1210
+ 'cos', 'cosh', 'cloglog',
1211
+ 'equals', 'exp', 'icloglog', 'ifelse', 'ilogit', 'log', 'logfact',
1212
+ 'loggam', 'logit', 'phi', 'pow', 'probit', 'round', 'sin', 'sinh',
1213
+ 'sqrt', 'step', 'tan', 'tanh', 'trunc', 'inprod', 'interp.lin',
1214
+ 'logdet', 'max', 'mean', 'min', 'prod', 'sum', 'sd', 'inverse',
1215
+ 'rank', 'sort', 't', 'acos', 'acosh', 'asin', 'asinh', 'atan',
1216
+ # Truncation/Censoring (should I include)
1217
+ 'T', 'I']
1218
+ # Distributions with density, probability and quartile functions
1219
+ _DISTRIBUTIONS = ['[dpq]%s' % x for x in
1220
+ ['bern', 'beta', 'dchiqsqr', 'ddexp', 'dexp',
1221
+ 'df', 'gamma', 'gen.gamma', 'logis', 'lnorm',
1222
+ 'negbin', 'nchisqr', 'norm', 'par', 'pois', 'weib']]
1223
+ # Other distributions without density and probability
1224
+ _OTHER_DISTRIBUTIONS = [
1225
+ 'dt', 'dunif', 'dbetabin', 'dbern', 'dbin', 'dcat', 'dhyper',
1226
+ 'ddirch', 'dmnorm', 'dwish', 'dmt', 'dmulti', 'dbinom', 'dchisq',
1227
+ 'dnbinom', 'dweibull', 'ddirich']
1228
+
1229
+ tokens = {
1230
+ 'whitespace' : [
1231
+ (r"\s+", Text),
1232
+ ],
1233
+ 'names' : [
1234
+ # Regular variable names
1235
+ (r'[a-zA-Z][a-zA-Z0-9_.]*\b', Name),
1236
+ ],
1237
+ 'comments' : [
1238
+ # do not use stateful comments
1239
+ (r'(?s)/\*.*?\*/', Comment.Multiline),
1240
+ # Comments
1241
+ (r'#.*$', Comment.Single),
1242
+ ],
1243
+ 'root': [
1244
+ # Comments
1245
+ include('comments'),
1246
+ include('whitespace'),
1247
+ # Block start
1248
+ (r'(model|data)(\s+)({)',
1249
+ bygroups(Keyword.Namespace, Text, Punctuation)),
1250
+ (r'var(?![0-9a-zA-Z\._])', Keyword.Declaration),
1251
+ # Reserved Words
1252
+ (r'(for|in)(?![0-9a-zA-Z\._])', Keyword.Reserved),
1253
+ # Builtins
1254
+ # Need to use lookahead because . is a valid char
1255
+ (r'(%s)(?=\s*\()' % r'|'.join(_FUNCTIONS
1256
+ + _DISTRIBUTIONS
1257
+ + _OTHER_DISTRIBUTIONS),
1258
+ Name.Builtin),
1259
+ # Names
1260
+ include('names'),
1261
+ # Number Literals
1262
+ (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
1263
+ (r'\[|\]|\(|\)|:|,|;', Punctuation),
1264
+ # Assignment operators
1265
+ (r'<-|~', Operator),
1266
+ # # JAGS includes many more than OpenBUGS
1267
+ (r'\+|-|\*|\/|\|\|[&]{2}|[<>=]=?|\^|%.*?%', Operator),
1268
+ (r'[{}]', Punctuation),
1269
+ ]
1270
+ }
1271
+
1272
+ def analyse_text(text):
1273
+ if re.search(r'^\s*model\s*\{', text, re.M):
1274
+ if re.search(r'^\s*data\s*\{', text, re.M):
1275
+ return 0.9
1276
+ elif re.search(r'^\s*var', text, re.M):
1277
+ return 0.9
1278
+ else:
1279
+ return 0.3
1280
+ else:
1281
+ return 0
1282
+
1283
+ class StanLexer(RegexLexer):
1284
+ """
1285
+ Pygments Lexer for Stan models.
1286
+
1287
+ *New in Pygments 1.6.*
1288
+ """
1289
+
1290
+ name = 'Stan'
1291
+ aliases = ['stan']
1292
+ filenames = ['*.stan']
1293
+
1294
+ _RESERVED = ('for', 'in', 'while', 'repeat', 'until', 'if',
1295
+ 'then', 'else', 'true', 'false', 'T',
1296
+ 'lower', 'upper', 'print')
1297
+
1298
+ _TYPES = ('int', 'real', 'vector', 'simplex', 'ordered', 'row_vector',
1299
+ 'matrix', 'corr_matrix', 'cov_matrix', 'positive_ordered')
1300
+
1301
+ tokens = {
1302
+ 'whitespace' : [
1303
+ (r"\s+", Text),
1304
+ ],
1305
+ 'comments' : [
1306
+ (r'(?s)/\*.*?\*/', Comment.Multiline),
1307
+ # Comments
1308
+ (r'(//|#).*$', Comment.Single),
1309
+ ],
1310
+ 'root': [
1311
+ # Stan is more restrictive on strings than this regex
1312
+ (r'"[^"]*"', String),
1313
+ # Comments
1314
+ include('comments'),
1315
+ # block start
1316
+ include('whitespace'),
1317
+ # Block start
1318
+ (r'(%s)(\s*)({)' %
1319
+ r'|'.join(('data', r'transformed\s+?data',
1320
+ 'parameters', r'transformed\s+parameters',
1321
+ 'model', r'generated\s+quantities')),
1322
+ bygroups(Keyword.Namespace, Text, Punctuation)),
1323
+ # Reserved Words
1324
+ (r'(%s)\b' % r'|'.join(_RESERVED), Keyword.Reserved),
1325
+ # Data types
1326
+ (r'(%s)\b' % r'|'.join(_TYPES), Keyword.Type),
1327
+ # Punctuation
1328
+ (r"[;:,\[\]()<>]", Punctuation),
1329
+ # Builtin
1330
+ (r'(%s)(?=\s*\()'
1331
+ % r'|'.join(_stan_builtins.FUNCTIONS
1332
+ + _stan_builtins.DISTRIBUTIONS),
1333
+ Name.Builtin),
1334
+ (r'(%s)(?=\s*\()'
1335
+ % r'|'.join(_stan_builtins.CONSTANTS), Keyword.Constant),
1336
+ # Special names ending in __, like lp__
1337
+ (r'[A-Za-z][A-Za-z0-9_]*__\b', Name.Builtin.Pseudo),
1338
+ # Regular variable names
1339
+ (r'[A-Za-z][A-Za-z0-9_]*\b', Name),
1340
+ # Real Literals
1341
+ (r'-?[0-9]+(\.[0-9]+)?[eE]-?[0-9]+', Number.Float),
1342
+ (r'-?[0-9]*\.[0-9]*', Number.Float),
1343
+ # Integer Literals
1344
+ (r'-?[0-9]+', Number.Integer),
1345
+ # Assignment operators
1346
+ # SLexer makes these tokens Operators.
1347
+ (r'<-|~', Operator),
1348
+ # Infix and prefix operators (and = )
1349
+ (r"\+|-|\.?\*|\.?/|\\|'|=", Operator),
1350
+ # Block delimiters
1351
+ (r'[{}]', Punctuation),
1352
+ ]
1353
+ }
1354
+
1355
+ def analyse_text(text):
1356
+ if re.search(r'^\s*parameters\s*\{', text, re.M):
1357
+ return 1.0
1358
+ else:
1359
+ return 0.0
1360
+
1361
+
1362
+ class RdLexer(RegexLexer):
1363
+ """
1364
+ Pygments Lexer for R documentation (Rd) files
1365
+
1366
+ This is a very minimal implementation, highlighting little more
1367
+ than the macros. A description of Rd syntax is found in `Writing R
1368
+ Extensions <http://cran.r-project.org/doc/manuals/R-exts.html>`_
1369
+ and `Parsing Rd files <developer.r-project.org/parseRd.pdf>`_.
1370
+
1371
+ *New in Pygments 1.6.*
1372
+ """
1373
+ name = 'Rd'
1374
+ aliases = ['rd']
1375
+ filenames = ['*.Rd']
1376
+ mimetypes = ['text/x-r-doc']
1377
+
1378
+ # To account for verbatim / LaTeX-like / and R-like areas
1379
+ # would require parsing.
1380
+ tokens = {
1381
+ 'root' : [
1382
+ # catch escaped brackets and percent sign
1383
+ (r'\\[\\{}%]', String.Escape),
1384
+ # comments
1385
+ (r'%.*$', Comment),
1386
+ # special macros with no arguments
1387
+ (r'\\(?:cr|l?dots|R|tab)\b', Keyword.Constant),
1388
+ # macros
1389
+ (r'\\[a-zA-Z]+\b', Keyword),
1390
+ # special preprocessor macros
1391
+ (r'^\s*#(?:ifn?def|endif).*\b', Comment.Preproc),
1392
+ # non-escaped brackets
1393
+ (r'[{}]', Name.Builtin),
1394
+ # everything else
1395
+ (r'[^\\%\n{}]+', Text),
1396
+ (r'.', Text),
1397
+ ]
1398
+ }