rouge 3.6.0 → 3.8.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/lib/rouge/demos/ada +26 -0
  4. data/lib/rouge/demos/armasm +12 -0
  5. data/lib/rouge/demos/batchfile +3 -0
  6. data/lib/rouge/demos/bbcbasic +6 -0
  7. data/lib/rouge/demos/cmhg +8 -0
  8. data/lib/rouge/demos/cuda +11 -0
  9. data/lib/rouge/demos/cython +6 -0
  10. data/lib/rouge/demos/epp +4 -0
  11. data/lib/rouge/demos/gdscript +18 -0
  12. data/lib/rouge/demos/hocon +8 -0
  13. data/lib/rouge/demos/mason +22 -0
  14. data/lib/rouge/demos/msgtrans +4 -0
  15. data/lib/rouge/demos/opentype_feature_file +6 -0
  16. data/lib/rouge/demos/plist +1 -132
  17. data/lib/rouge/demos/reasonml +12 -0
  18. data/lib/rouge/demos/sas +13 -0
  19. data/lib/rouge/formatters/html_line_table.rb +3 -1
  20. data/lib/rouge/formatters/tex.rb +14 -12
  21. data/lib/rouge/guessers/disambiguation.rb +12 -0
  22. data/lib/rouge/lexers/ada.rb +162 -0
  23. data/lib/rouge/lexers/armasm.rb +145 -0
  24. data/lib/rouge/lexers/batchfile.rb +164 -0
  25. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  26. data/lib/rouge/lexers/cmhg.rb +34 -0
  27. data/lib/rouge/lexers/console.rb +1 -1
  28. data/lib/rouge/lexers/cpp.rb +4 -1
  29. data/lib/rouge/lexers/cuda.rb +35 -0
  30. data/lib/rouge/lexers/cython.rb +151 -0
  31. data/lib/rouge/lexers/epp.rb +51 -0
  32. data/lib/rouge/lexers/escape.rb +3 -0
  33. data/lib/rouge/lexers/gdscript.rb +171 -0
  34. data/lib/rouge/lexers/gherkin.rb +4 -2
  35. data/lib/rouge/lexers/graphql.rb +10 -3
  36. data/lib/rouge/lexers/handlebars.rb +14 -3
  37. data/lib/rouge/lexers/hocon.rb +86 -0
  38. data/lib/rouge/lexers/html.rb +2 -2
  39. data/lib/rouge/lexers/igorpro.rb +1 -1
  40. data/lib/rouge/lexers/json.rb +43 -5
  41. data/lib/rouge/lexers/julia.rb +1 -1
  42. data/lib/rouge/lexers/make.rb +39 -12
  43. data/lib/rouge/lexers/mason.rb +115 -0
  44. data/lib/rouge/lexers/msgtrans.rb +26 -0
  45. data/lib/rouge/lexers/ocaml.rb +12 -48
  46. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  47. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  48. data/lib/rouge/lexers/php.rb +31 -9
  49. data/lib/rouge/lexers/php/builtins.rb +181 -174
  50. data/lib/rouge/lexers/plain_text.rb +1 -1
  51. data/lib/rouge/lexers/puppet.rb +2 -2
  52. data/lib/rouge/lexers/r.rb +2 -3
  53. data/lib/rouge/lexers/reasonml.rb +65 -0
  54. data/lib/rouge/lexers/rust.rb +12 -9
  55. data/lib/rouge/lexers/sas.rb +563 -0
  56. data/lib/rouge/lexers/sed.rb +1 -1
  57. data/lib/rouge/lexers/smarty.rb +10 -10
  58. data/lib/rouge/tex_theme_renderer.rb +5 -1
  59. data/lib/rouge/themes/magritte.rb +3 -3
  60. data/lib/rouge/themes/thankful_eyes.rb +1 -1
  61. data/lib/rouge/themes/tulip.rb +1 -1
  62. data/lib/rouge/version.rb +1 -1
  63. data/rouge.gemspec +4 -3
  64. metadata +38 -5
