rouge 3.8.0 → 3.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rouge/demos/apex +9 -0
  3. data/lib/rouge/demos/clean +6 -0
  4. data/lib/rouge/demos/csvs +8 -0
  5. data/lib/rouge/demos/eex +1 -0
  6. data/lib/rouge/demos/haxe +5 -0
  7. data/lib/rouge/demos/hql +5 -0
  8. data/lib/rouge/demos/jsl +3 -0
  9. data/lib/rouge/demos/liquid +0 -1
  10. data/lib/rouge/demos/lustre +6 -0
  11. data/lib/rouge/demos/lutin +18 -0
  12. data/lib/rouge/demos/minizinc +23 -0
  13. data/lib/rouge/demos/robot_framework +27 -0
  14. data/lib/rouge/demos/sparql +6 -0
  15. data/lib/rouge/demos/terraform +0 -15
  16. data/lib/rouge/guessers/disambiguation.rb +5 -0
  17. data/lib/rouge/lexer.rb +3 -0
  18. data/lib/rouge/lexers/apex.rb +126 -0
  19. data/lib/rouge/lexers/clean.rb +156 -0
  20. data/lib/rouge/lexers/common_lisp.rb +1 -1
  21. data/lib/rouge/lexers/coq.rb +12 -9
  22. data/lib/rouge/lexers/csvs.rb +44 -0
  23. data/lib/rouge/lexers/eex.rb +52 -0
  24. data/lib/rouge/lexers/elixir.rb +20 -9
  25. data/lib/rouge/lexers/haxe.rb +246 -0
  26. data/lib/rouge/lexers/hql.rb +139 -0
  27. data/lib/rouge/lexers/http.rb +5 -5
  28. data/lib/rouge/lexers/javascript.rb +1 -1
  29. data/lib/rouge/lexers/jsl.rb +55 -0
  30. data/lib/rouge/lexers/json.rb +1 -1
  31. data/lib/rouge/lexers/kotlin.rb +21 -28
  32. data/lib/rouge/lexers/liquid.rb +82 -108
  33. data/lib/rouge/lexers/lustre.rb +79 -0
  34. data/lib/rouge/lexers/lutin.rb +33 -0
  35. data/lib/rouge/lexers/markdown.rb +7 -1
  36. data/lib/rouge/lexers/mason.rb +0 -5
  37. data/lib/rouge/lexers/matlab.rb +4 -2
  38. data/lib/rouge/lexers/matlab/builtins.yml +3515 -0
  39. data/lib/rouge/lexers/minizinc.rb +87 -0
  40. data/lib/rouge/lexers/perl.rb +1 -1
  41. data/lib/rouge/lexers/q.rb +1 -1
  42. data/lib/rouge/lexers/robot_framework.rb +249 -0
  43. data/lib/rouge/lexers/shell.rb +5 -3
  44. data/lib/rouge/lexers/sparql.rb +129 -0
  45. data/lib/rouge/lexers/sql.rb +26 -6
  46. data/lib/rouge/lexers/swift.rb +1 -1
  47. data/lib/rouge/lexers/terraform.rb +8 -0
  48. data/lib/rouge/plugins/redcarpet.rb +7 -1
  49. data/lib/rouge/version.rb +1 -1
  50. metadata +27 -3
  51. data/lib/rouge/lexers/matlab/builtins.rb +0 -13
