Mercurial > hg > soundsoftware-site
comparison vendor/gems/coderay-1.0.0/lib/coderay/scanners/yaml.rb @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 module CodeRay | |
2 module Scanners | |
3 | |
4 # Scanner for YAML. | |
5 # | |
6 # Based on the YAML scanner from Syntax by Jamis Buck. | |
7 class YAML < Scanner | |
8 | |
9 register_for :yaml | |
10 file_extension 'yml' | |
11 | |
12 KINDS_NOT_LOC = :all | |
13 | |
14 protected | |
15 | |
16 def scan_tokens encoder, options | |
17 | |
18 state = :initial | |
19 key_indent = string_indent = 0 | |
20 | |
21 until eos? | |
22 | |
23 key_indent = nil if bol? | |
24 | |
25 if match = scan(/ +[\t ]*/) | |
26 encoder.text_token match, :space | |
27 | |
28 elsif match = scan(/\n+/) | |
29 encoder.text_token match, :space | |
30 state = :initial if match.index(?\n) | |
31 | |
32 elsif match = scan(/#.*/) | |
33 encoder.text_token match, :comment | |
34 | |
35 elsif bol? and case | |
36 when match = scan(/---|\.\.\./) | |
37 encoder.begin_group :head | |
38 encoder.text_token match, :head | |
39 encoder.end_group :head | |
40 next | |
41 when match = scan(/%.*/) | |
42 encoder.text_token match, :doctype | |
43 next | |
44 end | |
45 | |
46 elsif state == :value and case | |
47 when !check(/(?:"[^"]*")(?=: |:$)/) && match = scan(/"/) | |
48 encoder.begin_group :string | |
49 encoder.text_token match, :delimiter | |
50 encoder.text_token match, :content if match = scan(/ [^"\\]* (?: \\. [^"\\]* )* /mx) | |
51 encoder.text_token match, :delimiter if match = scan(/"/) | |
52 encoder.end_group :string | |
53 next | |
54 when match = scan(/[|>][-+]?/) | |
55 encoder.begin_group :string | |
56 encoder.text_token match, :delimiter | |
57 string_indent = key_indent || column(pos - match.size) - 1 | |
58 encoder.text_token matched, :content if scan(/(?:\n+ {#{string_indent + 1}}.*)+/) | |
59 encoder.end_group :string | |
60 next | |
61 when match = scan(/(?![!"*&]).+?(?=$|\s+#)/) | |
62 encoder.begin_group :string | |
63 encoder.text_token match, :content | |
64 string_indent = key_indent || column(pos - match.size) - 1 | |
65 encoder.text_token matched, :content if scan(/(?:\n+ {#{string_indent + 1}}.*)+/) | |
66 encoder.end_group :string | |
67 next | |
68 end | |
69 | |
70 elsif case | |
71 when match = scan(/[-:](?= |$)/) | |
72 state = :value if state == :colon && (match == ':' || match == '-') | |
73 state = :value if state == :initial && match == '-' | |
74 encoder.text_token match, :operator | |
75 next | |
76 when match = scan(/[,{}\[\]]/) | |
77 encoder.text_token match, :operator | |
78 next | |
79 when state == :initial && match = scan(/[\w.() ]*\S(?= *:(?: |$))/) | |
80 encoder.text_token match, :key | |
81 key_indent = column(pos - match.size) - 1 | |
82 state = :colon | |
83 next | |
84 when match = scan(/(?:"[^"\n]*"|'[^'\n]*')(?= *:(?: |$))/) | |
85 encoder.begin_group :key | |
86 encoder.text_token match[0,1], :delimiter | |
87 encoder.text_token match[1..-2], :content | |
88 encoder.text_token match[-1,1], :delimiter | |
89 encoder.end_group :key | |
90 key_indent = column(pos - match.size) - 1 | |
91 state = :colon | |
92 next | |
93 when match = scan(/(![\w\/]+)(:([\w:]+))?/) | |
94 encoder.text_token self[1], :type | |
95 if self[2] | |
96 encoder.text_token ':', :operator | |
97 encoder.text_token self[3], :class | |
98 end | |
99 next | |
100 when match = scan(/&\S+/) | |
101 encoder.text_token match, :variable | |
102 next | |
103 when match = scan(/\*\w+/) | |
104 encoder.text_token match, :global_variable | |
105 next | |
106 when match = scan(/<</) | |
107 encoder.text_token match, :class_variable | |
108 next | |
109 when match = scan(/\d\d:\d\d:\d\d/) | |
110 encoder.text_token match, :octal | |
111 next | |
112 when match = scan(/\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d(\.\d+)? [-+]\d\d:\d\d/) | |
113 encoder.text_token match, :octal | |
114 next | |
115 when match = scan(/:\w+/) | |
116 encoder.text_token match, :symbol | |
117 next | |
118 when match = scan(/[^:\s]+(:(?! |$)[^:\s]*)* .*/) | |
119 encoder.text_token match, :error | |
120 next | |
121 when match = scan(/[^:\s]+(:(?! |$)[^:\s]*)*/) | |
122 encoder.text_token match, :error | |
123 next | |
124 end | |
125 | |
126 else | |
127 raise if eos? | |
128 encoder.text_token getch, :error | |
129 | |
130 end | |
131 | |
132 end | |
133 | |
134 encoder | |
135 end | |
136 | |
137 end | |
138 | |
139 end | |
140 end |