@@ -0,0 +1,162 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Ada < RegexLexer
7
+ tag 'ada'
8
+ filenames '*.ada', '*.ads', '*.adb', '*.gpr'
9
+ mimetypes 'text/x-ada'
10
+
11
+ title 'Ada'
12
+ desc 'The Ada 2012 programming language'
13
+
14
+ # Ada identifiers are Unicode with underscores only allowed as separators.
15
+ ID = /\b[[:alpha:]](?:\p{Pc}?[[:alnum:]])*\b/
16
+
17
+ # Numerals can also contain underscores.
18
+ NUM = /\d(_?\d)*/
19
+ XNUM = /\h(_?\h)*/
20
+ EXP = /(E[-+]?#{NUM})?/i
21
+
22
+ # Return a hash mapping lower-case identifiers to token classes.
23
+ def self.idents
24
+ @idents ||= Hash.new(Name).tap do |h|
25
+ %w(
26
+ abort abstract accept access aliased all array at begin body
27
+ case constant declare delay delta digits do else elsif end
28
+ exception exit for generic goto if in interface is limited
29
+ loop new null of others out overriding pragma private
30
+ protected raise range record renames requeue return reverse
31
+ select separate some synchronized tagged task terminate then
32
+ until use when while with
33
+ ).each {|w| h[w] = Keyword}
34
+
35
+ %w(abs and mod not or rem xor).each {|w| h[w] = Operator::Word}
36
+
37
+ %w(
38
+ entry function package procedure subtype type
39
+ ).each {|w| h[w] = Keyword::Declaration}
40
+
41
+ %w(
42
+ boolean character constraint_error duration float integer
43
+ natural positive long_float long_integer long_long_float
44
+ long_long_integer program_error short_float short_integer
45
+ short_short_integer storage_error string tasking_error
46
+ wide_character wide_string wide_wide_character
47
+ wide_wide_string
48
+ ).each {|w| h[w] = Name::Builtin}
49
+ end
50
+ end
51
+
52
+ state :whitespace do
53
+ rule %r{\s+}m, Text
54
+ rule %r{--.*$}, Comment::Single
55
+ end
56
+
57
+ state :dquote_string do
58
+ rule %r{[^"\n]+}, Literal::String::Double
59
+ rule %r{""}, Literal::String::Escape
60
+ rule %r{"}, Literal::String::Double, :pop!
61
+ rule %r{\n}, Error, :pop!
62
+ end
63
+
64
+ state :attr do
65
+ mixin :whitespace
66
+ rule ID, Name::Attribute, :pop!
67
+ rule %r{}, Text, :pop!
68
+ end
69
+
70
+ # Handle a dotted name immediately following a declaration keyword.
71
+ state :decl_name do
72
+ mixin :whitespace
73
+ rule %r{body\b}i, Keyword::Declaration # package body Foo.Bar is...
74
+ rule %r{(#{ID})(\.)} do
75
+ groups Name::Namespace, Punctuation
76
+ end
77
+ # function "<=" (Left, Right: Type) is ...
78
+ rule %r{#{ID}|"(and|or|xor|/?=|<=?|>=?|\+|–|&\|/|mod|rem|\*?\*|abs|not)"},
79
+ Name::Function, :pop!
80
+ rule %r{}, Text, :pop!
81
+ end
82
+
83
+ # Handle a sequence of library unit names: with Ada.Foo, Ada.Bar;
84
+ #
85
+ # There's a chance we entered this state mistakenly since 'with'
86
+ # has multiple other uses in Ada (none of which are likely to
87
+ # appear at the beginning of a line). Try to bail as soon as
88
+ # possible if we see something suspicious like keywords.
89
+ #
90
+ # See ada_spec.rb for some examples.
91
+ state :libunit_name do
92
+ mixin :whitespace
93
+
94
+ rule ID do |m|
95
+ t = self.class.idents[m[0].downcase]
96
+ if t <= Name
97
+ # Convert all kinds of Name to namespaces in this context.
98
+ token Name::Namespace
99
+ else
100
+ # Yikes, we're not supposed to get a keyword in a library unit name!
101
+ # We probably entered this state by mistake, so try to fix it.
102
+ token t
103
+ if t == Keyword::Declaration
104
+ goto :decl_name
105
+ else
106
+ pop!
107
+ end
108
+ end
109
+ end
110
+
111
+ rule %r{[.,]}, Punctuation
112
+ rule %r{}, Text, :pop!
113
+ end
114
+
115
+ state :root do
116
+ mixin :whitespace
117
+
118
+ # String literals.
119
+ rule %r{'.'}, Literal::String::Char
120
+ rule %r{"[^"\n]*}, Literal::String::Double, :dquote_string
121
+
122
+ # Real literals.
123
+ rule %r{#{NUM}\.#{NUM}#{EXP}}, Literal::Number::Float
124
+ rule %r{#{NUM}##{XNUM}\.#{XNUM}##{EXP}}, Literal::Number::Float
125
+
126
+ # Integer literals.
127
+ rule %r{2#[01](_?[01])*##{EXP}}, Literal::Number::Bin
128
+ rule %r{8#[0-7](_?[0-7])*##{EXP}}, Literal::Number::Oct
129
+ rule %r{16##{XNUM}*##{EXP}}, Literal::Number::Hex
130
+ rule %r{#{NUM}##{XNUM}##{EXP}}, Literal::Number::Integer
131
+ rule %r{#{NUM}#\w+#}, Error
132
+ rule %r{#{NUM}#{EXP}}, Literal::Number::Integer
133
+
134
+ # Special constructs.
135
+ rule %r{'}, Punctuation, :attr
136
+ rule %r{<<#{ID}>>}, Name::Label
137
+
138
+ # Context clauses are tricky because the 'with' keyword is used
139
+ # for many purposes. Detect at beginning of the line only.
140
+ rule %r{^(?:(limited)(\s+))?(?:(private)(\s+))?(with)\b}i do
141
+ groups Keyword::Namespace, Text, Keyword::Namespace, Text, Keyword::Namespace
142
+ push :libunit_name
143
+ end
144
+
145
+ # Operators and punctuation characters.
146
+ rule %r{[+*/&<=>|]|-|=>|\.\.|\*\*|[:></]=|<<|>>|<>}, Operator
147
+ rule %r{[.,:;()]}, Punctuation
148
+
149
+ rule ID do |m|
150
+ t = self.class.idents[m[0].downcase]
151
+ token t
152
+ if t == Keyword::Declaration
153
+ push :decl_name
154
+ end
155
+ end
156
+
157
+ # Flag word-like things that don't match the ID pattern.
158
+ rule %r{\b(\p{Pc}|[[alpha]])\p{Word}*}, Error
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,145 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class ArmAsm < RegexLexer
7
+ title "ArmAsm"
8
+ desc "Arm assembly syntax"
9
+ tag 'armasm'
10
+ filenames '*.s'
11
+
12
+ def self.preproc_keyword
13
+ @preproc_keyword ||= %w(
14
+ define elif else endif error if ifdef ifndef include line pragma undef warning
15
+ )
16
+ end
17
+
18
+ def self.file_directive
19
+ @file_directive ||= %w(
20
+ BIN GET INCBIN INCLUDE LNK
21
+ )
22
+ end
23
+
24
+ def self.general_directive
25
+ @general_directive ||= %w(
26
+ ALIAS ALIGN AOF AOUT AREA ARM ASSERT ATTR CN CODE16 CODE32 COMMON CP
27
+ DATA DCB DCD DCDO DCDU DCFD DCFDU DCFH DCFHU DCFS DCFSU DCI DCI.N DCI.W
28
+ DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT
29
+ EXPORTAS EXTERN FIELD FILL FN FRAME FUNCTION GBLA GBLL GBLS GLOBAL IF
30
+ IMPORT INFO KEEP LCLA LCLL LCLS LEADR LEAF LTORG MACRO MAP MEND MEXIT
31
+ NOFP OPT ORG PRESERVE8 PROC QN RELOC REQUIRE REQUIRE8 RLIST RN ROUT
32
+ SETA SETL SETS SN SPACE STRONG SUBT THUMB THUMBX TTL WEND WHILE
33
+ \[ \] [|!#*=%&^]
34
+ )
35
+ end
36
+
37
+ def self.shift_or_condition
38
+ @shift_or_condition ||= %w(
39
+ ASR LSL LSR ROR RRX AL CC CS EQ GE GT HI HS LE LO LS LT MI NE PL VC VS
40
+ asr lsl lsr ror rrx al cc cs eq ge gt hi hs le lo ls lt mi ne pl vc vs
41
+ )
42
+ end
43
+
44
+ def self.builtin
45
+ @builtin ||= %w(
46
+ ARCHITECTURE AREANAME ARMASM_VERSION CODESIZE COMMANDLINE CONFIG CPU
47
+ ENDIAN FALSE FPIC FPU INPUTFILE INTER LINENUM LINENUMUP LINENUMUPPER
48
+ OBJASM_VERSION OPT PC PCSTOREOFFSET REENTRANT ROPI RWPI TRUE VAR
49
+ )
50
+ end
51
+
52
+ def self.operator
53
+ @operator ||= %w(
54
+ AND BASE CC CC_ENCODING CHR DEF EOR FATTR FEXEC FLOAD FSIZE INDEX LAND
55
+ LEFT LEN LEOR LNOT LOR LOWERCASE MOD NOT OR RCONST REVERSE_CC RIGHT ROL
56
+ ROR SHL SHR STR TARGET_ARCH_[0-9A-Z_]+ TARGET_FEATURE_[0-9A-Z_]+
57
+ TARGET_FPU_[A-Z_] TARGET_PROFILE_[ARM] UAL UPPERCASE
58
+ )
59
+ end
60
+
61
+ state :root do
62
+ rule %r/\n/, Text
63
+ rule %r/^([ \t]*)(#[ \t]*(?:(?:#{ArmAsm.preproc_keyword.join('|')})(?:[ \t].*)?)?)(\n)/ do
64
+ groups Text, Comment::Preproc, Text
65
+ end
66
+ rule %r/[ \t]+/, Text, :command
67
+ rule %r/;.*/, Comment
68
+ rule %r/\$[a-z_]\w*\.?/i, Name::Namespace # variable substitution or macro argument
69
+ rule %r/\w+|\|[^|\n]+\|/, Name::Label
70
+ end
71
+
72
+ state :command do
73
+ rule %r/\n/, Text, :pop!
74
+ rule %r/[ \t]+/ do |m|
75
+ token Text
76
+ goto :args
77
+ end
78
+ rule %r/;.*/, Comment, :pop!
79
+ rule %r/(?:#{ArmAsm.file_directive.join('|')})\b/ do |m|
80
+ token Keyword
81
+ goto :filespec
82
+ end
83
+ rule %r/(?:#{ArmAsm.general_directive.join('|')})(?=[; \t\n])/, Keyword
84
+ rule %r/(?:[A-Z][\dA-Z]*|[a-z][\da-z]*)(?:\.[NWnw])?(?:\.[DFIPSUdfipsu]?(?:8|16|32|64)?){,3}\b/, Name::Builtin # rather than attempt to list all opcodes, rely on all-uppercase or all-lowercase rule
85
+ rule %r/[a-z_]\w*|\|[^|\n]+\|/i, Name::Function # probably a macro name
86
+ rule %r/\$[a-z]\w*\.?/i, Name::Namespace
87
+ end
88
+
89
+ state :args do
90
+ rule %r/\n/, Text, :pop!
91
+ rule %r/[ \t]+/, Text
92
+ rule %r/;.*/, Comment, :pop!
93
+ rule %r/(?:#{ArmAsm.shift_or_condition.join('|')})\b/, Name::Builtin
94
+ rule %r/[a-z_]\w*|\|[^|\n]+\|/i, Name::Variable # various types of symbol
95
+ rule %r/%[bf]?[at]?\d+(?:[a-z_]\w*)?/i, Name::Label
96
+ rule %r/(?:&|0x)\h+(?!p)/i, Literal::Number::Hex
97
+ rule %r/(?:&|0x)[.\h]+(?:p[-+]?\d+)?/i, Literal::Number::Float
98
+ rule %r/0f_\h{8}|0d_\h{16}/i, Literal::Number::Float
99
+ rule %r/(?:2_[01]+|3_[0-2]+|4_[0-3]+|5_[0-4]+|6_[0-5]+|7_[0-6]+|8_[0-7]+|9_[0-8]+|\d+)(?!e)/i, Literal::Number::Integer
100
+ rule %r/(?:2_[.01]+|3_[.0-2]+|4_[.0-3]+|5_[.0-4]+|6_[.0-5]+|7_[.0-6]+|8_[.0-7]+|9_[.0-8]+|[.\d]+)(?:e[-+]?\d+)?/i, Literal::Number::Float
101
+ rule %r/[@:](?=[ \t]*(?:8|16|32|64|128|256)[^\d])/, Operator
102
+ rule %r/[.@]|\{(?:#{ArmAsm.builtin.join('|')})\}/, Name::Constant
103
+ rule %r/[-!#%&()*+,\/<=>?^{|}]|\[|\]|!=|&&|\/=|<<|<=|<>|==|><|>=|>>|\|\||:(?:#{ArmAsm.operator.join('|')}):/, Operator
104
+ rule %r/\$[a-z]\w*\.?/i, Name::Namespace
105
+ rule %r/'/ do |m|
106
+ token Literal::String::Char
107
+ goto :singlequoted
108
+ end
109
+ rule %r/"/ do |m|
110
+ token Literal::String::Double
111
+ goto :doublequoted
112
+ end
113
+ end
114
+
115
+ state :singlequoted do
116
+ rule %r/\n/, Text, :pop!
117
+ rule %r/\$\$/, Literal::String::Char
118
+ rule %r/\$[a-z]\w*\.?/i, Name::Namespace
119
+ rule %r/'/ do |m|
120
+ token Literal::String::Char
121
+ goto :args
122
+ end
123
+ rule %r/[^$'\n]+/, Literal::String::Char
124
+ end
125
+
126
+ state :doublequoted do
127
+ rule %r/\n/, Text, :pop!
128
+ rule %r/\$\$/, Literal::String::Double
129
+ rule %r/\$[a-z]\w*\.?/i, Name::Namespace
130
+ rule %r/"/ do |m|
131
+ token Literal::String::Double
132
+ goto :args
133
+ end
134
+ rule %r/[^$"\n]+/, Literal::String::Double
135
+ end
136
+
137
+ state :filespec do
138
+ rule %r/\n/, Text, :pop!
139
+ rule %r/\$\$/, Literal::String::Other
140
+ rule %r/\$[a-z]\w*\.?/i, Name::Namespace
141
+ rule %r/[^$\n]+/, Literal::String::Other
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,164 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Batchfile < RegexLexer
7
+ title "Batchfile"
8
+ desc "Windows Batch File"
9
+
10
+ tag 'batchfile'
11
+ aliases 'bat', 'batch', 'dosbatch', 'winbatch'
12
+ filenames '*.bat', '*.cmd'
13
+
14
+ mimetypes 'application/bat', 'application/x-bat', 'application/x-msdos-program'
15
+
16
+ def self.keywords
17
+ @keywords ||= %w(
18
+ if else for in do goto call exit
19
+ )
20
+ end
21
+
22
+ def self.operator_words
23
+ @operator_words ||= %w(
24
+ exist defined errorlevel cmdextversion not equ neq lss leq gtr geq
25
+ )
26
+ end
27
+
28
+ def self.devices
29
+ @devices ||= %w(
30
+ con prn aux nul com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2
31
+ lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9
32
+ )
33
+ end
34
+
35
+ def self.builtin_commands
36
+ @builtin_commands ||= %w(
37
+ assoc attrib break bcdedit cacls cd chcp chdir chkdsk chkntfs choice
38
+ cls cmd color comp compact convert copy date del dir diskpart doskey
39
+ dpath driverquery echo endlocal erase fc find findstr format fsutil
40
+ ftype gpresult graftabl help icacls label md mkdir mklink mode more
41
+ move openfiles path pause popd print prompt pushd rd recover ren
42
+ rename replace rmdir robocopy setlocal sc schtasks shift shutdown sort
43
+ start subst systeminfo takeown tasklist taskkill time timeout title
44
+ tree type ver verify vol xcopy waitfor wmic
45
+ )
46
+ end
47
+
48
+ def self.other_commands
49
+ @other_commands ||= %w(
50
+ addusers admodcmd ansicon arp at bcdboot bitsadmin browstat certreq
51
+ certutil change cidiag cipher cleanmgr clip cmdkey compress convertcp
52
+ coreinfo csccmd csvde cscript curl debug defrag delprof deltree devcon
53
+ diamond dirquota diruse diskshadow diskuse dism dnscmd dsacls dsadd
54
+ dsget dsquery dsmod dsmove dsrm dsmgmt dsregcmd edlin eventcreate
55
+ expand extract fdisk fltmc forfiles freedisk ftp getmac gpupdate
56
+ hostname ifmember inuse ipconfig kill lgpo lodctr logman logoff
57
+ logtime makecab mapisend mbsacli mem mountvol moveuser msg mshta
58
+ msiexec msinfo32 mstsc nbtstat net net1 netdom netsh netstat nlsinfo
59
+ nltest now nslookup ntbackup ntdsutil ntoskrnl ntrights nvspbind
60
+ pathping perms ping portqry powercfg pngout pnputil printbrm prncnfg
61
+ prnmngr procdump psexec psfile psgetsid psinfo pskill pslist
62
+ psloggedon psloglist pspasswd psping psservice psshutdown pssuspend
63
+ qbasic qgrep qprocess query quser qwinsta rasdial reg reg1 regdump
64
+ regedt32 regsvr32 regini reset restore rundll32 rmtshare route rpcping
65
+ run runas scandisk setspn setx sfc share shellrunas shortcut sigcheck
66
+ sleep slmgr strings subinacl sysmon telnet tftp tlist touch tracerpt
67
+ tracert tscon tsdiscon tskill tttracer typeperf tzutil undelete
68
+ unformat verifier vmconnect vssadmin w32tm wbadmin wecutil wevtutil
69
+ wget where whoami windiff winrm winrs wpeutil wpr wusa wuauclt wscript
70
+ )
71
+ end
72
+
73
+ def self.attributes
74
+ @attributes ||= %w(
75
+ on off disable enableextensions enabledelayedexpansion
76
+ )
77
+ end
78
+
79
+ state :basic do
80
+ # Comments
81
+ rule %r/\brem\b.*$/i, Comment
82
+ # Empty Labels
83
+ rule %r/^::.*$/, Comment
84
+
85
+ # Labels
86
+ rule %r/:[a-z]+/i, Name::Label
87
+
88
+ rule %r/([a-z]\w*)(\.exe|com|bat|cmd|msi)?/i do |m|
89
+ if self.class.devices.include? m[1]
90
+ groups Keyword::Reserved, Error
91
+ elsif self.class.keywords.include? m[1]
92
+ groups Keyword, Error
93
+ elsif self.class.operator_words.include? m[1]
94
+ groups Operator::Word, Error
95
+ elsif self.class.builtin_commands.include? m[1]
96
+ token Name::Builtin
97
+ elsif self.class.other_commands.include? m[1]
98
+ token Name::Builtin
99
+ elsif self.class.attributes.include? m[1]
100
+ groups Name::Attribute, Error
101
+ elsif "set".casecmp m[1]
102
+ groups Keyword::Declaration, Error
103
+ else
104
+ token Text
105
+ end
106
+ end
107
+
108
+ rule %r/([\/\-+][a-z]+)\s*/i, Name::Attribute
109
+
110
+ mixin :expansions
111
+
112
+ rule %r/[<>&|(){}\[\]\-+=;,~?*]/, Operator
113
+ end
114
+
115
+ state :escape do
116
+ rule %r/\^./m, Str::Escape
117
+ end
118
+
119
+ state :expansions do
120
+ # Normal and Delayed expansion
121
+ rule %r/[%!]+([a-z_$@#]+)[%!]+/i, Name::Variable
122
+ # For Variables
123
+ rule %r/(\%+~?[a-z]+\d?)/i, Name::Variable::Magic
124
+ end
125
+
126
+ state :double_quotes do
127
+ mixin :escape
128
+ rule %r/["]/, Str::Double, :pop!
129
+ mixin :expansions
130
+ rule %r/[^\^"%!]+/, Str::Double
131
+ end
132
+
133
+ state :single_quotes do
134
+ mixin :escape
135
+ rule %r/[']/, Str::Single, :pop!
136
+ mixin :expansions
137
+ rule %r/[^\^'%!]+/, Str::Single
138
+ end
139
+
140
+ state :backtick do
141
+ mixin :escape
142
+ rule %r/[`]/, Str::Backtick, :pop!
143
+ mixin :expansions
144
+ rule %r/[^\^`%!]+/, Str::Backtick
145
+ end
146
+
147
+ state :data do
148
+ rule %r/\s+/, Text
149
+ rule %r/0x[0-9a-f]+/i, Literal::Number::Hex
150
+ rule %r/[0-9]/, Literal::Number
151
+ rule %r/["]/, Str::Double, :double_quotes
152
+ rule %r/[']/, Str::Single, :single_quotes
153
+ rule %r/[`]/, Str::Backtick, :backtick
154
+ rule %r/[^\s&|()\[\]{}\^=;!%+\-,"'`~?*]+/, Text
155
+ mixin :escape
156
+ end
157
+
158
+ state :root do
159
+ mixin :basic
160
+ mixin :data
161
+ end
162
+ end
163
+ end
164
+ end