@@ -0,0 +1,139 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ load_lexer 'sql.rb'
6
+
7
+ class HQL < SQL
8
+ title "HQL"
9
+ desc "Hive Query Language SQL dialect"
10
+ tag 'hql'
11
+ filenames '*.hql'
12
+
13
+ def self.keywords
14
+ # sources:
15
+ # https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
16
+ # https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
17
+ @keywords ||= Set.new(%w(
18
+ ADD ADMIN AFTER ANALYZE ARCHIVE ASC BEFORE BUCKET BUCKETS CASCADE
19
+ CHANGE CLUSTER CLUSTERED CLUSTERSTATUS COLLECTION COLUMNS COMMENT
20
+ COMPACT COMPACTIONS COMPUTE CONCATENATE CONTINUE DATA DATABASES
21
+ DATETIME DAY DBPROPERTIES DEFERRED DEFINED DELIMITED DEPENDENCY DESC
22
+ DIRECTORIES DIRECTORY DISABLE DISTRIBUTE ELEM_TYPE ENABLE ESCAPED
23
+ EXCLUSIVE EXPLAIN EXPORT FIELDS FILE FILEFORMAT FIRST FORMAT FORMATTED
24
+ FUNCTIONS HOLD_DDLTIME HOUR IDXPROPERTIES IGNORE INDEX INDEXES INPATH
25
+ INPUTDRIVER INPUTFORMAT ITEMS JAR KEYS KEY_TYPE LIMIT LINES LOAD
26
+ LOCATION LOCK LOCKS LOGICAL LONG MAPJOIN MATERIALIZED METADATA MINUS
27
+ MINUTE MONTH MSCK NOSCAN NO_DROP OFFLINE OPTION OUTPUTDRIVER
28
+ OUTPUTFORMAT OVERWRITE OWNER PARTITIONED PARTITIONS PLUS PRETTY
29
+ PRINCIPALS PROTECTION PURGE READ READONLY REBUILD RECORDREADER
30
+ RECORDWRITER REGEXP RELOAD RENAME REPAIR REPLACE REPLICATION RESTRICT
31
+ REWRITE RLIKE ROLE ROLES SCHEMA SCHEMAS SECOND SEMI SERDE
32
+ SERDEPROPERTIES SERVER SETS SHARED SHOW SHOW_DATABASE SKEWED SORT
33
+ SORTED SSL STATISTICS STORED STREAMTABLE STRING STRUCT TABLES
34
+ TBLPROPERTIES TEMPORARY TERMINATED TINYINT TOUCH TRANSACTIONS UNARCHIVE
35
+ UNDO UNIONTYPE UNLOCK UNSET UNSIGNED URI USE UTC UTCTIMESTAMP
36
+ VALUE_TYPE VIEW WHILE YEAR IF
37
+
38
+ ALL ALTER AND ARRAY AS AUTHORIZATION BETWEEN BIGINT BINARY BOOLEAN
39
+ BOTH BY CASE CAST CHAR COLUMN CONF CREATE CROSS CUBE CURRENT
40
+ CURRENT_DATE CURRENT_TIMESTAMP CURSOR DATABASE DATE DECIMAL DELETE
41
+ DESCRIBE DISTINCT DOUBLE DROP ELSE END EXCHANGE EXISTS EXTENDED
42
+ EXTERNAL FALSE FETCH FLOAT FOLLOWING FOR FROM FULL FUNCTION GRANT
43
+ GROUP GROUPING HAVING IF IMPORT IN INNER INSERT INT INTERSECT
44
+ INTERVAL INTO IS JOIN LATERAL LEFT LESS LIKE LOCAL MACRO MAP MORE
45
+ NONE NOT NULL OF ON OR ORDER OUT OUTER OVER PARTIALSCAN PARTITION
46
+ PERCENT PRECEDING PRESERVE PROCEDURE RANGE READS REDUCE REVOKE RIGHT
47
+ ROLLUP ROW ROWS SELECT SET SMALLINT TABLE TABLESAMPLE THEN TIMESTAMP
48
+ TO TRANSFORM TRIGGER TRUE TRUNCATE UNBOUNDED UNION UNIQUEJOIN UPDATE
49
+ USER USING UTC_TMESTAMP VALUES VARCHAR WHEN WHERE WINDOW WITH
50
+
51
+ AUTOCOMMIT ISOLATION LEVEL OFFSET SNAPSHOT TRANSACTION WORK WRITE
52
+
53
+ COMMIT ONLY REGEXP RLIKE ROLLBACK START
54
+
55
+ ABORT KEY LAST NORELY NOVALIDATE NULLS RELY VALIDATE
56
+
57
+ CACHE CONSTRAINT FOREIGN PRIMARY REFERENCES
58
+
59
+ DETAIL DOW EXPRESSION OPERATOR QUARTER SUMMARY VECTORIZATION WEEK YEARS MONTHS WEEKS DAYS HOURS MINUTES SECONDS
60
+
61
+ DAYOFWEEK EXTRACT FLOOR INTEGER PRECISION VIEWS
62
+
63
+ TIMESTAMPTZ ZONE
64
+
65
+ TIME NUMERIC
66
+
67
+ NAMED_STRUCT CREATE_UNION
68
+
69
+ ROUND BROUND FLOOR CEIL CEILING RAND EXP LN LOG10 LOG2 LOG POW POWER SQRT BIN
70
+ HEX UNHEX CONV ABS PMOD SIN ASIN COS ACOS TAN ATAN DEGREES RADIANS POSITIVE
71
+ NEGATIVE SIGN E PI FACTORIAL CBRT SHIFTLEFT SHIFTRIGHT SHIFTRIGHTUNSIGNED
72
+ GREATEST LEAST WIDTH_BUCKET SIZE SIZE MAP_KEYS MAP_VALUES ARRAY_CONTAINS
73
+ SORT_ARRAY BINARY CAST FROM_UNIXTIME UNIX_TIMESTAMP UNIX_TIMESTAMP
74
+ UNIX_TIMESTAMP TO_DATE YEAR QUARTER MONTH DAY DAYOFMONTH HOUR MINUTE SECOND
75
+ WEEKOFYEAR EXTRACT DATEDIFF DATE_ADD DATE_SUB FROM_UTC_TIMESTAMP
76
+ TO_UTC_TIMESTAMP CURRENT_DATE CURRENT_TIMESTAMP ADD_MONTHS LAST_DAY NEXT_DAY
77
+ TRUNC MONTHS_BETWEEN DATE_FORMAT IF ISNULL ISNOTNULL NVL COALESCE CASE WHEN
78
+ then else end NULLIF ASSERT_TRUE ASCII BASE64 CHARACTER_LENGTH CHR CONCAT
79
+ CONTEXT_NGRAMS CONCAT_WS CONCAT_WS DECODE ELT ENCODE FIELD FIND_IN_SET
80
+ FORMAT_NUMBER GET_JSON_OBJECT IN_FILE INSTR LENGTH LOCATE LOWER LCASE LPAD LTRIM
81
+ NGRAMS OCTET_LENGTH PARSE_URL PRINTF REGEXP_EXTRACT REGEXP_REPLACE REPEAT
82
+ REPLACE REVERSE RPAD RTRIM SENTENCES SPACE SPLIT STR_TO_MAP SUBSTR SUBSTRING
83
+ SUBSTRING_INDEX TRANSLATE TRIM UNBASE64 UPPER UCASE INITCAP LEVENSHTEIN SOUNDEX
84
+ MASK MASK_FIRST_N MASK_LAST_N MASK_SHOW_FIRST_N MASK_SHOW_LAST_N MASK_HASH
85
+ JAVA_METHOD REFLECT HASH CURRENT_USER LOGGED_IN_USER CURRENT_DATABASE MD5 SHA1
86
+ SHA CRC32 SHA2 AES_ENCRYPT AES_DECRYPT VERSION COUNT SUM AVG MIN MAX VARIANCE
87
+ VAR_POP VAR_SAMP STDDEV_POP STDDEV_SAMP COVAR_POP COVAR_SAMP CORR PERCENTILE
88
+ PERCENTILE_APPROX PERCENTILE_APPROX REGR_AVGX REGR_AVGY REGR_COUNT
89
+ REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY HISTOGRAM_NUMERIC
90
+ COLLECT_SET COLLECT_LIST NTILE EXPLODE EXPLODE POSEXPLODE INLINE STACK
91
+
92
+ JSON_TUPLE PARSE_URL_TUPLE
93
+
94
+ XPATH XPATH_SHORT XPATH_INT XPATH_LONG XPATH_FLOAT XPATH_DOUBLE
95
+ XPATH_NUMBER XPATH_STRING GET_JSON_OBJECT JSON_TUPLE
96
+
97
+ PARSE_URL_TUPLE
98
+ ))
99
+ end
100
+
101
+ def self.keywords_type
102
+ # source: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
103
+ @keywords_type ||= Set.new(%w(
104
+ TINYINT SMALLINT INT INTEGER BIGINT FLOAT DOUBLE PRECISION DECIMAL NUMERIC
105
+ TIMESTAMP DATE INTERVAL
106
+ STRING VARCHAR CHAR
107
+ BOOLEAN BINARY
108
+ ARRAY MAP STRUCT UNIONTYPE
109
+ ))
110
+ end
111
+
112
+ prepend :root do
113
+ # a double-quoted string is a string literal in Hive QL.
114
+ rule %r/"/, Str::Double, :double_string
115
+
116
+ # interpolation of variables through ${...}
117
+ rule %r/\$\{/, Name::Variable, :hive_variable
118
+ end
119
+
120
+ prepend :single_string do
121
+ rule %r/\$\{/, Name::Variable, :hive_variable
122
+ rule %r/[^\\'\$]+/, Str::Single
123
+ end
124
+
125
+ prepend :double_string do
126
+ rule %r/\$\{/, Name::Variable, :hive_variable
127
+ # double-quoted strings are string literals so need to change token
128
+ rule %r/"/, Str::Double, :pop!
129
+ rule %r/[^\\"\$]+/, Str::Double
130
+ end
131
+
132
+ state :hive_variable do
133
+ rule %r/\}/, Name::Variable, :pop!
134
+ rule %r/[^\}]+/, Name::Variable
135
+ end
136
+
137
+ end
138
+ end
139
+ end
@@ -26,8 +26,8 @@ module Rouge
26
26
  # request
27
27
  rule %r(
28
28
  (#{HTTP.http_methods.join('|')})([ ]+) # method
29
- ([^ ]+)([ ]+) # path
30
- (HTTPS?)(/)(1[.][01])(\r?\n|$) # http version
29
+ ([^ ]+)([ ]+) # path
30
+ (HTTPS?)(/)(\d(?:\.\d)?)(\r?\n|$) # http version
31
31
  )ox do
32
32
  groups(
33
33
  Name::Function, Text,
@@ -40,9 +40,9 @@ module Rouge
40
40
 
41
41
  # response
42
42
  rule %r(
43
- (HTTPS?)(/)(1[.][01])([ ]+) # http version
44
- (\d{3})([ ]+) # status
45
- ([^\r\n]+)(\r?\n|$) # status message
43
+ (HTTPS?)(/)(\d(?:\.\d))([ ]+) # http version
44
+ (\d{3})([ ]+)? # status
45
+ ([^\r\n]*)?(\r?\n|$) # status message
46
46
  )x do
47
47
  groups(
48
48
  Keyword, Operator, Num, Text,
@@ -73,7 +73,7 @@ module Rouge
73
73
  end
74
74
 
75
75
  state :regex_end do
76
- rule %r/[gim]+/, Str::Regex, :pop!
76
+ rule %r/[gimuy]+/, Str::Regex, :pop!
77
77
  rule(//) { pop! }
78
78
  end
79
79
 
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class JSL < RegexLexer
7
+ title "JSL"
8
+ desc "The JMP Scripting Language (JSL) (jmp.com)"
9
+
10
+ tag 'jsl'
11
+ filenames '*.jsl'
12
+
13
+ state :root do
14
+ rule %r/\s+/m, Text::Whitespace
15
+
16
+ rule %r(//.*?$), Comment::Single
17
+ rule %r(/\*.*?\*/)m, Comment::Multiline
18
+
19
+ # messages
20
+ rule %r/(<<)(.*?)(\(|;)/ do |m|
21
+ groups Operator, Name::Function, Punctuation
22
+ end
23
+
24
+ # covers built-in and custom functions
25
+ rule %r/([a-z_][\w\s'%.\\]*)(\()/i do |m|
26
+ groups Keyword, Punctuation
27
+ end
28
+
29
+ rule %r/\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:e[+-]?[0-9]+)?i?\b/i, Num
30
+
31
+ rule %r/\d{2}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}(\d{2})?(:\d{2}:\d{2}(:\d{2}(\.\d*)?)?)?/i, Literal::Date
32
+
33
+ rule %r/::[a-z_][\w\s'%.\\]*/i, Name::Variable
34
+ rule %r/:\w+/, Name
35
+ rule %r/[a-z_][\w\s'%.\\]*/i, Name::Variable
36
+ rule %r/"(?:\\!"|[^"])*?"n/m, Name::Variable
37
+
38
+ rule %r/(")(\\\[)(.*?)(\]\\)(")/m do
39
+ groups Str::Double, Str::Escape, Str::Double, Str::Escape, Str::Double # escaped string
40
+ end
41
+ rule %r/"/, Str::Double, :dq
42
+
43
+ rule %r/[-+*\/!%&<>\|=:]/, Operator
44
+ rule %r/[\[\](){},;]/, Punctuation
45
+ end
46
+
47
+ state :dq do
48
+ rule %r/\\![btrnNf0\\"]/, Str::Escape
49
+ rule %r/\\/, Str::Double
50
+ rule %r/"/, Str::Double, :pop!
51
+ rule %r/[^\\"]*/m, Str::Double
52
+ end
53
+ end
54
+ end
55
+ end
@@ -34,7 +34,7 @@ module Rouge
34
34
  end
35
35
 
36
36
  state :name do
37
- rule %r/("(?:\\.|[^"\n])*?")(\s*)(:)/ do
37
+ rule %r/("(?:\\.|[^"\\\n])*?")(\s*)(:)/ do
38
38
  groups Name::Label, Text::Whitespace, Punctuation
39
39
  end
40
40
  end
@@ -24,19 +24,12 @@ module Rouge
24
24
  while yield
25
25
  )
26
26
 
27
- name = %r'@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
28
- name_backtick = %r'#{name}|`#{name}`'
27
+ name_chars = %r'[-_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
29
28
 
30
- id = %r'(#{name_backtick})'
29
+ class_name = %r'`?[\p{Lu}]#{name_chars}`?'
30
+ name = %r'`?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}]#{name_chars}`?'
31
31
 
32
32
  state :root do
33
- rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})(<)' do
34
- groups Punctuation, Text, Punctuation, Text, Name::Class, Punctuation
35
- push :generic_parameters
36
- end
37
- rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})' do
38
- groups Punctuation, Text, Punctuation, Text, Name::Class
39
- end
40
33
  rule %r'\b(companion)(\s+)(object)\b' do
41
34
  groups Keyword, Text, Keyword
42
35
  end
@@ -48,13 +41,6 @@ module Rouge
48
41
  groups Keyword, Text
49
42
  push :function
50
43
  end
51
- rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})(<)' do
52
- groups Name::Variable, Punctuation, Text, Name::Class, Punctuation
53
- push :generic_parameters
54
- end
55
- rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})' do
56
- groups Name::Variable, Punctuation, Text, Name::Class
57
- end
58
44
  rule %r'\b(package|import)(\s+)' do
59
45
  groups Keyword, Text
60
46
  push :package
@@ -67,8 +53,8 @@ module Rouge
67
53
  groups Keyword::Declaration, Text
68
54
  push :property
69
55
  end
70
- rule %r/\bfun\b/, Keyword
71
- rule %r/\b(?:#{keywords.join('|')})\b/, Keyword
56
+ rule %r'\bfun\b', Keyword
57
+ rule %r'\b(?:#{keywords.join('|')})\b', Keyword
72
58
  rule %r'^\s*\[.*?\]', Name::Attribute
73
59
  rule %r'[^\S\n]+', Text
74
60
  rule %r'\\\n', Text # line continuation
@@ -85,43 +71,50 @@ module Rouge
85
71
  rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str
86
72
  rule %r"'\\.'|'[^\\]'", Str::Char
87
73
  rule %r"[0-9](\.[0-9]+)?([eE][+-][0-9]+)?[flFL]?|0[xX][0-9a-fA-F]+[Ll]?", Num
88
- rule %r/@#{id}/, Name::Decorator
89
- rule id, Name
74
+ rule %r'(@#{class_name})', Name::Decorator
75
+ rule %r'(#{class_name})(<)' do
76
+ groups Name::Class, Punctuation
77
+ push :generic_parameters
78
+ end
79
+ rule class_name, Name::Class
80
+ rule %r'(#{name})(?=\s*[({])', Name::Function
81
+ rule name, Name
90
82
  end
91
83
 
92
84
  state :package do
93
- rule %r/\S+/, Name::Namespace, :pop!
85
+ rule %r'\S+', Name::Namespace, :pop!
94
86
  end
95
87
 
96
88
  state :class do
97
- rule id, Name::Class, :pop!
89
+ rule class_name, Name::Class, :pop!
98
90
  end
99
91
 
100
92
  state :function do
101
93
  rule %r'(<)', Punctuation, :generic_parameters
102
94
  rule %r'(\s+)', Text
103
- rule %r'(#{name_backtick})(\.)' do
95
+ rule %r'(#{class_name})(\.)' do
104
96
  groups Name::Class, Punctuation
105
97
  end
106
- rule id, Name::Function, :pop!
98
+ rule name, Name::Function, :pop!
107
99
  end
108
100
 
109
101
  state :generic_parameters do
110
- rule id, Name::Class
102
+ rule class_name, Name::Class
103
+ rule %r'(<)', Punctuation, :generic_parameters
111
104
  rule %r'(,)', Punctuation
112
105
  rule %r'(\s+)', Text
113
106
  rule %r'(>)', Punctuation, :pop!
114
107
  end
115
108
 
116
109
  state :property do
117
- rule id, Name::Property, :pop!
110
+ rule name, Name::Property, :pop!
118
111
  end
119
112
 
120
113
  state :destructure do
121
114
  rule %r'(,)', Punctuation
122
115
  rule %r'(\))', Punctuation, :pop!
123
116
  rule %r'(\s+)', Text
124
- rule id, Name::Property
117
+ rule name, Name::Property
125
118
  end
126
119
 
127
120
  state :comment do
@@ -12,12 +12,12 @@ module Rouge
12
12
  state :root do
13
13
  rule %r/[^\{]+/, Text
14
14
 
15
- rule %r/(\{%)(\s*)/ do
15
+ rule %r/(\{%-?)(\s*)/ do
16
16
  groups Punctuation, Text::Whitespace
17
17
  push :tag_or_block
18
18
  end
19
19
 
20
- rule %r/(\{\{)(\s*)/ do
20
+ rule %r/(\{\{-?)(\s*)/ do
21
21
  groups Punctuation, Text::Whitespace
22
22
  push :output
23
23
  end
@@ -27,78 +27,70 @@ module Rouge
27
27
 
28
28
  state :tag_or_block do
29
29
  # builtin logic blocks
30
- rule %r/(if|unless|elsif|case)(?=\s+)/, Keyword::Reserved, :condition
30
+ rule %r/(if|elsif|unless|case)\b/, Keyword::Reserved, :condition
31
+ rule %r/(when)\b/, Keyword::Reserved, :when
31
32
 
32
- rule %r/(when)(\s+)/ do
33
- groups Keyword::Reserved, Text::Whitespace
34
- push :when
35
- end
36
-
37
- rule %r/(else)(\s*)(%\})/ do
33
+ rule %r/(else)(\s*)(-?%\})/ do
38
34
  groups Keyword::Reserved, Text::Whitespace, Punctuation
39
35
  pop!
40
36
  end
41
37
 
42
38
  # other builtin blocks
43
- rule %r/(capture)(\s+)([^\s%]+)(\s*)(%\})/ do
44
- groups Name::Tag, Text::Whitespace, Name::Attribute, Text::Whitespace, Punctuation
39
+ rule %r/(capture|(?:in|de)crement)(\s+)([^\s%]+)(\s*)(-?%\})/ do
40
+ groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, Punctuation
45
41
  pop!
46
42
  end
47
43
 
48
- rule %r/(comment)(\s*)(%\})/ do
44
+ rule %r/(comment)(\s*)(-?%\})/ do
49
45
  groups Name::Tag, Text::Whitespace, Punctuation
50
46
  push :comment
51
47
  end
52
48
 
53
- rule %r/(raw)(\s*)(%\})/ do
49
+ rule %r/(raw)(\s*)(-?%\})/ do
54
50
  groups Name::Tag, Text::Whitespace, Punctuation
55
51
  push :raw
56
52
  end
57
53
 
58
- rule %r/assign/, Name::Tag, :assign
59
- rule %r/include/, Name::Tag, :include
60
-
61
54
  # end of block
62
- rule %r/(end(?:case|unless|if))(\s*)(%\})/ do
55
+ rule %r/(end(?:if|unless|case))(\s*)(-?%\})/ do
63
56
  groups Keyword::Reserved, Text::Whitespace, Punctuation
64
57
  pop!
65
58
  end
66
59
 
67
- rule %r/(end(?:[^\s%]+))(\s*)(%\})/ do
60
+ rule %r/(end(?:[^\s%]+))(\s*)(-?%\})/ do
68
61
  groups Name::Tag, Text::Whitespace, Punctuation
