-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhalpert.jquery.js
86 lines (70 loc) · 2.3 KB
/
halpert.jquery.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
var parseProperties = function(properties) {
return _.reduce(properties, function(memo, property) {
var el = $(property),
name = el.attr('property'),
val = el.html();
memo[name] = val;
return memo;
}, {})
}
var embeddedLinks = function(el) {
el.find('[resource]').remove();
var selfLink = { self: [{href: el.attr('resource')}] },
bodyLinks = parseLinks(el.find('a[rel],link[rel]'), selfLink),
links = _.extend(selfLink, bodyLinks);
return { _links: links }
}
var parseCuries = function(prefix_attr) {
var prefix_re = /([^\s]+): ([^\s]+)/g,
prefixes = prefix_attr.match(prefix_re);
var curies = _.map(prefixes, function(prefix) {
var items = prefix.split(': ');
return {
name: items[0],
href: items[1],
templated: true
}
});
return { curies: curies };
}
var parseLinks = function(links, currentLinks) {
return _.reduce(links, function(memo, link) {
var el = $(link),
rel = el.attr('rel'),
href = el.attr('href'),
title = el.attr('title');
if(!_.has(memo, rel)) memo[rel] = [];
memo[rel].push({ href: href, title: title })
return memo
}, currentLinks)
}
var parseEmbedded = function(resources) {
var embedded = _.reduce(resources, function(memo, resource) {
var el = $(resource),
typeOf = el.attr('typeof');
if(!typeOf) return memo;
if(!_.has(memo, typeOf)) memo[typeOf] = [];
var properties = parseProperties(el.find('[property]'));
var links = embeddedLinks(el);
memo[typeOf].push(_.extend(properties, links));
return memo;
}, {})
return { _embedded: embedded }
}
var halLinks = function(links) {
return {
_links: links
}
}
var Halpert = function() {
var clone = $('html').clone(),
embedded = parseEmbedded($('body').find('[resource]'))
curies = parseCuries($('html').attr('prefix')),
headerLinks = parseLinks($('head').find('link[rel!="stylesheet"]'), {});
// Now that we have the embedded, let's remove them
clone.find('[resource]').remove();
var bodyLinks = parseLinks(clone.find('body').find('a[rel],link[rel]'), headerLinks),
mainLinks = halLinks(_.extend(curies, headerLinks, bodyLinks)),
mainProperties = parseProperties(clone.find('[property]'));
return _.extend(mainLinks, mainProperties, embedded);
}