1/* 2 * Metadata - jQuery plugin for parsing metadata from elements 3 * 4 * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan 5 * 6 * Dual licensed under the MIT and GPL licenses: 7 * http://www.opensource.org/licenses/mit-license.php 8 * http://www.gnu.org/licenses/gpl.html 9 * 10 * Revision: $Id: jquery.metadata.js 3640 2007-10-11 18:34:38Z pmclanahan $ 11 * 12 */ 13 14/** 15 * Sets the type of metadata to use. Metadata is encoded in JSON, and each property 16 * in the JSON will become a property of the element itself. 17 * 18 * There are four supported types of metadata storage: 19 * 20 * attr: Inside an attribute. The name parameter indicates *which* attribute. 21 * 22 * class: Inside the class attribute, wrapped in curly braces: { } 23 * 24 * elem: Inside a child element (e.g. a script tag). The 25 * name parameter indicates *which* element. 26 * html5: Values are stored in data-* attributes. 27 * 28 * The metadata for an element is loaded the first time the element is accessed via jQuery. 29 * 30 * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements 31 * matched by expr, then redefine the metadata type and run another $(expr) for other elements. 32 * 33 * @name $.metadata.setType 34 * 35 * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p> 36 * @before $.metadata.setType("class") 37 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 38 * @desc Reads metadata from the class attribute 39 * 40 * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p> 41 * @before $.metadata.setType("attr", "data") 42 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 43 * @desc Reads metadata from a "data" attribute 44 * 45 * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p> 46 * @before $.metadata.setType("elem", "script") 47 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 48 * @desc Reads metadata from a nested script element 49 * 50 * @example <p id="one" class="some_class" data-item_id="1" data-item_label="Label">This is a p</p> 51 * @before $.metadata.setType("html5") 52 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 53 * @desc Reads metadata from a series of data-* attributes 54 * 55 * @param String type The encoding type 56 * @param String name The name of the attribute to be used to get metadata (optional) 57 * @cat Plugins/Metadata 58 * @descr Sets the type of encoding to be used when loading metadata for the first time 59 * @type undefined 60 * @see metadata() 61 */ 62 63(function ($) { 64 $.extend({ 65 metadata: { 66 defaults: { 67 type: 'class', 68 name: 'metadata', 69 cre: /({.*})/, 70 single: 'metadata' 71 }, 72 setType: function (type, name) { 73 this.defaults.type = type; 74 this.defaults.name = name; 75 }, 76 get: function (elem, opts) { 77 var settings = $.extend({}, this.defaults, opts); 78 // check for empty string in single property 79 if (!settings.single.length) settings.single = 'metadata'; 80 81 var data = $.data(elem, settings.single); 82 // returned cached data if it already exists 83 if (data) return data; 84 85 data = '{}'; 86 87 var getData = function (data) { 88 if (typeof data != 'string') return data; 89 90 if (data.indexOf('{') < 0) { 91 data = eval('(' + data + ')'); 92 } 93 }; 94 95 var getObject = function (data) { 96 if (typeof data != 'string') return data; 97 98 data = eval('(' + data + ')'); 99 return data; 100 }; 101 102 if (settings.type == 'html5') { 103 var object = {}; 104 $(elem.attributes).each(function () { 105 var name = this.nodeName; 106 if (name.match(/^data-/)) name = name.replace(/^data-/, ''); 107 else return true; 108 object[name] = getObject(this.nodeValue); 109 }); 110 } else { 111 if (settings.type == 'class') { 112 var m = settings.cre.exec(elem.className); 113 if (m) data = m[1]; 114 } else if (settings.type == 'elem') { 115 if (!elem.getElementsByTagName) return; 116 var e = elem.getElementsByTagName(settings.name); 117 if (e.length) data = $.trim(e[0].innerHTML); 118 } else if (elem.getAttribute != undefined) { 119 var attr = elem.getAttribute(settings.name); 120 if (attr) data = attr; 121 } 122 object = getObject(data.indexOf('{') < 0 ? '{' + data + '}' : data); 123 } 124 125 $.data(elem, settings.single, object); 126 return object; 127 } 128 } 129 }); 130 131 /** 132 * Returns the metadata object for the first member of the jQuery object. 133 * 134 * @name metadata
135 * @descr Returns element's metadata object 136 * @param Object opts An object contianing settings to override the defaults 137 * @type jQuery 138 * @cat Plugins/Metadata 139 */ 140 $.fn.metadata = function (opts) { 141 return $.metadata.get(this[0], opts); 142 }; 143})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.