69
62
  pop!
70
63
  end
71
64
 
72
65
  # builtin tags
73
- rule %r/(cycle)(\s+)(([^\s:]*)(:))?(\s*)/ do |m|
74
- token Name::Tag, m[1]
75
- token Text::Whitespace, m[2]
66
+ rule %r/(assign|echo)\b/, Name::Tag, :assign
67
+ rule %r/(include|render)\b/, Name::Tag, :include
76
68
 
77
- if m[4] =~ /'[^']*'/
78
- token Str::Single, m[4]
79
- elsif m[4] =~ /"[^"]*"/
80
- token Str::Double, m[4]
81
- else
82
- token Name::Attribute, m[4]
83
- end
69
+ rule %r/(cycle)(\s+)(?:([^\s:]*)(\s*)(:))?(\s*)/ do |m|
70
+ token_class = case m[3]
71
+ when %r/'[^']*'/ then Str::Single
72
+ when %r/"[^"]*"/ then Str::Double
73
+ else
74
+ Name::Attribute
75
+ end
84
76
 
85
- token Punctuation, m[5]
86
- token Text::Whitespace, m[6]
77
+ groups Name::Tag, Text::Whitespace, token_class,
78
+ Text::Whitespace, Punctuation, Text::Whitespace
87
79
 
