<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -12,8 +12,10 @@ class RC_VALIDATE
   # http://www.manamplified.org/archives/2006/10/url-regex-pattern.html
   # tags are documented in `rc format.mdown`
   url_pattern = /([A-Za-z][A-Za-z0-9+.-]{1,120}:[A-Za-z0-9\/](([A-Za-z0-9$_.+!*,;\/?:@&amp;~=-])|%[A-Fa-f0-9]{2}){1,333}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;\/?:@&amp;~=%-]{0,1000}))?)/
-  iso_8601_datetime = /[\+-]?\d{5}-(0[1-9]|1[0-2])-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9](\.\d+)?(-[0-2]\d{3}|Z)/
-  iso_8601_duration = /P(\d+YnMnD)?T\d+H\d+M\d+S\/P(\d+YnMnD)?T\d+H\d+M\d+S/
+  iso_8601_datetime = /[\+-]?\d{5}-?(0[1-9]|1[0-2])-?([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-4]):?[0-5][0-9]:?[0-5][0-9](\.\d+)?(-?[0-2]\d{3}|Z)/
+  iso_8601_duration = /P[\+-]?((\d{5}Y)?((0[1-9]|1[0-2])M)?(([0-2][0-9]|3[0-1])D)?)?(T(([0-1][0-9]|2[0-4])H)?([0-5][0-9]M)?([0-5][0-9]S)?)?/
+
+  iso_8601_interval = /(#{iso_8601_datetime}|#{iso_8601_duration})\/(#{iso_8601_datetime}|#{iso_8601_duration})/
   @@valid_metatags = {
         'AUTHOR' =&gt; {'req' =&gt; false, 'pat' =&gt; /\w+/},
         'BOOKMARK' =&gt; {'req' =&gt; false, 'pat' =&gt; url_pattern},
@@ -24,19 +26,19 @@ class RC_VALIDATE
         'LINK' =&gt; {'req' =&gt; false, 'pat' =&gt; url_pattern},
         'MEDIUM' =&gt; {'req' =&gt; false, 'pat' =&gt; /.+/},
         'PERMALINK' =&gt; {'req' =&gt; true, 'pat' =&gt; url_pattern},
-        'PUBLISHED' =&gt; {'req' =&gt; true, 'pat' =&gt; iso_8601_datetime},
-        'SOURCE' =&gt; {'req' =&gt; false, 'pat' =&gt; /\d{5}(, \w*)?/},
-        'SOURCERANGE' =&gt; {'req' =&gt; false, 'pat' =&gt; &quot;(p \d+-\d+(, \d+-\d+)*|#{iso_8601_duration}/#{iso_8601_duration}(, #{iso_8601_duration}/#{iso_8601_duration})*)&quot;},
+        'PUBLISHED' =&gt; {'req' =&gt; true, 'pat' =&gt; /(#{iso_8601_datetime}|#{iso_8601_duration})/},
+        'SOURCE' =&gt; {'req' =&gt; false, 'pat' =&gt; /.+/},
+        'SOURCERANGE' =&gt; {'req' =&gt; false, 'pat' =&gt; /(p \d+-\d+(, \d+-\d+)*|#{iso_8601_interval}(, #{iso_8601_interval})*)/},
         'SOURCEURI' =&gt; {'req' =&gt; false, 'pat' =&gt; url_pattern},
         'TITLE' =&gt; {'req' =&gt; true, 'pat' =&gt; /.+/},
-        'UPDATED' =&gt; {'req' =&gt; true, 'pat' =&gt; iso_8601_datetime}}
+        'UPDATED' =&gt; {'req' =&gt; true, 'pat' =&gt; /(#{iso_8601_datetime}|#{iso_8601_duration})/}}
 
   def load_files(path)
     entries = File.expand_path(path)
     file_list = []
 
     if entries.nil?
-      puts &quot;Please specify a file or directory to validate&quot;
+      @@errors &lt;&lt; &quot;Please specify a file or directory to validate&quot;
     else
       Find.find(entries) { |f|
         file_list &lt;&lt; f
@@ -50,6 +52,7 @@ class RC_VALIDATE
     document = entry.split(&quot;--\n&quot;)
     metatags = document[0]
     body = document[1]
+    @@errors &lt;&lt; &quot;Couldn't find body section&quot; if body.nil?
 
     tags = prepare_tags(metatags)
     tags.each { |name, data|
@@ -71,7 +74,7 @@ class RC_VALIDATE
       this_tag = { tag_name =&gt; tag_data }
       # catch duplicate metatags
       if tags[tag_name]
-        @@errors &lt;&lt; [&quot;Duplicate metatag: #{tag_name}&quot;]
+        @@errors &lt;&lt; &quot;Duplicate metatag: #{tag_name}&quot;
       else
         tags.merge!(this_tag)
       end
@@ -87,19 +90,19 @@ class RC_VALIDATE
     }
     required_tags.each { |key, value|
       unless tags[key]
-        @@errors[&quot;Missing metatag: #{key}&quot;]
+        @@errors &lt;&lt; &quot;Missing metatag: #{key}&quot;
       end
     }
   end
 
   def valid_tag?(name, data)
     if @@valid_metatags[name]
-      match = data =~ @@valid_metatags[name]['pat']
+      match = (data =~ @@valid_metatags[name]['pat'])
       unless 0 === match
-        @@errors &lt;&lt; [&quot;Invalid metatag data for #{name}: #{data}&quot;]
+        @@errors &lt;&lt; &quot;Invalid metatag data for #{name}: #{data}&quot;
       end
     else
-      @@errors &lt;&lt; [&quot;Invalid metatag: #{name}&quot;]
+      @@errors &lt;&lt; &quot;Invalid metatag: #{name}&quot;
     end
   end
 
@@ -116,10 +119,10 @@ class RC_VALIDATE
             entry = IO.read(file)
             parse_entry(entry)
           rescue =&gt; err
-            @@errors &lt;&lt; [&quot;Problem reading file: #{err}\n\n&quot;]
+            @@errors &lt;&lt; &quot;Problem reading file: #{err}&quot;
           end
         elsif 0 === (File.extname(file) =~ /\.mdown/)
-          @@errors &lt;&lt; [&quot;#{file} might be valid, but you need to rename it first&quot;]
+          @@errors &lt;&lt; &quot;#{file} might be valid, but you need to rename it first&quot;
         end
       end
 </diff>
      <filename>rc_validate.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0e6853ebc83ad893cd4b2a9ad24018f452144102</id>
    </parent>
  </parents>
  <author>
    <name>Jordan Cole</name>
    <email>stilist@ratafia.info</email>
  </author>
  <url>http://github.com/stilist/ratafiacurrant/commit/0554c9e56cf2d0d70d81236a515d2f365c402dea</url>
  <id>0554c9e56cf2d0d70d81236a515d2f365c402dea</id>
  <committed-date>2009-10-27T17:29:00-07:00</committed-date>
  <authored-date>2009-10-27T17:29:00-07:00</authored-date>
  <message>Updates to validator: tweak @@error building; support more ISO 8601:2004 modes and generally improve its handling</message>
  <tree>e62c4c2202928e075911c30d1ca6062315b01bb0</tree>
  <committer>
    <name>Jordan Cole</name>
    <email>stilist@ratafia.info</email>
  </committer>
</commit>
