sdl4r 0.9.6 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +49 -2
- data/Rakefile +35 -5
- data/TODO +29 -3
- data/doc/classes/SDL4R.html +386 -674
- data/doc/classes/SDL4R/Parser.html +183 -307
- data/doc/classes/SDL4R/ParserTest.html +357 -0
- data/doc/classes/SDL4R/SDL4RTest.html +532 -0
- data/doc/classes/SDL4R/SDLTest.html +77 -0
- data/doc/classes/SDL4R/SdlBinary.html +180 -295
- data/doc/classes/SDL4R/SdlParseError.html +105 -180
- data/doc/classes/SDL4R/SdlTimeSpan.html +628 -939
- data/doc/classes/SDL4R/Tag.html +1236 -2036
- data/doc/classes/SDL4R/TagTest.html +292 -0
- data/doc/created.rid +1 -1
- data/doc/files/CHANGELOG.html +183 -184
- data/doc/files/LICENSE.html +496 -755
- data/doc/files/README.html +399 -623
- data/doc/files/lib/sdl4r/parser/reader_rb.html +53 -106
- data/doc/files/lib/sdl4r/parser/time_span_with_zone_rb.html +53 -106
- data/doc/files/lib/sdl4r/parser/token_rb.html +53 -106
- data/doc/files/lib/sdl4r/parser/tokenizer_rb.html +53 -106
- data/doc/files/lib/sdl4r/parser_rb.html +60 -112
- data/doc/files/lib/sdl4r/sdl4r_rb.html +62 -114
- data/doc/files/lib/sdl4r/sdl_binary_rb.html +53 -106
- data/doc/files/lib/sdl4r/sdl_parse_error_rb.html +53 -106
- data/doc/files/lib/sdl4r/sdl_time_span_rb.html +53 -106
- data/doc/files/lib/sdl4r/tag_rb.html +62 -114
- data/doc/files/lib/sdl4r_rb.html +53 -106
- data/doc/files/test/sdl4r/parser_test_rb.html +63 -0
- data/doc/files/test/sdl4r/sdl4r_test_rb.html +66 -0
- data/doc/files/test/sdl4r/sdl_test_rb.html +63 -0
- data/doc/files/test/sdl4r/tag_test_rb.html +63 -0
- data/doc/fr_class_index.html +19 -32
- data/doc/fr_file_index.html +37 -40
- data/doc/fr_method_index.html +4707 -114
- data/doc/index.html +14 -23
- data/doc/rdoc-style.css +323 -203
- data/lib/sdl4r/parser/reader.rb +26 -19
- data/lib/sdl4r/parser/token.rb +3 -3
- data/lib/sdl4r/parser/tokenizer.rb +93 -98
- data/lib/sdl4r/sdl_parse_error.rb +2 -2
- data/lib/sdl4r/tag.rb +127 -73
- data/test/sdl4r/parser_test.rb +109 -11
- data/test/sdl4r/tag_test.rb +73 -4
- metadata +15 -12
data/doc/files/README.html
CHANGED
@@ -1,625 +1,401 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
-
<script type="text/javascript">
|
13
|
-
// <![CDATA[
|
14
|
-
|
15
|
-
function popupCode( url ) {
|
16
|
-
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
-
}
|
18
|
-
|
19
|
-
function toggleCode( id ) {
|
20
|
-
if ( document.getElementById )
|
21
|
-
elem = document.getElementById( id );
|
22
|
-
else if ( document.all )
|
23
|
-
elem = eval( "document.all." + id );
|
24
|
-
else
|
25
|
-
return false;
|
26
|
-
|
27
|
-
elemStyle = elem.style;
|
28
|
-
|
29
|
-
if ( elemStyle.display != "block" ) {
|
30
|
-
elemStyle.display = "block"
|
31
|
-
} else {
|
32
|
-
elemStyle.display = "none"
|
33
|
-
}
|
34
|
-
|
35
|
-
return true;
|
36
|
-
}
|
37
|
-
|
38
|
-
// Make codeblocks hidden by default
|
39
|
-
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
-
|
41
|
-
// ]]>
|
42
|
-
</script>
|
43
|
-
|
44
|
-
</head>
|
45
|
-
<body>
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
<div id="fileHeader">
|
50
|
-
<h1>README</h1>
|
51
|
-
<table class="header-table">
|
52
|
-
<tr class="top-aligned-row">
|
53
|
-
<td><strong>Path:</strong></td>
|
54
|
-
<td>README
|
55
|
-
</td>
|
56
|
-
</tr>
|
57
|
-
<tr class="top-aligned-row">
|
58
|
-
<td><strong>Last Update:</strong></td>
|
59
|
-
<td>Fri Aug 06 13:03:22 +0900 2010</td>
|
60
|
-
</tr>
|
61
|
-
</table>
|
62
|
-
</div>
|
63
|
-
<!-- banner header -->
|
64
|
-
|
65
|
-
<div id="bodyContent">
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
<div id="contextContent">
|
70
|
-
|
71
|
-
<div id="description">
|
72
|
-
<h1>SDL (Simple Declarative Language)</h1>
|
73
|
-
<p>
|
74
|
-
SDL version supported: 1.3
|
75
|
-
</p>
|
76
|
-
<table>
|
77
|
-
<tr><td valign="top">Site:</td><td><a
|
78
|
-
href="http://www.ikayzo.org/confluence/display/SDL/Home">www.ikayzo.org/confluence/display/SDL/Home</a>
|
79
|
-
|
80
|
-
</td></tr>
|
81
|
-
<tr><td valign="top">Downloads:</td><td><a
|
82
|
-
href="http://www.ikayzo.org/confluence/display/SDL/Downloads">www.ikayzo.org/confluence/display/SDL/Downloads</a>
|
83
|
-
|
84
|
-
</td></tr>
|
85
|
-
<tr><td valign="top">Users mailing list:</td><td>sdl-users@ikayzo.org
|
86
|
-
|
87
|
-
</td></tr>
|
88
|
-
<tr><td valign="top">Developers mailing list:</td><td>sdl-developers@ikayzo.org
|
89
|
-
|
90
|
-
</td></tr>
|
91
|
-
</table>
|
92
|
-
<h2>Getting Started with <a href="../classes/SDL4R.html">SDL4R</a></h2>
|
93
|
-
<p>
|
94
|
-
To get the Ruby Gem:
|
95
|
-
</p>
|
96
|
-
<pre>
|
97
|
-
gem install sdl4r
|
98
|
-
</pre>
|
99
|
-
<p>
|
100
|
-
Then, you can start reading SDL documents:
|
101
|
-
</p>
|
102
|
-
<pre>
|
103
|
-
require 'pathname'
|
104
|
-
require 'sdl4r'
|
105
|
-
|
106
|
-
root = SDL4R::read(Pathname.new("my_directory/my_config.sdl"))
|
107
|
-
puts root.attribute("port")
|
108
|
-
</pre>
|
109
|
-
<p>
|
110
|
-
Or you can create SDL documents with the API:
|
111
|
-
</p>
|
112
|
-
<pre>
|
113
|
-
require 'fileutils'
|
114
|
-
require 'sdl4r'
|
115
|
-
|
116
|
-
root = SDL4R::Tag.new("root") do
|
117
|
-
new_child("server") do
|
118
|
-
set_attribute("port", 1234)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
File.open("my_directory/my_config.sdl", "w") { |io|
|
122
|
-
io.write(root.children_to_string)
|
123
|
-
}
|
124
|
-
</pre>
|
125
|
-
<p>
|
126
|
-
which will write the following in your file:
|
127
|
-
</p>
|
128
|
-
<pre>
|
129
|
-
server port=1234
|
130
|
-
</pre>
|
131
|
-
<h2>SDL Documents</h2>
|
132
|
-
<p>
|
133
|
-
SDL documents are made up of Tags. A Tag contains
|
134
|
-
</p>
|
135
|
-
<ul>
|
136
|
-
<li>a name (if not present, the name "content" is used)
|
137
|
-
|
138
|
-
</li>
|
139
|
-
<li>a namespace (optional)
|
140
|
-
|
141
|
-
</li>
|
142
|
-
<li>0 or more values (optional)
|
143
|
-
|
144
|
-
</li>
|
145
|
-
<li>0 or more attributes (optional)
|
146
|
-
|
147
|
-
</li>
|
148
|
-
<li>0 or more children (optional)
|
149
|
-
|
150
|
-
</li>
|
151
|
-
</ul>
|
152
|
-
<p>
|
153
|
-
For the SDL code:
|
154
|
-
</p>
|
155
|
-
<pre>
|
156
|
-
size 4
|
157
|
-
smoker false
|
158
|
-
</pre>
|
159
|
-
<p>
|
160
|
-
Assuming this code is in a file called <tt>values.sdl</tt>, the values can
|
161
|
-
be read using the following code (ignoring exceptions):
|
162
|
-
</p>
|
163
|
-
<pre>
|
164
|
-
root = Tag.new("root").read(Pathname.new("values.sdl"))
|
165
|
-
size = root.child("size").value
|
166
|
-
smoker = root.child("smoker").value
|
167
|
-
</pre>
|
168
|
-
<p>
|
169
|
-
A tag is basically a data structure with a list of values, a map of
|
170
|
-
attributes, and (if it has a body) child tags. In the example above, the
|
171
|
-
<tt>values.sdl</tt> file is read into a tag called "root". It has
|
172
|
-
two children (tags) called "size" and "smoker". Both
|
173
|
-
these children have one value, no attributes, and no bodies.
|
174
|
-
</p>
|
175
|
-
<p>
|
176
|
-
SDL is often used for simple key-value mappings. To simplify things Tag has
|
177
|
-
the methods getValue and setValue which operate on the first element in the
|
178
|
-
values list. Also notice SDL understands types which are determined using
|
179
|
-
type inference.
|
180
|
-
</p>
|
181
|
-
<p>
|
182
|
-
The example above used the simple format common in property files:
|
183
|
-
</p>
|
184
|
-
<pre>
|
185
|
-
name value
|
186
|
-
</pre>
|
187
|
-
<p>
|
188
|
-
The full SDL tag format is:
|
189
|
-
</p>
|
190
|
-
<pre>
|
191
|
-
namespace:name value_list attribute_list {
|
192
|
-
children_tags
|
193
|
-
}
|
194
|
-
</pre>
|
195
|
-
<p>
|
196
|
-
where value_list is zero or more space separated SDL literals and
|
197
|
-
attribute_list is zero or more space separated
|
198
|
-
<tt>(namespace:)key=value</tt> pairs. The name, namespace, and keys are SDL
|
199
|
-
identifiers. Values are SDL literals. Namespace is optional for both tag
|
200
|
-
names and attributes. Tag bodies are also optional. SDL identifiers begin
|
201
|
-
with a unicode letter or an underscore (_) followed by zero or more unicode
|
202
|
-
letters, numbers, underscores (_), dashes (-) and periods (.).
|
203
|
-
</p>
|
204
|
-
<p>
|
205
|
-
Tags without bodies are terminated by a new line character (\n) and may be
|
206
|
-
continue onto the next line by placing a backslash (\) at the end of the
|
207
|
-
line. Tags may be nested to an arbitrary depth. SDL ignores all other white
|
208
|
-
space characters between tokens. Although nested blocks are indented by
|
209
|
-
convention, tabs have no significance in the language.
|
210
|
-
</p>
|
211
|
-
<h2>Anonymous Tags</h2>
|
212
|
-
<p>
|
213
|
-
SDL also supports anonymous tags which are assigned the name
|
214
|
-
"content". An anonymous tag starts with a literal and is followed
|
215
|
-
by zero or more additional literals and zero or more attributes. The
|
216
|
-
examples section below demonstrates the use of anonymous tags.
|
217
|
-
</p>
|
218
|
-
<pre>
|
219
|
-
greetings {
|
220
|
-
"hello" language="English"
|
221
|
-
}
|
222
|
-
|
223
|
-
# If we have a handle on the "greetings" tag we can access the
|
224
|
-
# anonymous child tag by calling
|
225
|
-
# Tag child1 = greetingTag.getChild("content");
|
226
|
-
</pre>
|
227
|
-
<h2>String literals</h2>
|
228
|
-
<p>
|
229
|
-
There are two ways to write String literals.
|
230
|
-
</p>
|
231
|
-
<h3>Starting and ending with double quotes (")</h3>
|
232
|
-
<p>
|
233
|
-
Double quotes, backslash characters (\), and new lines (\n) within this
|
234
|
-
type of String literal must be escaped like so:
|
235
|
-
</p>
|
236
|
-
<pre>
|
237
|
-
file "C:\\folder\\file.txt"
|
238
|
-
say "I said \"something\""
|
239
|
-
</pre>
|
240
|
-
<p>
|
241
|
-
This type of String literal can be continued on the next line by placing a
|
242
|
-
backslash (\) at the end of the line like so:
|
243
|
-
</p>
|
244
|
-
<pre>
|
245
|
-
line "this is a \
|
246
|
-
long string of text"
|
247
|
-
</pre>
|
248
|
-
<p>
|
249
|
-
White space before the first character in the second line will be ignored.
|
250
|
-
</p>
|
251
|
-
<h3>Starting and ending with a backquote (`)</h3>
|
252
|
-
<p>
|
253
|
-
This type of string literal can only be ended with a second backquote (`).
|
254
|
-
It is not necessary (or possible) to escape any type of character within a
|
255
|
-
backquote string literal. This type of literal can also span lines. All
|
256
|
-
white spaces are preserved including new lines.
|
257
|
-
</p>
|
258
|
-
<p>
|
259
|
-
Examples:
|
260
|
-
</p>
|
261
|
-
<pre>
|
262
|
-
file `C:\folder\file.txt`
|
263
|
-
say `I said "something"`
|
264
|
-
regex `\w+\.suite\(\)`
|
265
|
-
long_line `This is
|
266
|
-
a long line
|
267
|
-
fee fi fo fum`
|
268
|
-
</pre>
|
269
|
-
<p>
|
270
|
-
Note: SDL interprets new lines in `` String literals as a single new line
|
271
|
-
character (\n) regarless of the platform.
|
272
|
-
</p>
|
273
|
-
<h2>Binary literals</h2>
|
274
|
-
<p>
|
275
|
-
Binary literals use base64 characters enclosed in square brackets ([]). The
|
276
|
-
binary literal type can also span lines. White space is ignored.
|
277
|
-
</p>
|
278
|
-
<p>
|
279
|
-
Examples:
|
280
|
-
</p>
|
281
|
-
<pre>
|
282
|
-
key [sdf789GSfsb2+3324sf2] name="my key"
|
283
|
-
image [
|
284
|
-
R3df789GSfsb2edfSFSDF
|
285
|
-
uikuikk2349GSfsb2edfS
|
286
|
-
vFSDFR3df789GSfsb2edf
|
287
|
-
]
|
288
|
-
upload from="ikayzo.com" data=[
|
289
|
-
R3df789GSfsb2edfSFSDF
|
290
|
-
uikuikk2349GSfsb2edfS
|
291
|
-
vFSDFR3df789GSfsb2edf
|
292
|
-
]
|
293
|
-
</pre>
|
294
|
-
<h2>Date and Time Literals</h2>
|
295
|
-
<p>
|
296
|
-
SDL supports date, time span, and date/time literals. Date and Date/Time
|
297
|
-
literals use a 24 hour clock (0-23). If a timezone is not specified, the
|
298
|
-
default locale‘s timezone will be used.
|
299
|
-
</p>
|
300
|
-
<p>
|
301
|
-
Examples:
|
302
|
-
</p>
|
303
|
-
<ul>
|
304
|
-
<li>create a tag called "date" with a date value of Dec 5, 2005
|
305
|
-
|
306
|
-
<pre>
|
307
|
-
date 2005/12/05
|
308
|
-
</pre>
|
309
|
-
</li>
|
310
|
-
<li>various time span literals
|
311
|
-
|
312
|
-
<pre>
|
313
|
-
hours 03:00:00
|
314
|
-
minutes 00:12:00
|
315
|
-
seconds 00:00:42
|
316
|
-
short_time 00:12:32.423 # 12 minutes, 32 seconds, 423 milliseconds
|
317
|
-
long_time 30d:15:23:04.023 # 30 days, 15 hours, 23 mins, 4 secs, 23 millis
|
318
|
-
before -00:02:30 # 2 hours and 30 minutes ago
|
319
|
-
</pre>
|
320
|
-
</li>
|
321
|
-
<li>a date time literal
|
322
|
-
|
323
|
-
<pre>
|
324
|
-
in_japan 2005/12/05 14:12:23.345-JST
|
325
|
-
</pre>
|
326
|
-
</li>
|
327
|
-
</ul>
|
328
|
-
<h2>Literal Types</h2>
|
329
|
-
<p>
|
330
|
-
SDL 1.0 has thirteen literal types (parenthesis indicate optional
|
331
|
-
components)
|
332
|
-
</p>
|
333
|
-
<ol>
|
334
|
-
<li>string (unicode) - examples: <tt>"hello"</tt> or <tt>`aloha`</tt>
|
335
|
-
|
336
|
-
</li>
|
337
|
-
<li>character (unicode) - example: <tt>’/’</tt> Note: \uXXXX style
|
338
|
-
unicode escapes are not supported (or needed because sdl files are UTF8)
|
339
|
-
|
340
|
-
</li>
|
341
|
-
<li>integer (32 bits signed) - example: <tt>123</tt>
|
342
|
-
|
343
|
-
</li>
|
344
|
-
<li>long integer (64 bits signed) - examples: <tt>123L</tt> or <tt>123l</tt>
|
345
|
-
|
346
|
-
</li>
|
347
|
-
<li>float (32 bits signed) - examples <tt>123.43F</tt> <tt>123.43f</tt>
|
348
|
-
|
349
|
-
</li>
|
350
|
-
<li>double float (64 bits signed) - example: <tt>123.43</tt> or
|
351
|
-
<tt>123.43d</tt> or <tt>123.43D</tt>
|
352
|
-
|
353
|
-
</li>
|
354
|
-
<li>decimal (128+ bits signed) - example: <tt>123.44BD</tt> or
|
355
|
-
<tt>123.44bd</tt>
|
356
|
-
|
357
|
-
</li>
|
358
|
-
<li>boolean - examples: <tt>true</tt> or <tt>false</tt> or <tt>on</tt> or
|
359
|
-
<tt>off</tt>
|
360
|
-
|
361
|
-
</li>
|
362
|
-
<li>date yyyy/mm/dd - example <tt>2005/12/05</tt>
|
363
|
-
|
364
|
-
</li>
|
365
|
-
<li>date time yyyy/mm/dd hh:mm(:ss)(.xxx)(-ZONE) example - <tt>2005/12/05
|
366
|
-
05:21:23.532-JST</tt> notes: uses a 24 hour clock (0-23), only hours and
|
367
|
-
minutes are mandatory
|
368
|
-
|
369
|
-
</li>
|
370
|
-
<li>time span using the format (d:)hh:mm:ss(.xxx) notes: if the day component
|
371
|
-
is included it must be suffixed with a lower case ‘d’ examples
|
372
|
-
|
373
|
-
<pre>
|
374
|
-
12:14:42 # (12 hours, 14 minutes, 42 seconds)
|
375
|
-
00:09:12 # (9 minutes, 12 seconds)
|
376
|
-
00:00:01.023 # (1 second, 23 milliseconds)
|
377
|
-
23d:05:21:23.532 # (23 days, 5 hours, 21 minutes, 23 seconds, 532 milliseconds)
|
378
|
-
</pre>
|
379
|
-
</li>
|
380
|
-
<li>binary [base64] example - <tt>[sdf789GSfsb2+3324sf2]</tt>
|
381
|
-
|
382
|
-
</li>
|
383
|
-
<li><tt>null</tt>
|
384
|
-
|
385
|
-
</li>
|
386
|
-
</ol>
|
387
|
-
<p>
|
388
|
-
Timezones must be specified using a valid time zone ID (ex.
|
389
|
-
America/Los_Angeles), three letter abbreviation (ex. HST), or
|
390
|
-
GMT(+/-)hh(:mm) formatted custom timezone (ex. GMT+02 or GMT+02:30)
|
391
|
-
</p>
|
392
|
-
<p>
|
393
|
-
These types are designed to be portable across Java, .NET, and other
|
394
|
-
popular platforms.
|
395
|
-
</p>
|
396
|
-
<h2>SDL Comments</h2>
|
397
|
-
<p>
|
398
|
-
SDL supports four comment types.
|
399
|
-
</p>
|
400
|
-
<pre>
|
401
|
-
1. // single line comments identicle to those used in Java, C, etc. // style
|
402
|
-
comments can occur anywhere in a line. All text after // up to the new line
|
403
|
-
will be ignored.
|
404
|
-
2. # property style comments. They work the same way as //
|
405
|
-
3. -- separator comments useful for visually dividing content. They work the same way as //
|
406
|
-
4. Slash star (/*) style multiline comments. These begin with a slash
|
407
|
-
star and end with a star slash. Everything in between is ignored.
|
408
|
-
</pre>
|
409
|
-
<h2>Example</h2>
|
410
|
-
<p>
|
411
|
-
An example SDL file:
|
412
|
-
</p>
|
413
|
-
<pre>
|
414
|
-
# a tag having only a name
|
415
|
-
my_tag
|
416
|
-
|
417
|
-
# three tags acting as name value pairs
|
418
|
-
first_name "Akiko"
|
419
|
-
last_name "Johnson"
|
420
|
-
height 68
|
421
|
-
|
422
|
-
# a tag with a value list
|
423
|
-
person "Akiko" "Johnson" 68
|
424
|
-
|
425
|
-
# a tag with attributes
|
426
|
-
person first_name="Akiko" last_name="Johnson" height=68
|
427
|
-
|
428
|
-
# a tag with values and attributes
|
429
|
-
person "Akiko" "Johnson" height=60
|
430
|
-
|
431
|
-
# a tag with attributes using namespaces
|
432
|
-
person name:first-name="Akiko" name:last-name="Johnson"
|
433
|
-
|
434
|
-
# a tag with values, attributes, namespaces, and children
|
435
|
-
my_namespace:person "Akiko" "Johnson" dimensions:height=68 {
|
436
|
-
son "Nouhiro" "Johnson"
|
437
|
-
daughter "Sabrina" "Johnson" location="Italy" {
|
438
|
-
hobbies "swimming" "surfing"
|
439
|
-
languages "English" "Italian"
|
440
|
-
smoker false
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
2
|
+
<html lang='en'>
|
3
|
+
<head>
|
4
|
+
<title>File: README [RDoc: Simple Declarative Language for Ruby]</title>
|
5
|
+
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
|
6
|
+
<link href='../rdoc-style.css' media='screen' rel='stylesheet' type='text/css'>
|
7
|
+
<script type='text/javascript'>
|
8
|
+
//<![CDATA[
|
9
|
+
function popupCode(url) {
|
10
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
441
11
|
}
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
</p>
|
498
|
-
<
|
499
|
-
<p>
|
500
|
-
|
501
|
-
|
502
|
-
</
|
503
|
-
<
|
504
|
-
|
505
|
-
|
506
|
-
</
|
507
|
-
<
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
</
|
528
|
-
<
|
529
|
-
|
530
|
-
</
|
531
|
-
<
|
532
|
-
|
533
|
-
</
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
</
|
554
|
-
<
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
</
|
575
|
-
<p>
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
the
|
582
|
-
</
|
583
|
-
<p>
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
12
|
+
|
13
|
+
function toggleCode(id) {
|
14
|
+
var code = document.getElementById(id)
|
15
|
+
|
16
|
+
code.style.display = code.style.display != 'block' ? 'block' : 'none'
|
17
|
+
return true
|
18
|
+
}
|
19
|
+
|
20
|
+
// Make codeblocks hidden by default
|
21
|
+
document.writeln('<' + 'style type="text/css">.method .source pre { display: none }<\/style>')
|
22
|
+
//]]>
|
23
|
+
</script>
|
24
|
+
</head>
|
25
|
+
<body class='page'>
|
26
|
+
<div class='file' id='wrapper'>
|
27
|
+
<div class='header'>
|
28
|
+
<div class='name'>README</div>
|
29
|
+
<div class='paths'>
|
30
|
+
README
|
31
|
+
</div>
|
32
|
+
<div class='last-update'>
|
33
|
+
Last Update:
|
34
|
+
<span class='datetime'>2010-08-06 13:03:22 +0900</span>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<div id='content'>
|
38
|
+
<div id='text'>
|
39
|
+
<div id='description'>
|
40
|
+
<h1>SDL (Simple Declarative Language)</h1>
|
41
|
+
<p>
|
42
|
+
SDL version supported: 1.3
|
43
|
+
</p>
|
44
|
+
<table>
|
45
|
+
<tr><td valign="top">Site:</td><td><a
|
46
|
+
href="http://www.ikayzo.org/confluence/display/SDL/Home">www.ikayzo.org/confluence/display/SDL/Home</a>
|
47
|
+
|
48
|
+
</td></tr>
|
49
|
+
<tr><td valign="top">Downloads:</td><td><a
|
50
|
+
href="http://www.ikayzo.org/confluence/display/SDL/Downloads">www.ikayzo.org/confluence/display/SDL/Downloads</a>
|
51
|
+
|
52
|
+
</td></tr>
|
53
|
+
<tr><td valign="top">Users mailing list:</td><td>sdl-users@ikayzo.org
|
54
|
+
|
55
|
+
</td></tr>
|
56
|
+
<tr><td valign="top">Developers mailing list:</td><td>sdl-developers@ikayzo.org
|
57
|
+
|
58
|
+
</td></tr>
|
59
|
+
</table>
|
60
|
+
<h2>Getting Started with <a href="../classes/SDL4R.html">SDL4R</a></h2>
|
61
|
+
<p>
|
62
|
+
To get the Ruby Gem:
|
63
|
+
</p>
|
64
|
+
<pre>gem install sdl4r</pre>
|
65
|
+
<p>
|
66
|
+
Then, you can start reading SDL documents:
|
67
|
+
</p>
|
68
|
+
<pre>require 'pathname'
require 'sdl4r'

root = SDL4R::read(Pathname.new("my_directory/my_config.sdl"))
puts root.attribute("port")</pre>
|
69
|
+
<p>
|
70
|
+
Or you can create SDL documents with the API:
|
71
|
+
</p>
|
72
|
+
<pre>require 'fileutils'
require 'sdl4r'

root = SDL4R::Tag.new("root") do
 new_child("server") do
 set_attribute("port", 1234)
 end
end
File.open("my_directory/my_config.sdl", "w") { |io|
 io.write(root.children_to_string)
}</pre>
|
73
|
+
<p>
|
74
|
+
which will write the following in your file:
|
75
|
+
</p>
|
76
|
+
<pre>server port=1234</pre>
|
77
|
+
<h2>SDL Documents</h2>
|
78
|
+
<p>
|
79
|
+
SDL documents are made up of Tags. A Tag contains
|
80
|
+
</p>
|
81
|
+
<ul>
|
82
|
+
<li>a name (if not present, the name “content” is used)
|
83
|
+
|
84
|
+
</li>
|
85
|
+
<li>a namespace (optional)
|
86
|
+
|
87
|
+
</li>
|
88
|
+
<li>0 or more values (optional)
|
89
|
+
|
90
|
+
</li>
|
91
|
+
<li>0 or more attributes (optional)
|
92
|
+
|
93
|
+
</li>
|
94
|
+
<li>0 or more children (optional)
|
95
|
+
|
96
|
+
</li>
|
97
|
+
</ul>
|
98
|
+
<p>
|
99
|
+
For the SDL code:
|
100
|
+
</p>
|
101
|
+
<pre>size 4
smoker false</pre>
|
102
|
+
<p>
|
103
|
+
Assuming this code is in a file called <tt>values.sdl</tt>, the values can
|
104
|
+
be read using the following code (ignoring exceptions):
|
105
|
+
</p>
|
106
|
+
<pre>root = Tag.new("root").read(Pathname.new("values.sdl"))
size = root.child("size").value
smoker = root.child("smoker").value</pre>
|
107
|
+
<p>
|
108
|
+
A tag is basically a data structure with a list of values, a map of
|
109
|
+
attributes, and (if it has a body) child tags. In the example above, the
|
110
|
+
<tt>values.sdl</tt> file is read into a tag called “root”. It
|
111
|
+
has two children (tags) called “size” and “smoker”.
|
112
|
+
Both these children have one value, no attributes, and no bodies.
|
113
|
+
</p>
|
114
|
+
<p>
|
115
|
+
SDL is often used for simple key-value mappings. To simplify things Tag has
|
116
|
+
the methods getValue and setValue which operate on the first element in the
|
117
|
+
values list. Also notice SDL understands types which are determined using
|
118
|
+
type inference.
|
119
|
+
</p>
|
120
|
+
<p>
|
121
|
+
The example above used the simple format common in property files:
|
122
|
+
</p>
|
123
|
+
<pre>name value</pre>
|
124
|
+
<p>
|
125
|
+
The full SDL tag format is:
|
126
|
+
</p>
|
127
|
+
<pre>namespace:name value_list attribute_list {
 children_tags
}</pre>
|
128
|
+
<p>
|
129
|
+
where value_list is zero or more space separated SDL literals and
|
130
|
+
attribute_list is zero or more space separated
|
131
|
+
<tt>(namespace:)key=value</tt> pairs. The name, namespace, and keys are SDL
|
132
|
+
identifiers. Values are SDL literals. Namespace is optional for both tag
|
133
|
+
names and attributes. Tag bodies are also optional. SDL identifiers begin
|
134
|
+
with a unicode letter or an underscore (_) followed by zero or more unicode
|
135
|
+
letters, numbers, underscores (_), dashes (-) and periods (.).
|
136
|
+
</p>
|
137
|
+
<p>
|
138
|
+
Tags without bodies are terminated by a new line character (n) and may be
|
139
|
+
continue onto the next line by placing a backslash () at the end of the
|
140
|
+
line. Tags may be nested to an arbitrary depth. SDL ignores all other white
|
141
|
+
space characters between tokens. Although nested blocks are indented by
|
142
|
+
convention, tabs have no significance in the language.
|
143
|
+
</p>
|
144
|
+
<h2>Anonymous Tags</h2>
|
145
|
+
<p>
|
146
|
+
SDL also supports anonymous tags which are assigned the name
|
147
|
+
“content”. An anonymous tag starts with a literal and is
|
148
|
+
followed by zero or more additional literals and zero or more attributes.
|
149
|
+
The examples section below demonstrates the use of anonymous tags.
|
150
|
+
</p>
|
151
|
+
<pre>greetings {
 "hello" language="English"
}

# If we have a handle on the "greetings" tag we can access the
# anonymous child tag by calling
# Tag child1 = greetingTag.getChild("content");</pre>
|
152
|
+
<h2>String literals</h2>
|
153
|
+
<p>
|
154
|
+
There are two ways to write String literals.
|
155
|
+
</p>
|
156
|
+
<h3>Starting and ending with double quotes (“)</h3>
|
157
|
+
<p>
|
158
|
+
Double quotes, backslash characters (), and new lines (n) within this type
|
159
|
+
of String literal must be escaped like so:
|
160
|
+
</p>
|
161
|
+
<pre>file "C:\\folder\\file.txt"
say "I said \"something\""</pre>
|
162
|
+
<p>
|
163
|
+
This type of String literal can be continued on the next line by placing a
|
164
|
+
backslash () at the end of the line like so:
|
165
|
+
</p>
|
166
|
+
<pre>line "this is a \
 long string of text"</pre>
|
167
|
+
<p>
|
168
|
+
White space before the first character in the second line will be ignored.
|
169
|
+
</p>
|
170
|
+
<h3>Starting and ending with a backquote (`)</h3>
|
171
|
+
<p>
|
172
|
+
This type of string literal can only be ended with a second backquote (`).
|
173
|
+
It is not necessary (or possible) to escape any type of character within a
|
174
|
+
backquote string literal. This type of literal can also span lines. All
|
175
|
+
white spaces are preserved including new lines.
|
176
|
+
</p>
|
177
|
+
<p>
|
178
|
+
Examples:
|
179
|
+
</p>
|
180
|
+
<pre>file `C:\folder\file.txt`
say `I said "something"`
regex `\w+\.suite\(\)`
long_line `This is
 a long line
 fee fi fo fum`</pre>
|
181
|
+
<p>
|
182
|
+
Note: SDL interprets new lines in `` String literals as a single new line
|
183
|
+
character (n) regarless of the platform.
|
184
|
+
</p>
|
185
|
+
<h2>Binary literals</h2>
|
186
|
+
<p>
|
187
|
+
Binary literals use base64 characters enclosed in square brackets ([]). The
|
188
|
+
binary literal type can also span lines. White space is ignored.
|
189
|
+
</p>
|
190
|
+
<p>
|
191
|
+
Examples:
|
192
|
+
</p>
|
193
|
+
<pre>key [sdf789GSfsb2+3324sf2] name="my key"
image [
 R3df789GSfsb2edfSFSDF
 uikuikk2349GSfsb2edfS
 vFSDFR3df789GSfsb2edf
]
upload from="ikayzo.com" data=[
 R3df789GSfsb2edfSFSDF
 uikuikk2349GSfsb2edfS
 vFSDFR3df789GSfsb2edf
]</pre>
|
194
|
+
<h2>Date and Time Literals</h2>
|
195
|
+
<p>
|
196
|
+
SDL supports date, time span, and date/time literals. Date and Date/Time
|
197
|
+
literals use a 24 hour clock (0-23). If a timezone is not specified, the
|
198
|
+
default locale’s timezone will be used.
|
199
|
+
</p>
|
200
|
+
<p>
|
201
|
+
Examples:
|
202
|
+
</p>
|
203
|
+
<ul>
|
204
|
+
<li>create a tag called “date” with a date value of Dec 5, 2005
|
205
|
+
|
206
|
+
<pre>date 2005/12/05</pre>
|
207
|
+
</li>
|
208
|
+
<li>various time span literals
|
209
|
+
|
210
|
+
<pre>hours 03:00:00
minutes 00:12:00
seconds 00:00:42
short_time 00:12:32.423 # 12 minutes, 32 seconds, 423 milliseconds
long_time 30d:15:23:04.023 # 30 days, 15 hours, 23 mins, 4 secs, 23 millis
before -00:02:30 # 2 hours and 30 minutes ago</pre>
|
211
|
+
</li>
|
212
|
+
<li>a date time literal
|
213
|
+
|
214
|
+
<pre>in_japan 2005/12/05 14:12:23.345-JST</pre>
|
215
|
+
</li>
|
216
|
+
</ul>
|
217
|
+
<h2>Literal Types</h2>
|
218
|
+
<p>
|
219
|
+
SDL 1.0 has thirteen literal types (parenthesis indicate optional
|
220
|
+
components)
|
221
|
+
</p>
|
222
|
+
<ol>
|
223
|
+
<li>string (unicode) - examples: <tt>"hello"</tt> or <tt>`aloha`</tt>
|
224
|
+
|
225
|
+
</li>
|
226
|
+
<li>character (unicode) - example: <tt>'/'</tt> Note: uXXXX style unicode
|
227
|
+
escapes are not supported (or needed because sdl files are UTF8)
|
228
|
+
|
229
|
+
</li>
|
230
|
+
<li>integer (32 bits signed) - example: <tt>123</tt>
|
231
|
+
|
232
|
+
</li>
|
233
|
+
<li>long integer (64 bits signed) - examples: <tt>123L</tt> or <tt>123l</tt>
|
234
|
+
|
235
|
+
</li>
|
236
|
+
<li>float (32 bits signed) - examples <tt>123.43F</tt> <tt>123.43f</tt>
|
237
|
+
|
238
|
+
</li>
|
239
|
+
<li>double float (64 bits signed) - example: <tt>123.43</tt> or
|
240
|
+
<tt>123.43d</tt> or <tt>123.43D</tt>
|
241
|
+
|
242
|
+
</li>
|
243
|
+
<li>decimal (128+ bits signed) - example: <tt>123.44BD</tt> or
|
244
|
+
<tt>123.44bd</tt>
|
245
|
+
|
246
|
+
</li>
|
247
|
+
<li>boolean - examples: <tt>true</tt> or <tt>false</tt> or <tt>on</tt> or
|
248
|
+
<tt>off</tt>
|
249
|
+
|
250
|
+
</li>
|
251
|
+
<li>date yyyy/mm/dd - example <tt>2005/12/05</tt>
|
252
|
+
|
253
|
+
</li>
|
254
|
+
<li>date time yyyy/mm/dd hh:mm(:ss)(.xxx)(-ZONE) example - <tt>2005/12/05
|
255
|
+
05:21:23.532-JST</tt> notes: uses a 24 hour clock (0-23), only hours and
|
256
|
+
minutes are mandatory
|
257
|
+
|
258
|
+
</li>
|
259
|
+
<li>time span using the format (d:)hh:mm:ss(.xxx) notes: if the day component
|
260
|
+
is included it must be suffixed with a lower case ‘d’ examples
|
261
|
+
|
262
|
+
<pre>12:14:42 # (12 hours, 14 minutes, 42 seconds)
00:09:12 # (9 minutes, 12 seconds)
00:00:01.023 # (1 second, 23 milliseconds)
23d:05:21:23.532 # (23 days, 5 hours, 21 minutes, 23 seconds, 532 milliseconds)</pre>
|
263
|
+
</li>
|
264
|
+
<li>binary [base64] example - <tt>[sdf789GSfsb2+3324sf2]</tt>
|
265
|
+
|
266
|
+
</li>
|
267
|
+
<li><tt>null</tt>
|
268
|
+
|
269
|
+
</li>
|
270
|
+
</ol>
|
271
|
+
<p>
|
272
|
+
Timezones must be specified using a valid time zone ID (ex.
|
273
|
+
America/Los_Angeles), three letter abbreviation (ex. HST), or
|
274
|
+
GMT(+/-)hh(:mm) formatted custom timezone (ex. GMT+02 or GMT+02:30)
|
275
|
+
</p>
|
276
|
+
<p>
|
277
|
+
These types are designed to be portable across Java, .NET, and other
|
278
|
+
popular platforms.
|
279
|
+
</p>
|
280
|
+
<h2>SDL Comments</h2>
|
281
|
+
<p>
|
282
|
+
SDL supports four comment types.
|
283
|
+
</p>
|
284
|
+
<pre>1. // single line comments identicle to those used in Java, C, etc. // style
 comments can occur anywhere in a line. All text after // up to the new line
 will be ignored.
2. # property style comments. They work the same way as //
3. -- separator comments useful for visually dividing content. They work the same way as //
4. Slash star (/*) style multiline comments. These begin with a slash
 star and end with a star slash. Everything in between is ignored.</pre>
|
285
|
+
<h2>Example</h2>
|
286
|
+
<p>
|
287
|
+
An example SDL file:
|
288
|
+
</p>
|
289
|
+
<pre># a tag having only a name
my_tag

# three tags acting as name value pairs
first_name "Akiko"
last_name "Johnson"
height 68

# a tag with a value list
person "Akiko" "Johnson" 68

# a tag with attributes
person first_name="Akiko" last_name="Johnson" height=68

# a tag with values and attributes
person "Akiko" "Johnson" height=60

# a tag with attributes using namespaces
person name:first-name="Akiko" name:last-name="Johnson"

# a tag with values, attributes, namespaces, and children
my_namespace:person "Akiko" "Johnson" dimensions:height=68 {
 son "Nouhiro" "Johnson"
 daughter "Sabrina" "Johnson" location="Italy" {
 hobbies "swimming" "surfing"
 languages "English" "Italian"
 smoker false
 }
}

------------------------------------------------------------------
// (notice the separator style comment above...)

# a log entry
# note - this tag has two values (date_time and string) and an
# attribute (error)
entry 2005/11/23 10:14:23.253-GMT "Something bad happened" error=true

# a long line
mylist "something" "another" true "shoe" 2002/12/13 "rock" \
 "morestuff" "sink" "penny" 12:15:23.425

# a long string
text "this is a long rambling line of text with a continuation \
 and it keeps going and going..."

# anonymous tag examples

files {
 "/folder1/file.txt"
 "/file2.txt"
}

# To retrieve the files as a list of strings
#
# List files = tag.getChild("files").getChildrenValues("content");
#
# We us the name "content" because the files tag has two children, each of
# which are anonymous tags (values with no name.) These tags are assigned
# the name "content"

matrix {
 1 2 3
 4 5 6
}

# To retrieve the values from the matrix (as a list of lists)
#
# List rows = tag.getChild("matrix").getChildrenValues("content");</pre>
|
290
|
+
<p>
|
291
|
+
Example of getting the “location” attribute from the
|
292
|
+
“daughter” tag above (ignoring exceptions)
|
293
|
+
</p>
|
294
|
+
<pre>root = SDL4R.read(Pathname.new("myfile.sdl"))
daughter = root.child("daughter", true) // recursive search
location = daughter.attribute("location")</pre>
|
295
|
+
<p>
|
296
|
+
SDL is normally stored in a file with the .sdl extension. These files
|
297
|
+
should always be encoded using UTF8. SDL fully supports unicode in
|
298
|
+
identifiers and literals.
|
299
|
+
</p>
|
300
|
+
<h2>Ruby and SDL types</h2>
|
301
|
+
<p>
|
302
|
+
The following list gives what types are used in Ruby in order to represent
|
303
|
+
SDL types.
|
304
|
+
</p>
|
305
|
+
<table>
|
306
|
+
<tr><td valign="top"><b>SDL</b>:</td><td><b>Ruby</b>
|
307
|
+
|
308
|
+
</td></tr>
|
309
|
+
<tr><td valign="top">unicode string:</td><td>String
|
310
|
+
|
311
|
+
</td></tr>
|
312
|
+
<tr><td valign="top">unicode character:</td><td>single-character String
|
313
|
+
|
314
|
+
</td></tr>
|
315
|
+
<tr><td valign="top">integer (32 bits signed):</td><td>Integer (Fixnum or Bignum)
|
316
|
+
|
317
|
+
</td></tr>
|
318
|
+
<tr><td valign="top">long integer (64 bits signed):</td><td>Integer (Fixnum or Bignum)
|
319
|
+
|
320
|
+
</td></tr>
|
321
|
+
<tr><td valign="top">float (32 bits signed):</td><td>Float
|
322
|
+
|
323
|
+
</td></tr>
|
324
|
+
<tr><td valign="top">double float (64 bits signed):</td><td>Float
|
325
|
+
|
326
|
+
</td></tr>
|
327
|
+
<tr><td valign="top">decimal (128+ bits signed):</td><td>BigDecimal
|
328
|
+
|
329
|
+
</td></tr>
|
330
|
+
<tr><td valign="top">boolean:</td><td>true (TrueClass) and false (FalseClass)
|
331
|
+
|
332
|
+
</td></tr>
|
333
|
+
<tr><td valign="top">date (day):</td><td>Date
|
334
|
+
|
335
|
+
</td></tr>
|
336
|
+
<tr><td valign="top">date time:</td><td>DateTime (see <a
|
337
|
+
href="../classes/SDL4R.html#M000003">SDL4R#new_date_time</a> if you want to
|
338
|
+
get Time instances from the parsers)
|
339
|
+
|
340
|
+
</td></tr>
|
341
|
+
<tr><td valign="top">time span:</td><td>SdlTimeSpan
|
342
|
+
|
343
|
+
</td></tr>
|
344
|
+
<tr><td valign="top">binary:</td><td>SdlBinary (to avoid confusion with simple strings)
|
345
|
+
|
346
|
+
</td></tr>
|
347
|
+
<tr><td valign="top">null:</td><td>nil (NilClass)
|
348
|
+
|
349
|
+
</td></tr>
|
350
|
+
</table>
|
351
|
+
<p>
|
352
|
+
TO FIX: the handling of floating numbers in Ruby being different from the
|
353
|
+
Java world, the behavior of <a href="../classes/SDL4R.html">SDL4R</a> at
|
354
|
+
limits might not be perfect for the time being.
|
355
|
+
</p>
|
356
|
+
<h2>UTF-8 Support</h2>
|
357
|
+
<p>
|
358
|
+
In Ruby 1.8, in order to enable UTF-8 support, you may have to declare the
|
359
|
+
following lines:
|
360
|
+
</p>
|
361
|
+
<pre>$KCODE = 'u'
require 'jcode'</pre>
|
362
|
+
<p>
|
363
|
+
This will give you correct input and output and correct UTF-8
|
364
|
+
“general” sorting. Alternatively you can use the following
|
365
|
+
options when launching the Ruby interpreter:
|
366
|
+
</p>
|
367
|
+
<pre>/path/to/ruby -Ku -rjcode</pre>
|
368
|
+
<h2>License</h2>
|
369
|
+
<p>
|
370
|
+
Simple Declarative Language (SDL) for Ruby
|
371
|
+
</p>
|
372
|
+
<p>
|
373
|
+
Copyright 2005 Ikayzo, inc.
|
374
|
+
</p>
|
375
|
+
<p>
|
376
|
+
This program is free software. You can distribute or modify it under the
|
377
|
+
terms of the GNU Lesser General Public License version 2.1 as published by
|
378
|
+
the Free Software Foundation.
|
379
|
+
</p>
|
380
|
+
<p>
|
381
|
+
This program is distributed AS IS and WITHOUT WARRANTY. OF ANY KIND,
|
382
|
+
INCLUDING MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
383
|
+
Lesser General Public License for more details.
|
384
|
+
</p>
|
385
|
+
<p>
|
386
|
+
You should have received a copy of the GNU Lesser General Public License
|
387
|
+
along with this program; if not, contact the Free Software Foundation,
|
388
|
+
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
389
|
+
</p>
|
390
|
+
</div>
|
391
|
+
<div id='section'>
|
392
|
+
</div>
|
393
|
+
</div>
|
394
|
+
</div>
|
395
|
+
<div id='footer-push'></div>
|
396
|
+
</div>
|
397
|
+
<div id='footer'>
|
398
|
+
<a href="http://github.com/mislav/hanna/tree/master"><strong>Hanna</strong> RDoc template</a>
|
594
399
|
</div>
|
595
|
-
|
596
|
-
|
597
|
-
</div>
|
598
|
-
|
599
|
-
|
600
|
-
</div>
|
601
|
-
|
602
|
-
|
603
|
-
<!-- if includes -->
|
604
|
-
|
605
|
-
<div id="section">
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
<!-- if method_list -->
|
615
|
-
|
616
|
-
|
617
|
-
</div>
|
618
|
-
|
619
|
-
|
620
|
-
<div id="validator-badges">
|
621
|
-
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
622
|
-
</div>
|
623
|
-
|
624
|
-
</body>
|
625
|
-
</html>
|
400
|
+
</body>
|
401
|
+
</html>
|