88
80
  push :variable_tag_markup
89
81
  end
90
82
 
91
83
  # iteration
92
84
  rule %r/
93
- (for)(\s+)
85
+ (for|tablerow)(\s+)
94
86
  ([\w-]+)(\s+)
95
87
  (in)(\s+)
96
88
  (
97
- (?: [^\s,\|'"] | (?:"[^"]*"|'[^']*') )+
89
+ (?: [^\s%,\|'"] | (?:"[^"]*"|'[^']*') )+
98
90
  )(\s*)
99
91
  /x do |m|
100
92
  groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace,
101
- Keyword::Reserved, Text::Whitespace
93
+ Name::Tag, Text::Whitespace
102
94
 
103
95
  token_class = case m[7]
104
96
  when %r/'[^']*'/ then Str::Single
@@ -119,105 +111,76 @@ module Rouge
119
111
  end
120
112
 
121
113
  state :output do
122
- mixin :whitespace
123
- mixin :generic
114
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do
115
+ groups Punctuation, Text::Whitespace, Name::Function
116
+ push :filters
117
+ end
124
118
 
125
- rule %r/\}\}/, Punctuation, :pop!
126
- rule %r/\|/, Punctuation, :filters
119
+ mixin :end_of_tag
120
+ mixin :generic
127
121
  end
