rouge 3.7.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.
@@ -0,0 +1,112 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class BBCBASIC < RegexLexer
7
+ title "BBCBASIC"
8
+ desc "BBC BASIC syntax"
9
+ tag 'bbcbasic'
10
+ filenames '*,fd1'
11
+
12
+ def self.punctuation
13
+ @punctuation ||= %w(
14
+ [,;'~] SPC TAB
15
+ )
16
+ end
17
+
18
+ def self.function
19
+ @function ||= %w(
20
+ ABS ACS ADVAL ASC ASN ATN BEATS BEAT BGET# CHR\$ COS COUNT DEG DIM
21
+ EOF# ERL ERR EVAL EXP EXT# FN GET\$# GET\$ GET HIMEM INKEY\$ INKEY
22
+ INSTR INT LEFT\$ LEN LN LOG LOMEM MID\$ OPENIN OPENOUT OPENUP PAGE
23
+ POINT POS PTR# RAD REPORT\$ RIGHT\$ RND SGN SIN SQR STR\$ STRING\$ SUM
24
+ SUMLEN TAN TEMPO TIME\$ TIME TOP USR VAL VPOS
25
+ )
26
+ end
27
+
28
+ def self.statement
29
+ @statement ||= %w(
30
+ BEATS BPUT# CALL CASE CHAIN CLEAR CLG CLOSE# CLS COLOR COLOUR DATA
31
+ ELSE ENDCASE ENDIF ENDPROC ENDWHILE END ENVELOPE FOR GCOL GOSUB GOTO
32
+ IF INSTALL LET LIBRARY MODE NEXT OFF OF ON ORIGIN OSCI OTHERWISE
33
+ OVERLAY PLOT PRINT# PRINT PROC QUIT READ REPEAT REPORT RETURN SOUND
34
+ STEP STEREO STOP SWAP SYS THEN TINT TO VDU VOICES VOICE UNTIL WAIT
35
+ WHEN WHILE WIDTH
36
+ )
37
+ end
38
+
39
+ def self.operator
40
+ @operator ||= %w(
41
+ << <= <> < >= >>> >> > [-!$()*+/=?^|] AND DIV EOR MOD NOT OR
42
+ )
43
+ end
44
+
45
+ def self.constant
46
+ @constant ||= %w(
47
+ FALSE TRUE
48
+ )
49
+ end
50
+
51
+ state :expression do
52
+ rule %r/#{BBCBASIC.function.join('|')}/o, Name::Builtin # function or pseudo-variable
53
+ rule %r/#{BBCBASIC.operator.join('|')}/o, Operator
54
+ rule %r/#{BBCBASIC.constant.join('|')}/o, Name::Constant
55
+ rule %r/"[^"]*"/o, Literal::String
56
+ rule %r/[a-z_`][\w`]*[$%]?/io, Name::Variable
57
+ rule %r/@%/o, Name::Variable
58
+ rule %r/[\d.]+/o, Literal::Number
59
+ rule %r/%[01]+/o, Literal::Number::Bin
60
+ rule %r/&[\h]+/o, Literal::Number::Hex
61
+ end
62
+
63
+ state :root do
64
+ rule %r/(:+)( *)(\*)(.*)/ do
65
+ groups Punctuation, Text, Keyword, Text # CLI command
66
+ end
67
+ rule %r/(\n+ *)(\*)(.*)/ do
68
+ groups Text, Keyword, Text # CLI command
69
+ end
70
+ rule %r/(ELSE|OTHERWISE|REPEAT|THEN)( *)(\*)(.*)/ do
71
+ groups Keyword, Text, Keyword, Text # CLI command
72
+ end
73
+ rule %r/[ \n]+/o, Text
74
+ rule %r/:+/o, Punctuation
75
+ rule %r/[\[]/o, Keyword, :assembly1
76
+ rule %r/REM *>.*/o, Comment::Special
77
+ rule %r/REM.*/o, Comment
78
+ rule %r/(?:#{BBCBASIC.statement.join('|')}|CIRCLE(?: *FILL)?|DEF *(?:FN|PROC)|DRAW(?: *BY)?|DIM(?!\()|ELLIPSE(?: *FILL)?|ERROR(?: *EXT)?|FILL(?: *BY)?|INPUT(?:#| *LINE)?|LINE(?: *INPUT)?|LOCAL(?: *DATA| *ERROR)?|MOUSE(?: *COLOUR| *OFF| *ON| *RECTANGLE| *STEP| *TO)?|MOVE(?: *BY)?|ON(?! *ERROR)|ON *ERROR *(?:LOCAL|OFF)?|POINT(?: *BY)?(?!\()|RECTANGE(?: *FILL)?|RESTORE(?: *DATA| *ERROR)?|TRACE(?: *CLOSE| *ENDPROC| *OFF| *STEP(?: *FN| *ON| *PROC)?| *TO)?)/o, Keyword
79
+ mixin :expression
80
+ rule %r/#{BBCBASIC.punctuation.join('|')}/o, Punctuation
81
+ end
82
+
83
+ # Assembly statements are parsed as
84
+ # {label} {directive|opcode |']' {expressions}} {comment}
85
+ # Technically, you don't need whitespace between opcodes and arguments,
86
+ # but this is rare in uncrunched source and trying to enumerate all
87
+ # possible opcodes here is impractical so we colour it as though
88
+ # the whitespace is required. Opcodes and directives can only easily be
89
+ # distinguished from the symbols that make up expressions by looking at
90
+ # their position within the statement. Similarly, ']' is treated as a
91
+ # keyword at the start of a statement or as punctuation elsewhere. This
92
+ # requires a two-state state machine.
93
+
94
+ state :assembly1 do
95
+ rule %r/ +/o, Text
96
+ rule %r/]/o, Keyword, :pop!
97
+ rule %r/[:\n]/o, Punctuation
98
+ rule %r/\.[a-z_`][\w`]*%? */io, Name::Label
99
+ rule %r/(?:REM|;)[^:\n]*/o, Comment
100
+ rule %r/[^ :\n]+/o, Keyword, :assembly2
101
+ end
102
+
103
+ state :assembly2 do
104
+ rule %r/ +/o, Text
105
+ rule %r/[:\n]/o, Punctuation, :pop!
106
+ rule %r/(?:REM|;)[^:\n]*/o, Comment, :pop!
107
+ mixin :expression
108
+ rule %r/[!#,@\[\]^{}]/, Punctuation
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class CMHG < RegexLexer
7
+ title "CMHG"
8
+ desc "RISC OS C module header generator source file"
9
+ tag 'cmhg'
10
+ filenames '*.cmhg'
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
+ state :root do
19
+ rule %r/;[^\n]*/, Comment
20
+ rule %r/^([ \t]*)(#[ \t]*(?:(?:#{CMHG.preproc_keyword.join('|')})(?:[ \t].*)?)?)(?=\n)/ do
21
+ groups Text, Comment::Preproc
22
+ end
23
+ rule %r/[-a-z]+:/, Keyword::Declaration
24
+ rule %r/[a-z_]\w+/i, Name::Entity
25
+ rule %r/"[^"]*"/, Literal::String
26
+ rule %r/(?:&|0x)\h+/, Literal::Number::Hex
27
+ rule %r/\d+/, Literal::Number
28
+ rule %r/[,\/()]/, Punctuation
29
+ rule %r/[ \t]+/, Text
30
+ rule %r/\n+/, Text
31
+ end
32
+ end
33
+ end
34
+ end
@@ -116,7 +116,7 @@ module Rouge
116
116
  # before we pass to the lang lexer so it can determine where
117
117
  # the "real" beginning of the line is
118
118
  $' =~ /\A\s*/
119
- yield Text, $& unless $&.empty?
119
+ yield Text::Whitespace, $& unless $&.empty?
120
120
 
121
121
  lang_lexer.continue_lex($', &output)
122
122
  elsif comment_regex =~ input[0].strip
@@ -17,7 +17,7 @@ module Rouge
17
17
  '*.cc', '*.hh',
18
18
  '*.cxx', '*.hxx',
19
19
  '*.pde', '*.ino',
20
- '*.tpp'
20
+ '*.tpp', '*.h'
21
21
  mimetypes 'text/x-c++hdr', 'text/x-c++src'
22
22
 
23
23
  def self.keywords
@@ -58,9 +58,11 @@ module Rouge
58
58
 
59
59
  prepend :statements do
60
60
  rule %r/class\b/, Keyword, :classname
61
+ rule %r/\d+(\.\d+)?(?:h|(?:min)|s|(?:ms)|(?:us)|(?:ns))/, Num::Other
61
62
  rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float
62
63
  rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float
63
64
  rule %r/0x\h('?\h)*[lu]*/i, Num::Hex
65
+ rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
64
66
  rule %r/0[0-7]('?[0-7])*[lu]*/i, Num::Oct
65
67
  rule %r/#{dq}[lu]*/i, Num::Integer
66
68
  rule %r/\bnullptr\b/, Name::Builtin
@@ -72,6 +74,7 @@ module Rouge
72
74
 
73
75
  # template specification
74
76
  rule %r/\s*(?=>)/m, Text, :pop!
77
+ rule %r/[.]{3}/, Operator
75
78
  mixin :whitespace
76
79
  end
77
80
  end
@@ -0,0 +1,151 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ load_lexer 'python.rb'
7
+
8
+ class Cython < Python
9
+ title "Cython"
10
+ desc "Cython and Pyrex source code (cython.org)"
11
+ tag 'cython'
12
+ aliases 'pyx', 'pyrex'
13
+ filenames '*.pyx', '*.pxd', '*.pxi'
14
+ mimetypes 'text/x-cython', 'application/x-cython'
15
+
16
+ def initialize(opts = {})
17
+ super opts
18
+ @indentation = nil
19
+ end
20
+
21
+ def self.keywords
22
+ @keywords ||= super + %w(
23
+ by except? fused gil nogil
24
+ )
25
+ end
26
+
27
+ def self.c_keywords
28
+ @ckeywords ||= %w(
29
+ public readonly extern api inline enum union
30
+ )
31
+ end
32
+
33
+ identifier = /[a-z_]\w*/i
34
+ dotted_identifier = /[a-z_.][\w.]*/i
35
+
36
+ prepend :root do
37
+ rule %r/cp?def|ctypedef/ do
38
+ token Keyword
39
+ push :c_definitions
40
+ push :c_start
41
+ end
42
+
43
+ rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(cimport)/ do
44
+ groups Keyword::Namespace,
45
+ Text,
46
+ Name::Namespace,
47
+ Text,
48
+ Keyword::Namespace
49
+ end
50
+
51
+ rule %r/(cimport)(\s+)(#{dotted_identifier})/ do
52
+ groups Keyword::Namespace, Text, Name::Namespace
53
+ end
54
+
55
+ rule %r/(struct)((?:\\\s|\s)+)/ do
56
+ groups Keyword, Text
57
+ push :classname
58
+ end
59
+
60
+ mixin :func_call_fix
61
+
62
+ rule %r/[(,]/, Punctuation, :c_start
63
+ end
64
+
65
+ prepend :classname do
66
+ rule %r/(?:\\\s|\s)+/, Text
67
+ end
68
+
69
+ prepend :funcname do
70
+ rule %r/(?:\\\s|\s)+/, Text
71
+ end
72
+ # This is a fix for the way that function calls are lexed in the Python
73
+ # lexer. This should be moved to the Python lexer once confirmed that it
74
+ # does not cause any regressions.
75
+ state :func_call_fix do
76
+ rule %r/#{identifier}(?=\()/ do |m|
77
+ if self.class.keywords.include? m[0]
78
+ token Keyword
79
+ elsif self.class.exceptions.include? m[0]
80
+ token Name::Builtin
81
+ elsif self.class.builtins.include? m[0]
82
+ token Name::Builtin
83
+ elsif self.class.builtins_pseudo.include? m[0]
84
+ token Name::Builtin::Pseudo
85
+ else
86
+ token Name::Function
87
+ end
88
+ end
89
+ end
90
+
91
+ # The Cython lexer adds three states to those already in the Python lexer.
92
+ # Calls to `cdef`, `cpdef` and `ctypedef` move the lexer into the :c_start
93
+ # state. The primary purpose of this state is to highlight datatypes. Once
94
+ # this has been done, the lexer moves to the :c_definitions state where
95
+ # the majority of text in a definition is lexed. Finally, newlines cause
96
+ # the lexer to move to :c_indent. This state is used to check whether we
97
+ # have moved out of a C block.
98
+
99
+ state :c_start do
100
+ rule %r/[^\S\n]+/, Text
101
+
102
+ rule %r/cp?def|ctypedef/, Keyword
103
+
104
+ rule %r/(?:un)?signed/, Keyword::Type
105
+
106
+ # This rule matches identifiers that could be type declarations. The
107
+ # lookahead matches (1) pointers, (2) arrays and (3) variable names.
108
+ rule %r/#{identifier}(?=(?:\*+)|(?:[ \t]*\[)|(?:[ \t]+\w))/ do |m|
109
+ if self.class.keywords.include? m[0]
110
+ token Keyword
111
+ pop!
112
+ elsif %w(def).include? m[0]
113
+ token Keyword
114
+ goto :funcname
115
+ elsif %w(struct class).include? m[0]
116
+ token Keyword::Reserved
117
+ goto :classname
118
+ elsif self.class.c_keywords.include? m[0]
119
+ token Keyword::Reserved
120
+ else
121
+ token Keyword::Type
122
+ pop!
123
+ end
124
+ end
125
+
126
+ rule(//) { pop! }
127
+ end
128
+
129
+ state :c_definitions do
130
+ rule %r/\n/, Text, :c_indent
131
+ mixin :root
132
+ end
133
+
134
+ state :c_indent do
135
+ rule %r/[ \t]+/ do |m|
136
+ token Text
137
+ goto :c_start
138
+
139
+ if @indentation.nil?
140
+ @indentation = m[0]
141
+ elsif @indentation.length > m[0].length
142
+ @indentation = nil
143
+ pop! 2 # Pop :c_start and :c_definitions
144
+ end
145
+ end
146
+
147
+ rule(//) { @indentation = nil; reset_stack }
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,51 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class EPP < TemplateLexer
6
+ title "EPP"
7
+ desc "Embedded Puppet template files"
8
+
9
+ tag 'epp'
10
+
11
+ filenames '*.epp'
12
+
13
+ def initialize(opts={})
14
+ super(opts)
15
+ @parent = lexer_option(:parent) { PlainText.new(opts) }
16
+ @puppet_lexer = Puppet.new(opts)
17
+ end
18
+
19
+ start do
20
+ parent.reset!
21
+ @puppet_lexer.reset!
22
+ end
23
+
24
+ open = /<%%|<%=|<%#|(<%-|<%)(\s*\|)?/
25
+ close = /%%>|(\|\s*)?(-%>|%>)/
26
+
27
+ state :root do
28
+ rule %r/<%#/, Comment, :comment
29
+
30
+ rule open, Comment::Preproc, :puppet
31
+
32
+ rule %r/.+?(?=#{open})|.+/m do
33
+ delegate parent
34
+ end
35
+ end
36
+
37
+ state :comment do
38
+ rule close, Comment, :pop!
39
+ rule %r/.+?(?=#{close})|.+/m, Comment
40
+ end
41
+
42
+ state :puppet do
43
+ rule close, Comment::Preproc, :pop!
44
+
45
+ rule %r/.+?(?=#{close})|.+/m do
46
+ delegate @puppet_lexer
47
+ end
48
+ end
49
+ end
50
+ end
51
+ 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
@@ -199,7 +199,7 @@ module Rouge
199
199
  end
200
200
 
201
201
  # types
202
- rule %r/((mutable )?struct|(abstract|primitive) type)((?:\s|\\\s)+)/ do
202
+ rule %r/((?:mutable )?struct|(?:abstract|primitive) type)((?:\s|\\\s)+)/ do
203
203
  groups Keyword, Name::Class
204
204
  push :typename
205
205
  end
@@ -8,9 +8,18 @@ module Rouge
8
8
  desc "Makefile syntax"
9
9
  tag 'make'
10
10
  aliases 'makefile', 'mf', 'gnumake', 'bsdmake'
11
- filenames '*.make', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'
11
+ filenames '*.make', '*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile', '*,fe1'
12
12
  mimetypes 'text/x-makefile'
13
13
 
14
+ def self.functions
15
+ @functions ||= %w(
16
+ abspath addprefix addsuffix and basename call dir error eval file
17
+ filter filter-out findstring firstword flavor foreach if join lastword
18
+ notdir or origin patsubst realpath shell sort strip subst suffix value
19
+ warning wildcard word wordlist words
20
+ )
21
+ end
22
+
14
23
  # TODO: Add support for special keywords
15
24
  # bsd_special = %w(
16
25
  # include undef error warning if else elif endif for endfor
@@ -28,15 +37,25 @@ module Rouge
28
37
 
29
38
  rule %r/#.*?\n/, Comment
30
39
 
31
- rule %r/(export)(\s+)(?=[a-zA-Z0-9_\${}\t -]+\n)/ do
40
+ rule %r/([-s]?include)((?:[\t ]+[^\t\n #]+)+)/ do
41
+ groups Keyword, Literal::String::Other
42
+ end
43
+
44
+ rule %r/(ifn?def|ifn?eq)([\t ]+)([^#\n]+)/ do
45
+ groups Keyword, Text, Name::Variable
46
+ end
47
+
48
+ rule %r/(?:else|endif)[\t ]*(?=[#\n])/, Keyword
49
+
50
+ rule %r/(export)([\t ]+)(?=[\w\${}()\t -]+\n)/ do
32
51
  groups Keyword, Text
33
52
  push :export
34
53
  end
35
54
 
36
- rule %r/export\s+/, Keyword
55
+ rule %r/export[\t ]+/, Keyword
37
56
 
38
57
  # assignment
39
- rule %r/([a-zA-Z0-9_${}.-]+)(\s*)([!?:+]?=)/m do |m|
58
+ rule %r/([\w${}().-]+)([\t ]*)([!?:+]?=)/m do |m|
40
59
  token Name::Variable, m[1]
41
60
  token Text, m[2]
42
61
  token Operator, m[3]
@@ -52,9 +71,9 @@ module Rouge
52
71
  end
53
72
 
54
73
  state :export do
55
- rule %r/[\w\${}-]/, Name::Variable
74
+ rule %r/[\w\${}()-]/, Name::Variable
56
75
  rule %r/\n/, Text, :pop!
57
- rule %r/\s+/, Text
76
+ rule %r/[\t ]+/, Text
58
77
  end
59
78
 
60
79
  state :block_header do
@@ -70,6 +89,14 @@ module Rouge
70
89
  end
71
90
 
72
91
  state :block_body do
92
+ rule %r/(ifn?def|ifn?eq)([\t ]+)([^#\n]+)(#.*)?(\n)/ do
93
+ groups Keyword, Text, Name::Variable, Comment, Text
94
+ end
95
+
96
+ rule %r/(else|endif)([\t ]*)(#.*)?(\n)/ do
97
+ groups Keyword, Text, Comment, Text
98
+ end
99
+
73
100
  rule %r/(\t[\t ]*)([@-]?)/ do
74
101
  groups Text, Punctuation
75
102
  push :shell_line
@@ -80,22 +107,22 @@ module Rouge
80
107
 
81
108
  state :shell do
82
109
  # macro interpolation
83
- rule %r/\$\(\s*[a-z_]\w*\s*\)/i, Name::Variable
84
- # $(shell ...)
85
- rule %r/(\$\()(\s*)(shell)(\s+)/m do
110
+ rule %r/\$[({][\t ]*\w[\w:=%.]*[\t ]*[)}]/i, Name::Variable
111
+ # function invocation
112
+ rule %r/(\$[({])([\t ]*)(#{Make.functions.join('|')})([\t ]+)/m do
86
113
  groups Name::Function, Text, Name::Builtin, Text
87
114
  push :shell_expr
88
115
  end
89
116
 
90
117
  rule(/\\./m) { delegate @shell }
91
- stop = /\$\(|\(|\)|\\|$/
118
+ stop = /\$\(|\$\{|\(|\)|\}|\\|$/
92
119
  rule(/.+?(?=#{stop})/m) { delegate @shell }
93
120
  rule(stop) { delegate @shell }
94
121
  end
95
122
 
96
123
  state :shell_expr do
97
- rule(/\(/) { delegate @shell; push }
98
- rule %r/\)/, Name::Variable, :pop!
124
+ rule(/[({]/) { delegate @shell; push }
125
+ rule %r/[)}]/, Name::Function, :pop!
99
126
  mixin :shell
100
127
  end
101
128