udat 1.1.3 → 1.2.0

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 (2) hide show
  1. data/lib/udat.rb +32 -4
  2. metadata +2 -2
@@ -52,6 +52,11 @@ class Udat
52
52
 
53
53
  [rational|2/3]
54
54
 
55
+ The following 7 characters must be escaped with a backslash, when
56
+ being part of a tag or being part of the content of a scalar:
57
+
58
+ \< \> \[ \] \| \~ \\
59
+
55
60
 
56
61
  Arrays (or sets):
57
62
 
@@ -69,6 +74,21 @@ class Udat
69
74
  References like in YAML with &id and *id
70
75
  are not directly supported by UDAT.
71
76
 
77
+ Empty arrays, sets or maps must contain the ~ character, to avoid
78
+ ambiguity with scalars:
79
+
80
+ [ ] scalar containing three spaces
81
+ [ ~ ] empty array
82
+ [list of numbers| ~ ] empty array, tagged with "list of numbers"
83
+ [ ~ comment ] empty array with a comment
84
+ [ comment ~ ] another empty array with a comment
85
+ [ ~~ ] empty array too (multiple ~ are allowed)
86
+
87
+ It is also allowed to write ~ in non-empty arrays. In that case the ~
88
+ symbol is ignored.
89
+
90
+ [~ [1] [2] [3] ] Array containing "1", "2" and "3"
91
+
72
92
 
73
93
  Ordered or unordered maps:
74
94
 
@@ -145,7 +165,7 @@ class Udat
145
165
  # Returns an escaped version of a string, where backslashes are preceding
146
166
  # certain reserved characters.
147
167
  def self.escape_string(string)
148
- string.to_s.gsub /([<>\[\]|\\])/, "\\\\\\1"
168
+ string.to_s.gsub /([<>\[\]|~\\])/, "\\\\\\1"
149
169
  end
150
170
  # Calls Udat.escape_string.
151
171
  def escape_string(string)
@@ -245,8 +265,8 @@ class Udat
245
265
  if char.empty?
246
266
  raise UdatParseError, "Backslash at end of input."
247
267
  end
248
- if char =~ /([<>\[\]|\\])/
249
- string << char
268
+ if char =~ /([<>\[\]|~\\])/
269
+ string << char if string
250
270
  elsif char == "\n"
251
271
  elsif char == "\r"
252
272
  next_char = input[pos + 1, 1]
@@ -259,9 +279,16 @@ class Udat
259
279
  if tag
260
280
  raise UdatParseError, "Multiple occurrences of pipe symbol."
261
281
  end
282
+ unless string
283
+ raise UdatParseError, "Unexpected occurrence of pipe symbol."
284
+ end
262
285
  tag = string
263
286
  string = ""
264
287
  pos += 1
288
+ when "~"
289
+ collection ||= UdatCollection.new(tag, [])
290
+ string = nil
291
+ pos += 1
265
292
  when "<"
266
293
  if key
267
294
  raise UdatParseError, "Unexpected opening angle bracket."
@@ -289,7 +316,7 @@ class Udat
289
316
  when "]"
290
317
  break
291
318
  else
292
- string << char
319
+ string << char if string
293
320
  pos += 1
294
321
  end
295
322
  end
@@ -810,6 +837,7 @@ class UdatCollection < Udat
810
837
  def encoded_content
811
838
  synchronize do
812
839
  return (
840
+ @entries.empty? ? "~" :
813
841
  @entries.collect do |key, value|
814
842
  if key
815
843
  "<#{key.encode}>[#{value.encode}]"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: udat
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.1.3
7
- date: 2007-05-24 00:00:00 +00:00
6
+ version: 1.2.0
7
+ date: 2007-05-25 00:00:00 +00:00
8
8
  summary: Parser and generator for UDAT documents, a generic data format similar to XML or YAML.
9
9
  require_paths:
10
10
  - lib/