128
122
 
129
123
  state :filters do
130
- mixin :whitespace
131
-
132
- rule(/\}\}/) { token Punctuation; reset_stack }
133
-
134
- rule %r/([^\s\|:]+)(:?)(\s*)/ do
135
- groups Name::Function, Punctuation, Text::Whitespace
136
- push :filter_markup
124
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s%}\|:]*)/ do
125
+ groups Punctuation, Text::Whitespace, Name::Function
137
126
  end
138
- end
139
-
140
- state :filter_markup do
141
- rule %r/\|/, Punctuation, :pop!
142
127
 
143
128
  mixin :end_of_tag
144
129
  mixin :end_of_block
145
- mixin :default_param_markup
130
+ mixin :variable_param_markup
146
131
  end
147
132
 
148
133
  state :condition do
149
- mixin :end_of_block
150
- mixin :whitespace
151
-
152
- rule %r/([=!><]=?)/, Operator
153
-
154
- rule %r/\b(?:(!)|(not\b))/ do
155
- groups Operator, Operator::Word
156
- end
157
-
158
- rule %r/(contains)/, Operator::Word
134
+ rule %r/([=!]=|[<>]=?)/, Operator
135
+ rule %r/(and|or|contains)\b/, Operator::Word
159
136
 
137
+ mixin :end_of_block
160
138
  mixin :generic
