sdl4r 0.9.6 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/CHANGELOG +49 -2
  2. data/Rakefile +35 -5
  3. data/TODO +29 -3
  4. data/doc/classes/SDL4R.html +386 -674
  5. data/doc/classes/SDL4R/Parser.html +183 -307
  6. data/doc/classes/SDL4R/ParserTest.html +357 -0
  7. data/doc/classes/SDL4R/SDL4RTest.html +532 -0
  8. data/doc/classes/SDL4R/SDLTest.html +77 -0
  9. data/doc/classes/SDL4R/SdlBinary.html +180 -295
  10. data/doc/classes/SDL4R/SdlParseError.html +105 -180
  11. data/doc/classes/SDL4R/SdlTimeSpan.html +628 -939
  12. data/doc/classes/SDL4R/Tag.html +1236 -2036
  13. data/doc/classes/SDL4R/TagTest.html +292 -0
  14. data/doc/created.rid +1 -1
  15. data/doc/files/CHANGELOG.html +183 -184
  16. data/doc/files/LICENSE.html +496 -755
  17. data/doc/files/README.html +399 -623
  18. data/doc/files/lib/sdl4r/parser/reader_rb.html +53 -106
  19. data/doc/files/lib/sdl4r/parser/time_span_with_zone_rb.html +53 -106
  20. data/doc/files/lib/sdl4r/parser/token_rb.html +53 -106
  21. data/doc/files/lib/sdl4r/parser/tokenizer_rb.html +53 -106
  22. data/doc/files/lib/sdl4r/parser_rb.html +60 -112
  23. data/doc/files/lib/sdl4r/sdl4r_rb.html +62 -114
  24. data/doc/files/lib/sdl4r/sdl_binary_rb.html +53 -106
  25. data/doc/files/lib/sdl4r/sdl_parse_error_rb.html +53 -106
  26. data/doc/files/lib/sdl4r/sdl_time_span_rb.html +53 -106
  27. data/doc/files/lib/sdl4r/tag_rb.html +62 -114
  28. data/doc/files/lib/sdl4r_rb.html +53 -106
  29. data/doc/files/test/sdl4r/parser_test_rb.html +63 -0
  30. data/doc/files/test/sdl4r/sdl4r_test_rb.html +66 -0
  31. data/doc/files/test/sdl4r/sdl_test_rb.html +63 -0
  32. data/doc/files/test/sdl4r/tag_test_rb.html +63 -0
  33. data/doc/fr_class_index.html +19 -32
  34. data/doc/fr_file_index.html +37 -40
  35. data/doc/fr_method_index.html +4707 -114
  36. data/doc/index.html +14 -23
  37. data/doc/rdoc-style.css +323 -203
  38. data/lib/sdl4r/parser/reader.rb +26 -19
  39. data/lib/sdl4r/parser/token.rb +3 -3
  40. data/lib/sdl4r/parser/tokenizer.rb +93 -98
  41. data/lib/sdl4r/sdl_parse_error.rb +2 -2
  42. data/lib/sdl4r/tag.rb +127 -73
  43. data/test/sdl4r/parser_test.rb +109 -11
  44. data/test/sdl4r/tag_test.rb +73 -4
  45. metadata +15 -12
