l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

type.js (1586B)


      1 'use strict';
      2 
      3 var YAMLException = require('./exception');
      4 
      5 var TYPE_CONSTRUCTOR_OPTIONS = [
      6   'kind',
      7   'resolve',
      8   'construct',
      9   'instanceOf',
     10   'predicate',
     11   'represent',
     12   'defaultStyle',
     13   'styleAliases'
     14 ];
     15 
     16 var YAML_NODE_KINDS = [
     17   'scalar',
     18   'sequence',
     19   'mapping'
     20 ];
     21 
     22 function compileStyleAliases(map) {
     23   var result = {};
     24 
     25   if (map !== null) {
     26     Object.keys(map).forEach(function (style) {
     27       map[style].forEach(function (alias) {
     28         result[String(alias)] = style;
     29       });
     30     });
     31   }
     32 
     33   return result;
     34 }
     35 
     36 function Type(tag, options) {
     37   options = options || {};
     38 
     39   Object.keys(options).forEach(function (name) {
     40     if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
     41       throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
     42     }
     43   });
     44 
     45   // TODO: Add tag format check.
     46   this.tag          = tag;
     47   this.kind         = options['kind']         || null;
     48   this.resolve      = options['resolve']      || function () { return true; };
     49   this.construct    = options['construct']    || function (data) { return data; };
     50   this.instanceOf   = options['instanceOf']   || null;
     51   this.predicate    = options['predicate']    || null;
     52   this.represent    = options['represent']    || null;
     53   this.defaultStyle = options['defaultStyle'] || null;
     54   this.styleAliases = compileStyleAliases(options['styleAliases'] || null);
     55 
     56   if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
     57     throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
     58   }
     59 }
     60 
     61 module.exports = Type;