161
- mixin :whitespace
162
139
  end
163
140
 
164
141
  state :when do
165
142
  mixin :end_of_block
166
- mixin :whitespace
167
143
  mixin :generic
168
144
  end
169
145
 
170
- state :operator do
171
- rule %r/(\s*)((?:=|!|>|<)=?)(\s*)/ do
172
- groups Text::Whitespace, Operator, Text::Whitespace
173
- pop!
174
- end
175
-
176
- rule %r/(\s*)(\bcontains\b)(\s*)/ do
177
- groups Text::Whitespace, Operator::Word, Text::Whitespace
178
- pop!
179
- end
180
- end
181
-
182
146
  state :end_of_tag do
183
- rule(/\}\}/) { token Punctuation; reset_stack }
147
+ rule(/-?\}\}/) { token Punctuation; reset_stack }
184
148
  end
185
149
 
186
150
  state :end_of_block do
187
- rule(/%\}/) { token Punctuation; reset_stack }
151
+ rule(/-?%\}/) { token Punctuation; reset_stack }
188
152
  end
189
153
 
190
154
  # states for unknown markup
191
155
  state :param_markup do
192
156
  mixin :whitespace
157
+ mixin :keyword
193
158
  mixin :string
159
+ mixin :number
194
160
 
195
161
  rule %r/([^\s=:]+)(\s*)(=|:)/ do
