gitlab-rouge 1.9.2

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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +16 -0
  5. data/gitlab-rouge.gemspec +17 -0
  6. data/lib/rouge.rb +57 -0
  7. data/lib/rouge/cli.rb +363 -0
  8. data/lib/rouge/demos/apache +21 -0
  9. data/lib/rouge/demos/applescript +2 -0
  10. data/lib/rouge/demos/c +8 -0
  11. data/lib/rouge/demos/clojure +5 -0
  12. data/lib/rouge/demos/coffeescript +5 -0
  13. data/lib/rouge/demos/common_lisp +1 -0
  14. data/lib/rouge/demos/conf +4 -0
  15. data/lib/rouge/demos/cpp +8 -0
  16. data/lib/rouge/demos/csharp +5 -0
  17. data/lib/rouge/demos/css +4 -0
  18. data/lib/rouge/demos/dart +6 -0
  19. data/lib/rouge/demos/diff +7 -0
  20. data/lib/rouge/demos/elixir +1 -0
  21. data/lib/rouge/demos/erb +1 -0
  22. data/lib/rouge/demos/erlang +7 -0
  23. data/lib/rouge/demos/factor +5 -0
  24. data/lib/rouge/demos/gherkin +17 -0
  25. data/lib/rouge/demos/glsl +14 -0
  26. data/lib/rouge/demos/go +7 -0
  27. data/lib/rouge/demos/groovy +9 -0
  28. data/lib/rouge/demos/haml +5 -0
  29. data/lib/rouge/demos/handlebars +7 -0
  30. data/lib/rouge/demos/haskell +6 -0
  31. data/lib/rouge/demos/html +8 -0
  32. data/lib/rouge/demos/http +14 -0
  33. data/lib/rouge/demos/ini +4 -0
  34. data/lib/rouge/demos/io +11 -0
  35. data/lib/rouge/demos/java +5 -0
  36. data/lib/rouge/demos/javascript +1 -0
  37. data/lib/rouge/demos/json +1 -0
  38. data/lib/rouge/demos/json-doc +1 -0
  39. data/lib/rouge/demos/liquid +11 -0
  40. data/lib/rouge/demos/literate_coffeescript +3 -0
  41. data/lib/rouge/demos/literate_haskell +7 -0
  42. data/lib/rouge/demos/llvm +20 -0
  43. data/lib/rouge/demos/lua +12 -0
  44. data/lib/rouge/demos/make +6 -0
  45. data/lib/rouge/demos/markdown +4 -0
  46. data/lib/rouge/demos/matlab +6 -0
  47. data/lib/rouge/demos/moonscript +16 -0
  48. data/lib/rouge/demos/nginx +5 -0
  49. data/lib/rouge/demos/nim +27 -0
  50. data/lib/rouge/demos/objective_c +14 -0
  51. data/lib/rouge/demos/ocaml +12 -0
  52. data/lib/rouge/demos/perl +5 -0
  53. data/lib/rouge/demos/php +3 -0
  54. data/lib/rouge/demos/plaintext +1 -0
  55. data/lib/rouge/demos/powershell +49 -0
  56. data/lib/rouge/demos/prolog +9 -0
  57. data/lib/rouge/demos/properties +7 -0
  58. data/lib/rouge/demos/puppet +6 -0
  59. data/lib/rouge/demos/python +6 -0
  60. data/lib/rouge/demos/qml +9 -0
  61. data/lib/rouge/demos/r +8 -0
  62. data/lib/rouge/demos/racket +24 -0
  63. data/lib/rouge/demos/ruby +9 -0
  64. data/lib/rouge/demos/rust +12 -0
  65. data/lib/rouge/demos/sass +3 -0
  66. data/lib/rouge/demos/scala +3 -0
  67. data/lib/rouge/demos/scheme +4 -0
  68. data/lib/rouge/demos/scss +5 -0
  69. data/lib/rouge/demos/sed +4 -0
  70. data/lib/rouge/demos/shell +2 -0
  71. data/lib/rouge/demos/slim +17 -0
  72. data/lib/rouge/demos/smalltalk +6 -0
  73. data/lib/rouge/demos/sml +4 -0
  74. data/lib/rouge/demos/sql +1 -0
  75. data/lib/rouge/demos/swift +5 -0
  76. data/lib/rouge/demos/tcl +1 -0
  77. data/lib/rouge/demos/tex +1 -0
  78. data/lib/rouge/demos/toml +9 -0
  79. data/lib/rouge/demos/tulip +14 -0
  80. data/lib/rouge/demos/vb +4 -0
  81. data/lib/rouge/demos/viml +5 -0
  82. data/lib/rouge/demos/xml +2 -0
  83. data/lib/rouge/demos/yaml +4 -0
  84. data/lib/rouge/formatter.rb +50 -0
  85. data/lib/rouge/formatters/html.rb +117 -0
  86. data/lib/rouge/formatters/null.rb +19 -0
  87. data/lib/rouge/formatters/terminal256.rb +176 -0
  88. data/lib/rouge/lexer.rb +443 -0
  89. data/lib/rouge/lexers/apache.rb +68 -0
  90. data/lib/rouge/lexers/apache/keywords.yml +453 -0
  91. data/lib/rouge/lexers/apple_script.rb +367 -0
  92. data/lib/rouge/lexers/c.rb +212 -0
  93. data/lib/rouge/lexers/clojure.rb +112 -0
  94. data/lib/rouge/lexers/coffeescript.rb +174 -0
  95. data/lib/rouge/lexers/common_lisp.rb +345 -0
  96. data/lib/rouge/lexers/conf.rb +24 -0
  97. data/lib/rouge/lexers/cpp.rb +66 -0
  98. data/lib/rouge/lexers/csharp.rb +88 -0
  99. data/lib/rouge/lexers/css.rb +271 -0
  100. data/lib/rouge/lexers/dart.rb +104 -0
  101. data/lib/rouge/lexers/diff.rb +31 -0
  102. data/lib/rouge/lexers/elixir.rb +108 -0
  103. data/lib/rouge/lexers/erb.rb +56 -0
  104. data/lib/rouge/lexers/erlang.rb +118 -0
  105. data/lib/rouge/lexers/factor.rb +302 -0
  106. data/lib/rouge/lexers/gherkin.rb +137 -0
  107. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  108. data/lib/rouge/lexers/glsl.rb +135 -0
  109. data/lib/rouge/lexers/go.rb +178 -0
  110. data/lib/rouge/lexers/groovy.rb +104 -0
  111. data/lib/rouge/lexers/haml.rb +228 -0
  112. data/lib/rouge/lexers/handlebars.rb +79 -0
  113. data/lib/rouge/lexers/haskell.rb +183 -0
  114. data/lib/rouge/lexers/html.rb +94 -0
  115. data/lib/rouge/lexers/http.rb +80 -0
  116. data/lib/rouge/lexers/ini.rb +57 -0
  117. data/lib/rouge/lexers/io.rb +68 -0
  118. data/lib/rouge/lexers/java.rb +76 -0
  119. data/lib/rouge/lexers/javascript.rb +297 -0
  120. data/lib/rouge/lexers/liquid.rb +287 -0
  121. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  122. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  123. data/lib/rouge/lexers/llvm.rb +84 -0
  124. data/lib/rouge/lexers/lua.rb +122 -0
  125. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  126. data/lib/rouge/lexers/make.rb +116 -0
  127. data/lib/rouge/lexers/markdown.rb +154 -0
  128. data/lib/rouge/lexers/matlab.rb +74 -0
  129. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  130. data/lib/rouge/lexers/moonscript.rb +110 -0
  131. data/lib/rouge/lexers/nginx.rb +71 -0
  132. data/lib/rouge/lexers/nim.rb +152 -0
  133. data/lib/rouge/lexers/objective_c.rb +197 -0
  134. data/lib/rouge/lexers/ocaml.rb +111 -0
  135. data/lib/rouge/lexers/perl.rb +197 -0
  136. data/lib/rouge/lexers/php.rb +173 -0
  137. data/lib/rouge/lexers/php/builtins.rb +204 -0
  138. data/lib/rouge/lexers/plain_text.rb +25 -0
  139. data/lib/rouge/lexers/powershell.rb +96 -0
  140. data/lib/rouge/lexers/prolog.rb +64 -0
  141. data/lib/rouge/lexers/properties.rb +55 -0
  142. data/lib/rouge/lexers/puppet.rb +128 -0
  143. data/lib/rouge/lexers/python.rb +228 -0
  144. data/lib/rouge/lexers/qml.rb +72 -0
  145. data/lib/rouge/lexers/r.rb +56 -0
  146. data/lib/rouge/lexers/racket.rb +542 -0
  147. data/lib/rouge/lexers/ruby.rb +415 -0
  148. data/lib/rouge/lexers/rust.rb +191 -0
  149. data/lib/rouge/lexers/sass.rb +74 -0
  150. data/lib/rouge/lexers/sass/common.rb +180 -0
  151. data/lib/rouge/lexers/scala.rb +142 -0
  152. data/lib/rouge/lexers/scheme.rb +112 -0
  153. data/lib/rouge/lexers/scss.rb +34 -0
  154. data/lib/rouge/lexers/sed.rb +170 -0
  155. data/lib/rouge/lexers/shell.rb +152 -0
  156. data/lib/rouge/lexers/slim.rb +228 -0
  157. data/lib/rouge/lexers/smalltalk.rb +116 -0
  158. data/lib/rouge/lexers/sml.rb +347 -0
  159. data/lib/rouge/lexers/sql.rb +140 -0
  160. data/lib/rouge/lexers/swift.rb +144 -0
  161. data/lib/rouge/lexers/tcl.rb +192 -0
  162. data/lib/rouge/lexers/tex.rb +72 -0
  163. data/lib/rouge/lexers/toml.rb +71 -0
  164. data/lib/rouge/lexers/tulip.rb +75 -0
  165. data/lib/rouge/lexers/vb.rb +164 -0
  166. data/lib/rouge/lexers/viml.rb +101 -0
  167. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  168. data/lib/rouge/lexers/xml.rb +59 -0
  169. data/lib/rouge/lexers/yaml.rb +364 -0
  170. data/lib/rouge/plugins/redcarpet.rb +30 -0
  171. data/lib/rouge/regex_lexer.rb +439 -0
  172. data/lib/rouge/template_lexer.rb +22 -0
  173. data/lib/rouge/text_analyzer.rb +48 -0
  174. data/lib/rouge/theme.rb +195 -0
  175. data/lib/rouge/themes/base16.rb +130 -0
  176. data/lib/rouge/themes/colorful.rb +67 -0
  177. data/lib/rouge/themes/github.rb +71 -0
  178. data/lib/rouge/themes/molokai.rb +82 -0
  179. data/lib/rouge/themes/monokai.rb +92 -0
  180. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  181. data/lib/rouge/themes/thankful_eyes.rb +71 -0
  182. data/lib/rouge/token.rb +182 -0
  183. data/lib/rouge/util.rb +101 -0
  184. data/lib/rouge/version.rb +7 -0
  185. metadata +231 -0
