coderay 0.9.8 → 1.0.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.
- data/{lib/README → README_INDEX.rdoc} +10 -21
- data/Rakefile +6 -6
- data/bin/coderay +193 -64
- data/lib/coderay.rb +61 -105
- data/lib/coderay/duo.rb +17 -21
- data/lib/coderay/encoder.rb +100 -112
- data/lib/coderay/encoders/_map.rb +12 -7
- data/lib/coderay/encoders/comment_filter.rb +12 -30
- data/lib/coderay/encoders/count.rb +29 -11
- data/lib/coderay/encoders/debug.rb +32 -20
- data/lib/coderay/encoders/div.rb +13 -9
- data/lib/coderay/encoders/filter.rb +34 -51
- data/lib/coderay/encoders/html.rb +155 -161
- data/lib/coderay/encoders/html/css.rb +4 -9
- data/lib/coderay/encoders/html/numbering.rb +115 -0
- data/lib/coderay/encoders/html/output.rb +22 -70
- data/lib/coderay/encoders/json.rb +59 -45
- data/lib/coderay/encoders/lines_of_code.rb +12 -57
- data/lib/coderay/encoders/null.rb +6 -14
- data/lib/coderay/encoders/page.rb +13 -9
- data/lib/coderay/encoders/span.rb +13 -9
- data/lib/coderay/encoders/statistic.rb +58 -39
- data/lib/coderay/encoders/terminal.rb +179 -0
- data/lib/coderay/encoders/text.rb +31 -17
- data/lib/coderay/encoders/token_kind_filter.rb +111 -0
- data/lib/coderay/encoders/xml.rb +19 -18
- data/lib/coderay/encoders/yaml.rb +37 -9
- data/lib/coderay/for_redcloth.rb +4 -4
- data/lib/coderay/helpers/file_type.rb +127 -246
- data/lib/coderay/helpers/gzip.rb +41 -0
- data/lib/coderay/helpers/plugin.rb +241 -306
- data/lib/coderay/helpers/word_list.rb +65 -126
- data/lib/coderay/scanner.rb +173 -156
- data/lib/coderay/scanners/_map.rb +18 -17
- data/lib/coderay/scanners/c.rb +63 -77
- data/lib/coderay/scanners/clojure.rb +217 -0
- data/lib/coderay/scanners/cpp.rb +71 -84
- data/lib/coderay/scanners/css.rb +103 -120
- data/lib/coderay/scanners/debug.rb +47 -44
- data/lib/coderay/scanners/delphi.rb +70 -76
- data/lib/coderay/scanners/diff.rb +141 -50
- data/lib/coderay/scanners/erb.rb +81 -0
- data/lib/coderay/scanners/groovy.rb +104 -113
- data/lib/coderay/scanners/haml.rb +168 -0
- data/lib/coderay/scanners/html.rb +181 -110
- data/lib/coderay/scanners/java.rb +73 -75
- data/lib/coderay/scanners/java/builtin_types.rb +2 -0
- data/lib/coderay/scanners/java_script.rb +90 -101
- data/lib/coderay/scanners/json.rb +40 -53
- data/lib/coderay/scanners/php.rb +123 -147
- data/lib/coderay/scanners/python.rb +93 -91
- data/lib/coderay/scanners/raydebug.rb +66 -0
- data/lib/coderay/scanners/ruby.rb +343 -326
- data/lib/coderay/scanners/ruby/patterns.rb +40 -106
- data/lib/coderay/scanners/ruby/string_state.rb +71 -0
- data/lib/coderay/scanners/sql.rb +80 -66
- data/lib/coderay/scanners/text.rb +26 -0
- data/lib/coderay/scanners/xml.rb +1 -1
- data/lib/coderay/scanners/yaml.rb +74 -73
- data/lib/coderay/style.rb +10 -7
- data/lib/coderay/styles/_map.rb +3 -3
- data/lib/coderay/styles/alpha.rb +143 -0
- data/lib/coderay/token_kinds.rb +90 -0
- data/lib/coderay/tokens.rb +102 -277
- data/lib/coderay/tokens_proxy.rb +55 -0
- data/lib/coderay/version.rb +3 -0
- data/test/functional/basic.rb +200 -18
- data/test/functional/examples.rb +130 -0
- data/test/functional/for_redcloth.rb +15 -8
- data/test/functional/suite.rb +9 -6
- metadata +103 -123
- data/FOLDERS +0 -53
- data/bin/coderay_stylesheet +0 -4
- data/lib/coderay/encoders/html/numerization.rb +0 -133
- data/lib/coderay/encoders/term.rb +0 -158
- data/lib/coderay/encoders/token_class_filter.rb +0 -84
- data/lib/coderay/helpers/gzip_simple.rb +0 -123
- data/lib/coderay/scanners/nitro_xhtml.rb +0 -136
- data/lib/coderay/scanners/plaintext.rb +0 -20
- data/lib/coderay/scanners/rhtml.rb +0 -78
- data/lib/coderay/scanners/scheme.rb +0 -145
- data/lib/coderay/styles/cycnus.rb +0 -152
- data/lib/coderay/styles/murphy.rb +0 -134
- data/lib/coderay/token_classes.rb +0 -86
- data/test/functional/load_plugin_scanner.rb +0 -11
- data/test/functional/vhdl.rb +0 -126
- data/test/functional/word_list.rb +0 -79
@@ -1,158 +0,0 @@
|
|
1
|
-
# encoders/term.rb
|
2
|
-
# By Rob Aldred (http://robaldred.co.uk)
|
3
|
-
# Based on idea by Nathan Weizenbaum (http://nex-3.com)
|
4
|
-
# MIT License (http://www.opensource.org/licenses/mit-license.php)
|
5
|
-
#
|
6
|
-
# A CodeRay encoder that outputs code highlighted for a color terminal.
|
7
|
-
# Check out http://robaldred.co.uk
|
8
|
-
|
9
|
-
module CodeRay
|
10
|
-
module Encoders
|
11
|
-
class Term < Encoder
|
12
|
-
register_for :term
|
13
|
-
|
14
|
-
TOKEN_COLORS = {
|
15
|
-
:annotation => '35',
|
16
|
-
:attribute_name => '33',
|
17
|
-
:attribute_name_fat => '33',
|
18
|
-
:attribute_value => '31',
|
19
|
-
:attribute_value_fat => '31',
|
20
|
-
:bin => '1;35',
|
21
|
-
:char => {:self => '36', :delimiter => '34'},
|
22
|
-
:class => '1;35',
|
23
|
-
:class_variable => '36',
|
24
|
-
:color => '32',
|
25
|
-
:comment => '37',
|
26
|
-
:complex => '34',
|
27
|
-
:constant => ['34', '4'],
|
28
|
-
:decoration => '35',
|
29
|
-
:definition => '1;32',
|
30
|
-
:directive => ['32', '4'],
|
31
|
-
:doc => '46',
|
32
|
-
:doctype => '1;30',
|
33
|
-
:doc_string => ['31', '4'],
|
34
|
-
:entity => '33',
|
35
|
-
:error => ['1;33', '41'],
|
36
|
-
:exception => '1;31',
|
37
|
-
:float => '1;35',
|
38
|
-
:function => '1;34',
|
39
|
-
:global_variable => '42',
|
40
|
-
:hex => '1;36',
|
41
|
-
:important => '1;31',
|
42
|
-
:include => '33',
|
43
|
-
:integer => '1;34',
|
44
|
-
:interpreted => '1;35',
|
45
|
-
:key => '35',
|
46
|
-
:label => '1;4',
|
47
|
-
:local_variable => '33',
|
48
|
-
:oct => '1;35',
|
49
|
-
:operator_name => '1;29',
|
50
|
-
:pre_constant => '1;36',
|
51
|
-
:pre_type => '1;30',
|
52
|
-
:predefined => ['4', '1;34'],
|
53
|
-
:preprocessor => '36',
|
54
|
-
:pseudo_class => '34',
|
55
|
-
:regexp => {
|
56
|
-
:content => '31',
|
57
|
-
:delimiter => '1;29',
|
58
|
-
:modifier => '35',
|
59
|
-
:function => '1;29'
|
60
|
-
},
|
61
|
-
:reserved => '1;31',
|
62
|
-
:shell => {
|
63
|
-
:self => '42',
|
64
|
-
:content => '1;29',
|
65
|
-
:delimiter => '37',
|
66
|
-
},
|
67
|
-
:string => {
|
68
|
-
:self => '32',
|
69
|
-
:modifier => '1;32',
|
70
|
-
:escape => '1;36',
|
71
|
-
:delimiter => '1;32',
|
72
|
-
},
|
73
|
-
:symbol => '1;32',
|
74
|
-
:tag => '34',
|
75
|
-
:tag_fat => '1;34',
|
76
|
-
:tag_special => ['34', '4'],
|
77
|
-
:type => '1;34',
|
78
|
-
:value => '36',
|
79
|
-
:variable => '34',
|
80
|
-
:insert => '42',
|
81
|
-
:delete => '41',
|
82
|
-
:change => '44',
|
83
|
-
:head => '45',
|
84
|
-
}
|
85
|
-
TOKEN_COLORS[:keyword] = TOKEN_COLORS[:reserved]
|
86
|
-
TOKEN_COLORS[:method] = TOKEN_COLORS[:function]
|
87
|
-
TOKEN_COLORS[:imaginary] = TOKEN_COLORS[:complex]
|
88
|
-
TOKEN_COLORS[:open] = TOKEN_COLORS[:close] = TOKEN_COLORS[:nesting_delimiter] = TOKEN_COLORS[:escape] = TOKEN_COLORS[:delimiter]
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
def setup(options)
|
93
|
-
@out = ''
|
94
|
-
@opened = [nil]
|
95
|
-
@subcolors = nil
|
96
|
-
end
|
97
|
-
|
98
|
-
def finish(options)
|
99
|
-
super
|
100
|
-
end
|
101
|
-
|
102
|
-
def token text, type = :plain
|
103
|
-
case text
|
104
|
-
|
105
|
-
when nil
|
106
|
-
# raise 'Token with nil as text was given: %p' % [[text, type]]
|
107
|
-
|
108
|
-
when String
|
109
|
-
|
110
|
-
if color = (@subcolors || TOKEN_COLORS)[type]
|
111
|
-
color = color[:self] || return if Hash === color
|
112
|
-
|
113
|
-
@out << col(color) + text.gsub("\n", col(0) + "\n" + col(color)) + col(0)
|
114
|
-
@out << col(@subcolors[:self]) if @subcolors && @subcolors[:self]
|
115
|
-
else
|
116
|
-
@out << text
|
117
|
-
end
|
118
|
-
|
119
|
-
# token groups, eg. strings
|
120
|
-
when :open
|
121
|
-
@opened[0] = type
|
122
|
-
if color = TOKEN_COLORS[type]
|
123
|
-
if Hash === color
|
124
|
-
@subcolors = color
|
125
|
-
@out << col(color[:self]) if color[:self]
|
126
|
-
else
|
127
|
-
@subcolors = {}
|
128
|
-
@out << col(color)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
@opened << type
|
132
|
-
when :close
|
133
|
-
if @opened.empty?
|
134
|
-
# nothing to close
|
135
|
-
else
|
136
|
-
@out << col(0) if (@subcolors || {})[:self]
|
137
|
-
@subcolors = nil
|
138
|
-
@opened.pop
|
139
|
-
end
|
140
|
-
|
141
|
-
# whole lines to be highlighted, eg. a added/modified/deleted lines in a diff
|
142
|
-
when :begin_line
|
143
|
-
|
144
|
-
when :end_line
|
145
|
-
|
146
|
-
else
|
147
|
-
raise 'unknown token kind: %p' % [text]
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
private
|
152
|
-
|
153
|
-
def col(color)
|
154
|
-
Array(color).map { |c| "\e[#{c}m" }.join
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
2
|
-
module CodeRay
|
3
|
-
module Encoders
|
4
|
-
|
5
|
-
load :filter
|
6
|
-
|
7
|
-
class TokenClassFilter < Filter
|
8
|
-
|
9
|
-
include Streamable
|
10
|
-
register_for :token_class_filter
|
11
|
-
|
12
|
-
DEFAULT_OPTIONS = {
|
13
|
-
:exclude => [],
|
14
|
-
:include => :all
|
15
|
-
}
|
16
|
-
|
17
|
-
protected
|
18
|
-
def setup options
|
19
|
-
super
|
20
|
-
@exclude = options[:exclude]
|
21
|
-
@exclude = Array(@exclude) unless @exclude == :all
|
22
|
-
@include = options[:include]
|
23
|
-
@include = Array(@include) unless @include == :all
|
24
|
-
end
|
25
|
-
|
26
|
-
def include_text_token? text, kind
|
27
|
-
(@include == :all || @include.include?(kind)) &&
|
28
|
-
!(@exclude == :all || @exclude.include?(kind))
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
if $0 == __FILE__
|
37
|
-
$VERBOSE = true
|
38
|
-
$: << File.join(File.dirname(__FILE__), '..')
|
39
|
-
eval DATA.read, nil, $0, __LINE__ + 4
|
40
|
-
end
|
41
|
-
|
42
|
-
__END__
|
43
|
-
require 'test/unit'
|
44
|
-
|
45
|
-
class TokenClassFilterTest < Test::Unit::TestCase
|
46
|
-
|
47
|
-
def test_creation
|
48
|
-
assert CodeRay::Encoders::TokenClassFilter < CodeRay::Encoders::Encoder
|
49
|
-
assert CodeRay::Encoders::TokenClassFilter < CodeRay::Encoders::Filter
|
50
|
-
filter = nil
|
51
|
-
assert_nothing_raised do
|
52
|
-
filter = CodeRay.encoder :token_class_filter
|
53
|
-
end
|
54
|
-
assert_instance_of CodeRay::Encoders::TokenClassFilter, filter
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_filtering_text_tokens
|
58
|
-
tokens = CodeRay::Tokens.new
|
59
|
-
for i in 1..10
|
60
|
-
tokens << [i.to_s, :index]
|
61
|
-
tokens << [' ', :space] if i < 10
|
62
|
-
end
|
63
|
-
assert_equal 10, CodeRay::Encoders::TokenClassFilter.new.encode_tokens(tokens, :exclude => :space).size
|
64
|
-
assert_equal 10, tokens.token_class_filter(:exclude => :space).size
|
65
|
-
assert_equal 9, CodeRay::Encoders::TokenClassFilter.new.encode_tokens(tokens, :include => :space).size
|
66
|
-
assert_equal 9, tokens.token_class_filter(:include => :space).size
|
67
|
-
assert_equal 0, CodeRay::Encoders::TokenClassFilter.new.encode_tokens(tokens, :exclude => :all).size
|
68
|
-
assert_equal 0, tokens.token_class_filter(:exclude => :all).size
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_filtering_block_tokens
|
72
|
-
tokens = CodeRay::Tokens.new
|
73
|
-
10.times do |i|
|
74
|
-
tokens << [:open, :index]
|
75
|
-
tokens << [i.to_s, :content]
|
76
|
-
tokens << [:close, :index]
|
77
|
-
end
|
78
|
-
assert_equal 20, CodeRay::Encoders::TokenClassFilter.new.encode_tokens(tokens, :include => :blubb).size
|
79
|
-
assert_equal 20, tokens.token_class_filter(:include => :blubb).size
|
80
|
-
assert_equal 30, CodeRay::Encoders::TokenClassFilter.new.encode_tokens(tokens, :exclude => :index).size
|
81
|
-
assert_equal 30, tokens.token_class_filter(:exclude => :index).size
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
@@ -1,123 +0,0 @@
|
|
1
|
-
# =GZip Simple
|
2
|
-
#
|
3
|
-
# A simplified interface to the gzip library +zlib+ (from the Ruby Standard Library.)
|
4
|
-
#
|
5
|
-
# Author: murphy (mail to murphy rubychan de)
|
6
|
-
#
|
7
|
-
# Version: 0.2 (2005.may.28)
|
8
|
-
#
|
9
|
-
# ==Documentation
|
10
|
-
#
|
11
|
-
# See +GZip+ module and the +String+ extensions.
|
12
|
-
#
|
13
|
-
module GZip
|
14
|
-
|
15
|
-
require 'zlib'
|
16
|
-
|
17
|
-
# The default zipping level. 7 zips good and fast.
|
18
|
-
DEFAULT_GZIP_LEVEL = 7
|
19
|
-
|
20
|
-
# Unzips the given string +s+.
|
21
|
-
#
|
22
|
-
# Example:
|
23
|
-
# require 'gzip_simple'
|
24
|
-
# print GZip.gunzip(File.read('adresses.gz'))
|
25
|
-
def GZip.gunzip s
|
26
|
-
Zlib::Inflate.inflate s
|
27
|
-
end
|
28
|
-
|
29
|
-
# Zips the given string +s+.
|
30
|
-
#
|
31
|
-
# Example:
|
32
|
-
# require 'gzip_simple'
|
33
|
-
# File.open('adresses.gz', 'w') do |file
|
34
|
-
# file.write GZip.gzip('Mum: 0123 456 789', 9)
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# If you provide a +level+, you can control how strong
|
38
|
-
# the string is compressed:
|
39
|
-
# - 0: no compression, only convert to gzip format
|
40
|
-
# - 1: compress fast
|
41
|
-
# - 7: compress more, but still fast (default)
|
42
|
-
# - 8: compress more, slower
|
43
|
-
# - 9: compress best, very slow
|
44
|
-
def GZip.gzip s, level = DEFAULT_GZIP_LEVEL
|
45
|
-
Zlib::Deflate.new(level).deflate s, Zlib::FINISH
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
# String extensions to use the GZip module.
|
51
|
-
#
|
52
|
-
# The methods gzip and gunzip provide an even more simple
|
53
|
-
# interface to the ZLib:
|
54
|
-
#
|
55
|
-
# # create a big string
|
56
|
-
# x = 'a' * 1000
|
57
|
-
#
|
58
|
-
# # zip it
|
59
|
-
# x_gz = x.gzip
|
60
|
-
#
|
61
|
-
# # test the result
|
62
|
-
# puts 'Zipped %d bytes to %d bytes.' % [x.size, x_gz.size]
|
63
|
-
# #-> Zipped 1000 bytes to 19 bytes.
|
64
|
-
#
|
65
|
-
# # unzipping works
|
66
|
-
# p x_gz.gunzip == x #-> true
|
67
|
-
class String
|
68
|
-
# Returns the string, unzipped.
|
69
|
-
# See GZip.gunzip
|
70
|
-
def gunzip
|
71
|
-
GZip.gunzip self
|
72
|
-
end
|
73
|
-
# Replaces the string with its unzipped value.
|
74
|
-
# See GZip.gunzip
|
75
|
-
def gunzip!
|
76
|
-
replace gunzip
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns the string, zipped.
|
80
|
-
# +level+ is the gzip compression level, see GZip.gzip.
|
81
|
-
def gzip level = GZip::DEFAULT_GZIP_LEVEL
|
82
|
-
GZip.gzip self, level
|
83
|
-
end
|
84
|
-
# Replaces the string with its zipped value.
|
85
|
-
# See GZip.gzip.
|
86
|
-
def gzip!(*args)
|
87
|
-
replace gzip(*args)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
if $0 == __FILE__
|
92
|
-
eval DATA.read, nil, $0, __LINE__+4
|
93
|
-
end
|
94
|
-
|
95
|
-
__END__
|
96
|
-
#CODE
|
97
|
-
|
98
|
-
# Testing / Benchmark
|
99
|
-
x = 'a' * 1000
|
100
|
-
x_gz = x.gzip
|
101
|
-
puts 'Zipped %d bytes to %d bytes.' % [x.size, x_gz.size] #-> Zipped 1000 bytes to 19 bytes.
|
102
|
-
p x_gz.gunzip == x #-> true
|
103
|
-
|
104
|
-
require 'benchmark'
|
105
|
-
|
106
|
-
INFO = 'packed to %0.3f%%' # :nodoc:
|
107
|
-
|
108
|
-
x = Array.new(100000) { rand(255).chr + 'aaaaaaaaa' + rand(255).chr }.join
|
109
|
-
Benchmark.bm(10) do |bm|
|
110
|
-
for level in 0..9
|
111
|
-
bm.report "zip #{level}" do
|
112
|
-
$x = x.gzip level
|
113
|
-
end
|
114
|
-
puts INFO % [100.0 * $x.size / x.size]
|
115
|
-
end
|
116
|
-
bm.report 'zip' do
|
117
|
-
$x = x.gzip
|
118
|
-
end
|
119
|
-
puts INFO % [100.0 * $x.size / x.size]
|
120
|
-
bm.report 'unzip' do
|
121
|
-
$x.gunzip
|
122
|
-
end
|
123
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
module CodeRay
|
2
|
-
module Scanners
|
3
|
-
|
4
|
-
load :html
|
5
|
-
load :ruby
|
6
|
-
|
7
|
-
# Nitro XHTML Scanner
|
8
|
-
class NitroXHTML < Scanner
|
9
|
-
|
10
|
-
include Streamable
|
11
|
-
register_for :nitro_xhtml
|
12
|
-
file_extension :xhtml
|
13
|
-
title 'Nitro XHTML'
|
14
|
-
|
15
|
-
KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
|
16
|
-
|
17
|
-
NITRO_RUBY_BLOCK = /
|
18
|
-
<\?r
|
19
|
-
(?>
|
20
|
-
[^\?]*
|
21
|
-
(?> \?(?!>) [^\?]* )*
|
22
|
-
)
|
23
|
-
(?: \?> )?
|
24
|
-
|
|
25
|
-
<ruby>
|
26
|
-
(?>
|
27
|
-
[^<]*
|
28
|
-
(?> <(?!\/ruby>) [^<]* )*
|
29
|
-
)
|
30
|
-
(?: <\/ruby> )?
|
31
|
-
|
|
32
|
-
<%
|
33
|
-
(?>
|
34
|
-
[^%]*
|
35
|
-
(?> %(?!>) [^%]* )*
|
36
|
-
)
|
37
|
-
(?: %> )?
|
38
|
-
/mx
|
39
|
-
|
40
|
-
NITRO_VALUE_BLOCK = /
|
41
|
-
\#
|
42
|
-
(?:
|
43
|
-
\{
|
44
|
-
[^{}]*
|
45
|
-
(?>
|
46
|
-
\{ [^}]* \}
|
47
|
-
(?> [^{}]* )
|
48
|
-
)*
|
49
|
-
\}?
|
50
|
-
| \| [^|]* \|?
|
51
|
-
| \( [^)]* \)?
|
52
|
-
| \[ [^\]]* \]?
|
53
|
-
| \\ [^\\]* \\?
|
54
|
-
)
|
55
|
-
/x
|
56
|
-
|
57
|
-
NITRO_ENTITY = /
|
58
|
-
% (?: \#\d+ | \w+ ) ;
|
59
|
-
/
|
60
|
-
|
61
|
-
START_OF_RUBY = /
|
62
|
-
(?=[<\#%])
|
63
|
-
< (?: \?r | % | ruby> )
|
64
|
-
| \# [{(|]
|
65
|
-
| % (?: \#\d+ | \w+ ) ;
|
66
|
-
/x
|
67
|
-
|
68
|
-
CLOSING_PAREN = Hash.new do |h, p|
|
69
|
-
h[p] = p
|
70
|
-
end.update( {
|
71
|
-
'(' => ')',
|
72
|
-
'[' => ']',
|
73
|
-
'{' => '}',
|
74
|
-
} )
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def setup
|
79
|
-
@ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
|
80
|
-
@html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
|
81
|
-
end
|
82
|
-
|
83
|
-
def reset_instance
|
84
|
-
super
|
85
|
-
@html_scanner.reset
|
86
|
-
end
|
87
|
-
|
88
|
-
def scan_tokens tokens, options
|
89
|
-
|
90
|
-
until eos?
|
91
|
-
|
92
|
-
if (match = scan_until(/(?=#{START_OF_RUBY})/o) || scan_rest) && !match.empty?
|
93
|
-
@html_scanner.tokenize match
|
94
|
-
|
95
|
-
elsif match = scan(/#{NITRO_VALUE_BLOCK}/o)
|
96
|
-
start_tag = match[0,2]
|
97
|
-
delimiter = CLOSING_PAREN[start_tag[1,1]]
|
98
|
-
end_tag = match[-1,1] == delimiter ? delimiter : ''
|
99
|
-
tokens << [:open, :inline]
|
100
|
-
tokens << [start_tag, :inline_delimiter]
|
101
|
-
code = match[start_tag.size .. -1 - end_tag.size]
|
102
|
-
@ruby_scanner.tokenize code
|
103
|
-
tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
|
104
|
-
tokens << [:close, :inline]
|
105
|
-
|
106
|
-
elsif match = scan(/#{NITRO_RUBY_BLOCK}/o)
|
107
|
-
start_tag = '<?r'
|
108
|
-
end_tag = match[-2,2] == '?>' ? '?>' : ''
|
109
|
-
tokens << [:open, :inline]
|
110
|
-
tokens << [start_tag, :inline_delimiter]
|
111
|
-
code = match[start_tag.size .. -(end_tag.size)-1]
|
112
|
-
@ruby_scanner.tokenize code
|
113
|
-
tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
|
114
|
-
tokens << [:close, :inline]
|
115
|
-
|
116
|
-
elsif entity = scan(/#{NITRO_ENTITY}/o)
|
117
|
-
tokens << [entity, :entity]
|
118
|
-
|
119
|
-
elsif scan(/%/)
|
120
|
-
tokens << [matched, :error]
|
121
|
-
|
122
|
-
else
|
123
|
-
raise_inspect 'else-case reached!', tokens
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
tokens
|
130
|
-
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|