196
162
  groups Name::Attribute, Text::Whitespace, Operator
197
163
  end
198
164
 
199
- rule %r/(\{\{)(\s*)([^\s\}])(\s*)(\}\})/ do
200
- groups Punctuation, Text::Whitespace, Text, Text::Whitespace, Punctuation
201
- end
202
-
203
- mixin :number
204
- mixin :keyword
205
-
206
- rule %r/,/, Punctuation
165
+ rule %r/[,:]/, Punctuation
207
166
  end
208
167
 
209
168
  state :default_param_markup do
210
169
  mixin :param_markup
211
- rule %r/./, Text
170
+
171
+ rule %r/\S+/, Text
212
172
  end
213
173
 
214
174
  state :variable_param_markup do
215
175
  mixin :param_markup
216
176
  mixin :variable
217
- rule %r/./, Text
177
+
178
+ rule %r/\S+/, Text
218
179
  end
219
180
 
220
181
  state :tag_markup do
182
+ rule %r/(reversed)\b/, Name::Attribute
183
+
221
184
  mixin :end_of_block
222
185
  mixin :default_param_markup
223
186
  end
@@ -229,12 +192,14 @@ module Rouge
229
192
 
230
193
  # states for different values types
231
194
  state :keyword do
232
- rule %r/\b(false|true)\b/, Keyword::Constant
195
+ rule %r/(false|true|nil)\b/, Keyword::Constant
233
196
  end
