sdl4r 0.9.6 → 0.9.7

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.
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>