@@ -1,625 +1,401 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: README</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
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(&quot;my_directory/my_config.sdl&quot;))
107
- puts root.attribute(&quot;port&quot;)
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(&quot;root&quot;) do
117
- new_child(&quot;server&quot;) do
118
- set_attribute(&quot;port&quot;, 1234)
119
- end
120
- end
121
- File.open(&quot;my_directory/my_config.sdl&quot;, &quot;w&quot;) { |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 &quot;content&quot; 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(&quot;root&quot;).read(Pathname.new(&quot;values.sdl&quot;))
165
- size = root.child(&quot;size&quot;).value
166
- smoker = root.child(&quot;smoker&quot;).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 &quot;root&quot;. It has
172
- two children (tags) called &quot;size&quot; and &quot;smoker&quot;. 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
- &quot;content&quot;. 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
- &quot;hello&quot; language=&quot;English&quot;
221
- }
222
-
223
- # If we have a handle on the &quot;greetings&quot; tag we can access the
224
- # anonymous child tag by calling
225
- # Tag child1 = greetingTag.getChild(&quot;content&quot;);
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 (&quot;)</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 &quot;C:\\folder\\file.txt&quot;
238
- say &quot;I said \&quot;something\&quot;&quot;
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 &quot;this is a \
246
- long string of text&quot;
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 &quot;something&quot;`
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=&quot;my key&quot;
283
- image [
284
- R3df789GSfsb2edfSFSDF
285
- uikuikk2349GSfsb2edfS
286
- vFSDFR3df789GSfsb2edf
287
- ]
288
- upload from=&quot;ikayzo.com&quot; 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&#8216;s timezone will be used.
299
- </p>
300
- <p>
301
- Examples:
302
- </p>
303
- <ul>
304
- <li>create a tag called &quot;date&quot; 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>&quot;hello&quot;</tt> or <tt>`aloha`</tt>
335
-
336
- </li>
337
- <li>character (unicode) - example: <tt>&#8217;/&#8217;</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 &#8216;d&#8217; 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 &quot;Akiko&quot;
419
- last_name &quot;Johnson&quot;
420
- height 68
421
-
422
- # a tag with a value list
423
- person &quot;Akiko&quot; &quot;Johnson&quot; 68
424
-
425
- # a tag with attributes
426
- person first_name=&quot;Akiko&quot; last_name=&quot;Johnson&quot; height=68
427
-
428
- # a tag with values and attributes
429
- person &quot;Akiko&quot; &quot;Johnson&quot; height=60
430
-
431
- # a tag with attributes using namespaces
432
- person name:first-name=&quot;Akiko&quot; name:last-name=&quot;Johnson&quot;
433
-
434
- # a tag with values, attributes, namespaces, and children
435
- my_namespace:person &quot;Akiko&quot; &quot;Johnson&quot; dimensions:height=68 {
436
- son &quot;Nouhiro&quot; &quot;Johnson&quot;
437
- daughter &quot;Sabrina&quot; &quot;Johnson&quot; location=&quot;Italy&quot; {
438
- hobbies &quot;swimming&quot; &quot;surfing&quot;
439
- languages &quot;English&quot; &quot;Italian&quot;
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
- // (notice the separator style comment above...)
446
-
447
- # a log entry
448
- # note - this tag has two values (date_time and string) and an
449
- # attribute (error)
450
- entry 2005/11/23 10:14:23.253-GMT &quot;Something bad happened&quot; error=true
451
-
452
- # a long line
453
- mylist &quot;something&quot; &quot;another&quot; true &quot;shoe&quot; 2002/12/13 &quot;rock&quot; \
454
- &quot;morestuff&quot; &quot;sink&quot; &quot;penny&quot; 12:15:23.425
455
-
456
- # a long string
457
- text &quot;this is a long rambling line of text with a continuation \
458
- and it keeps going and going...&quot;
459
-
460
- # anonymous tag examples
461
-
462
- files {
463
- &quot;/folder1/file.txt&quot;
464
- &quot;/file2.txt&quot;
465
- }
466
-
467
- # To retrieve the files as a list of strings
468
- #
469
- # List files = tag.getChild(&quot;files&quot;).getChildrenValues(&quot;content&quot;);
470
- #
471
- # We us the name &quot;content&quot; because the files tag has two children, each of
472
- # which are anonymous tags (values with no name.) These tags are assigned
473
- # the name &quot;content&quot;
474
-
475
- matrix {
476
- 1 2 3
477
- 4 5 6
478
- }
479
-
480
- # To retrieve the values from the matrix (as a list of lists)
481
- #
482
- # List rows = tag.getChild(&quot;matrix&quot;).getChildrenValues(&quot;content&quot;);
483
- </pre>
484
- <p>
485
- Example of getting the &quot;location&quot; attribute from the
486
- &quot;daughter&quot; tag above (ignoring exceptions)
487
- </p>
488
- <pre>
489
- root = SDL4R.read(Pathname.new(&quot;myfile.sdl&quot;))
490
- daughter = root.child(&quot;daughter&quot;, true) // recursive search
491
- location = daughter.attribute(&quot;location&quot;)
492
- </pre>
493
- <p>
494
- SDL is normally stored in a file with the .sdl extension. These files
495
- should always be encoded using UTF8. SDL fully supports unicode in
496
- identifiers and literals.
497
- </p>
498
- <h2>Ruby and SDL types</h2>
499
- <p>
500
- The following list gives what types are used in Ruby in order to represent
501
- SDL types.
502
- </p>
503
- <table>
504
- <tr><td valign="top"><b>SDL</b>:</td><td><b>Ruby</b>
505
-
506
- </td></tr>
507
- <tr><td valign="top">unicode string:</td><td>String
508
-
509
- </td></tr>
510
- <tr><td valign="top">unicode character:</td><td>single-character String
511
-
512
- </td></tr>
513
- <tr><td valign="top">integer (32 bits signed):</td><td>Integer (Fixnum or Bignum)
514
-
515
- </td></tr>
516
- <tr><td valign="top">long integer (64 bits signed):</td><td>Integer (Fixnum or Bignum)
517
-
518
- </td></tr>
519
- <tr><td valign="top">float (32 bits signed):</td><td>Float
520
-
521
- </td></tr>
522
- <tr><td valign="top">double float (64 bits signed):</td><td>Float
523
-
524
- </td></tr>
525
- <tr><td valign="top">decimal (128+ bits signed):</td><td>BigDecimal
526
-
527
- </td></tr>
528
- <tr><td valign="top">boolean:</td><td>true (TrueClass) and false (FalseClass)
529
-
530
- </td></tr>
531
- <tr><td valign="top">date (day):</td><td>Date
532
-
533
- </td></tr>
534
- <tr><td valign="top">date time:</td><td>DateTime (see <a
535
- href="../classes/SDL4R.html#M000003">SDL4R#new_date_time</a> if you want to
536
- get Time instances from the parsers)
537
-
538
- </td></tr>
539
- <tr><td valign="top">time span:</td><td>SdlTimeSpan
540
-
541
- </td></tr>
542
- <tr><td valign="top">binary:</td><td>SdlBinary (to avoid confusion with simple strings)
543
-
544
- </td></tr>
545
- <tr><td valign="top">null:</td><td>nil (NilClass)
546
-
547
- </td></tr>
548
- </table>
549
- <p>
550
- TO FIX: the handling of floating numbers in Ruby being different from the
551
- Java world, the behavior of <a href="../classes/SDL4R.html">SDL4R</a> at
552
- limits might not be perfect for the time being.
553
- </p>
554
- <h2>UTF-8 Support</h2>
555
- <p>
556
- In Ruby 1.8, in order to enable UTF-8 support, you may have to declare the
557
- following lines:
558
- </p>
559
- <pre>
560
- $KCODE = 'u'
561
- require 'jcode'
562
- </pre>
563
- <p>
564
- This will give you correct input and output and correct UTF-8
565
- &quot;general&quot; sorting. Alternatively you can use the following
566
- options when launching the Ruby interpreter:
567
- </p>
568
- <pre>
569
- /path/to/ruby -Ku -rjcode
570
- </pre>
571
- <h2>License</h2>
572
- <p>
573
- Simple Declarative Language (SDL) for Ruby
574
- </p>
575
- <p>
576
- Copyright 2005 Ikayzo, inc.
577
- </p>
578
- <p>
579
- This program is free software. You can distribute or modify it under the
580
- terms of the GNU Lesser General Public License version 2.1 as published by
581
- the Free Software Foundation.
582
- </p>
583
- <p>
584
- This program is distributed AS IS and WITHOUT WARRANTY. OF ANY KIND,
585
- INCLUDING MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU
586
- Lesser General Public License for more details.
587
- </p>
588
- <p>
589
- You should have received a copy of the GNU Lesser General Public License
590
- along with this program; if not, contact the Free Software Foundation,
591
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
592
- </p>
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'&#x000A;require 'sdl4r'&#x000A;&#x000A;root = SDL4R::read(Pathname.new(&quot;my_directory/my_config.sdl&quot;))&#x000A;puts root.attribute(&quot;port&quot;)</pre>
69
+ <p>
70
+ Or you can create SDL documents with the API:
71
+ </p>
72
+ <pre>require 'fileutils'&#x000A;require 'sdl4r'&#x000A;&#x000A;root = SDL4R::Tag.new(&quot;root&quot;) do&#x000A; new_child(&quot;server&quot;) do&#x000A; set_attribute(&quot;port&quot;, 1234)&#x000A; end&#x000A;end&#x000A;File.open(&quot;my_directory/my_config.sdl&quot;, &quot;w&quot;) { |io|&#x000A; io.write(root.children_to_string)&#x000A;}</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 &#8220;content&#8221; 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&#x000A;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(&quot;root&quot;).read(Pathname.new(&quot;values.sdl&quot;))&#x000A;size = root.child(&quot;size&quot;).value&#x000A;smoker = root.child(&quot;smoker&quot;).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 &#8220;root&#8221;. It
111
+ has two children (tags) called &#8220;size&#8221; and &#8220;smoker&#8221;.
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 {&#x000A; children_tags&#x000A;}</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
+ &#8220;content&#8221;. 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 {&#x000A; &quot;hello&quot; language=&quot;English&quot;&#x000A;}&#x000A;&#x000A;# If we have a handle on the &quot;greetings&quot; tag we can access the&#x000A;# anonymous child tag by calling&#x000A;# Tag child1 = greetingTag.getChild(&quot;content&quot;);</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 (&#8220;)</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 &quot;C:\\folder\\file.txt&quot;&#x000A;say &quot;I said \&quot;something\&quot;&quot;</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 &quot;this is a \&#x000A; long string of text&quot;</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`&#x000A;say `I said &quot;something&quot;`&#x000A;regex `\w+\.suite\(\)`&#x000A;long_line `This is&#x000A; a long line&#x000A; 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=&quot;my key&quot;&#x000A;image [&#x000A; R3df789GSfsb2edfSFSDF&#x000A; uikuikk2349GSfsb2edfS&#x000A; vFSDFR3df789GSfsb2edf&#x000A;]&#x000A;upload from=&quot;ikayzo.com&quot; data=[&#x000A; R3df789GSfsb2edfSFSDF&#x000A; uikuikk2349GSfsb2edfS&#x000A; vFSDFR3df789GSfsb2edf&#x000A;]</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&#8217;s timezone will be used.
199
+ </p>
200
+ <p>
201
+ Examples:
202
+ </p>
203
+ <ul>
204
+ <li>create a tag called &#8220;date&#8221; 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&#x000A;minutes 00:12:00&#x000A;seconds 00:00:42&#x000A;short_time 00:12:32.423 # 12 minutes, 32 seconds, 423 milliseconds&#x000A;long_time 30d:15:23:04.023 # 30 days, 15 hours, 23 mins, 4 secs, 23 millis&#x000A;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>&quot;hello&quot;</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 &#8216;d&#8217; examples
261
+
262
+ <pre>12:14:42 # (12 hours, 14 minutes, 42 seconds)&#x000A;00:09:12 # (9 minutes, 12 seconds)&#x000A;00:00:01.023 # (1 second, 23 milliseconds)&#x000A;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&#x000A; comments can occur anywhere in a line. All text after // up to the new line&#x000A; will be ignored.&#x000A;2. # property style comments. They work the same way as //&#x000A;3. -- separator comments useful for visually dividing content. They work the same way as //&#x000A;4. Slash star (/*) style multiline comments. These begin with a slash&#x000A; 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&#x000A;my_tag&#x000A;&#x000A;# three tags acting as name value pairs&#x000A;first_name &quot;Akiko&quot;&#x000A;last_name &quot;Johnson&quot;&#x000A;height 68&#x000A;&#x000A;# a tag with a value list&#x000A;person &quot;Akiko&quot; &quot;Johnson&quot; 68&#x000A;&#x000A;# a tag with attributes&#x000A;person first_name=&quot;Akiko&quot; last_name=&quot;Johnson&quot; height=68&#x000A;&#x000A;# a tag with values and attributes&#x000A;person &quot;Akiko&quot; &quot;Johnson&quot; height=60&#x000A;&#x000A;# a tag with attributes using namespaces&#x000A;person name:first-name=&quot;Akiko&quot; name:last-name=&quot;Johnson&quot;&#x000A;&#x000A;# a tag with values, attributes, namespaces, and children&#x000A;my_namespace:person &quot;Akiko&quot; &quot;Johnson&quot; dimensions:height=68 {&#x000A; son &quot;Nouhiro&quot; &quot;Johnson&quot;&#x000A; daughter &quot;Sabrina&quot; &quot;Johnson&quot; location=&quot;Italy&quot; {&#x000A; hobbies &quot;swimming&quot; &quot;surfing&quot;&#x000A; languages &quot;English&quot; &quot;Italian&quot;&#x000A; smoker false&#x000A; }&#x000A;}&#x000A;&#x000A;------------------------------------------------------------------&#x000A;// (notice the separator style comment above...)&#x000A;&#x000A;# a log entry&#x000A;# note - this tag has two values (date_time and string) and an&#x000A;# attribute (error)&#x000A;entry 2005/11/23 10:14:23.253-GMT &quot;Something bad happened&quot; error=true&#x000A;&#x000A;# a long line&#x000A;mylist &quot;something&quot; &quot;another&quot; true &quot;shoe&quot; 2002/12/13 &quot;rock&quot; \&#x000A; &quot;morestuff&quot; &quot;sink&quot; &quot;penny&quot; 12:15:23.425&#x000A;&#x000A;# a long string&#x000A;text &quot;this is a long rambling line of text with a continuation \&#x000A; and it keeps going and going...&quot;&#x000A;&#x000A;# anonymous tag examples&#x000A;&#x000A;files {&#x000A; &quot;/folder1/file.txt&quot;&#x000A; &quot;/file2.txt&quot;&#x000A;}&#x000A;&#x000A;# To retrieve the files as a list of strings&#x000A;#&#x000A;# List files = tag.getChild(&quot;files&quot;).getChildrenValues(&quot;content&quot;);&#x000A;#&#x000A;# We us the name &quot;content&quot; because the files tag has two children, each of&#x000A;# which are anonymous tags (values with no name.) These tags are assigned&#x000A;# the name &quot;content&quot;&#x000A;&#x000A;matrix {&#x000A; 1 2 3&#x000A; 4 5 6&#x000A;}&#x000A;&#x000A;# To retrieve the values from the matrix (as a list of lists)&#x000A;#&#x000A;# List rows = tag.getChild(&quot;matrix&quot;).getChildrenValues(&quot;content&quot;);</pre>
290
+ <p>
291
+ Example of getting the &#8220;location&#8221; attribute from the
292
+ &#8220;daughter&#8221; tag above (ignoring exceptions)
293
+ </p>
294
+ <pre>root = SDL4R.read(Pathname.new(&quot;myfile.sdl&quot;))&#x000A;daughter = root.child(&quot;daughter&quot;, true) // recursive search&#x000A;location = daughter.attribute(&quot;location&quot;)</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'&#x000A;require 'jcode'</pre>
362
+ <p>
363
+ This will give you correct input and output and correct UTF-8
364
+ &#8220;general&#8221; 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>