234
197
 
235
198
  state :variable do
236
- rule %r/\.(?=\w)/, Punctuation
237
- rule %r/[a-zA-Z_]\w*\??/, Name::Variable
199
+ rule %r/(empty|blank|forloop\.[^\s%}\|:]+)\b/, Name::Builtin
200
+ rule %r/\.(?=\w)|\[|\]/, Punctuation
201
+ rule %r/(first|last|size)\b/, Name::Function
202
+ rule %r/[a-zA-Z_][\w-]*\??/, Name::Variable
238
203
  end
239
204
 
240
205
  state :string do
@@ -243,21 +208,17 @@ module Rouge
243
208
  end
244
209
 
245
210
  state :number do
211
+ rule %r/-/, Operator
246
212
  rule %r/\d+\.\d+/, Num::Float
247
213
  rule %r/\d+/, Num::Integer
248
214
  end
249
215
 
250
- state :array_index do
251
- rule %r/\[/, Punctuation
252
- rule %r/\]/, Punctuation
253
- end
254
-
255
216
  state :generic do
256
- mixin :array_index
217
+ mixin :whitespace
257
218
  mixin :keyword
258
219
  mixin :string
259
- mixin :variable
260
220
  mixin :number
221
+ mixin :variable
261
222
  end
262
223
 
263
224
  state :whitespace do
@@ -265,18 +226,20 @@ module Rouge
265
226
  end
266
227
 
267
228
  state :comment do
268
- rule %r/(\{%)(\s*)(endcomment)(\s*)(%\})/ do
229
+ rule %r/[^\{]+/, Comment
230
+
231
+ rule %r/(\{%-?)(\s*)(endcomment)(\s*)(-?%\})/ do
269
232
  groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
270
233
  reset_stack
271
234
  end
272
235
 
273
- rule %r/./, Comment
236
+ rule %r/\{/, Comment
274
237
  end
275
238
 
276
239
  state :raw do
277
240
  rule %r/[^\{]+/, Text
278
241
 
279
- rule %r/(\{%)(\s*)(endraw)(\s*)(%\})/ do
242
+ rule %r/(\{%-?)(\s*)(endraw)(\s*)(-?%\})/ do
280
243
  groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
281
244
  reset_stack
282
245
  end
@@ -285,27 +248,38 @@ module Rouge
285
248
  end
286
249
 
287
250
  state :assign do
288
- mixin :whitespace
289
- mixin :end_of_block
251
+ rule %r/=/, Operator
290
252
 
291
- rule %r/(\s*)(=)(\s*)/ do
292
- groups Text::Whitespace, Operator, Text::Whitespace
253
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s%\|:]*)/ do
254
+ groups Punctuation, Text::Whitespace, Name::Function
255
+ push :filters
293
256
  end
294
257
 
295
- rule %r/\|/, Punctuation, :filters
296
-
258
+ mixin :end_of_block
297
259
  mixin :generic
298
260
  end
299
261
 
300
262
  state :include do
301
- mixin :whitespace
302
-
303
- rule %r/([^\.]+)(\.)(html|liquid)/ do
304
- groups Name::Attribute, Punctuation, Name::Attribute
263
+ rule %r/(\{\{-?)(\s*)/ do
264
+ groups Punctuation, Text::Whitespace
265
+ push :output_embed
305
266
  end
306
267
 
268
+ rule %r/(with|for)\b/, Name::Tag
269
+ rule %r/[^\s\.]+(\.[^\s\.]+)+\b/, Name::Other
270
+
307
271
  mixin :variable_tag_markup
308
272
  end
273
+
274
+ state :output_embed do
275
+ rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do
276
+ groups Punctuation, Text::Whitespace, Name::Function
277
+ end
278
+
279
+ rule %r/-?\}\}/, Punctuation, :pop!
280
+
281
+ mixin :variable_param_markup
282
+ end
309
283
  end
310
284
  end
311
285
  end