gitlab-rouge 1.9.2

Sign up to get free protection for your applications and to get access to all the features.
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,140 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class SQL < RegexLexer
6
+ title "SQL"
7
+ desc "Structured Query Language, for relational databases"
8
+ tag 'sql'
9
+ filenames '*.sql'
10
+ mimetypes 'text/x-sql'
11
+
12
+ def self.keywords
13
+ @keywords ||= Set.new %w(
14
+ ABORT ABS ABSOLUTE ACCESS ADA ADD ADMIN AFTER AGGREGATE ALIAS
15
+ ALL ALLOCATE ALTER ANALYSE ANALYZE AND ANY ARE AS ASC ASENSITIVE
16
+ ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC AUTHORIZATION
17
+ AVG BACKWARD BEFORE BEGIN BETWEEN BITVAR BIT_LENGTH BOTH
18
+ BREADTH BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED
19
+ CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS
20
+ CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME
21
+ CHARACTER_SET_SCHEMA CHAR_LENGTH CHECK CHECKED CHECKPOINT
22
+ CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER COALSECE COBOL COLLATE
23
+ COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA
24
+ COLUMN COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE
25
+ COMMENT COMMIT COMMITTED COMPLETION CONDITION_NUMBER
26
+ CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINTS
27
+ CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA
28
+ CONSTRUCTOR CONTAINS CONTINUE CONVERSION CONVERT COPY
29
+ CORRESPONTING COUNT CREATE CREATEDB CREATEUSER CROSS CUBE
30
+ CURRENT CURRENT_DATE CURRENT_PATH CURRENT_ROLE CURRENT_TIME
31
+ CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA
32
+ DATABASE DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION
33
+ DAY DEALLOCATE DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED
34
+ DEFINED DEFINER DELETE DELIMITER DELIMITERS DEREF DESC DESCRIBE
35
+ DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS
36
+ DICTIONARY DISCONNECT DISPATCH DISTINCT DO DOMAIN DROP
37
+ DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELSE
38
+ ENCODING ENCRYPTED END END-EXEC EQUALS ESCAPE EVERY EXCEPT
39
+ ESCEPTION EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS
40
+ EXPLAIN EXTERNAL EXTRACT FALSE FETCH FINAL FIRST FOR FORCE
41
+ FOREIGN FORTRAN FORWARD FOUND FREE FREEZE FROM FULL FUNCTION
42
+ G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GROUP
43
+ GROUPING HANDLER HAVING HIERARCHY HOLD HOST IDENTITY IGNORE
44
+ ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDING
45
+ INCREMENT INDEX INDITCATOR INFIX INHERITS INITIALIZE INITIALLY
46
+ INNER INOUT INPUT INSENSITIVE INSERT INSTANTIABLE INSTEAD
47
+ INTERSECT INTO INVOKER IS ISNULL ISOLATION ITERATE JOIN KEY
48
+ KEY_MEMBER KEY_TYPE LANCOMPILER LANGUAGE LARGE LAST LATERAL
49
+ LEADING LEFT LENGTH LESS LEVEL LIKE LIMIT LISTEN LOAD LOCAL
50
+ LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOWER MAP MATCH
51
+ MAX MAXVALUE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT
52
+ METHOD MIN MINUTE MINVALUE MOD MODE MODIFIES MODIFY MONTH
53
+ MORE MOVE MUMPS NAMES NATIONAL NATURAL NCHAR NCLOB NEW NEXT
54
+ NO NOCREATEDB NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL
55
+ NULL NULLABLE NULLIF OBJECT OCTET_LENGTH OF OFF OFFSET OIDS
56
+ OLD ON ONLY OPEN OPERATION OPERATOR OPTION OPTIONS OR ORDER
57
+ ORDINALITY OUT OUTER OUTPUT OVERLAPS OVERLAY OVERRIDING
58
+ OWNER PAD PARAMETER PARAMETERS PARAMETER_MODE PARAMATER_NAME
59
+ PARAMATER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG
60
+ PARAMETER_SPECIFIC_NAME PARAMATER_SPECIFIC_SCHEMA PARTIAL PASCAL
61
+ PENDANT PLACING PLI POSITION POSTFIX PRECISION PREFIX PREORDER
62
+ PREPARE PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
63
+ PUBLIC READ READS RECHECK RECURSIVE REF REFERENCES REFERENCING
64
+ REINDEX RELATIVE RENAME REPEATABLE REPLACE RESET RESTART
65
+ RESTRICT RESULT RETURN RETURNED_LENGTH RETURNED_OCTET_LENGTH
66
+ RETURNED_SQLSTATE RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
67
+ ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROWS
68
+ ROW_COUNT RULE SAVE_POINT SCALE SCHEMA SCHEMA_NAME SCOPE SCROLL
69
+ SEARCH SECOND SECURITY SELECT SELF SENSITIVE SERIALIZABLE
70
+ SERVER_NAME SESSION SESSION_USER SET SETOF SETS SHARE SHOW
71
+ SIMILAR SIMPLE SIZE SOME SOURCE SPACE SPECIFIC SPECIFICTYPE
72
+ SPECIFIC_NAME SQL SQLCODE SQLERROR SQLEXCEPTION SQLSTATE
73
+ SQLWARNINIG STABLE START STATE STATEMENT STATIC STATISTICS
74
+ STDIN STDOUT STORAGE STRICT STRUCTURE STYPE SUBCLASS_ORIGIN
75
+ SUBLIST SUBSTRING SUM SYMMETRIC SYSID SYSTEM SYSTEM_USER
76
+ TABLE TABLE_NAME TEMP TEMPLATE TEMPORARY TERMINATE THAN THEN
77
+ TIMESTAMP TIMEZONE_HOUR TIMEZONE_MINUTE TO TOAST TRAILING
78
+ TRANSATION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK
79
+ TRANSATION_ACTIVE TRANSFORM TRANSFORMS TRANSLATE TRANSLATION
80
+ TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM
81
+ TRUE TRUNCATE TRUSTED TYPE UNCOMMITTED UNDER UNENCRYPTED UNION
82
+ UNIQUE UNKNOWN UNLISTEN UNNAMED UNNEST UNTIL UPDATE UPPER
83
+ USAGE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_NAME
84
+ USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID VALIDATOR VALUES
85
+ VARIABLE VERBOSE VERSION VIEW VOLATILE WHEN WHENEVER WHERE
86
+ WITH WITHOUT WORK WRITE YEAR ZONE
87
+ )
88
+ end
89
+
90
+ state :root do
91
+ rule /\s+/m, Text
92
+ rule /--.*?\n/, Comment::Single
93
+ rule %r(/\*), Comment::Multiline, :multiline_comments
94
+ rule /\d+/, Num::Integer
95
+ rule /'/, Str::Single, :single_string
96
+ rule /"/, Name::Variable, :double_string
97
+ rule /`/, Name::Variable, :backtick
98
+
99
+ rule /\w[\w\d]*/ do |m|
100
+ if self.class.keywords.include? m[0].upcase
101
+ token Keyword
102
+ else
103
+ token Name
104
+ end
105
+ end
106
+
107
+ rule %r([+*/<>=~!@#%^&|?^-]), Operator
108
+ rule /[;:()\[\],.]/, Punctuation
109
+ end
110
+
111
+ state :multiline_comments do
112
+ rule %r(/[*]), Comment::Multiline, :multiline_comments
113
+ rule %r([*]/), Comment::Multiline, :pop!
114
+ rule %r([^/*]+), Comment::Multiline
115
+ rule %r([/*]), Comment::Multiline
116
+ end
117
+
118
+ state :backtick do
119
+ rule /\\./, Str::Escape
120
+ rule /``/, Str::Escape
121
+ rule /`/, Name::Variable, :pop!
122
+ rule /[^\\`]+/, Name::Variable
123
+ end
124
+
125
+ state :single_string do
126
+ rule /\\./, Str::Escape
127
+ rule /''/, Str::Escape
128
+ rule /'/, Str::Single, :pop!
129
+ rule /[^\\']+/, Str::Single
130
+ end
131
+
132
+ state :double_string do
133
+ rule /\\./, Str::Escape
134
+ rule /""/, Str::Escape
135
+ rule /"/, Name::Variable, :pop!
136
+ rule /[^\\"]+/, Name::Variable
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,144 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Swift < RegexLexer
6
+ tag 'swift'
7
+ filenames '*.swift'
8
+
9
+ title "Swift"
10
+ desc 'Multi paradigm, compiled programming language developed by Apple for iOS and OS X development. (developer.apple.com/swift)'
11
+
12
+ id_head = /_|(?!\p{Mc})\p{Alpha}|[^\u0000-\uFFFF]/
13
+ id_rest = /[\p{Alnum}_]|[^\u0000-\uFFFF]/
14
+ id = /#{id_head}#{id_rest}*/
15
+
16
+ keywords = Set.new %w(
17
+ break case continue default do else fallthrough if in for return switch where while try catch throw guard defer repeat
18
+
19
+ as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__
20
+
21
+ associativity didSet get infix inout left mutating none nonmutating operator override postfix precedence prefix right set unowned weak willSet throws rethrows
22
+ )
23
+
24
+ declarations = Set.new %w(
25
+ class deinit enum extension final func import init internal lazy let optional private protocol public required static struct subscript typealias var dynamic
26
+ )
27
+
28
+ constants = Set.new %w(
29
+ true false nil
30
+ )
31
+
32
+ start { push :bol }
33
+
34
+ # beginning of line
35
+ state :bol do
36
+ rule /#.*/, Comment::Preproc
37
+
38
+ mixin :inline_whitespace
39
+
40
+ rule(//) { pop! }
41
+ end
42
+
43
+ state :inline_whitespace do
44
+ rule /\s+/m, Text
45
+ rule %r((?<re>\/\*(?:(?>[^\/\*\*\/]+)|\g<re>)*\*\/))m, Comment::Multiline
46
+ end
47
+
48
+ state :whitespace do
49
+ rule /\n+/m, Text, :bol
50
+ rule %r(\/\/.*?$), Comment::Single, :bol
51
+ mixin :inline_whitespace
52
+ end
53
+
54
+ state :root do
55
+ mixin :whitespace
56
+ rule /\$(([1-9]\d*)?\d)/, Name::Variable
57
+
58
+ rule %r{[()\[\]{}:;,?]}, Punctuation
59
+ rule %r([-/=+*%<>!&|^.~]+), Operator
60
+ rule /@?"/, Str, :dq
61
+ rule /'(\\.|.)'/, Str::Char
62
+ rule /(\d+\*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
63
+ rule /\d+e[+-]?[0-9]+/i, Num::Float
64
+ rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
65
+ rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
66
+ rule /0b[01]+(?:_[01]+)*/, Num::Bin
67
+ rule %r{[\d]+(?:_\d+)*}, Num::Integer
68
+
69
+ rule /@#{id}(\([^)]+\))?/, Keyword::Declaration
70
+
71
+ rule /(private|internal)(\([ ]*)(\w+)([ ]*\))/ do |m|
72
+ if m[3] == 'set'
73
+ token Keyword::Declaration
74
+ else
75
+ groups Keyword::Declaration, Keyword::Declaration, Error, Keyword::Declaration
76
+ end
77
+ end
78
+
79
+ rule /(unowned\([ ]*)(\w+)([ ]*\))/ do |m|
80
+ if m[2] == 'safe' || m[2] == 'unsafe'
81
+ token Keyword::Declaration
82
+ else
83
+ groups Keyword::Declaration, Error, Keyword::Declaration
84
+ end
85
+ end
86
+
87
+ rule /#available\([^)]+\)/, Keyword::Declaration
88
+
89
+ rule /(let|var)\b(\s*)(#{id})/ do
90
+ groups Keyword, Text, Name::Variable
91
+ end
92
+
93
+ rule /(?!\b(if|while|for|private|internal|unowned|switch|case)\b)\b#{id}(?=(\?|!)?\s*[(])/ do |m|
94
+ if m[0] =~ /^[[:upper:]]/
95
+ token Keyword::Type
96
+ else
97
+ token Name::Function
98
+ end
99
+ end
100
+
101
+ rule /as[?!]?/, Keyword
102
+ rule /try[!]?/, Keyword
103
+
104
+ rule /(#?(?!default)(?![[:upper:]])#{id})(\s*)(:)/ do
105
+ groups Name::Variable, Text, Punctuation
106
+ end
107
+
108
+ rule id do |m|
109
+ if keywords.include? m[0]
110
+ token Keyword
111
+ elsif declarations.include? m[0]
112
+ token Keyword::Declaration
113
+ elsif constants.include? m[0]
114
+ token Keyword::Constant
115
+ elsif m[0] =~ /^[[:upper:]]/
116
+ token Keyword::Type
117
+ else
118
+ token Name
119
+ end
120
+ end
121
+ end
122
+
123
+ state :dq do
124
+ rule /\\[\\0tnr'"]/, Str::Escape
125
+ rule /\\[(]/, Str::Escape, :interp
126
+ rule /\\u\{\h{1,8}\}/, Str::Escape
127
+ rule /[^\\"]+/, Str
128
+ rule /"/, Str, :pop!
129
+ end
130
+
131
+ state :interp do
132
+ rule /[(]/, Punctuation, :interp_inner
133
+ rule /[)]/, Str::Escape, :pop!
134
+ mixin :root
135
+ end
136
+
137
+ state :interp_inner do
138
+ rule /[(]/, Punctuation, :push
139
+ rule /[)]/, Punctuation, :pop!
140
+ mixin :root
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,192 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class TCL < RegexLexer
6
+ title "Tcl"
7
+ desc "The Tool Command Language (tcl.tk)"
8
+ tag 'tcl'
9
+ filenames '*.tcl'
10
+ mimetypes 'text/x-tcl', 'text/x-script.tcl', 'application/x-tcl'
11
+
12
+ def self.analyze_text(text)
13
+ return 1 if text.shebang? 'tclsh'
14
+ return 1 if text.shebang? 'wish'
15
+ return 1 if text.shebang? 'jimsh'
16
+ end
17
+
18
+ KEYWORDS = %w(
19
+ after apply array break catch continue elseif else error
20
+ eval expr for foreach global if namespace proc rename return
21
+ set switch then trace unset update uplevel upvar variable
22
+ vwait while
23
+ )
24
+
25
+ BUILTINS = %w(
26
+ append bgerror binary cd chan clock close concat dde dict
27
+ encoding eof exec exit fblocked fconfigure fcopy file
28
+ fileevent flush format gets glob history http incr info interp
29
+ join lappend lassign lindex linsert list llength load loadTk
30
+ lrange lrepeat lreplace lreverse lsearch lset lsort mathfunc
31
+ mathop memory msgcat open package pid pkg::create pkg_mkIndex
32
+ platform platform::shell puts pwd re_syntax read refchan
33
+ regexp registry regsub scan seek socket source split string
34
+ subst tell time tm unknown unload
35
+ )
36
+
37
+ OPEN = %w| \( \[ \{ " |
38
+ CLOSE = %w| \) \] \} |
39
+ ALL = OPEN + CLOSE
40
+ END_LINE = CLOSE + %w(; \n)
41
+ END_WORD = END_LINE + %w(\s)
42
+
43
+ CHARS = lambda { |list| Regexp.new %/[#{list.join}]/ }
44
+ NOT_CHARS = lambda { |list| Regexp.new %/[^#{list.join}]/ }
45
+
46
+ state :word do
47
+ rule /\{\*\}/, Keyword
48
+
49
+ mixin :brace_abort
50
+ mixin :interp
51
+ rule /\{/, Punctuation, :brace
52
+ rule /\(/, Punctuation, :paren
53
+ rule /"/, Str::Double, :string
54
+ rule /#{NOT_CHARS[END_WORD]}+?(?=#{CHARS[OPEN+['\\\\']]})/, Text
55
+ end
56
+
57
+ def self.gen_command_state(name='')
58
+ state(:"command#{name}") do
59
+ mixin :word
60
+
61
+ rule /##{NOT_CHARS[END_LINE]}+/, Comment::Single
62
+
63
+ rule /(?=#{CHARS[END_WORD]})/ do
64
+ push :"params#{name}"
65
+ end
66
+
67
+ rule /#{NOT_CHARS[END_WORD]}+/ do |m|
68
+ if KEYWORDS.include? m[0]
69
+ token Keyword
70
+ elsif BUILTINS.include? m[0]
71
+ token Name::Builtin
72
+ else
73
+ token Text
74
+ end
75
+ end
76
+
77
+ mixin :whitespace
78
+ end
79
+ end
80
+
81
+ def self.gen_delimiter_states(name, close, opts={})
82
+ gen_command_state("_in_#{name}")
83
+
84
+ state :"params_in_#{name}" do
85
+ rule close do
86
+ token Punctuation
87
+ pop! 2
88
+ end
89
+
90
+ # mismatched delimiters. Braced strings with mismatched
91
+ # closing delimiters should be okay, since this is standard
92
+ # practice, like {]]]]}
93
+ if opts[:strict]
94
+ rule CHARS[CLOSE - [close]], Error
95
+ else
96
+ rule CHARS[CLOSE - [close]], Text
97
+ end
98
+
99
+ mixin :params
100
+ end
101
+
102
+ state name do
103
+ rule close, Punctuation, :pop!
104
+ mixin :"command_in_#{name}"
105
+ end
106
+ end
107
+
108
+
109
+ # tcl is freaking impossible. If we're in braces and we encounter
110
+ # a close brace, we have to drop everything and close the brace.
111
+ # This is so silly things like {abc"def} and {abc]def} don't b0rk
112
+ # everything after them.
113
+
114
+ # TODO: TCL seems to have this aborting behavior quite a lot.
115
+ # such things as [ abc" ] are a runtime error, but will still
116
+ # parse. Currently something like this will muck up the lex.
117
+ state :brace_abort do
118
+ rule /}/ do
119
+ if in_state? :brace
120
+ pop! until state? :brace
121
+ pop!
122
+ token Punctuation
123
+ else
124
+ token Error
125
+ end
126
+ end
127
+ end
128
+
129
+ state :params do
130
+ rule /;/, Punctuation, :pop!
131
+ rule /\n/, Text, :pop!
132
+ rule /else|elseif|then/, Keyword
133
+ mixin :word
134
+ mixin :whitespace
135
+ rule /#{NOT_CHARS[END_WORD]}+/, Text
136
+ end
137
+
138
+ gen_delimiter_states :brace, /\}/, :strict => false
139
+ gen_delimiter_states :paren, /\)/, :strict => true
140
+ gen_delimiter_states :bracket, /\]/, :strict => true
141
+ gen_command_state
142
+
143
+ state :root do
144
+ mixin :command
145
+ end
146
+
147
+ state :whitespace do
148
+ # not a multiline regex because we want to capture \n sometimes
149
+ rule /\s+/, Text
150
+ end
151
+
152
+ state :interp do
153
+ rule /\[/, Punctuation, :bracket
154
+ rule /\$[a-z0-9.:-]+/, Name::Variable
155
+ rule /\$\{.*?\}/m, Name::Variable
156
+ rule /\$/, Text
157
+
158
+ # escape sequences
159
+ rule /\\[0-7]{3}/, Str::Escape
160
+ rule /\\x[0-9a-f]{2}/i, Str::Escape
161
+ rule /\\u[0-9a-f]{4}/i, Str::Escape
162
+ rule /\\./m, Str::Escape
163
+ end
164
+
165
+ state :string do
166
+ rule /"/, Str::Double, :pop!
167
+ mixin :interp
168
+ rule /[^\\\[\$"{}]+/m, Str::Double
169
+
170
+ # strings have to keep count of their internal braces, to support
171
+ # for example { "{ }" }.
172
+ rule /{/ do
173
+ @brace_count ||= 0
174
+ @brace_count += 1
175
+
176
+ token Str::Double
177
+ end
178
+
179
+ rule /}/ do
180
+ if in_state? :brace and @brace_count.to_i == 0
181
+ pop! until state? :brace
182
+ pop!
183
+ token Punctuation
184
+ else
185
+ @brace_count -= 1
186
+ token Str::Double
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end