Requires

Provides

Item.js

Methods to get and set microdata closely to html5 spsec

License:
MIT-style license.
  1. 19
  2. 20
  3. 21
  4. 22
  5. 23
  6. 24
  7. 25
  8. 26
  9. 27
  10. 28
  11. 29
  12. 30
  13. 31
  14. 32
  15. 33
  16. 34
  17. 35
  18. 36
  19. 37
  20. 38
  21. 39
  22. 40
  23. 41
  24. 42
  25. 43
  26. 44
  27. 45
  28. 46
  29. 47
  30. 48
  31. 49
  32. 50
  33. 51
  34. 52
  35. 53
  36. 54
  37. 55
  38. 56
  39. 57
  40. 58
  41. 59
  42. 60
  43. 61
  44. 62
  45. 63
  46. 64
  47. 65
  48. 66
  49. 67
  50. 68
  51. 69
  52. 70
  53. 71
  54. 72
  55. 73
  56. 74
  57. 75
  58. 76
  59. 77
  60. 78
  61. 79
  62. 80
  63. 81
  64. 82
  65. 83
  66. 84
  67. 85
  68. 86
  69. 87
  70. 88
  71. 89
  72. 90
  73. 91
  74. 92
  75. 93
  76. 94
  77. 95
  78. 96
  79. 97
  80. 98
  81. 99
  82. 100
  83. 101
  84. 102
  85. 103
  86. 104
  87. 105
  88. 106
  89. 107
  90. 108
  91. 109
  92. 110
  93. 111
  94. 112
  95. 113
  96. 114
  97. 115
  98. 116
  99. 117
  100. 118
  101. 119
  102. 120
  103. 121
  104. 122
  105. 123
  106. 124
  107. 125
  108. 126
  109. 127
  110. 128
  111. 129
  112. 130
  113. 131
  114. 132
  115. 133
  116. 134
  117. 135
  118. 136
  119. 137
  120. 138
  121. 139
  122. 140
  123. 141
  124. 142
  125. 143
  126. 144
  127. 145
  128. 146
  129. 147
  130. 148
  131. 149
  132. 150
  133. 151
  134. 152
  135. 153
  136. 154
  137. 155
  138. 156
  139. 157
  140. 158
  141. 159
  142. 160
  143. 161
  144. 162
  145. 163
  146. 164
  147. 165
[Document, Element].invoke('implement', { getItems: function(tokens) { var selector = '[itemscope]:not([itemprop])'; if (tokens) selector += tokens.split(' ').map(function(type) { return '[itemtype~=' + type + ']' }).join(''); return this.getElements(selector).each(function(element) { return element.get('item'); }).get('item') } }); (function() { var push = function(properties, property, value) { var old = properties[property]; if (old) { //multiple values, convert to array if (!old.push) properties[property] = [old]; properties[property].push(value) } else { properties[property] = value; } } Element.Properties.properties = { get: function() { var properties = {}; var property = this.getProperty('itemprop'); if (property) { var value = this.get('itemvalue'); if (value) push(properties, property, value) } this.getChildren().each(function(child) { var values = child.get('properties'); for (var property in values) push(properties, property, values[property]); }); var reference = this.getProperty('itemref'); if (reference) { var selector = reference.split(' ').map(function(id) { return '#' + id}).join(', '); $$(selector).each(function(reference) { var values = reference.get('properties'); for (var property in values) push(properties, property, values[property]); }) } return properties; }, set: function(value) { this.getChildren().each(function(child) { var property = child.getProperty('itemprop'); if (property) child.set('itemvalue', value[property]); else child.set('properties', value) }); } }; })(); Element.Properties.item = { get: function() { if (!this.getProperty('itemscope')) return; return this.get('properties'); }, set: function(value) { if (!this.getProperty('itemscope')) return; return this.set('properties', value); } }; (function() { var resolve = function(url) { if (!url) return ''; var img = document.createElement('img'); img.setAttribute('src', url); return img.src; } Element.Properties.itemvalue = { get: function() { var property = this.getProperty('itemprop'); if (!property) return; var item = this.get('item'); if (item) return item; switch (this.get('tag')) { case 'meta': return this.get('content') || ''; case 'input': case 'select': case 'textarea': return this.get('value'); case 'audio': case 'embed': case 'iframe': case 'img': case 'source': case 'video': return resolve(this.get('src')); case 'a': case 'area': case 'link': return resolve(this.get('href')); case 'object': return resolve(this.get('data')); case 'time': var datetime = this.get('datetime'); if (!(datetime === undefined)) return datetime; default: return this.getProperty('itemvalue') || this.get('text'); } }, set: function(value) { var property = this.getProperty('itemprop'); var scope = this.getProperty('itemscope'); if (property === undefined) return; else if (scope && Object.type(value[scope])) return this.set('item', value[scope]); switch (this.get('tag')) { case 'meta': return this.set('content', value); case 'audio': case 'embed': case 'iframe': case 'img': case 'source': case 'video': return this.set('src', value); case 'a': case 'area': case 'link': return this.set('href', value); case 'object': return this.set('data', value); case 'time': var datetime = this.get('datetime'); if (!(datetime === undefined)) this.set('datetime', value) default: return this.set('html', value); } } } })();