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,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