Sync vCard itemref loop handling with spec
[microdatajs:microdatajs.git] / jquery.microdata.json.js
1 /* -*- mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
2
3 // http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#json
4 jQuery.microdata.json = function(selector, format) {
5   var $ = jQuery;
6
7   function getObject(item, memory) {
8     var $item = $(item);
9     var result = {};
10     if ($item.itemType())
11       result.type = $item.itemType();
12     if ($item.itemId())
13       result.id = $item.itemId();
14     result.properties = {};
15     $item.properties().each(function(i, elem) {
16       var $elem = $(elem);
17       var value;
18       if ($elem.itemScope()) {
19         if (memory.indexOf(elem) != -1) {
20           value = 'ERROR';
21         } else {
22           memory.push(item);
23           value = getObject(elem, memory);
24           memory.pop();
25         }
26       } else {
27         value = $elem.itemValue();
28       }
29       $elem.itemProp().each(function(i, prop) {
30         if (!result.properties[prop])
31           result.properties[prop] = [];
32         result.properties[prop].push(value);
33       });
34     });
35     return result;
36   }
37
38   var result = {};
39   result.items = [];
40   var $items = selector ? $(selector) : $(document).items();
41   $items.each(function(i, item) {
42     var $item = $(item);
43     if ($item.itemScope())
44       result.items.push(getObject(item, []));
45   });
46   return format ? format(result) : JSON.stringify(result);
47 };