rouge 3.6.0 → 3.7.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.
- checksums.yaml +4 -4
- data/lib/rouge/demos/ada +26 -0
- data/lib/rouge/demos/cuda +11 -0
- data/lib/rouge/demos/gdscript +18 -0
- data/lib/rouge/demos/hocon +8 -0
- data/lib/rouge/demos/mason +22 -0
- data/lib/rouge/demos/opentype_feature_file +6 -0
- data/lib/rouge/demos/reasonml +12 -0
- data/lib/rouge/demos/sas +13 -0
- data/lib/rouge/formatters/tex.rb +3 -0
- data/lib/rouge/guessers/disambiguation.rb +4 -0
- data/lib/rouge/lexers/ada.rb +162 -0
- data/lib/rouge/lexers/cuda.rb +35 -0
- data/lib/rouge/lexers/escape.rb +3 -0
- data/lib/rouge/lexers/gdscript.rb +171 -0
- data/lib/rouge/lexers/gherkin.rb +4 -2
- data/lib/rouge/lexers/graphql.rb +10 -3
- data/lib/rouge/lexers/handlebars.rb +14 -3
- data/lib/rouge/lexers/hocon.rb +86 -0
- data/lib/rouge/lexers/html.rb +2 -2
- data/lib/rouge/lexers/igorpro.rb +1 -1
- data/lib/rouge/lexers/json.rb +43 -5
- data/lib/rouge/lexers/mason.rb +115 -0
- data/lib/rouge/lexers/ocaml.rb +12 -48
- data/lib/rouge/lexers/ocaml/common.rb +53 -0
- data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
- data/lib/rouge/lexers/php.rb +31 -9
- data/lib/rouge/lexers/php/builtins.rb +181 -174
- data/lib/rouge/lexers/reasonml.rb +65 -0
- data/lib/rouge/lexers/rust.rb +12 -9
- data/lib/rouge/lexers/sas.rb +563 -0
- data/lib/rouge/lexers/smarty.rb +10 -10
- data/lib/rouge/tex_theme_renderer.rb +3 -0
- data/lib/rouge/themes/magritte.rb +1 -1
- data/lib/rouge/themes/thankful_eyes.rb +1 -1
- data/lib/rouge/themes/tulip.rb +1 -1
- data/lib/rouge/version.rb +1 -1
- data/rouge.gemspec +0 -1
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71832bb306e80d00d6416e2e0c7787810cee88f614afbf5e31264512fe7914e5
|
4
|
+
data.tar.gz: f7228f6567515239ade1d9de8c37e437ece59ba54bb81566d008df7db25545f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5441fc76804158ae89d9c05c11f430247c4966fccc4d12e5f6690d1081f9da6221a05b92d696022fa0b2b0655760f4cd6e86e27080556be41e995e47c15901f
|
7
|
+
data.tar.gz: 16a2988f811ff0eb93133ce6f812f7217d29d6f34ec7838211197ebf8db48bd8a84e7f8bf4d330d6be885f49d49a5b9ad94697144b2746aab5ca5d4f20bb5aba
|
data/lib/rouge/demos/ada
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
with Ada.Directories;
|
2
|
+
with Ada.Direct_IO;
|
3
|
+
with Ada.Text_IO;
|
4
|
+
|
5
|
+
procedure Extra_IO.Read_File (Name : String) is
|
6
|
+
|
7
|
+
package Dirs renames Ada.Directories;
|
8
|
+
package Text_IO renames Ada.Text_IO;
|
9
|
+
|
10
|
+
-- Get the size of the file for a new string.
|
11
|
+
Size : Natural := Natural (Dirs.Size (Name));
|
12
|
+
subtype File_String is String (1 .. Size);
|
13
|
+
|
14
|
+
-- Instantiate Direct_IO for our file type.
|
15
|
+
package FIO is new Ada.Direct_IO (File_String);
|
16
|
+
|
17
|
+
File : FIO.File_Type;
|
18
|
+
Contents : File_String;
|
19
|
+
|
20
|
+
begin
|
21
|
+
FIO.Open (File, FIO.In_File, Name);
|
22
|
+
FIO.Read (File, Contents);
|
23
|
+
FIO.Close (File);
|
24
|
+
|
25
|
+
Text_IO.Put (Contents);
|
26
|
+
end Extra_IO.Read_File;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
extends Node
|
2
|
+
|
3
|
+
# Variables & Built-in Types
|
4
|
+
|
5
|
+
var a = 5
|
6
|
+
var b = true
|
7
|
+
var s = "Hello"
|
8
|
+
var arr = [1, 2, 3]
|
9
|
+
|
10
|
+
# Constants & Enums
|
11
|
+
|
12
|
+
const ANSWER = 42
|
13
|
+
enum { UNIT_NEUTRAL, UNIT_ENEMY, UNIT_ALLY }
|
14
|
+
|
15
|
+
# Functions
|
16
|
+
|
17
|
+
func _ready():
|
18
|
+
print("Hello, World")
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# These are our own config values defined by the app
|
2
|
+
simple-app {
|
3
|
+
answer = 42
|
4
|
+
}
|
5
|
+
|
6
|
+
# Here we override some values used by a library
|
7
|
+
simple-lib.foo = "This value comes from simple-app's application.conf"
|
8
|
+
simple-lib.whatever = "This value comes from simple-app's application.conf"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%doc>
|
2
|
+
This is a mason component.
|
3
|
+
# This is a comment.
|
4
|
+
</%doc>
|
5
|
+
|
6
|
+
<%args>
|
7
|
+
$color # this argument is required!
|
8
|
+
$size => 20 # default size
|
9
|
+
$country => undef # this argument is optional, default value is 'undef'
|
10
|
+
@items => (1, 2, 'something else')
|
11
|
+
%pairs => (name => "John", age => 29)
|
12
|
+
</%args>
|
13
|
+
|
14
|
+
% # A random block of Perl code
|
15
|
+
<%perl>
|
16
|
+
my @people = ('mary' 'john' 'pete' 'david');
|
17
|
+
</%perl>
|
18
|
+
|
19
|
+
% # Note how each line of code begins with the mandatory %
|
20
|
+
% foreach my $person (@people) {
|
21
|
+
Name: <% $person %>
|
22
|
+
% }
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* I like a teacher who gives you something to take
|
2
|
+
home to think about besides homework. */
|
3
|
+
let gpa_score = 5.0;
|
4
|
+
type schoolPerson = Teacher | Director | Student(string);
|
5
|
+
|
6
|
+
let greeting = person =>
|
7
|
+
switch (person) {
|
8
|
+
| Teacher => "Hey Professor!"
|
9
|
+
| Director => "Hello Director."
|
10
|
+
| Student("Richard") => "Still here Ricky?"
|
11
|
+
| Student(anyOtherName) => "Hey, " ++ anyOtherName ++ "."
|
12
|
+
};
|
data/lib/rouge/demos/sas
ADDED
data/lib/rouge/formatters/tex.rb
CHANGED
@@ -86,7 +86,11 @@ module Rouge
|
|
86
86
|
next Mathematica if contains?('(*')
|
87
87
|
next Mathematica if contains?(':=')
|
88
88
|
|
89
|
+
next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/)
|
90
|
+
|
89
91
|
next Matlab if matches?(/^\s*?%/)
|
92
|
+
|
93
|
+
next Mason if matches? %r!(</?%|<&)!
|
90
94
|
end
|
91
95
|
|
92
96
|
disambiguate '*.php' do
|
@@ -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,35 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
load_lexer 'cpp.rb'
|
6
|
+
|
7
|
+
class CUDA < Cpp
|
8
|
+
title "CUDA"
|
9
|
+
desc "Compute Unified Device Architecture, used for programming with NVIDIA GPU"
|
10
|
+
|
11
|
+
tag 'cuda'
|
12
|
+
filenames '*.cu', '*.cuh'
|
13
|
+
|
14
|
+
def self.keywords
|
15
|
+
@keywords ||= super + Set.new(%w(
|
16
|
+
__global__ __device__ __host__ __noinline__ __forceinline__
|
17
|
+
__constant__ __shared__ __managed__ __restrict__
|
18
|
+
))
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.keywords_type
|
22
|
+
@keywords_type ||= super + Set.new(%w(
|
23
|
+
char1 char2 char3 char4 uchar1 uchar2 uchar3 uchar4
|
24
|
+
short1 short2 short3 short4 ushort1 ushort2 ushort3 ushort4
|
25
|
+
int1 int2 int3 int4 uint1 uint2 uint3 uint4
|
26
|
+
long1 long2 long3 long4 ulong1 ulong2 ulong3 ulong4
|
27
|
+
longlong1 longlong2 longlong3 longlong4
|
28
|
+
ulonglong1 ulonglong2 ulonglong3 ulonglong4
|
29
|
+
float1 float2 float3 float4 double1 double2 double3 double4
|
30
|
+
dim3
|
31
|
+
))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/rouge/lexers/escape.rb
CHANGED
@@ -0,0 +1,171 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Rouge
|
5
|
+
module Lexers
|
6
|
+
class GDScript < RegexLexer
|
7
|
+
title "GDScript"
|
8
|
+
desc "The Godot Engine programming language (https://godotengine.org/)"
|
9
|
+
tag 'gdscript'
|
10
|
+
aliases 'gd', 'gdscript'
|
11
|
+
filenames '*.gd'
|
12
|
+
mimetypes 'text/x-gdscript', 'application/x-gdscript'
|
13
|
+
|
14
|
+
def self.keywords
|
15
|
+
@keywords = %w(
|
16
|
+
and in not or as breakpoint class class_name extends is func setget
|
17
|
+
signal tool const enum export onready static var break continue
|
18
|
+
if elif else for pass return match while remote master puppet
|
19
|
+
remotesync mastersync puppetsync
|
20
|
+
).join('|')
|
21
|
+
end
|
22
|
+
|
23
|
+
# Reserved for future implementation
|
24
|
+
def self.keywords_reserved
|
25
|
+
@keywords_reserved = %w(
|
26
|
+
do switch case
|
27
|
+
).join('|')
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.builtins
|
31
|
+
builtins = %w(
|
32
|
+
Color8 ColorN abs acos asin assert atan atan2 bytes2var ceil char
|
33
|
+
clamp convert cos cosh db2linear decimals dectime deg2rad dict2inst
|
34
|
+
ease exp floor fmod fposmod funcref hash inst2dict instance_from_id
|
35
|
+
is_inf is_nan lerp linear2db load log max min nearest_po2 pow
|
36
|
+
preload print print_stack printerr printraw prints printt rad2deg
|
37
|
+
rand_range rand_seed randf randi randomize range round seed sign
|
38
|
+
sin sinh sqrt stepify str str2var tan tan tanh type_exist typeof
|
39
|
+
var2bytes var2str weakref yield
|
40
|
+
).join('|')
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.builtins_type
|
44
|
+
@builtins_type = %w(
|
45
|
+
bool int float String Vector2 Rect2 Transform2D Vector3 AABB
|
46
|
+
Plane Quat Basis Transform Color RID Object NodePath Dictionary
|
47
|
+
Array PoolByteArray PoolIntArray PoolRealArray PoolStringArray
|
48
|
+
PoolVector2Array PoolVector3Array PoolColorArray null
|
49
|
+
).join('|')
|
50
|
+
end
|
51
|
+
|
52
|
+
state :root do
|
53
|
+
rule %r/\n/, Text
|
54
|
+
rule %r/[^\S\n]+/, Text
|
55
|
+
rule %r/#.*/, Comment::Single
|
56
|
+
rule %r/[\[\]{}:(),;]/, Punctuation
|
57
|
+
rule %r/\\\n/, Text
|
58
|
+
rule %r/(in|and|or|not)\b/, Operator::Word
|
59
|
+
rule %r/!=|==|<<|>>|&&|\+=|-=|\*=|\/=|%=|&=|\|=|\|\||[-~+\/*%=<>&^.!|$]/, Operator
|
60
|
+
rule %r/(func)((?:\s|\\)+)/ do
|
61
|
+
groups Keyword, Text
|
62
|
+
push :funcname
|
63
|
+
end
|
64
|
+
rule %r/(class)((?:\s|\\)+)/ do
|
65
|
+
groups Keyword, Text
|
66
|
+
push :classname
|
67
|
+
end
|
68
|
+
mixin :keywords
|
69
|
+
mixin :builtins
|
70
|
+
rule %r/"""/, Str::Double, :escape_tdqs
|
71
|
+
rule %r/'''/, Str::Double, :escape_tsqs
|
72
|
+
rule %r/"/, Str::Double, :escape_dqs
|
73
|
+
rule %r/'/, Str::Double, :escape_sqs
|
74
|
+
mixin :name
|
75
|
+
mixin :numbers
|
76
|
+
end
|
77
|
+
|
78
|
+
state :keywords do
|
79
|
+
rule %r/\b(#{GDScript.keywords})\b/, Keyword
|
80
|
+
rule %r/\b(#{GDScript.keywords_reserved})\b/, Keyword::Reserved
|
81
|
+
end
|
82
|
+
|
83
|
+
state :builtins do
|
84
|
+
rule %r/\b(#{GDScript.builtins})\b/, Name::Builtin
|
85
|
+
rule %r/\b((self|false|true)|(PI|TAU|NAN|INF))\b/, Name::Builtin::Pseudo
|
86
|
+
rule %r/\b(#{GDScript.builtins_type})\b/, Keyword::Type
|
87
|
+
end
|
88
|
+
|
89
|
+
state :numbers do
|
90
|
+
rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
|
91
|
+
rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float
|
92
|
+
rule %r/0[xX][a-fA-F0-9]+/, Num::Hex
|
93
|
+
rule %r/\d+j?/, Num::Integer
|
94
|
+
end
|
95
|
+
|
96
|
+
state :name do
|
97
|
+
rule %r/[a-zA-Z_]\w*/, Name
|
98
|
+
end
|
99
|
+
|
100
|
+
state :funcname do
|
101
|
+
rule %r/[a-zA-Z_]\w*/, Name::Function, :pop!
|
102
|
+
end
|
103
|
+
|
104
|
+
state :classname do
|
105
|
+
rule %r/[a-zA-Z_]\w*/, Name::Class, :pop!
|
106
|
+
end
|
107
|
+
|
108
|
+
state :string_escape do
|
109
|
+
rule %r/\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/, Str::Escape
|
110
|
+
end
|
111
|
+
|
112
|
+
state :strings_single do
|
113
|
+
rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
|
114
|
+
rule %r/[^\\'%\n]+/, Str::Single
|
115
|
+
rule %r/["\\]/, Str::Single
|
116
|
+
rule %r/%/, Str::Single
|
117
|
+
end
|
118
|
+
|
119
|
+
state :strings_double do
|
120
|
+
rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
|
121
|
+
rule %r/[^\\"%\n]+/, Str::Double
|
122
|
+
rule %r/['\\]/, Str::Double
|
123
|
+
rule %r/%/, Str::Double
|
124
|
+
end
|
125
|
+
|
126
|
+
state :dqs do
|
127
|
+
rule %r/"/, Str::Double, :pop!
|
128
|
+
rule %r/\\\\|\\"|\\\n/, Str::Escape
|
129
|
+
mixin :strings_double
|
130
|
+
end
|
131
|
+
|
132
|
+
state :escape_dqs do
|
133
|
+
mixin :string_escape
|
134
|
+
mixin :dqs
|
135
|
+
end
|
136
|
+
|
137
|
+
state :sqs do
|
138
|
+
rule %r/'/, Str::Single, :pop!
|
139
|
+
rule %r/\\\\|\\'|\\\n/, Str::Escape
|
140
|
+
mixin :strings_single
|
141
|
+
end
|
142
|
+
|
143
|
+
state :escape_sqs do
|
144
|
+
mixin :string_escape
|
145
|
+
mixin :sqs
|
146
|
+
end
|
147
|
+
|
148
|
+
state :tdqs do
|
149
|
+
rule %r/"""/, Str::Double, :pop!
|
150
|
+
mixin :strings_double
|
151
|
+
rule %r/\n/, Str::Double
|
152
|
+
end
|
153
|
+
|
154
|
+
state :escape_tdqs do
|
155
|
+
mixin :string_escape
|
156
|
+
mixin :tdqs
|
157
|
+
end
|
158
|
+
|
159
|
+
state :tsqs do
|
160
|
+
rule %r/'''/, Str::Single, :pop!
|
161
|
+
mixin :strings_single
|
162
|
+
rule %r/\n/, Str::Single
|
163
|
+
end
|
164
|
+
|
165
|
+
state :escape_tsqs do
|
166
|
+
mixin :string_escape
|
167
|
+
mixin :tsqs
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|