twitst4tz

twitter statistics web application
Log | Files | Refs | README | LICENSE

links.js (2195B)


      1 /** 
      2  * JSON Schema link handler
      3  * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
      4  * Licensed under the MIT (MIT-LICENSE.txt) license.
      5  */
      6 (function (root, factory) {
      7     if (typeof define === 'function' && define.amd) {
      8         // AMD. Register as an anonymous module.
      9         define([], function () {
     10             return factory();
     11         });
     12     } else if (typeof module === 'object' && module.exports) {
     13         // Node. Does not work with strict CommonJS, but
     14         // only CommonJS-like environments that support module.exports,
     15         // like Node.
     16         module.exports = factory();
     17     } else {
     18         // Browser globals
     19         root.jsonSchemaLinks = factory();
     20     }
     21 }(this, function () {// setup primitive classes to be JSON Schema types
     22 var exports = {};
     23 exports.cacheLinks = true;
     24 exports.getLink = function(relation, instance, schema){
     25 	// gets the URI of the link for the given relation based on the instance and schema
     26 	// for example:
     27 	// getLink(
     28 	// 		"brother", 
     29 	// 		{"brother_id":33}, 
     30 	// 		{links:[{rel:"brother", href:"Brother/{brother_id}"}]}) ->
     31 	//	"Brother/33"
     32 	var links = schema.__linkTemplates; 
     33 	if(!links){
     34 		links = {};
     35 		var schemaLinks = schema.links;
     36 		if(schemaLinks && schemaLinks instanceof Array){
     37 			schemaLinks.forEach(function(link){
     38 	/*			// TODO: allow for multiple same-name relations
     39 				if(links[link.rel]){
     40 					if(!(links[link.rel] instanceof Array)){
     41 						links[link.rel] = [links[link.rel]];
     42 					}
     43 				}*/
     44 				links[link.rel] = link.href;
     45 			});
     46 		}
     47 		if(exports.cacheLinks){
     48 			schema.__linkTemplates = links;
     49 		}
     50 	}
     51 	var linkTemplate = links[relation];
     52 	return linkTemplate && exports.substitute(linkTemplate, instance);
     53 };
     54 
     55 exports.substitute = function(linkTemplate, instance){
     56 	return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){
     57 			var value = instance[decodeURIComponent(property)];
     58 			if(value instanceof Array){
     59 				// the value is an array, it should produce a URI like /Table/(4,5,8) and store.get() should handle that as an array of values
     60 				return '(' + value.join(',') + ')';
     61 			}
     62 			return value;
     63 		});
     64 };
     65 return exports;
     66 }));