| 'use strict'; | 
|   | 
| var Type = require('../type'); | 
|   | 
| var YAML_DATE_REGEXP = new RegExp( | 
|   '^([0-9][0-9][0-9][0-9])'          + // [1] year | 
|   '-([0-9][0-9])'                    + // [2] month | 
|   '-([0-9][0-9])$');                   // [3] day | 
|   | 
| var YAML_TIMESTAMP_REGEXP = new RegExp( | 
|   '^([0-9][0-9][0-9][0-9])'          + // [1] year | 
|   '-([0-9][0-9]?)'                   + // [2] month | 
|   '-([0-9][0-9]?)'                   + // [3] day | 
|   '(?:[Tt]|[ \\t]+)'                 + // ... | 
|   '([0-9][0-9]?)'                    + // [4] hour | 
|   ':([0-9][0-9])'                    + // [5] minute | 
|   ':([0-9][0-9])'                    + // [6] second | 
|   '(?:\\.([0-9]*))?'                 + // [7] fraction | 
|   '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour | 
|   '(?::([0-9][0-9]))?))?$');           // [11] tz_minute | 
|   | 
| function resolveYamlTimestamp(data) { | 
|   if (data === null) return false; | 
|   if (YAML_DATE_REGEXP.exec(data) !== null) return true; | 
|   if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; | 
|   return false; | 
| } | 
|   | 
| function constructYamlTimestamp(data) { | 
|   var match, year, month, day, hour, minute, second, fraction = 0, | 
|       delta = null, tz_hour, tz_minute, date; | 
|   | 
|   match = YAML_DATE_REGEXP.exec(data); | 
|   if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); | 
|   | 
|   if (match === null) throw new Error('Date resolve error'); | 
|   | 
|   // match: [1] year [2] month [3] day | 
|   | 
|   year = +(match[1]); | 
|   month = +(match[2]) - 1; // JS month starts with 0 | 
|   day = +(match[3]); | 
|   | 
|   if (!match[4]) { // no hour | 
|     return new Date(Date.UTC(year, month, day)); | 
|   } | 
|   | 
|   // match: [4] hour [5] minute [6] second [7] fraction | 
|   | 
|   hour = +(match[4]); | 
|   minute = +(match[5]); | 
|   second = +(match[6]); | 
|   | 
|   if (match[7]) { | 
|     fraction = match[7].slice(0, 3); | 
|     while (fraction.length < 3) { // milli-seconds | 
|       fraction += '0'; | 
|     } | 
|     fraction = +fraction; | 
|   } | 
|   | 
|   // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute | 
|   | 
|   if (match[9]) { | 
|     tz_hour = +(match[10]); | 
|     tz_minute = +(match[11] || 0); | 
|     delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds | 
|     if (match[9] === '-') delta = -delta; | 
|   } | 
|   | 
|   date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); | 
|   | 
|   if (delta) date.setTime(date.getTime() - delta); | 
|   | 
|   return date; | 
| } | 
|   | 
| function representYamlTimestamp(object /*, style*/) { | 
|   return object.toISOString(); | 
| } | 
|   | 
| module.exports = new Type('tag:yaml.org,2002:timestamp', { | 
|   kind: 'scalar', | 
|   resolve: resolveYamlTimestamp, | 
|   construct: constructYamlTimestamp, | 
|   instanceOf: Date, | 
|   represent: representYamlTimestamp | 
| }); |