coderay 1.0.0 → 1.0.0.598.pre
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/FOLDERS +49 -0
- data/Rakefile +6 -5
- data/bin/coderay +74 -190
- data/bin/coderay_stylesheet +4 -0
- data/{README_INDEX.rdoc → lib/README} +20 -10
- data/lib/coderay.rb +60 -62
- data/lib/coderay/duo.rb +55 -2
- data/lib/coderay/encoder.rb +39 -52
- data/lib/coderay/encoders/_map.rb +7 -11
- data/lib/coderay/encoders/comment_filter.rb +61 -0
- data/lib/coderay/encoders/count.rb +26 -11
- data/lib/coderay/encoders/debug.rb +60 -11
- data/lib/coderay/encoders/div.rb +8 -9
- data/lib/coderay/encoders/filter.rb +52 -12
- data/lib/coderay/encoders/html.rb +113 -106
- data/lib/coderay/encoders/html/css.rb +7 -2
- data/lib/coderay/encoders/html/numbering.rb +27 -24
- data/lib/coderay/encoders/html/output.rb +58 -15
- data/lib/coderay/encoders/json.rb +44 -37
- data/lib/coderay/encoders/lines_of_code.rb +56 -9
- data/lib/coderay/encoders/null.rb +13 -6
- data/lib/coderay/encoders/page.rb +8 -8
- data/lib/coderay/encoders/span.rb +9 -10
- data/lib/coderay/encoders/statistic.rb +114 -51
- data/lib/coderay/encoders/terminal.rb +10 -7
- data/lib/coderay/encoders/text.rb +36 -17
- data/lib/coderay/encoders/token_kind_filter.rb +58 -1
- data/lib/coderay/encoders/xml.rb +11 -13
- data/lib/coderay/encoders/yaml.rb +14 -16
- data/lib/coderay/for_redcloth.rb +1 -1
- data/lib/coderay/helpers/file_type.rb +240 -125
- data/lib/coderay/helpers/gzip_simple.rb +123 -0
- data/lib/coderay/helpers/plugin.rb +307 -241
- data/lib/coderay/helpers/word_list.rb +126 -65
- data/lib/coderay/scanner.rb +103 -153
- data/lib/coderay/scanners/_map.rb +16 -18
- data/lib/coderay/scanners/c.rb +13 -13
- data/lib/coderay/scanners/cpp.rb +6 -6
- data/lib/coderay/scanners/css.rb +48 -47
- data/lib/coderay/scanners/debug.rb +55 -9
- data/lib/coderay/scanners/delphi.rb +4 -4
- data/lib/coderay/scanners/diff.rb +25 -43
- data/lib/coderay/scanners/groovy.rb +2 -2
- data/lib/coderay/scanners/html.rb +30 -107
- data/lib/coderay/scanners/java.rb +5 -6
- data/lib/coderay/scanners/java/builtin_types.rb +0 -2
- data/lib/coderay/scanners/java_script.rb +6 -6
- data/lib/coderay/scanners/json.rb +6 -7
- data/lib/coderay/scanners/nitro_xhtml.rb +136 -0
- data/lib/coderay/scanners/php.rb +12 -13
- data/lib/coderay/scanners/plaintext.rb +26 -0
- data/lib/coderay/scanners/python.rb +4 -4
- data/lib/coderay/scanners/{erb.rb → rhtml.rb} +11 -19
- data/lib/coderay/scanners/ruby.rb +208 -219
- data/lib/coderay/scanners/ruby/patterns.rb +85 -18
- data/lib/coderay/scanners/scheme.rb +136 -0
- data/lib/coderay/scanners/sql.rb +22 -29
- data/lib/coderay/scanners/yaml.rb +10 -11
- data/lib/coderay/styles/_map.rb +2 -2
- data/lib/coderay/styles/alpha.rb +104 -102
- data/lib/coderay/styles/cycnus.rb +143 -0
- data/lib/coderay/styles/murphy.rb +123 -0
- data/lib/coderay/token_kinds.rb +86 -87
- data/lib/coderay/tokens.rb +169 -26
- data/test/functional/basic.rb +14 -200
- data/test/functional/examples.rb +14 -20
- data/test/functional/for_redcloth.rb +8 -15
- data/test/functional/load_plugin_scanner.rb +11 -0
- data/test/functional/suite.rb +6 -9
- data/test/functional/vhdl.rb +126 -0
- data/test/functional/word_list.rb +79 -0
- metadata +129 -107
- data/lib/coderay/helpers/gzip.rb +0 -41
- data/lib/coderay/scanners/clojure.rb +0 -217
- data/lib/coderay/scanners/haml.rb +0 -168
- data/lib/coderay/scanners/ruby/string_state.rb +0 -71
- data/lib/coderay/scanners/text.rb +0 -26
- data/lib/coderay/tokens_proxy.rb +0 -55
- data/lib/coderay/version.rb +0 -3
data/lib/coderay/helpers/gzip.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module CodeRay
|
2
|
-
|
3
|
-
# A simplified interface to the gzip library +zlib+ (from the Ruby Standard Library.)
|
4
|
-
module GZip
|
5
|
-
|
6
|
-
require 'zlib'
|
7
|
-
|
8
|
-
# The default zipping level. 7 zips good and fast.
|
9
|
-
DEFAULT_GZIP_LEVEL = 7
|
10
|
-
|
11
|
-
# Unzips the given string +s+.
|
12
|
-
#
|
13
|
-
# Example:
|
14
|
-
# require 'gzip_simple'
|
15
|
-
# print GZip.gunzip(File.read('adresses.gz'))
|
16
|
-
def GZip.gunzip s
|
17
|
-
Zlib::Inflate.inflate s
|
18
|
-
end
|
19
|
-
|
20
|
-
# Zips the given string +s+.
|
21
|
-
#
|
22
|
-
# Example:
|
23
|
-
# require 'gzip_simple'
|
24
|
-
# File.open('adresses.gz', 'w') do |file
|
25
|
-
# file.write GZip.gzip('Mum: 0123 456 789', 9)
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# If you provide a +level+, you can control how strong
|
29
|
-
# the string is compressed:
|
30
|
-
# - 0: no compression, only convert to gzip format
|
31
|
-
# - 1: compress fast
|
32
|
-
# - 7: compress more, but still fast (default)
|
33
|
-
# - 8: compress more, slower
|
34
|
-
# - 9: compress best, very slow
|
35
|
-
def GZip.gzip s, level = DEFAULT_GZIP_LEVEL
|
36
|
-
Zlib::Deflate.new(level).deflate s, Zlib::FINISH
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
@@ -1,217 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module CodeRay
|
3
|
-
module Scanners
|
4
|
-
|
5
|
-
# Clojure scanner by Licenser.
|
6
|
-
class Clojure < Scanner
|
7
|
-
|
8
|
-
register_for :clojure
|
9
|
-
file_extension 'clj'
|
10
|
-
|
11
|
-
SPECIAL_FORMS = %w[
|
12
|
-
def if do let quote var fn loop recur throw try catch monitor-enter monitor-exit .
|
13
|
-
new
|
14
|
-
] # :nodoc:
|
15
|
-
|
16
|
-
CORE_FORMS = %w[
|
17
|
-
+ - -> ->> .. / * <= < = == >= > accessor aclone add-classpath add-watch
|
18
|
-
agent agent-error agent-errors aget alength alias all-ns alter alter-meta!
|
19
|
-
alter-var-root amap ancestors and apply areduce array-map aset aset-boolean
|
20
|
-
aset-byte aset-char aset-double aset-float aset-int aset-long aset-short
|
21
|
-
assert assoc assoc! assoc-in associative? atom await await-for bases bean
|
22
|
-
bigdec bigint binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or
|
23
|
-
bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array
|
24
|
-
booleans bound-fn bound-fn* bound? butlast byte byte-array bytes case cast char
|
25
|
-
char-array char-escape-string char-name-string char? chars class class?
|
26
|
-
clear-agent-errors clojure-version coll? comment commute comp comparator
|
27
|
-
compare compare-and-set! compile complement concat cond condp conj conj!
|
28
|
-
cons constantly construct-proxy contains? count counted? create-ns
|
29
|
-
create-struct cycle dec decimal? declare definline defmacro defmethod defmulti
|
30
|
-
defn defn- defonce defprotocol defrecord defstruct deftype delay delay?
|
31
|
-
deliver denominator deref derive descendants disj disj! dissoc dissoc!
|
32
|
-
distinct distinct? doall doc dorun doseq dosync dotimes doto double
|
33
|
-
double-array doubles drop drop-last drop-while empty empty? ensure
|
34
|
-
enumeration-seq error-handler error-mode eval even? every? extend
|
35
|
-
extend-protocol extend-type extenders extends? false? ffirst file-seq
|
36
|
-
filter find find-doc find-ns find-var first float float-array float?
|
37
|
-
floats flush fn fn? fnext for force format future future-call future-cancel
|
38
|
-
future-cancelled? future-done? future? gen-class gen-interface gensym get
|
39
|
-
get-in get-method get-proxy-class get-thread-bindings get-validator hash
|
40
|
-
hash-map hash-set identical? identity if-let if-not ifn? import in-ns
|
41
|
-
inc init-proxy instance? int int-array integer? interleave intern
|
42
|
-
interpose into into-array ints io! isa? iterate iterator-seq juxt key
|
43
|
-
keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list*
|
44
|
-
list? load load-file load-reader load-string loaded-libs locking long
|
45
|
-
long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy
|
46
|
-
map map? mapcat max max-key memfn memoize merge merge-with meta methods
|
47
|
-
min min-key mod name namespace neg? newline next nfirst nil? nnext not
|
48
|
-
not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns
|
49
|
-
ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth
|
50
|
-
nthnext num number? numerator object-array odd? or parents partial
|
51
|
-
partition pcalls peek persistent! pmap pop pop! pop-thread-bindings
|
52
|
-
pos? pr pr-str prefer-method prefers print print-namespace-doc
|
53
|
-
print-str printf println println-str prn prn-str promise proxy
|
54
|
-
proxy-mappings proxy-super push-thread-bindings pvalues quot rand
|
55
|
-
rand-int range ratio? rationalize re-find re-groups re-matcher
|
56
|
-
re-matches re-pattern re-seq read read-line read-string reduce ref
|
57
|
-
ref-history-count ref-max-history ref-min-history ref-set refer
|
58
|
-
refer-clojure reify release-pending-sends rem remove remove-all-methods
|
59
|
-
remove-method remove-ns remove-watch repeat repeatedly replace replicate
|
60
|
-
require reset! reset-meta! resolve rest restart-agent resultset-seq
|
61
|
-
reverse reversible? rseq rsubseq satisfies? second select-keys send
|
62
|
-
send-off seq seq? seque sequence sequential? set set-error-handler!
|
63
|
-
set-error-mode! set-validator! set? short short-array shorts
|
64
|
-
shutdown-agents slurp some sort sort-by sorted-map sorted-map-by
|
65
|
-
sorted-set sorted-set-by sorted? special-form-anchor special-symbol?
|
66
|
-
split-at split-with str string? struct struct-map subs subseq subvec
|
67
|
-
supers swap! symbol symbol? sync syntax-symbol-anchor take take-last
|
68
|
-
take-nth take-while test the-ns thread-bound? time to-array to-array-2d
|
69
|
-
trampoline transient tree-seq true? type unchecked-add unchecked-dec
|
70
|
-
unchecked-divide unchecked-inc unchecked-multiply unchecked-negate
|
71
|
-
unchecked-remainder unchecked-subtract underive update-in update-proxy
|
72
|
-
use val vals var-get var-set var? vary-meta vec vector vector-of vector?
|
73
|
-
when when-first when-let when-not while with-bindings with-bindings*
|
74
|
-
with-in-str with-local-vars with-meta with-open with-out-str
|
75
|
-
with-precision xml-seq zero? zipmap
|
76
|
-
] # :nodoc:
|
77
|
-
|
78
|
-
PREDEFINED_CONSTANTS = %w[
|
79
|
-
true false nil *1 *2 *3 *agent* *clojure-version* *command-line-args*
|
80
|
-
*compile-files* *compile-path* *e *err* *file* *flush-on-newline*
|
81
|
-
*in* *ns* *out* *print-dup* *print-length* *print-level* *print-meta*
|
82
|
-
*print-readably* *read-eval* *warn-on-reflection*
|
83
|
-
] # :nodoc:
|
84
|
-
|
85
|
-
IDENT_KIND = WordList.new(:ident).
|
86
|
-
add(SPECIAL_FORMS, :keyword).
|
87
|
-
add(CORE_FORMS, :keyword).
|
88
|
-
add(PREDEFINED_CONSTANTS, :predefined_constant)
|
89
|
-
|
90
|
-
KEYWORD_NEXT_TOKEN_KIND = WordList.new(nil).
|
91
|
-
add(%w[ def defn defn- definline defmacro defmulti defmethod defstruct defonce declare ], :function).
|
92
|
-
add(%w[ ns ], :namespace).
|
93
|
-
add(%w[ defprotocol defrecord ], :class)
|
94
|
-
|
95
|
-
BASIC_IDENTIFIER = /[a-zA-Z$%*\/_+!?&<>\-=]=?[a-zA-Z0-9$&*+!\/_?<>\-\#]*/
|
96
|
-
IDENTIFIER = /(?!-\d)(?:(?:#{BASIC_IDENTIFIER}\.)*#{BASIC_IDENTIFIER}(?:\/#{BASIC_IDENTIFIER})?\.?)|\.\.?/
|
97
|
-
SYMBOL = /::?#{IDENTIFIER}/o
|
98
|
-
DIGIT = /\d/
|
99
|
-
DIGIT10 = DIGIT
|
100
|
-
DIGIT16 = /[0-9a-f]/i
|
101
|
-
DIGIT8 = /[0-7]/
|
102
|
-
DIGIT2 = /[01]/
|
103
|
-
RADIX16 = /\#x/i
|
104
|
-
RADIX8 = /\#o/i
|
105
|
-
RADIX2 = /\#b/i
|
106
|
-
RADIX10 = /\#d/i
|
107
|
-
EXACTNESS = /#i|#e/i
|
108
|
-
SIGN = /[\+-]?/
|
109
|
-
EXP_MARK = /[esfdl]/i
|
110
|
-
EXP = /#{EXP_MARK}#{SIGN}#{DIGIT}+/
|
111
|
-
SUFFIX = /#{EXP}?/
|
112
|
-
PREFIX10 = /#{RADIX10}?#{EXACTNESS}?|#{EXACTNESS}?#{RADIX10}?/
|
113
|
-
PREFIX16 = /#{RADIX16}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX16}/
|
114
|
-
PREFIX8 = /#{RADIX8}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX8}/
|
115
|
-
PREFIX2 = /#{RADIX2}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX2}/
|
116
|
-
UINT10 = /#{DIGIT10}+#*/
|
117
|
-
UINT16 = /#{DIGIT16}+#*/
|
118
|
-
UINT8 = /#{DIGIT8}+#*/
|
119
|
-
UINT2 = /#{DIGIT2}+#*/
|
120
|
-
DECIMAL = /#{DIGIT10}+#+\.#*#{SUFFIX}|#{DIGIT10}+\.#{DIGIT10}*#*#{SUFFIX}|\.#{DIGIT10}+#*#{SUFFIX}|#{UINT10}#{EXP}/
|
121
|
-
UREAL10 = /#{UINT10}\/#{UINT10}|#{DECIMAL}|#{UINT10}/
|
122
|
-
UREAL16 = /#{UINT16}\/#{UINT16}|#{UINT16}/
|
123
|
-
UREAL8 = /#{UINT8}\/#{UINT8}|#{UINT8}/
|
124
|
-
UREAL2 = /#{UINT2}\/#{UINT2}|#{UINT2}/
|
125
|
-
REAL10 = /#{SIGN}#{UREAL10}/
|
126
|
-
REAL16 = /#{SIGN}#{UREAL16}/
|
127
|
-
REAL8 = /#{SIGN}#{UREAL8}/
|
128
|
-
REAL2 = /#{SIGN}#{UREAL2}/
|
129
|
-
IMAG10 = /i|#{UREAL10}i/
|
130
|
-
IMAG16 = /i|#{UREAL16}i/
|
131
|
-
IMAG8 = /i|#{UREAL8}i/
|
132
|
-
IMAG2 = /i|#{UREAL2}i/
|
133
|
-
COMPLEX10 = /#{REAL10}@#{REAL10}|#{REAL10}\+#{IMAG10}|#{REAL10}-#{IMAG10}|\+#{IMAG10}|-#{IMAG10}|#{REAL10}/
|
134
|
-
COMPLEX16 = /#{REAL16}@#{REAL16}|#{REAL16}\+#{IMAG16}|#{REAL16}-#{IMAG16}|\+#{IMAG16}|-#{IMAG16}|#{REAL16}/
|
135
|
-
COMPLEX8 = /#{REAL8}@#{REAL8}|#{REAL8}\+#{IMAG8}|#{REAL8}-#{IMAG8}|\+#{IMAG8}|-#{IMAG8}|#{REAL8}/
|
136
|
-
COMPLEX2 = /#{REAL2}@#{REAL2}|#{REAL2}\+#{IMAG2}|#{REAL2}-#{IMAG2}|\+#{IMAG2}|-#{IMAG2}|#{REAL2}/
|
137
|
-
NUM10 = /#{PREFIX10}?#{COMPLEX10}/
|
138
|
-
NUM16 = /#{PREFIX16}#{COMPLEX16}/
|
139
|
-
NUM8 = /#{PREFIX8}#{COMPLEX8}/
|
140
|
-
NUM2 = /#{PREFIX2}#{COMPLEX2}/
|
141
|
-
NUM = /#{NUM10}|#{NUM16}|#{NUM8}|#{NUM2}/
|
142
|
-
|
143
|
-
protected
|
144
|
-
|
145
|
-
def scan_tokens encoder, options
|
146
|
-
|
147
|
-
state = :initial
|
148
|
-
kind = nil
|
149
|
-
|
150
|
-
until eos?
|
151
|
-
|
152
|
-
case state
|
153
|
-
when :initial
|
154
|
-
if match = scan(/ \s+ | \\\n | , /x)
|
155
|
-
encoder.text_token match, :space
|
156
|
-
elsif match = scan(/['`\(\[\)\]\{\}]|\#[({]|~@?|[@\^]/)
|
157
|
-
encoder.text_token match, :operator
|
158
|
-
elsif match = scan(/;.*/)
|
159
|
-
encoder.text_token match, :comment # TODO: recognize (comment ...) too
|
160
|
-
elsif match = scan(/\#?\\(?:newline|space|.?)/)
|
161
|
-
encoder.text_token match, :char
|
162
|
-
elsif match = scan(/\#[ft]/)
|
163
|
-
encoder.text_token match, :predefined_constant
|
164
|
-
elsif match = scan(/#{IDENTIFIER}/o)
|
165
|
-
kind = IDENT_KIND[match]
|
166
|
-
encoder.text_token match, kind
|
167
|
-
if rest? && kind == :keyword
|
168
|
-
if kind = KEYWORD_NEXT_TOKEN_KIND[match]
|
169
|
-
encoder.text_token match, :space if match = scan(/\s+/o)
|
170
|
-
encoder.text_token match, kind if match = scan(/#{IDENTIFIER}/o)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
elsif match = scan(/#{SYMBOL}/o)
|
174
|
-
encoder.text_token match, :symbol
|
175
|
-
elsif match = scan(/\./)
|
176
|
-
encoder.text_token match, :operator
|
177
|
-
elsif match = scan(/ \# \^ #{IDENTIFIER} /ox)
|
178
|
-
encoder.text_token match, :type
|
179
|
-
elsif match = scan(/ (\#)? " /x)
|
180
|
-
state = self[1] ? :regexp : :string
|
181
|
-
encoder.begin_group state
|
182
|
-
encoder.text_token match, :delimiter
|
183
|
-
elsif match = scan(/#{NUM}/o) and not matched.empty?
|
184
|
-
encoder.text_token match, match[/[.e\/]/i] ? :float : :integer
|
185
|
-
else
|
186
|
-
encoder.text_token getch, :error
|
187
|
-
end
|
188
|
-
|
189
|
-
when :string, :regexp
|
190
|
-
if match = scan(/[^"\\]+|\\.?/)
|
191
|
-
encoder.text_token match, :content
|
192
|
-
elsif match = scan(/"/)
|
193
|
-
encoder.text_token match, :delimiter
|
194
|
-
encoder.end_group state
|
195
|
-
state = :initial
|
196
|
-
else
|
197
|
-
raise_inspect "else case \" reached; %p not handled." % peek(1),
|
198
|
-
encoder, state
|
199
|
-
end
|
200
|
-
|
201
|
-
else
|
202
|
-
raise 'else case reached'
|
203
|
-
|
204
|
-
end
|
205
|
-
|
206
|
-
end
|
207
|
-
|
208
|
-
if [:string, :regexp].include? state
|
209
|
-
encoder.end_group state
|
210
|
-
end
|
211
|
-
|
212
|
-
encoder
|
213
|
-
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
@@ -1,168 +0,0 @@
|
|
1
|
-
module CodeRay
|
2
|
-
module Scanners
|
3
|
-
|
4
|
-
load :ruby
|
5
|
-
load :html
|
6
|
-
load :java_script
|
7
|
-
|
8
|
-
class HAML < Scanner
|
9
|
-
|
10
|
-
register_for :haml
|
11
|
-
title 'HAML Template'
|
12
|
-
|
13
|
-
KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
|
14
|
-
|
15
|
-
protected
|
16
|
-
|
17
|
-
def setup
|
18
|
-
super
|
19
|
-
@ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
|
20
|
-
@embedded_ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true, :state => @ruby_scanner.interpreted_string_state
|
21
|
-
@html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true
|
22
|
-
end
|
23
|
-
|
24
|
-
def scan_tokens encoder, options
|
25
|
-
|
26
|
-
match = nil
|
27
|
-
code = ''
|
28
|
-
|
29
|
-
until eos?
|
30
|
-
|
31
|
-
if bol?
|
32
|
-
if match = scan(/!!!.*/)
|
33
|
-
encoder.text_token match, :doctype
|
34
|
-
next
|
35
|
-
end
|
36
|
-
|
37
|
-
if match = scan(/(?>( *)(\/(?!\[if)|-\#|:javascript|:ruby|:\w+) *)(?=\n)/)
|
38
|
-
encoder.text_token match, :comment
|
39
|
-
|
40
|
-
code = self[2]
|
41
|
-
if match = scan(/(?:\n+#{self[1]} .*)+/)
|
42
|
-
case code
|
43
|
-
when '/', '-#'
|
44
|
-
encoder.text_token match, :comment
|
45
|
-
when ':javascript'
|
46
|
-
# TODO: recognize #{...} snippets inside JavaScript
|
47
|
-
@java_script_scanner ||= CodeRay.scanner :java_script, :tokens => @tokens, :keep_tokens => true
|
48
|
-
@java_script_scanner.tokenize match, :tokens => encoder
|
49
|
-
when ':ruby'
|
50
|
-
@ruby_scanner.tokenize match, :tokens => encoder
|
51
|
-
when /:\w+/
|
52
|
-
encoder.text_token match, :comment
|
53
|
-
else
|
54
|
-
raise 'else-case reached: %p' % [code]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
if match = scan(/ +/)
|
60
|
-
encoder.text_token match, :space
|
61
|
-
end
|
62
|
-
|
63
|
-
if match = scan(/\/.*/)
|
64
|
-
encoder.text_token match, :comment
|
65
|
-
next
|
66
|
-
end
|
67
|
-
|
68
|
-
if match = scan(/\\/)
|
69
|
-
encoder.text_token match, :plain
|
70
|
-
if match = scan(/.+/)
|
71
|
-
@html_scanner.tokenize match, :tokens => encoder
|
72
|
-
end
|
73
|
-
next
|
74
|
-
end
|
75
|
-
|
76
|
-
tag = false
|
77
|
-
|
78
|
-
if match = scan(/%[\w:]+\/?/)
|
79
|
-
encoder.text_token match, :tag
|
80
|
-
# if match = scan(/( +)(.+)/)
|
81
|
-
# encoder.text_token self[1], :space
|
82
|
-
# @embedded_ruby_scanner.tokenize self[2], :tokens => encoder
|
83
|
-
# end
|
84
|
-
tag = true
|
85
|
-
end
|
86
|
-
|
87
|
-
while match = scan(/([.#])[-\w]*\w/)
|
88
|
-
encoder.text_token match, self[1] == '#' ? :constant : :class
|
89
|
-
tag = true
|
90
|
-
end
|
91
|
-
|
92
|
-
if tag && match = scan(/(\()([^)]+)?(\))?/)
|
93
|
-
# TODO: recognize title=@title, class="widget_#{@widget.number}"
|
94
|
-
encoder.text_token self[1], :plain
|
95
|
-
@html_scanner.tokenize self[2], :tokens => encoder, :state => :attribute if self[2]
|
96
|
-
encoder.text_token self[3], :plain if self[3]
|
97
|
-
end
|
98
|
-
|
99
|
-
if tag && match = scan(/\{/)
|
100
|
-
encoder.text_token match, :plain
|
101
|
-
|
102
|
-
code = ''
|
103
|
-
level = 1
|
104
|
-
while true
|
105
|
-
code << scan(/([^\{\},\n]|, *\n?)*/)
|
106
|
-
case match = getch
|
107
|
-
when '{'
|
108
|
-
level += 1
|
109
|
-
code << match
|
110
|
-
when '}'
|
111
|
-
level -= 1
|
112
|
-
if level > 0
|
113
|
-
code << match
|
114
|
-
else
|
115
|
-
break
|
116
|
-
end
|
117
|
-
when "\n", ",", nil
|
118
|
-
break
|
119
|
-
end
|
120
|
-
end
|
121
|
-
@ruby_scanner.tokenize code, :tokens => encoder unless code.empty?
|
122
|
-
|
123
|
-
encoder.text_token match, :plain if match
|
124
|
-
end
|
125
|
-
|
126
|
-
if tag && match = scan(/(\[)([^\]\n]+)?(\])?/)
|
127
|
-
encoder.text_token self[1], :plain
|
128
|
-
@ruby_scanner.tokenize self[2], :tokens => encoder if self[2]
|
129
|
-
encoder.text_token self[3], :plain if self[3]
|
130
|
-
end
|
131
|
-
|
132
|
-
if tag && match = scan(/\//)
|
133
|
-
encoder.text_token match, :tag
|
134
|
-
end
|
135
|
-
|
136
|
-
if scan(/(>?<?[-=]|[&!]=|(& |!)|~)( *)([^,\n\|]+(?:(, *|\|(?=.|\n.*\|$))\n?[^,\n\|]*)*)?/)
|
137
|
-
encoder.text_token self[1] + self[3], :plain
|
138
|
-
if self[4]
|
139
|
-
if self[2]
|
140
|
-
@embedded_ruby_scanner.tokenize self[4], :tokens => encoder
|
141
|
-
else
|
142
|
-
@ruby_scanner.tokenize self[4], :tokens => encoder
|
143
|
-
end
|
144
|
-
end
|
145
|
-
elsif match = scan(/((?:<|><?)(?![!?\/\w]))?(.+)?/)
|
146
|
-
encoder.text_token self[1], :plain if self[1]
|
147
|
-
# TODO: recognize #{...} snippets
|
148
|
-
@html_scanner.tokenize self[2], :tokens => encoder if self[2]
|
149
|
-
end
|
150
|
-
|
151
|
-
elsif match = scan(/.+/)
|
152
|
-
@html_scanner.tokenize match, :tokens => encoder
|
153
|
-
|
154
|
-
end
|
155
|
-
|
156
|
-
if match = scan(/\n/)
|
157
|
-
encoder.text_token match, :space
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
encoder
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module CodeRay
|
3
|
-
module Scanners
|
4
|
-
|
5
|
-
class Ruby
|
6
|
-
|
7
|
-
class StringState < Struct.new :type, :interpreted, :delim, :heredoc,
|
8
|
-
:opening_paren, :paren_depth, :pattern, :next_state # :nodoc: all
|
9
|
-
|
10
|
-
CLOSING_PAREN = Hash[ *%w[
|
11
|
-
( )
|
12
|
-
[ ]
|
13
|
-
< >
|
14
|
-
{ }
|
15
|
-
] ].each { |k,v| k.freeze; v.freeze } # debug, if I try to change it with <<
|
16
|
-
|
17
|
-
STRING_PATTERN = Hash.new do |h, k|
|
18
|
-
delim, interpreted = *k
|
19
|
-
# delim = delim.dup # workaround for old Ruby
|
20
|
-
delim_pattern = Regexp.escape(delim)
|
21
|
-
if closing_paren = CLOSING_PAREN[delim]
|
22
|
-
delim_pattern << Regexp.escape(closing_paren)
|
23
|
-
end
|
24
|
-
delim_pattern << '\\\\' unless delim == '\\'
|
25
|
-
|
26
|
-
# special_escapes =
|
27
|
-
# case interpreted
|
28
|
-
# when :regexp_symbols
|
29
|
-
# '| [|?*+(){}\[\].^$]'
|
30
|
-
# end
|
31
|
-
|
32
|
-
h[k] =
|
33
|
-
if interpreted && delim != '#'
|
34
|
-
/ (?= [#{delim_pattern}] | \# [{$@] ) /mx
|
35
|
-
else
|
36
|
-
/ (?= [#{delim_pattern}] ) /mx
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def initialize kind, interpreted, delim, heredoc = false
|
41
|
-
if heredoc
|
42
|
-
pattern = heredoc_pattern delim, interpreted, heredoc == :indented
|
43
|
-
delim = nil
|
44
|
-
else
|
45
|
-
pattern = STRING_PATTERN[ [delim, interpreted] ]
|
46
|
-
if closing_paren = CLOSING_PAREN[delim]
|
47
|
-
opening_paren = delim
|
48
|
-
delim = closing_paren
|
49
|
-
paren_depth = 1
|
50
|
-
end
|
51
|
-
end
|
52
|
-
super kind, interpreted, delim, heredoc, opening_paren, paren_depth, pattern, :initial
|
53
|
-
end
|
54
|
-
|
55
|
-
def heredoc_pattern delim, interpreted, indented
|
56
|
-
# delim = delim.dup # workaround for old Ruby
|
57
|
-
delim_pattern = Regexp.escape(delim)
|
58
|
-
delim_pattern = / (?:\A|\n) #{ '(?>[ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x
|
59
|
-
if interpreted
|
60
|
-
/ (?= #{delim_pattern}() | \\ | \# [{$@] ) /mx # $1 set == end of heredoc
|
61
|
-
else
|
62
|
-
/ (?= #{delim_pattern}() | \\ ) /mx
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|