rouge 1.10.1 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rouge/cli.rb +1 -1
- data/lib/rouge/demos/actionscript +4 -0
- data/lib/rouge/demos/apiblueprint +33 -0
- data/lib/rouge/demos/biml +38 -0
- data/lib/rouge/demos/ceylon +7 -0
- data/lib/rouge/demos/cmake +7 -0
- data/lib/rouge/demos/coq +11 -0
- data/lib/rouge/demos/d +16 -0
- data/lib/rouge/demos/eiffel +30 -0
- data/lib/rouge/demos/fortran +22 -0
- data/lib/rouge/demos/gradle +10 -0
- data/lib/rouge/demos/jinja +9 -0
- data/lib/rouge/demos/jsonnet +28 -0
- data/lib/rouge/demos/julia +11 -0
- data/lib/rouge/demos/nasm +26 -0
- data/lib/rouge/demos/objective_c +4 -0
- data/lib/rouge/demos/protobuf +5 -0
- data/lib/rouge/demos/shell_session +10 -0
- data/lib/rouge/demos/smarty +12 -0
- data/lib/rouge/demos/tap +5 -0
- data/lib/rouge/demos/twig +9 -0
- data/lib/rouge/demos/typescript +1 -0
- data/lib/rouge/demos/verilog +27 -0
- data/lib/rouge/demos/viml +14 -5
- data/lib/rouge/formatters/html_wrapper.rb +11 -0
- data/lib/rouge/formatters/terminal256.rb +1 -1
- data/lib/rouge/lexer.rb +4 -2
- data/lib/rouge/lexers/actionscript.rb +195 -0
- data/lib/rouge/lexers/apache.rb +23 -20
- data/lib/rouge/lexers/apache/keywords.yml +721 -410
- data/lib/rouge/lexers/apiblueprint.rb +51 -0
- data/lib/rouge/lexers/biml.rb +41 -0
- data/lib/rouge/lexers/c.rb +7 -2
- data/lib/rouge/lexers/ceylon.rb +123 -0
- data/lib/rouge/lexers/clojure.rb +1 -1
- data/lib/rouge/lexers/cmake.rb +206 -0
- data/lib/rouge/lexers/coffeescript.rb +1 -1
- data/lib/rouge/lexers/coq.rb +187 -0
- data/lib/rouge/lexers/cpp.rb +12 -1
- data/lib/rouge/lexers/csharp.rb +12 -5
- data/lib/rouge/lexers/css.rb +2 -0
- data/lib/rouge/lexers/d.rb +176 -0
- data/lib/rouge/lexers/diff.rb +9 -9
- data/lib/rouge/lexers/eiffel.rb +65 -0
- data/lib/rouge/lexers/fortran.rb +142 -0
- data/lib/rouge/lexers/gradle.rb +37 -0
- data/lib/rouge/lexers/groovy.rb +2 -2
- data/lib/rouge/lexers/ini.rb +2 -2
- data/lib/rouge/lexers/java.rb +11 -8
- data/lib/rouge/lexers/javascript.rb +2 -1
- data/lib/rouge/lexers/jinja.rb +137 -0
- data/lib/rouge/lexers/jsonnet.rb +151 -0
- data/lib/rouge/lexers/julia.rb +172 -0
- data/lib/rouge/lexers/markdown.rb +1 -0
- data/lib/rouge/lexers/nasm.rb +203 -0
- data/lib/rouge/lexers/objective_c.rb +11 -0
- data/lib/rouge/lexers/php.rb +1 -1
- data/lib/rouge/lexers/powershell.rb +1 -1
- data/lib/rouge/lexers/protobuf.rb +70 -0
- data/lib/rouge/lexers/python.rb +23 -0
- data/lib/rouge/lexers/r.rb +53 -20
- data/lib/rouge/lexers/ruby.rb +4 -4
- data/lib/rouge/lexers/rust.rb +2 -2
- data/lib/rouge/lexers/shell_session.rb +29 -0
- data/lib/rouge/lexers/smarty.rb +91 -0
- data/lib/rouge/lexers/sql.rb +1 -1
- data/lib/rouge/lexers/swift.rb +20 -5
- data/lib/rouge/lexers/tap.rb +91 -0
- data/lib/rouge/lexers/twig.rb +37 -0
- data/lib/rouge/lexers/typescript.rb +46 -0
- data/lib/rouge/lexers/verilog.rb +164 -0
- data/lib/rouge/regex_lexer.rb +1 -1
- data/lib/rouge/version.rb +1 -1
- data/rouge.gemspec +1 -1
- metadata +47 -6
- data/lib/rouge/formatters/html_inline.rb +0 -20
- data/lib/rouge/formatters/html_linewise.rb +0 -31
data/lib/rouge/lexers/diff.rb
CHANGED
@@ -16,15 +16,15 @@ module Rouge
|
|
16
16
|
end
|
17
17
|
|
18
18
|
state :root do
|
19
|
-
rule(/^
|
20
|
-
rule(
|
21
|
-
rule(
|
22
|
-
rule(
|
23
|
-
rule(
|
24
|
-
rule(
|
25
|
-
rule(/^([Ii]ndex|diff)
|
26
|
-
rule(
|
27
|
-
rule(
|
19
|
+
rule(/^ .*$\n?/, Text)
|
20
|
+
rule(/^---$\n?/, Text)
|
21
|
+
rule(/^\+.*$\n?/, Generic::Inserted)
|
22
|
+
rule(/^-+.*$\n?/, Generic::Deleted)
|
23
|
+
rule(/^!.*$\n?/, Generic::Strong)
|
24
|
+
rule(/^@.*$\n?/, Generic::Subheading)
|
25
|
+
rule(/^([Ii]ndex|diff).*$\n?/, Generic::Heading)
|
26
|
+
rule(/^=.*$\n?/, Generic::Heading)
|
27
|
+
rule(/.*$\n?/, Text)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Eiffel < RegexLexer
|
6
|
+
title "Eiffel"
|
7
|
+
desc "Eiffel programming language"
|
8
|
+
|
9
|
+
tag 'eiffel'
|
10
|
+
filenames '*.e'
|
11
|
+
mimetypes 'text/x-eiffel'
|
12
|
+
|
13
|
+
LanguageKeywords = %w(
|
14
|
+
across agent alias all and attached as assign attribute check
|
15
|
+
class convert create debug deferred detachable do else elseif end
|
16
|
+
ensure expanded export external feature from frozen if implies inherit
|
17
|
+
inspect invariant like local loop not note obsolete old once or
|
18
|
+
Precursor redefine rename require rescue retry select separate
|
19
|
+
some then undefine until variant Void when xor
|
20
|
+
)
|
21
|
+
|
22
|
+
BooleanConstants = %w(True False)
|
23
|
+
|
24
|
+
LanguageVariables = %w(Current Result)
|
25
|
+
|
26
|
+
SimpleString = /(?:[^"%\b\f\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)+?/
|
27
|
+
|
28
|
+
state :root do
|
29
|
+
rule /"\[/, Str::Other, :aligned_verbatim_string
|
30
|
+
rule /"\{/, Str::Other, :non_aligned_verbatim_string
|
31
|
+
rule /"(?:[^%\b\f\n\r\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)*?"/, Str::Double
|
32
|
+
rule /--.*/, Comment::Single
|
33
|
+
rule /'(?:[^%\b\f\n\r\t\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)'/, Str::Char
|
34
|
+
|
35
|
+
rule /(?:#{LanguageKeywords.join('|')})\b/, Keyword
|
36
|
+
rule /(?:#{LanguageVariables.join('|')})\b/, Keyword::Variable
|
37
|
+
rule /(?:#{BooleanConstants.join('|')})\b/, Keyword::Constant
|
38
|
+
|
39
|
+
rule /\b0[xX][\da-fA-F](?:_*[\da-fA-F])*b/, Num::Hex
|
40
|
+
rule /\b0[cC][0-7](?:_*[0-7])*\b/, Num::Oct
|
41
|
+
rule /\b0[bB][01](?:_*[01])*\b/, Num::Bin
|
42
|
+
rule /\d(?:_*\d)*/, Num::Integer
|
43
|
+
rule /(?:\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?[eE][+-]?)?\d(?:_*\d)*|\d(?:_*\d)*\.?/, Num::Float
|
44
|
+
|
45
|
+
rule /:=|<<|>>|\(\||\|\)|->|\.|[{}\[\];(),:?]/, Punctuation::Indicator
|
46
|
+
rule /\\\\|\|\.\.\||\.\.|\/[~\/]?|[><\/]=?|[-+*^=~]/, Operator
|
47
|
+
|
48
|
+
rule /[A-Z][\dA-Z_]*/, Name::Class
|
49
|
+
rule /[A-Za-z][\dA-Za-z_]*/, Name
|
50
|
+
rule /\s+/, Text
|
51
|
+
end
|
52
|
+
|
53
|
+
state :aligned_verbatim_string do
|
54
|
+
rule /]"/, Str::Other, :pop!
|
55
|
+
rule SimpleString, Str::Other
|
56
|
+
end
|
57
|
+
|
58
|
+
state :non_aligned_verbatim_string do
|
59
|
+
rule /}"/, Str::Other, :pop!
|
60
|
+
rule SimpleString, Str::Other
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
# vim: set ts=2 sw=2 et:
|
3
|
+
|
4
|
+
# TODO: Implement format list support.
|
5
|
+
|
6
|
+
module Rouge
|
7
|
+
module Lexers
|
8
|
+
class Fortran < RegexLexer
|
9
|
+
title "Fortran"
|
10
|
+
desc "Fortran 95 Programming Language"
|
11
|
+
|
12
|
+
tag 'fortran'
|
13
|
+
filenames '*.f90', '*.f95',
|
14
|
+
'*.F90', '*.F95'
|
15
|
+
mimetypes 'text/x-fortran'
|
16
|
+
|
17
|
+
name = /[A-Z][_A-Z0-9]*/i
|
18
|
+
kind_param = /(\d+|#{name})/
|
19
|
+
exponent = /[ED][+-]\d+/
|
20
|
+
|
21
|
+
def self.keywords
|
22
|
+
# Fortran allows to omit whitespace between certain keywords...
|
23
|
+
@keywords ||= Set.new %w(
|
24
|
+
allocatable allocate assignment backspace block blockdata call case
|
25
|
+
close common contains continue cycle data deallocate default
|
26
|
+
dimension do elemental else elseif elsewhere end endblockdata enddo
|
27
|
+
endfile endforall endfunction endif endinterface endmodule endprogram
|
28
|
+
endselect endsubroutine endtype endwhere entry equivalence exit
|
29
|
+
external forall format function go goto if implicit in include inout
|
30
|
+
inquire intent interface intrinsic module namelist none nullify only
|
31
|
+
open operator optional out parameter pointer print private procedure
|
32
|
+
program public pure read recursive result return rewind save select
|
33
|
+
selectcase sequence stop subroutine target then to type use where
|
34
|
+
while write
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.types
|
39
|
+
@types ||= Set.new %w(
|
40
|
+
character complex double precision doubleprecision integer logical real
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.intrinsics
|
45
|
+
@intrinsics ||= Set.new %w(
|
46
|
+
abs achar acos adjustl adjustr aimag aint all allocated anint any
|
47
|
+
asin associated atan atan2 bit_size btest ceiling char cmplx conjg
|
48
|
+
cos cosh count cpu_time cshift date_and_time dble digits dim
|
49
|
+
dot_product dprod eoshift epsilon exp exponent floor fraction huge
|
50
|
+
iachar iand ibclr ibits ibset ichar ieor index int ior ishift ishiftc
|
51
|
+
kind lbound len len_trim lge lgt lle llt log log10 logical matmul max
|
52
|
+
maxexponent maxloc maxval merge min minexponent minloc minval mod
|
53
|
+
modulo mvbits nearest nint not null pack precision present product
|
54
|
+
radix random_number random_seed range real repeat reshape rrspacing
|
55
|
+
scale scan selected_int_kind selected_real_kind set_exponent shape
|
56
|
+
sign sin sinh size spacing spread sqrt sum system_clock tan tanh tiny
|
57
|
+
transfer transpose trim ubound unpack verify
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
state :root do
|
62
|
+
rule /[\s\n]+/, Text::Whitespace
|
63
|
+
rule /!.*$/, Comment::Single
|
64
|
+
rule /^#.*$/, Comment::Preproc
|
65
|
+
|
66
|
+
rule /::|[()\/;,:&]/, Punctuation
|
67
|
+
|
68
|
+
# TODO: This does not take into account line continuation.
|
69
|
+
rule /^(\s*)([0-9]+)\b/m do |m|
|
70
|
+
token Text::Whitespace, m[1]
|
71
|
+
token Name::Label, m[2]
|
72
|
+
end
|
73
|
+
|
74
|
+
# Format statements are quite a strange beast.
|
75
|
+
# Better process them in their own state.
|
76
|
+
rule /\b(FORMAT)(\s*)(\()/mi do |m|
|
77
|
+
token Keyword, m[1]
|
78
|
+
token Text::Whitespace, m[2]
|
79
|
+
token Punctuation, m[3]
|
80
|
+
push :format_spec
|
81
|
+
end
|
82
|
+
|
83
|
+
rule %r(
|
84
|
+
[+-]? # sign
|
85
|
+
(
|
86
|
+
(\d+[.]\d*|[.]\d+)(#{exponent})?
|
87
|
+
| \d+#{exponent} # exponent is mandatory
|
88
|
+
)
|
89
|
+
(_#{kind_param})? # kind parameter
|
90
|
+
)xi, Num::Float
|
91
|
+
|
92
|
+
rule /[+-]?\d+(_#{kind_param})?/i, Num::Integer
|
93
|
+
rule /B'[01]+'|B"[01]+"/i, Num::Bin
|
94
|
+
rule /O'[0-7]+'|O"[0-7]+"/i, Num::Oct
|
95
|
+
rule /Z'[0-9A-F]+'|Z"[0-9A-F]+"/i, Num::Hex
|
96
|
+
rule /(#{kind_param}_)?'/, Str::Single, :string_single
|
97
|
+
rule /(#{kind_param}_)?"/, Str::Double, :string_double
|
98
|
+
rule /[.](TRUE|FALSE)[.](_#{kind_param})?/i, Keyword::Constant
|
99
|
+
|
100
|
+
rule %r{\*\*|//|==|/=|<=|>=|=>|[-+*/<>=%]}, Operator
|
101
|
+
rule /\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV|[A-Z]+)\./i, Operator::Word
|
102
|
+
|
103
|
+
rule /#{name}/m do |m|
|
104
|
+
match = m[0].downcase
|
105
|
+
if self.class.keywords.include? match
|
106
|
+
token Keyword
|
107
|
+
elsif self.class.types.include? match
|
108
|
+
token Keyword::Type
|
109
|
+
elsif self.class.intrinsics.include? match
|
110
|
+
token Name::Builtin
|
111
|
+
else
|
112
|
+
token Name
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
state :string_single do
|
119
|
+
rule /[^']+/, Str::Single
|
120
|
+
rule /''/, Str::Escape
|
121
|
+
rule /'/, Str::Single, :pop!
|
122
|
+
end
|
123
|
+
|
124
|
+
state :string_double do
|
125
|
+
rule /[^"]+/, Str::Double
|
126
|
+
rule /""/, Str::Escape
|
127
|
+
rule /"/, Str::Double, :pop!
|
128
|
+
end
|
129
|
+
|
130
|
+
state :format_spec do
|
131
|
+
rule /'/, Str::Single, :string_single
|
132
|
+
rule /"/, Str::Double, :string_double
|
133
|
+
rule /\(/, Punctuation, :format_spec
|
134
|
+
rule /\)/, Punctuation, :pop!
|
135
|
+
rule /,/, Punctuation
|
136
|
+
rule /[\s\n]+/, Text::Whitespace
|
137
|
+
# Edit descriptors could be seen as a kind of "format literal".
|
138
|
+
rule /[^\s'"(),]+/, Literal
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
load_lexer 'groovy.rb'
|
6
|
+
|
7
|
+
class Gradle < Groovy
|
8
|
+
title "Gradle"
|
9
|
+
desc "A powerful build system for the JVM"
|
10
|
+
|
11
|
+
tag 'gradle'
|
12
|
+
filenames '*.gradle'
|
13
|
+
mimetypes 'text/x-gradle'
|
14
|
+
|
15
|
+
def self.keywords
|
16
|
+
@keywords ||= super + Set.new(%w(
|
17
|
+
allprojects artifacts buildscript configuration dependencies
|
18
|
+
repositories sourceSets subprojects publishing
|
19
|
+
))
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.types
|
23
|
+
@types ||= super + Set.new(%w(
|
24
|
+
Project Task Gradle Settings Script JavaToolChain SourceSet
|
25
|
+
SourceSetOutput IncrementalTaskInputs Configuration
|
26
|
+
ResolutionStrategy ArtifactResolutionQuery ComponentSelection
|
27
|
+
ComponentSelectionRules ConventionProperty ExtensionAware
|
28
|
+
ExtraPropertiesExtension PublishingExtension IvyPublication
|
29
|
+
IvyArtifact IvyArtifactSet IvyModuleDescriptorSpec
|
30
|
+
MavenPublication MavenArtifact MavenArtifactSet MavenPom
|
31
|
+
PluginDependenciesSpec PluginDependencySpec ResourceHandler
|
32
|
+
TextResourceFactory
|
33
|
+
))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/rouge/lexers/groovy.rb
CHANGED
@@ -4,7 +4,7 @@ module Rouge
|
|
4
4
|
module Lexers
|
5
5
|
class Groovy < RegexLexer
|
6
6
|
title "Groovy"
|
7
|
-
desc 'The Groovy programming language (groovy.
|
7
|
+
desc 'The Groovy programming language (http://www.groovy-lang.org/)'
|
8
8
|
tag 'groovy'
|
9
9
|
filenames '*.groovy'
|
10
10
|
mimetypes 'text/x-groovy'
|
@@ -53,7 +53,7 @@ module Rouge
|
|
53
53
|
rule %r(//.*?$), Comment::Single
|
54
54
|
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
55
55
|
rule /@\w[\w\d.]*/, Name::Decorator
|
56
|
-
rule /(class|interface)\b/, Keyword::Declaration, :class
|
56
|
+
rule /(class|interface|trait)\b/, Keyword::Declaration, :class
|
57
57
|
rule /package\b/, Keyword::Namespace, :import
|
58
58
|
rule /import\b/, Keyword::Namespace, :import
|
59
59
|
|
data/lib/rouge/lexers/ini.rb
CHANGED
@@ -12,10 +12,10 @@ module Rouge
|
|
12
12
|
mimetypes 'text/x-ini'
|
13
13
|
|
14
14
|
def self.analyze_text(text)
|
15
|
-
return 0.1 if text =~ /\A\[[\w
|
15
|
+
return 0.1 if text =~ /\A\[[\w\-.]+\]\s*[\w\-]+=\w+/
|
16
16
|
end
|
17
17
|
|
18
|
-
identifier = /[\w
|
18
|
+
identifier = /[\w\-.]+/
|
19
19
|
|
20
20
|
state :basic do
|
21
21
|
rule /[;#].*?\n/, Comment
|
data/lib/rouge/lexers/java.rb
CHANGED
@@ -25,8 +25,15 @@ module Rouge
|
|
25
25
|
id = /[a-zA-Z_][a-zA-Z0-9_]*/
|
26
26
|
|
27
27
|
state :root do
|
28
|
-
rule
|
29
|
-
|
28
|
+
rule /[^\S\n]+/, Text
|
29
|
+
rule %r(//.*?$), Comment::Single
|
30
|
+
rule %r(/\*.*?\*/)m, Comment::Multiline
|
31
|
+
# keywords: go before method names to avoid lexing "throw new XYZ"
|
32
|
+
# as a method signature
|
33
|
+
rule /(?:#{keywords.join('|')})\b/, Keyword
|
34
|
+
|
35
|
+
rule %r(
|
36
|
+
(\s*(?:[a-zA-Z_][a-zA-Z0-9_.\[\]<>]*\s+)+?) # return arguments
|
30
37
|
([a-zA-Z_][a-zA-Z0-9_]*) # method name
|
31
38
|
(\s*)(\() # signature start
|
32
39
|
)mx do |m|
|
@@ -34,14 +41,10 @@ module Rouge
|
|
34
41
|
delegate Java, m[1]
|
35
42
|
token Name::Function, m[2]
|
36
43
|
token Text, m[3]
|
37
|
-
token
|
44
|
+
token Operator, m[4]
|
38
45
|
end
|
39
46
|
|
40
|
-
rule /\s+/, Text
|
41
|
-
rule %r(//.*?$), Comment::Single
|
42
|
-
rule %r(/\*.*?\*/)m, Comment::Multiline
|
43
47
|
rule /@#{id}/, Name::Decorator
|
44
|
-
rule /(?:#{keywords.join('|')})\b/, Keyword
|
45
48
|
rule /(?:#{declarations.join('|')})\b/, Keyword::Declaration
|
46
49
|
rule /(?:#{types.join('|')})\b/, Keyword::Type
|
47
50
|
rule /package\b/, Keyword::Namespace
|
@@ -59,7 +62,7 @@ module Rouge
|
|
59
62
|
rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float
|
60
63
|
rule /0x[0-9a-f]+/, Num::Hex
|
61
64
|
rule /[0-9]+L?/, Num::Integer
|
62
|
-
|
65
|
+
rule /\n/, Text
|
63
66
|
end
|
64
67
|
|
65
68
|
state :class do
|
@@ -206,7 +206,8 @@ module Rouge
|
|
206
206
|
desc "JavaScript Object Notation (json.org)"
|
207
207
|
tag 'json'
|
208
208
|
filenames '*.json'
|
209
|
-
mimetypes 'application/json', 'application/vnd.api+json'
|
209
|
+
mimetypes 'application/json', 'application/vnd.api+json',
|
210
|
+
'application/hal+json'
|
210
211
|
|
211
212
|
# TODO: is this too much of a performance hit? JSON is quite simple,
|
212
213
|
# so I'd think this wouldn't be too bad, but for large documents this
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Jinja < TemplateLexer
|
6
|
+
title "Jinja"
|
7
|
+
desc "Django/Jinja template engine (jinja.pocoo.org)"
|
8
|
+
|
9
|
+
tag 'jinja'
|
10
|
+
aliases 'django'
|
11
|
+
|
12
|
+
mimetypes 'application/x-django-templating', 'application/x-jinja',
|
13
|
+
'text/html+django', 'text/html+jinja'
|
14
|
+
|
15
|
+
def self.keywords
|
16
|
+
@@keywords ||= %w(as context do else extends from ignore missing
|
17
|
+
import include reversed recursive scoped
|
18
|
+
autoescape endautoescape block endblock call endcall
|
19
|
+
filter endfilter for endfor if endif macro endmacro
|
20
|
+
set endset trans endtrans with endwith without)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.tests
|
24
|
+
@@tests ||= %w(callable defined divisibleby equalto escaped even iterable
|
25
|
+
lower mapping none number odd sameas sequence string
|
26
|
+
undefined upper)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.pseudo_keywords
|
30
|
+
@@pseudo_keywords ||= %w(true false none True False None)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.word_operators
|
34
|
+
@@word_operators ||= %w(is in and or not)
|
35
|
+
end
|
36
|
+
|
37
|
+
state :root do
|
38
|
+
# Comments
|
39
|
+
rule /{#/, Comment, :comment
|
40
|
+
|
41
|
+
# Statements
|
42
|
+
rule /\{\%/ do
|
43
|
+
token Comment::Preproc
|
44
|
+
push :statement
|
45
|
+
end
|
46
|
+
|
47
|
+
# Expressions
|
48
|
+
rule /\{\{/ do
|
49
|
+
token Comment::Preproc
|
50
|
+
push :expression
|
51
|
+
end
|
52
|
+
|
53
|
+
rule(/(.+?)(?=\\|{{|{%|{#)/m) { delegate parent }
|
54
|
+
rule(/.+/m) { delegate parent }
|
55
|
+
end
|
56
|
+
|
57
|
+
state :filter do
|
58
|
+
# Filters are called like variable|foo(arg1, ...)
|
59
|
+
rule /(\|)(\w+)/ do
|
60
|
+
groups Operator, Name::Function
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
state :function do
|
65
|
+
rule /(\w+)(\()/ do
|
66
|
+
groups Name::Function, Punctuation
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
state :text do
|
71
|
+
rule /\s+/m, Text
|
72
|
+
end
|
73
|
+
|
74
|
+
state :literal do
|
75
|
+
# Strings
|
76
|
+
rule /"(\\.|.)*?"/, Str::Double
|
77
|
+
rule /'(\\.|.)*?'/, Str::Single
|
78
|
+
|
79
|
+
# Numbers
|
80
|
+
rule /\d+(?=}\s)/, Num
|
81
|
+
|
82
|
+
# Arithmetic operators (+, -, *, **, //, /)
|
83
|
+
# TODO : implement modulo (%)
|
84
|
+
rule /(\+|\-|\*|\/\/?|\*\*?)/, Operator
|
85
|
+
|
86
|
+
# Comparisons operators (<=, <, >=, >, ==, ===, !=)
|
87
|
+
rule /(<=?|>=?|===?|!=)/, Operator
|
88
|
+
|
89
|
+
# Punctuation (the comma, [], ())
|
90
|
+
rule /,/, Punctuation
|
91
|
+
rule /\[/, Punctuation
|
92
|
+
rule /\]/, Punctuation
|
93
|
+
rule /\(/, Punctuation
|
94
|
+
rule /\)/, Punctuation
|
95
|
+
end
|
96
|
+
|
97
|
+
state :comment do
|
98
|
+
rule(/[^{#]+/m) { token Comment }
|
99
|
+
rule(/#}/) { token Comment; pop! }
|
100
|
+
end
|
101
|
+
|
102
|
+
state :expression do
|
103
|
+
rule /\w+\.?/m, Name::Variable
|
104
|
+
|
105
|
+
mixin :filter
|
106
|
+
mixin :function
|
107
|
+
mixin :literal
|
108
|
+
mixin :text
|
109
|
+
|
110
|
+
rule /%}|}}/, Comment::Preproc, :pop!
|
111
|
+
end
|
112
|
+
|
113
|
+
state :statement do
|
114
|
+
rule /(\w+\.?)/ do |m|
|
115
|
+
if self.class.keywords.include?(m[0])
|
116
|
+
groups Keyword
|
117
|
+
elsif self.class.pseudo_keywords.include?(m[0])
|
118
|
+
groups Keyword::Pseudo
|
119
|
+
elsif self.class.word_operators.include?(m[0])
|
120
|
+
groups Operator::Word
|
121
|
+
elsif self.class.tests.include?(m[0])
|
122
|
+
groups Name::Builtin
|
123
|
+
else
|
124
|
+
groups Name::Variable
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
mixin :filter
|
129
|
+
mixin :function
|
130
|
+
mixin :literal
|
131
|
+
mixin :text
|
132
|
+
|
133
|
+
rule /\%\}/, Comment::Preproc, :pop!
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|