rouge 0.0.13 → 0.0.14

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.
@@ -38,6 +38,13 @@ module Rouge
38
38
  rule /[-{}]/, 'Comment.Multiline'
39
39
  end
40
40
 
41
+ state :comment_preproc do
42
+ rule /-}/, 'Comment.Preproc', :pop!
43
+ rule /{-/, 'Comment.Preproc', :comment
44
+ rule /[^-{}]+/, 'Comment.Preproc'
45
+ rule /[-{}]/, 'Comment.Preproc'
46
+ end
47
+
41
48
  state :root do
42
49
  mixin :basic
43
50
 
@@ -48,11 +48,29 @@ module Rouge
48
48
 
49
49
  state :attr do
50
50
  # TODO: are backslash escapes valid here?
51
- rule /".*?"/, 'Literal.String', :pop!
52
- rule /'.*?'/, 'Literal.String', :pop!
51
+ rule /"/ do
52
+ token 'Literal.String'
53
+ pop!; push :dq
54
+ end
55
+
56
+ rule /'/ do
57
+ token 'Literal.String'
58
+ pop!; push :sq
59
+ end
60
+
53
61
  rule /[^\s>]+/, 'Literal.String', :pop!
54
62
  end
55
63
 
64
+ state :dq do
65
+ rule /"/, 'Literal.String', :pop!
66
+ rule /[^"]+/, 'Literal.String'
67
+ end
68
+
69
+ state :sq do
70
+ rule /'/, 'Literal.String', :pop!
71
+ rule /[^']+/, 'Literal.String'
72
+ end
73
+
56
74
  state :script_content do
57
75
  rule %r(<\s*/\s*script\s*>)m, 'Name.Tag', :pop!
58
76
  rule %r(.*?(?=<\s*/\s*script\s*>))m do
@@ -0,0 +1,105 @@
1
+ module Rouge
2
+ module Lexers
3
+ class Make < RegexLexer
4
+ tag 'make'
5
+ aliases 'makefile', 'mf', 'gnumake', 'bsdmake'
6
+ filenames '*.make', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'
7
+ mimetypes 'text/x-makefile'
8
+
9
+ def self.analyze_text(text)
10
+ return 0.2 if text =~ /^\.PHONY:/
11
+ end
12
+
13
+ bsd_special = %w(
14
+ include undef error warning if else elif endif for endfor
15
+ )
16
+
17
+ gnu_special = %w(
18
+ ifeq ifneq ifdef ifndef else endif include -include define endef :
19
+ )
20
+
21
+ line = /(?:\\.|\\\n|[^\\\n])*/m
22
+
23
+ attr_reader :shell
24
+ def initialize(opts={})
25
+ super
26
+ @shell = Shell.new(opts)
27
+ end
28
+
29
+ state :root do
30
+ rule /^(?:[\t ]+.*\n|\n)+/ do
31
+ delegate lexer.shell
32
+ end
33
+
34
+ # rule /\$\((?:.*\\\n|.*\n)+/ do
35
+ # delegate Shell
36
+ # end
37
+
38
+ rule /\s+/, 'Text'
39
+
40
+ rule /#.*?\n/, 'Comment'
41
+
42
+ rule /(export)(\s+)(?=[a-zA-Z0-9_\${}\t -]+\n)/ do
43
+ group 'Keyword'; group 'Text'
44
+ push :export
45
+ end
46
+
47
+ rule /export\s+/, 'Keyword'
48
+
49
+ # assignment
50
+ rule /([a-zA-Z0-9_${}.-]+)(\s*)([!?:+]?=)/m do |m|
51
+ token 'Name.Variable', m[1]
52
+ token 'Text', m[2]
53
+ token 'Operator', m[3]
54
+ push :shell_line
55
+ end
56
+
57
+ rule /"(\\\\|\\.|[^"\\])*"/, 'Literal.String.Double'
58
+ rule /'(\\\\|\\.|[^'\\])*'/, 'Literal.String.Single'
59
+ rule /([^\n:]+)(:+)([ \t]*)/ do
60
+ group 'Name.Label'; group 'Operator'; group 'Text'
61
+ push :block_header
62
+ end
63
+ end
64
+
65
+ state :export do
66
+ rule /[\w\${}-]/, 'Name.Variable'
67
+ rule /\n/, 'Text', :pop!
68
+ rule /\s+/, 'Text'
69
+ end
70
+
71
+ state :block_header do
72
+ rule /[^,\\\n#]+/, 'Name.Function'
73
+ rule /,/, 'Punctuation'
74
+ rule /#.*?/, 'Comment'
75
+ rule /\\\n/, 'Text'
76
+ rule /\\./, 'Text'
77
+ rule /\n/ do
78
+ token 'Text'
79
+ pop!; push :block_body
80
+ end
81
+ end
82
+
83
+ state :block_body do
84
+ rule /(\t[\t ]*)([@-]?)/ do |m|
85
+ group 'Text'; group 'Punctuation'
86
+ push :shell_line
87
+ end
88
+
89
+ rule(//) { lexer.shell.reset!; pop! }
90
+ end
91
+
92
+ state :shell do
93
+ # macro interpolation
94
+ rule /\$\(\s*[a-z_]\w*\s*\)/i, 'Name.Variable'
95
+ rule(/.+?(?=\$\(|\)|\n)/m) { delegate lexer.shell }
96
+ rule(/\$\(|\)|\n/) { delegate lexer.shell }
97
+ end
98
+
99
+ state :shell_line do
100
+ rule /\n/, 'Text', :pop!
101
+ mixin :shell
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,196 @@
1
+ module Rouge
2
+ module Lexers
3
+ class Perl < RegexLexer
4
+ tag 'perl'
5
+ aliases 'pl'
6
+
7
+ filenames '*.pl', '*.pm'
8
+ mimetypes 'text/x-perl', 'application/x-perl'
9
+
10
+ def self.analyze_text(text)
11
+ return 1 if text.shebang? 'perl'
12
+ return 0.9 if text.include? 'my $'
13
+ end
14
+
15
+ keywords = %w(
16
+ case continue do else elsif for foreach if last my next our
17
+ redo reset then unless until while use print new BEGIN CHECK
18
+ INIT END return
19
+ )
20
+
21
+ builtins = %w(
22
+ abs accept alarm atan2 bind binmode bless caller chdir chmod
23
+ chomp chop chown chr chroot close closedir connect continue cos
24
+ crypt dbmclose dbmopen defined delete die dump each endgrent
25
+ endhostent endnetent endprotoent endpwent endservent eof eval
26
+ exec exists exit exp fcntl fileno flock fork format formline getc
27
+ getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent
28
+ getlogin getnetbyaddr getnetbyname getnetent getpeername
29
+ getpgrp getppid getpriority getprotobyname getprotobynumber
30
+ getprotoent getpwent getpwnam getpwuid getservbyname getservbyport
31
+ getservent getsockname getsockopt glob gmtime goto grep hex
32
+ import index int ioctl join keys kill last lc lcfirst length
33
+ link listen local localtime log lstat map mkdir msgctl msgget
34
+ msgrcv msgsnd my next no oct open opendir ord our pack package
35
+ pipe pop pos printf prototype push quotemeta rand read readdir
36
+ readline readlink readpipe recv redo ref rename require reverse
37
+ rewinddir rindex rmdir scalar seek seekdir select semctl semget
38
+ semop send setgrent sethostent setnetent setpgrp setpriority
39
+ setprotoent setpwent setservent setsockopt shift shmctl shmget
40
+ shmread shmwrite shutdown sin sleep socket socketpair sort splice
41
+ split sprintf sqrt srand stat study substr symlink syscall sysopen
42
+ sysread sysseek system syswrite tell telldir tie tied time times
43
+ tr truncate uc ucfirst umask undef unlink unpack unshift untie
44
+ utime values vec wait waitpid wantarray warn write
45
+ )
46
+
47
+ re_tok = 'Literal.String.Regex'
48
+
49
+ state :balanced_regex do
50
+ rule %r(/(\\\\|\\/|[^/])*/[egimosx]*)m, re_tok, :pop!
51
+ rule %r(!(\\\\|\\!|[^!])*![egimosx]*)m, re_tok, :pop!
52
+ rule %r(\\(\\\\|[^\\])*\\[egimosx]*)m, re_tok, :pop!
53
+ rule %r({(\\\\|\\}|[^}])*}[egimosx]*), re_tok, :pop!
54
+ rule %r(<(\\\\|\\>|[^>])*>[egimosx]*), re_tok, :pop!
55
+ rule %r(\[(\\\\|\\\]|[^\]])*\][egimosx]*), re_tok, :pop!
56
+ rule %r(\((\\\\|\\\)|[^\)])*\)[egimosx]*), re_tok, :pop!
57
+ rule %r(@(\\\\|\\\@|[^\@])*@[egimosx]*), re_tok, :pop!
58
+ rule %r(%(\\\\|\\\%|[^\%])*%[egimosx]*), re_tok, :pop!
59
+ rule %r(\$(\\\\|\\\$|[^\$])*\$[egimosx]*), re_tok, :pop!
60
+ end
61
+
62
+ state :root do
63
+ rule /#.*?$/, 'Comment.Single'
64
+ rule /^=[a-zA-Z0-9]+\s+.*?\n=cut/, 'Comment.Multiline'
65
+ rule /(?:#{keywords.join('|')})\b/, 'Keyword'
66
+
67
+ rule /(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
68
+ group 'Keyword'; group 'Text'
69
+ group 'Name'; group 'Text'
70
+ group 'Punctuation'; group 'Text'
71
+
72
+ push :format
73
+ end
74
+
75
+ rule /(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, 'Operator.Word'
76
+
77
+ # common delimiters
78
+ rule %r(s/(\\\\|\\/|[^/])*/(\\\\|\\/|[^/])*/[egimosx]*), re_tok
79
+ rule %r(s!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*), re_tok
80
+ rule %r(s\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*), re_tok
81
+ rule %r(s@(\\\\|\\@|[^@])*@(\\\\|\\@|[^@])*@[egimosx]*), re_tok
82
+ rule %r(s%(\\\\|\\%|[^%])*%(\\\\|\\%|[^%])*%[egimosx]*), re_tok
83
+
84
+ # balanced delimiters
85
+ rule %r(s{(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
86
+ rule %r(s<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
87
+ rule %r(s\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
88
+ rule %r(s\((\\\\|\\\)|[^\)])*\)\s*), re_tok, :balanced_regex
89
+
90
+ rule %r(m?/(\\\\|\\/|[^/\n])*/[gcimosx]*), re_tok
91
+ rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
92
+ rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[gcimosx]*),
93
+ re_tok, :balanced_regex
94
+
95
+ rule /\s+/, 'Text'
96
+ rule /(?:#{builtins.join('|')})\b/, 'Name.Builtin'
97
+ rule /((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b/,
98
+ 'Name.Builtin.Pseudo'
99
+
100
+ rule /<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m,
101
+ 'Literal.String'
102
+
103
+ rule /__END__\b/, 'Comment.Preproc', :end_part
104
+ rule /\$\^[ADEFHILMOPSTWX]/, 'Name.Variable.Global'
105
+ rule /\$[\\"\[\]'&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, 'Name.Variable.Global'
106
+ rule /[$@%#]+/, 'Name.Variable', :varname
107
+
108
+ rule /0_?[0-7]+(_[0-7]+)*/, 'Literal.Number.Oct'
109
+ rule /0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, 'Literal.Number.Hex'
110
+ rule /0b[01]+(_[01]+)*/, 'Literal.Number.Bin'
111
+ rule /(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i,
112
+ 'Literal.Number.Float'
113
+ rule /\d+(_\d*)*e[+-]?\d+(_\d*)*/i, 'Literal.Number.Float'
114
+ rule /\d+(_\d+)*/, 'Literal.Number.Integer'
115
+
116
+ rule /'(\\\\|\\'|[^'])*'/, 'Literal.String'
117
+ rule /"(\\\\|\\"|[^"])*"/, 'Literal.String'
118
+ rule /`(\\\\|\\`|[^`])*`/, 'Literal.String.Backtick'
119
+ rule /<([^\s>]+)>/, re_tok
120
+ rule /(q|qq|qw|qr|qx)\{/, 'Literal.String.Other', :cb_string
121
+ rule /(q|qq|qw|qr|qx)\(/, 'Literal.String.Other', :rb_string
122
+ rule /(q|qq|qw|qr|qx)\[/, 'Literal.String.Other', :sb_string
123
+ rule /(q|qq|qw|qr|qx)</, 'Literal.String.Other', :lt_string
124
+ rule /(q|qq|qw|qr|qx)([^a-zA-Z0-9])(.|\n)*?\2/, 'Literal.String.Other'
125
+
126
+ rule /package\s+/, 'Keyword', :modulename
127
+ rule /sub\s+/, 'Keyword', :funcname
128
+ rule /\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
129
+ 'Operator'
130
+ rule /[-+\/*%=<>&^\|!\\~]=?/, 'Operator'
131
+ rule /[()\[\]:;,<>\/?{}]/, 'Punctuation'
132
+ rule(/(?=\w)/) { push :name }
133
+ end
134
+
135
+ state :format do
136
+ rule /\.\n/, 'Literal.String.Interpol', :pop!
137
+ rule /.*?\n/, 'Literal.String.Interpol'
138
+ end
139
+
140
+ state :name_common do
141
+ rule /\w+::/, 'Name.Namespace'
142
+ rule /[\w:]+/, 'Name.Variable', :pop!
143
+ end
144
+
145
+ state :varname do
146
+ rule /\s+/, 'Text'
147
+ rule /\{/, 'Punctuation', :pop! # hash syntax
148
+ rule /\)|,/, 'Punctuation', :pop! # arg specifier
149
+ mixin :name_common
150
+ end
151
+
152
+ state :name do
153
+ mixin :name_common
154
+ rule /[A-Z_]+(?=[^a-zA-Z0-9_])/, 'Name.Constant', :pop!
155
+ rule(/(?=\W)/) { pop! }
156
+ end
157
+
158
+ state :modulename do
159
+ rule /[a-z_]\w*/i, 'Name.Namespace', :pop!
160
+ end
161
+
162
+ state :funcname do
163
+ rule /[a-zA-Z_]\w*[!?]?/, 'Name.Function'
164
+ rule /\s+/, 'Text'
165
+
166
+ # argument declaration
167
+ rule /(\([$@%]*\))(\s*)/ do
168
+ group 'Punctuation'
169
+ group 'Text'
170
+ end
171
+
172
+ rule /.*?{/, 'Punctuation', :pop!
173
+ rule /;/, 'Punctuation', :pop!
174
+ end
175
+
176
+ [[:cb, '\{', '\}'],
177
+ [:rb, '\(', '\)'],
178
+ [:sb, '\[', '\]'],
179
+ [:lt, '<', '>']].each do |name, open, close|
180
+ tok = 'Literal.String.Other'
181
+ state :"#{name}_string" do
182
+ rule /\\[#{open}#{close}\\]/, tok
183
+ rule /\\/, tok
184
+ rule(/#{open}/) { token tok; push }
185
+ rule /#{close}/, tok, :pop!
186
+ rule /[^#{open}#{close}\\]+/, tok
187
+ end
188
+ end
189
+
190
+ state :end_part do
191
+ # eat the rest of the stream
192
+ rule /.+/m, 'Comment.Preproc', :pop!
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,145 @@
1
+ module Rouge
2
+ module Lexers
3
+ class PHP < RegexLexer
4
+ tag 'php'
5
+ aliases 'php', 'php3', 'php4', 'php5'
6
+ filenames '*.php', '*.php[345]'
7
+ mimetypes 'text/x-php'
8
+
9
+ def initialize(opts={})
10
+ # if truthy, the lexer starts highlighting with php code
11
+ # (no <?php required)
12
+ @start_inline = opts.delete(:start_inline)
13
+ @funcnamehighlighting = opts.delete(:funcnamehighlighting) { true }
14
+ @disabledmodules = opts.delete(:disabledmodules) { [] }
15
+ end
16
+
17
+ def builtins
18
+ return [] unless @funcnamehighlighting
19
+
20
+ @builtins ||= Set.new.tap do |builtins|
21
+ require Pathname.new(__FILE__).dirname.join('php/builtins.rb')
22
+
23
+ self.class.builtins.each do |mod, fns|
24
+ next if @disabledmodules.include? mod
25
+ builtins.merge(fns)
26
+ end
27
+ end
28
+ end
29
+
30
+ def start_inline?
31
+ !!@start_inline
32
+ end
33
+
34
+ start do
35
+ push :php if lexer.start_inline?
36
+ end
37
+
38
+ keywords = %w(
39
+ and E_PARSE old_function E_ERROR or as E_WARNING parent eval
40
+ PHP_OS break exit case extends PHP_VERSION cfunction FALSE
41
+ print for require continue foreach require_once declare return
42
+ default static do switch die stdClass echo else TRUE elseif
43
+ var empty if xor enddeclare include virtual endfor include_once
44
+ while endforeach global __FILE__ endif list __LINE__ endswitch
45
+ new __sleep endwhile not array __wakeup E_ALL NULL final
46
+ php_user_filter interface implements public private protected
47
+ abstract clone try catch throw this use namespace
48
+ )
49
+
50
+ state :root do
51
+ rule /<\?(php)?/, 'Comment.Preproc', :php
52
+ rule /.*?(?=<\?)/, 'Other'
53
+ rule /</, 'Other'
54
+ end
55
+
56
+ state :php do
57
+ rule /\?>/, 'Comment.Preproc', :pop!
58
+ # heredocs
59
+ rule /<<<('?)([a-z_]\w*)\1\n.*?\n\2;?\n/im, 'String'
60
+ rule /\s+/, 'Text'
61
+ rule /#.*?\n/, 'Comment.Single'
62
+ rule %r(//.*?\n), 'Comment.Single'
63
+ # empty comment, otherwise seen as the start of a docstring
64
+ rule %r(/\*\*/)
65
+ rule %r(/\*\*.*?\*/)m, 'Literal.String.Doc'
66
+ rule %r(/\*.*?\*/)m, 'Comment.Multiline'
67
+ rule /(->|::)(\s*)([a-zA-Z_][a-zA-Z0-9_]*)/ do
68
+ group 'Operator'; group 'Text'; group 'Name.Attribute'
69
+ end
70
+
71
+ rule /[~!%^&*+=\|:.<>\/?@-]+/, 'Operator'
72
+ rule /[\[\]{}();,]+/, 'Punctuation'
73
+ rule /class\b/, 'Keyword', :classname
74
+ # anonymous functions
75
+ rule /(function)(\s*)(?=\()/ do
76
+ group 'Keyword'; group 'Text'
77
+ end
78
+
79
+ # named functions
80
+ rule /(function)(\s+)(&?)(\s*)/ do
81
+ group 'Keyword'; group 'Text'; group 'Operator'; group 'Text'
82
+ push :funcname
83
+ end
84
+
85
+ rule /(const)(\s+)([a-zA-Z_]\w*)/i do
86
+ group 'Keyword'; group 'Text'; group 'Name.Constant'
87
+ end
88
+
89
+ rule /(?:#{keywords.join('|')})\b/, 'Keyword'
90
+ rule /(true|false|null)\b/, 'Keyword.Constant'
91
+ rule /\$\{\$+[a-z_]\w*\}/i, 'Name.Variable'
92
+ rule /\$+[a-z_]\w*/i, 'Name.Variable'
93
+
94
+ # may be intercepted for builtin highlighting
95
+ rule /[\\a-z_][\\\w]*/i, 'Name.Other'
96
+
97
+ rule /(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, 'Literal.Number.Float'
98
+ rule /\d+e[+-]?\d+/i, 'Literal.Number.Float'
99
+ rule /0[0-7]+/, 'Literal.Number.Oct'
100
+ rule /0x[a-f0-9]+/i, 'Literal.Number.Hex'
101
+ rule /\d+/, 'Literal.Number.Integer'
102
+ rule /'([^'\\]*(?:\\.[^'\\]*)*)'/, 'Literal.String.Single'
103
+ rule /`([^`\\]*(?:\\.[^`\\]*)*)`/, 'Literal.String.Backtick'
104
+ rule /"/, 'Literal.String.Double', :string
105
+ end
106
+
107
+ state :classname do
108
+ rule /\s+/, 'Text'
109
+ rule /[a-z_][\\\w]*/i, 'Name.Class', :pop!
110
+ end
111
+
112
+ state :funcname do
113
+ rule /[a-z_]\w*/i, 'Name.Function', :pop!
114
+ end
115
+
116
+ state :string do
117
+ rule /"/, 'Literal.String.Double', :pop!
118
+ rule /[^\\{$"]+/, 'Literal.String.Double'
119
+ rule /\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})/,
120
+ 'Literal.String.Escape'
121
+ rule /\$[a-zA-Z_][a-zA-Z0-9_]*(\[\S+\]|->[a-zA-Z_][a-zA-Z0-9_]*)?/
122
+
123
+ lsi = 'Literal.String.Interpol'
124
+ rule /\{\$\{/, lsi, :interp_double
125
+ rule /\{(?=\$)/, lsi, :interp_single
126
+ rule /(\{)(\S+)(\})/ do
127
+ group lsi; group 'Name.Variable'; group lsi
128
+ end
129
+
130
+ rule /[${\\]+/, 'Literal.String.Double'
131
+ end
132
+
133
+ def stream_tokens(source, &b)
134
+ super(source) do |tok, val|
135
+ if tok.name == 'Name.Other' and builtins.include? val
136
+ yield [Token['Name.Builtin'], val]
137
+ else
138
+ yield [tok, val]
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+