Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f803f64

Browse files
author
Yury Snegirev
committed
Add SLIM scanner
1 parent f1d1e5b commit f803f64

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

lib/coderay/helpers/file_type.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ def type_from_shebang filename
120120
'ru' => :ruby, # config.ru
121121
'rxml' => :ruby,
122122
'sass' => :sass,
123+
'slim' => :slim,
123124
'sql' => :sql,
124125
'taskpaper' => :taskpaper,
125126
'template' => :json, # AWS CloudFormation template

lib/coderay/scanners/slim.rb

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
module CodeRay
2+
module Scanners
3+
4+
load :ruby
5+
load :html
6+
load :java_script
7+
8+
class SLIM < Scanner
9+
10+
register_for :slim
11+
title 'SLIM 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(/doctype .*/)
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+
tag = false
69+
70+
if match = scan(/[\w:]+\/?/)
71+
encoder.text_token match, :tag
72+
# if match = scan(/( +)(.+)/)
73+
# encoder.text_token self[1], :space
74+
# @embedded_ruby_scanner.tokenize self[2], :tokens => encoder
75+
# end
76+
tag = true
77+
end
78+
79+
while match = scan(/([.#])[-\w]*\w/)
80+
encoder.text_token match, self[1] == '#' ? :constant : :class
81+
tag = true
82+
end
83+
84+
if tag && match = scan(/(\()([^)]+)?(\))?/)
85+
# TODO: recognize title=@title, class="widget_#{@widget.number}"
86+
encoder.text_token self[1], :plain
87+
@html_scanner.tokenize self[2], :tokens => encoder, :state => :attribute if self[2]
88+
encoder.text_token self[3], :plain if self[3]
89+
end
90+
91+
if tag && match = scan(/\{/)
92+
encoder.text_token match, :plain
93+
94+
code = ''
95+
level = 1
96+
while true
97+
code << scan(/([^\{\},\n]|, *\n?)*/)
98+
case match = getch
99+
when '{'
100+
level += 1
101+
code << match
102+
when '}'
103+
level -= 1
104+
if level > 0
105+
code << match
106+
else
107+
break
108+
end
109+
when "\n", ",", nil
110+
break
111+
end
112+
end
113+
@ruby_scanner.tokenize code, :tokens => encoder unless code.empty?
114+
115+
encoder.text_token match, :plain if match
116+
end
117+
118+
if tag && match = scan(/(\[)([^\]\n]+)?(\])?/)
119+
encoder.text_token self[1], :plain
120+
@ruby_scanner.tokenize self[2], :tokens => encoder if self[2]
121+
encoder.text_token self[3], :plain if self[3]
122+
end
123+
124+
if tag && match = scan(/\//)
125+
encoder.text_token match, :tag
126+
end
127+
128+
if scan(/(>?<?[-=]|[&!]=|(& |!)|~)( *)([^,\n\|]+(?:(, *|\|(?=.|\n.*\|$))\n?[^,\n\|]*)*)?/)
129+
encoder.text_token self[1] + self[3], :plain
130+
if self[4]
131+
if self[2]
132+
@embedded_ruby_scanner.tokenize self[4], :tokens => encoder
133+
else
134+
@ruby_scanner.tokenize self[4], :tokens => encoder
135+
end
136+
end
137+
elsif match = scan(/((?:<|><?)(?![!?\/\w]))?(.+)?/)
138+
encoder.text_token self[1], :plain if self[1]
139+
# TODO: recognize #{...} snippets
140+
@html_scanner.tokenize self[2], :tokens => encoder if self[2]
141+
end
142+
143+
elsif match = scan(/.+/)
144+
@html_scanner.tokenize match, :tokens => encoder
145+
146+
end
147+
148+
if match = scan(/\n/)
149+
encoder.text_token match, :space
150+
end
151+
end
152+
153+
encoder
154+
155+
end
156+
157+
end
158+
159+
end
160+
end

0 commit comments

Comments
 (0)