@@ -0,0 +1,25 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class PlainText < Lexer
6
+ title "Plain Text"
7
+ desc "A boring lexer that doesn't highlight anything"
8
+
9
+ tag 'plaintext'
10
+ aliases 'text'
11
+ filenames '*.txt'
12
+ mimetypes 'text/plain'
13
+
14
+ default_options :token => 'Text'
15
+
16
+ def token
17
+ @token ||= Token[option :token]
18
+ end
19
+
20
+ def stream_tokens(string, &b)
21
+ yield self.token, string
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,96 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ load_const :Shell, 'shell.rb'
6
+
7
+ class Powershell < Shell
8
+ title 'powershell'
9
+ desc 'powershell'
10
+ tag 'powershell'
11
+ aliases 'posh'
12
+ filenames '*.ps1', '*.psm1', '*.psd1'
13
+ mimetypes 'text/plain'
14
+
15
+ ATTRIBUTES = %w(
16
+ CmdletBinding ConfirmImpact DefaultParameterSetName HelpURI SupportsPaging
17
+ SupportsShouldProcess PositionalBinding
18
+ ).join('|')
19
+
20
+ KEYWORDS = %w(
21
+ Begin Exit Process Break Filter Return Catch Finally Sequence Class For
22
+ Switch Continue ForEach Throw Data From Trap Define Function Try Do If
23
+ Until DynamicParam In Using Else InlineScript Var ElseIf Parallel While
24
+ End Param Workflow
25
+ ).join('|')
26
+
27
+ KEYWORDS_TYPE = %w(
28
+ bool byte char decimal double float int long object sbyte
29
+ short string uint ulong ushort
30
+ ).join('|')
31
+
32
+ OPERATORS = %w(
33
+ -split -isplit -csplit -join -is -isnot -as -eq -ieq -ceq -ne -ine
34
+ -cne -gt -igt -cgt -ge -ige -cge -lt -ilt -clt -le -ile -cle -like
35
+ -ilike -clike -notlike -inotlike -cnotlike -match -imatch -cmatch
36
+ -notmatch -inotmatch -cnotmatch -contains -icontains -ccontains
37
+ -notcontains -inotcontains -cnotcontains -replace -ireplace
38
+ -creplace -band -bor -bxor -and -or -xor \. & = \+= -= \*= \/= %=
39
+ ).join('|')
40
+
41
+ BUILTINS = %w(
42
+ Add-Content Add-History Add-Member Add-PSSnapin Clear-Content
43
+ Clear-Item Clear-Item Property Clear-Variable Compare-Object
44
+ ConvertFrom-SecureString Convert-Path ConvertTo-Html
45
+ ConvertTo-SecureString Copy-Item Copy-ItemProperty Export-Alias
46
+ Export-Clixml Export-Console Export-Csv ForEach-Object
47
+ Format-Custom Format-List Format-Table Format-Wide
48
+ Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem
49
+ Get-Command Get-Content Get-Credential Get-Culture Get-Date
50
+ Get-EventLog Get-ExecutionPolicy Get-Help Get-History
51
+ Get-Host Get-Item Get-ItemProperty Get-Location Get-Member
52
+ Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider
53
+ Get-PSSnapin Get-Service Get-TraceSource Get-UICulture
54
+ Get-Unique Get-Variable Get-WmiObject Group-Object
55
+ Import-Alias Import-Clixml Import-Csv Invoke-Expression
56
+ Invoke-History Invoke-Item Join-Path Measure-Command
57
+ Measure-Object Move-Item Move-ItemProperty New-Alias
58
+ New-Item New-ItemProperty New-Object New-PSDrive New-Service
59
+ New-TimeSpan New-Variable Out-Default Out-File Out-Host Out-Null
60
+ Out-Printer Out-String Pop-Location Push-Location Read-Host
61
+ Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin
62
+ Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path
63
+ Restart-Service Resume-Service Select-Object Select-String
64
+ Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date
65
+ Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location
66
+ Set-PSDebug Set-Service Set-TraceSource Set-Variable Sort-Object
67
+ Split-Path Start-Service Start-Sleep Start-Transcript Stop-Process
68
+ Stop-Service Stop-Transcript Suspend-Service Tee-Object Test-Path
69
+ Trace-Command Update-FormatData Update-TypeData Where-Object
70
+ Write-Debug Write-Error Write-Host Write-Output Write-Progress
71
+ Write-Verbose Write-Warning ac asnp cat cd chdir clc clear clhy
72
+ cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del
73
+ diff dir dnsn ebp echo epal epcsv epsn erase etsn exsn fc fl
74
+ foreach ft fw gal gbp gc gci gcm gcs gdr ghy gi gjb gl gm gmo
75
+ gp gps group gsn gsnp gsv gu gv gwmi h history icm iex ihy ii
76
+ ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure
77
+ mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps
78
+ pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp
79
+ rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc select
80
+ set shcm si sl sleep sls sort sp spjb spps spsv start sujb sv
81
+ swmi tee trcm type wget where wjb write \% \?
82
+ ).join('|')
83
+
84
+ prepend :basic do
85
+ rule %r(<#[\s,\S]*?#>)m, Comment::Multiline
86
+ rule /#.*$/, Comment::Single
87
+ rule /\b(#{OPERATORS})\s*\b/i, Operator
88
+ rule /\b(#{ATTRIBUTES})\s*\b/i, Name::Attribute
89
+ rule /\b(#{KEYWORDS})\s*\b/i, Keyword
90
+ rule /\b(#{KEYWORDS_TYPE})\s*\b/i, Keyword::Type
91
+ rule /\bcase\b/, Keyword, :case
92
+ rule /\b(#{BUILTINS})\s*\b(?!\.)/i, Name::Builtin
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,64 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Prolog < RegexLexer
6
+ title "Prolog"
7
+ desc "The Prolog programming language (http://en.wikipedia.org/wiki/Prolog)"
8
+ tag 'prolog'
9
+ aliases 'prolog'
10
+ filenames '*.pro', '*.P', '*.prolog', '*.pl'
11
+ mimetypes 'text/x-prolog'
12
+
13
+ def self.analyze_text(text)
14
+ return 0.1 if text =~ /\A\w+(\(\w+\,\s*\w+\))*\./
15
+ return 0.1 if text.include? ':-'
16
+ end
17
+
18
+ state :basic do
19
+ rule /\s+/, Text
20
+ rule /^#.*/, Comment::Single
21
+ rule /\/\*/, Comment::Multiline, :nested_comment
22
+
23
+ rule /[\[\](){}|.,;!]/, Punctuation
24
+ rule /:-|-->/, Punctuation
25
+
26
+ rule /"[^"]*"/, Str::Double
27
+
28
+ rule /\d+\.\d+/, Num::Float
29
+ rule /\d+/, Num
30
+ end
31
+
32
+ state :atoms do
33
+ rule /[[:lower:]]([_[:word:][:digit:]])*/, Str::Symbol
34
+ rule /'[^']*'/, Str::Symbol
35
+ end
36
+
37
+ state :operators do
38
+ rule /(<|>|=<|>=|==|=:=|=|\/|\/\/|\*|\+|-)(?=\s|[a-zA-Z0-9\[])/,
39
+ Operator
40
+ rule /is/, Operator
41
+ rule /(mod|div|not)/, Operator
42
+ rule /[#&*+-.\/:<=>?@^~]+/, Operator
43
+ end
44
+
45
+ state :variables do
46
+ rule /[A-Z]+\w*/, Name::Variable
47
+ rule /_[[:word:]]*/, Name::Variable
48
+ end
49
+
50
+ state :root do
51
+ mixin :basic
52
+ mixin :atoms
53
+ mixin :variables
54
+ mixin :operators
55
+ end
56
+
57
+ state :nested_comment do
58
+ rule /\/\*/, Comment::Multiline, :push
59
+ rule /\s*\*[^*\/]+/, Comment::Multiline
60
+ rule /\*\//, Comment::Multiline, :pop!
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Properties < RegexLexer
6
+ title ".properties"
7
+ desc '.properties config files for Java'
8
+ tag 'properties'
9
+
10
+ filenames '*.properties'
11
+ mimetypes 'text/x-java-properties'
12
+
13
+ def self.analyze_text(text)
14
+ return 0.1 if text =~ /\A\[[\w.]+\]\s*\w+=\w+/
15
+ end
16
+
17
+ identifier = /[\w.]+/
18
+
19
+ state :basic do
20
+ rule /[!#].*?\n/, Comment
21
+ rule /\s+/, Text
22
+ rule /\\\n/, Str::Escape
23
+ end
24
+
25
+ state :root do
26
+ mixin :basic
27
+
28
+ rule /(#{identifier})(\s*)([=:])/ do
29
+ groups Name::Property, Text, Punctuation
30
+ push :value
31
+ end
32
+ end
33
+
34
+ state :value do
35
+ rule /\n/, Text, :pop!
36
+ mixin :basic
37
+ rule /"/, Str, :dq
38
+ rule /'.*?'/, Str
39
+ mixin :esc_str
40
+ rule /[^\\\n]+/, Str
41
+ end
42
+
43
+ state :dq do
44
+ rule /"/, Str, :pop!
45
+ mixin :esc_str
46
+ rule /[^\\"]+/m, Str
47
+ end
48
+
49
+ state :esc_str do
50
+ rule /\\u[0-9]{4}/, Str::Escape
51
+ rule /\\./m, Str::Escape
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,128 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Puppet < RegexLexer
6
+ title "Puppet"
7
+ desc 'The Puppet configuration management language (puppetlabs.org)'
8
+ tag 'puppet'
9
+ aliases 'pp'
10
+ filenames '*.pp'
11
+
12
+ def self.analyze_text(text)
13
+ return 1 if text.shebang? 'puppet-apply'
14
+ return 1 if text.shebang? 'puppet'
15
+ end
16
+
17
+ def self.keywords
18
+ @keywords ||= Set.new %w(
19
+ and case class default define else elsif if in import inherits
20
+ node unless
21
+ )
22
+ end
23
+
24
+ def self.constants
25
+ @constants ||= Set.new %w(
26
+ false true undef
27
+ )
28
+ end
29
+
30
+ def self.metaparameters
31
+ @metaparameters ||= Set.new %w(
32
+ before require notify subscribe
33
+ )
34
+ end
35
+
36
+ id = /[a-z]\w*/
37
+ cap_id = /[A-Z]\w*/
38
+ qualname = /(::)?(#{id}::)*\w+/
39
+
40
+ state :whitespace do
41
+ rule /\s+/m, Text
42
+ rule /#.*?\n/, Comment
43
+ end
44
+
45
+ state :root do
46
+ mixin :whitespace
47
+
48
+ rule /[$]#{qualname}/, Name::Variable
49
+ rule /(#{id})(?=\s*[=+]>)/m do |m|
50
+ if self.class.metaparameters.include? m[0]
51
+ token Keyword::Pseudo
52
+ else
53
+ token Name::Property
54
+ end
55
+ end
56
+
57
+ rule /(#{qualname})(?=\s*[(])/m, Name::Function
58
+ rule cap_id, Name::Class
59
+
60
+ rule /[+=|~-]>|<[|~-]/, Punctuation
61
+ rule /[:}();\[\]]/, Punctuation
62
+
63
+ # HACK for case statements and selectors
64
+ rule /{/, Punctuation, :regex_allowed
65
+ rule /,/, Punctuation, :regex_allowed
66
+
67
+ rule /(in|and|or)\b/, Operator::Word
68
+ rule /[=!<>]=/, Operator
69
+ rule /[=!]~/, Operator, :regex_allowed
70
+ rule %r([<>!+*/-]), Operator
71
+
72
+ rule /(class|include)(\s*)(#{qualname})/ do
73
+ groups Keyword, Text, Name::Class
74
+ end
75
+
76
+ rule /node\b/, Keyword, :regex_allowed
77
+
78
+ rule /'(\\[\\']|[^'])*'/m, Str::Single
79
+ rule /"/, Str::Double, :dquotes
80
+
81
+ rule /\d+([.]\d+)?(e[+-]\d+)?/, Num
82
+
83
+ # a valid regex. TODO: regexes are only allowed
84
+ # in certain places in puppet.
85
+ rule qualname do |m|
86
+ if self.class.keywords.include? m[0]
87
+ token Keyword
88
+ elsif self.class.constants.include? m[0]
89
+ token Keyword::Constant
90
+ else
91
+ token Name
92
+ end
93
+ end
94
+ end
95
+
96
+ state :regex_allowed do
97
+ mixin :whitespace
98
+ rule %r(/), Str::Regex, :regex
99
+
100
+ rule(//) { pop! }
101
+ end
102
+
103
+ state :regex do
104
+ rule %r(/), Str::Regex, :pop!
105
+ rule /\\./, Str::Escape
106
+ rule /[(){}]/, Str::Interpol
107
+ rule /\[/, Str::Interpol, :regex_class
108
+ rule /./, Str::Regex
109
+ end
110
+
111
+ state :regex_class do
112
+ rule /\]/, Str::Interpol, :pop!
113
+ rule /(?<!\[)-(?=\])/, Str::Regex
114
+ rule /-/, Str::Interpol
115
+ rule /\\./, Str::Escape
116
+ rule /[^\\\]-]+/, Str::Regex
117
+ end
118
+
119
+ state :dquotes do
120
+ rule /"/, Str::Double, :pop!
121
+ rule /[^$\\"]+/m, Str::Double
122
+ rule /\\./m, Str::Escape
123
+ rule /[$]#{qualname}/, Name::Variable
124
+ rule /[$][{]#{qualname}[}]/, Name::Variable
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,228 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Python < RegexLexer
6
+ title "Python"
7
+ desc "The Python programming language (python.org)"
8
+ tag 'python'
9
+ aliases 'py'
10
+ filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac'
11
+ mimetypes 'text/x-python', 'application/x-python'
12
+
13
+ def self.analyze_text(text)
14
+ return 1 if text.shebang?(/pythonw?(3|2(\.\d)?)?/)
15
+ end
16
+
17
+ def self.keywords
18
+ @keywords ||= %w(
19
+ assert break continue del elif else except exec
20
+ finally for global if lambda pass print raise
21
+ return try while yield as with
22
+ )
23
+ end
24
+
25
+ def self.builtins
26
+ @builtins ||= %w(
27
+ __import__ abs all any apply basestring bin bool buffer
28
+ bytearray bytes callable chr classmethod cmp coerce compile
29
+ complex delattr dict dir divmod enumerate eval execfile exit
30
+ file filter float frozenset getattr globals hasattr hash hex id
31
+ input int intern isinstance issubclass iter len list locals
32
+ long map max min next object oct open ord pow property range
33
+ raw_input reduce reload repr reversed round set setattr slice
34
+ sorted staticmethod str sum super tuple type unichr unicode
35
+ vars xrange zip
36
+ )
37
+ end
38
+
39
+ def self.builtins_pseudo
40
+ @builtins_pseudo ||= %w(self None Ellipsis NotImplemented False True)
41
+ end
42
+
43
+ def self.exceptions
44
+ @exceptions ||= %w(
45
+ ArithmeticError AssertionError AttributeError
46
+ BaseException DeprecationWarning EOFError EnvironmentError
47
+ Exception FloatingPointError FutureWarning GeneratorExit IOError
48
+ ImportError ImportWarning IndentationError IndexError KeyError
49
+ KeyboardInterrupt LookupError MemoryError NameError
50
+ NotImplemented NotImplementedError OSError OverflowError
51
+ OverflowWarning PendingDeprecationWarning ReferenceError
52
+ RuntimeError RuntimeWarning StandardError StopIteration
53
+ SyntaxError SyntaxWarning SystemError SystemExit TabError
54
+ TypeError UnboundLocalError UnicodeDecodeError
55
+ UnicodeEncodeError UnicodeError UnicodeTranslateError
56
+ UnicodeWarning UserWarning ValueError VMSError Warning
57
+ WindowsError ZeroDivisionError
58
+ )
59
+ end
60
+
61
+ identifier = /[a-z_][a-z0-9_]*/i
62
+ dotted_identifier = /[a-z_.][a-z0-9_.]*/i
63
+ state :root do
64
+ rule /\n+/m, Text
65
+ rule /^(:)(\s*)([ru]{,2}""".*?""")/mi do
66
+ groups Punctuation, Text, Str::Doc
67
+ end
68
+
69
+ rule /[^\S\n]+/, Text
70
+ rule /#.*$/, Comment
71
+ rule /[\[\]{}:(),;]/, Punctuation
72
+ rule /\\\n/, Text
73
+ rule /\\/, Text
74
+
75
+ rule /(in|is|and|or|not)\b/, Operator::Word
76
+ rule /!=|==|<<|>>|[-~+\/*%=<>&^|.]/, Operator
77
+
78
+ rule /(def)((?:\s|\\\s)+)/ do
79
+ groups Keyword, Text
80
+ push :funcname
81
+ end
82
+
83
+ rule /(class)((?:\s|\\\s)+)/ do
84
+ groups Keyword, Text
85
+ push :classname
86
+ end
87
+
88
+ rule /(from)((?:\s|\\\s)+)/ do
89
+ groups Keyword::Namespace, Text
90
+ push :fromimport
91
+ end
92
+
93
+ rule /(import)((?:\s|\\\s)+)/ do
94
+ groups Keyword::Namespace, Text
95
+ push :import
96
+ end
97
+
98
+ # TODO: not in python 3
99
+ rule /`.*?`/, Str::Backtick
100
+ rule /(?:r|ur|ru)"""/i, Str, :tdqs
101
+ rule /(?:r|ur|ru)'''/i, Str, :tsqs
102
+ rule /(?:r|ur|ru)"/i, Str, :dqs
103
+ rule /(?:r|ur|ru)'/i, Str, :sqs
104
+ rule /u?"""/i, Str, :escape_tdqs
105
+ rule /u?'''/i, Str, :escape_tsqs
106
+ rule /u?"/i, Str, :escape_dqs
107
+ rule /u?'/i, Str, :escape_sqs
108
+
109
+ rule /@#{dotted_identifier}/i, Name::Decorator
110
+
111
+ # using negative lookbehind so we don't match property names
112
+ rule /(?<!\.)#{identifier}/ do |m|
113
+ if self.class.keywords.include? m[0]
114
+ token Keyword
115
+ elsif self.class.exceptions.include? m[0]
116
+ token Name::Builtin
117
+ elsif self.class.builtins.include? m[0]
118
+ token Name::Builtin
119
+ elsif self.class.builtins_pseudo.include? m[0]
120
+ token Name::Builtin::Pseudo
121
+ else
122
+ token Name
123
+ end
124
+ end
125
+
126
+ rule identifier, Name
127
+
128
+ rule /(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
129
+ rule /\d+e[+-]?[0-9]+/i, Num::Float
130
+ rule /0[0-7]+/, Num::Oct
131
+ rule /0x[a-f0-9]+/i, Num::Hex
132
+ rule /\d+L/, Num::Integer::Long
133
+ rule /\d+/, Num::Integer
134
+ end
135
+
136
+ state :funcname do
137
+ rule identifier, Name::Function, :pop!
138
+ end
139
+
140
+ state :classname do
141
+ rule identifier, Name::Class, :pop!
142
+ end
143
+
144
+ state :import do
145
+ # non-line-terminating whitespace
146
+ rule /(?:[ \t]|\\\n)+/, Text
147
+
148
+ rule /as\b/, Keyword::Namespace
149
+ rule /,/, Operator
150
+ rule dotted_identifier, Name::Namespace
151
+ rule(//) { pop! } # anything else -> go back
152
+ end
153
+
154
+ state :fromimport do
155
+ # non-line-terminating whitespace
156
+ rule /(?:[ \t]|\\\n)+/, Text
157
+
158
+ rule /import\b/, Keyword::Namespace, :pop!
159
+ rule dotted_identifier, Name::Namespace
160
+ end
161
+
162
+ state :strings do
163
+ rule /%(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str::Interpol
164
+ end
165
+
166
+ state :strings_double do
167
+ rule /[^\\"%\n]+/, Str
168
+ mixin :strings
169
+ end
170
+
171
+ state :strings_single do
172
+ rule /[^\\'%\n]+/, Str
173
+ mixin :strings
174
+ end
175
+
176
+ state :nl do
177
+ rule /\n/, Str
178
+ end
179
+
180
+ state :escape do
181
+ rule %r(\\
182
+ ( [\\abfnrtv"']
183
+ | \n
184
+ | N{.*?}
185
+ | u[a-fA-F0-9]{4}
186
+ | U[a-fA-F0-9]{8}
187
+ | x[a-fA-F0-9]{2}
188
+ | [0-7]{1,3}
189
+ )
190
+ )x, Str::Escape
191
+ end
192
+
193
+ state :dqs do
194
+ rule /"/, Str, :pop!
195
+ rule /\\\\|\\"|\\\n/, Str::Escape
196
+ mixin :strings_double
197
+ end
198
+
199
+ state :sqs do
200
+ rule /'/, Str, :pop!
201
+ rule /\\\\|\\'|\\\n/, Str::Escape
202
+ mixin :strings_single
203
+ end
204
+
205
+ state :tdqs do
206
+ rule /"""/, Str, :pop!
207
+ rule /"/, Str
208
+ mixin :strings_double
209
+ mixin :nl
210
+ end
211
+
212
+ state :tsqs do
213
+ rule /'''/, Str, :pop!
214
+ rule /'/, Str
215
+ mixin :strings_single
216
+ mixin :nl
217
+ end
218
+
219
+ %w(tdqs tsqs dqs sqs).each do |qtype|
220
+ state :"escape_#{qtype}" do
221
+ mixin :escape
222
+ mixin :"#{qtype}"
223
+ end
224
+ end
225
+
226
+ end
227
+ end
228
+ end