-
Notifications
You must be signed in to change notification settings - Fork 2
/
alexpearce.js
158 lines (142 loc) · 4.24 KB
/
alexpearce.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Capitalizes a string
// Accepts:
// str: string
// Returns:
// string
var majusculeFirst = function(str) {
var temp = str.charAt(0).toUpperCase();
for (var i = 1; i < str.length; i++) {
temp += str.charAt(i).toLowerCase();
}
return temp;
}
// Retrieves the value of a GET parameter with a given key
// Accepts:
// param: string
// Returns:
// string or null
var getParam = function(param) {
var queryString = window.location.search.substring(1),
queries = queryString.split("&");
for (var i in queries) {
var pair = queries[i].split("=");
if (pair[0] == param) {
return pair[1];
}
}
return null;
};
// Filters posts with the condition `post['property'] == value`
// Accepts:
// posts - array of post objects and a string
// property - string of post object property to compare
// value - filter value of property
// Returns:
// array of post objects
var filterPostsByPropertyValue = function(posts, property, value) {
var filteredPosts = [];
// The last element is a null terminator
posts.pop();
for (var i in posts) {
var post = posts[i],
prop = post[property];
// The property could be a string, such as a post's category,
// or an array, such as a post's tags
if (prop.constructor == String) {
if (prop.toLowerCase() == value.toLowerCase()) {
filteredPosts.push(post);
}
} else if (prop.constructor == Array) {
// hehe
prop.pop();
for (var j in prop) {
if (prop[j].toLowerCase() == value.toLowerCase()) {
filteredPosts.push(post);
}
}
}
}
return filteredPosts;
};
// Formats search results and appends them to the DOM
// Accepts:
// property: string of object type we're displaying
// value: string of name of object we're displaying
// posts: array of post objects
// Returns:
// null
var layoutResultsPage = function(property, value, posts) {
// Make sure we're on the search results page
var $container = $('#results');
if ($container.length == 0) return;
// Update the header
var str = majusculeFirst(property) + " Listing for ‘" + majusculeFirst(value) + '’';
$container.find('h1').text(str);
// Loop through each post to format it
for (var i in posts) {
// Create an unordered list of the post's tags
var tagsList = '<ul class="tags cf">',
tags = posts[i].tags;
for (var j in tags) {
tagsList += '<li><a href="/search.html?tags=' + tags[j] + '">' + tags[j] + '</li>';
}
tagsList += '</ul>';
var post = posts[i];
$container.find('ul.results').append(
'<li>'
// Page anchor
+ '<a href="' + post.href + '">'
+ posts[i].title
+ '</a>'
// Post date
+ ' <span class="date">- '
+ posts[i].date.day + ' ' + posts[i].date.month + ' ' + posts[i].date.year
+ '</span>'
// Tags
+ tagsList
+ '</li>'
);
}
return null;
}
// Replaces ERB-style tags with Liquid ones as we can't escape them in posts
// Accepts:
// elements: jQuery elements in which to replace tags
// Returns: nothing
var replaceERBTags = function(elements) {
elements.each(function() {
// Only for text blocks at the moment as we'll strip highlighting otherwise
var $this = $(this),
txt = $this.html();
console.log(txt);
// Replace <%= %>with {{ }}
txt = txt.replace(new RegExp("<%=(.+?)%>", "g"), "{{$1}}");
// Replace <% %> with {% %}
txt = txt.replace(new RegExp("<%(.+?)%>", "g"), "{%$1%}");
$this.html(txt);
});
};
$(function() {
var map = {
'category' : getParam('category'),
'tags' : getParam('tags'),
'search' : getParam('search')
};
$.each(map, function(type, value) {
if (value !== null) {
$.getJSON('/search.json', function(data) {
posts = filterPostsByPropertyValue(data, type, value);
if (posts.length === 0) {
//noResultsPage();
console.log('No results.');
} else {
layoutResultsPage(type, value, posts);
}
});
}
});
// Replace ERB-style Liquid tags in highlighted code blocks...
replaceERBTags($('div.highlight').find('code.text'));
// ... and in inline code
replaceERBTags($('p code'));
});