-
Notifications
You must be signed in to change notification settings - Fork 49
/
picky.results_renderer.js
137 lines (115 loc) · 4.3 KB
/
picky.results_renderer.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
var PickyResultsRenderer = function(addination, config) {
var locale = config.locale;
var resultsDivider = config['resultsDivider'];
var allocationWrapper = config['wrapResults'];
var nonPartial = config['nonPartial'];
// Adds asterisks to the last token.
//
var asteriskifyLastToken = function(combinations) {
var last_part = combinations[combinations.length-1];
if (last_part === undefined) { return []; }
var parts = combinations.slice(0, combinations.length-1);
if (parts == []) { parts = [parts]; }
if (!nonPartial.include(last_part[0])) {
// Replace with * unless there is already one or a tilde.
//
if (last_part[1].match(/[^\*~]$/)) { last_part[1] += '*'; }
}
parts.push(last_part);
return parts;
};
this.asteriskifyLastToken = asteriskifyLastToken; // Note: For tests.
// Replaces the category with an explanation of the category.
//
var explainCategory = function(combination) {
var explanations = Localization.explanations && Localization.explanations[locale] || {}; // TODO
var parts = [];
var combo;
for (var i = 0, l = combination.length; i < l; i++) {
combo = combination[i];
var explanation = combo[0];
explanation = explanations[explanation] || explanation;
parts.push([explanation, combo[1]]);
}
return parts;
};
this.explainCategory = explainCategory; // Note: Only exposed for testing.
//
//
var strongify = function(category, joinedTokens) {
return [category.replace(/([\w\sÄäÖöÜüéèà\,]+)/, "<strong>$1</strong>"), joinedTokens].join(' ');
};
this.strongify = strongify; // Note: Only exposed for testing.
// Puts together an explanation.
//
// Note: Accumulates same categories using a whitespace.
//
var explain = function(type, combinations) {
var explanation_delimiter = Localization.explanation_delimiters[locale];
var parts = explainCategory(asteriskifyLastToken(combinations));
var lastCategory = '';
var tokenAccumulator = [];
var joinedTokens = '';
var replaced = []
// Note: Was $.map
parts.each(function(i, part) {
var category = part[0];
var token = part[1];
if (lastCategory == '' || category == lastCategory) {
// Remove categorization (including commas)
// before the token.
//
token = token.replace(/[\w,]+:(.+)/, "$1");
tokenAccumulator.push(token);
lastCategory = category;
return;
}
var result = strongify(lastCategory, tokenAccumulator.join(' '));
tokenAccumulator = [];
tokenAccumulator.push(token);
lastCategory = category;
replaced.push(result);
});
// there might be something in the accumulator
//
replaced.push(strongify(lastCategory, tokenAccumulator.join(' ')));
replaced = replaced.join(' ' + explanation_delimiter + ' ');
replaced = '<span class="explanation">' + type + ' ' + replaced + '</span>';
return replaced;
};
this.explain = explain; // Note: Only exposed for testing.
// TODO Make customizable.
//
var renderHeader = function(data, allocation) {
// TODO Make type definable. (Mapping, i18n)
//
var header_html = '<div class="header">';
header_html += explain(allocation.type, allocation.combination); // TODO Rename to combinations?
if (data.offset > 0) {
// TODO Add the class to the link. Remove the div.
//
header_html += '<div class="tothetop"><a href="#" onclick="javascript:$(\'body\').animate({scrollTop: 0}, 500);">↑</a></div>';
// searchEngine.focus();
}
header_html += '</div>';
return header_html;
};
this.renderHeader = renderHeader;
// Render results with the data.
//
this.render = function(results, data) {
data.allocations.each(function(i, allocation) {
// Only render if there is something to render.
// TODO Move into methods.
//
if (allocation.entries.length > 0) {
// TODO header.render(data);
//
results.append(renderHeader(data, allocation))
.append(allocation.entries.join(resultsDivider));
results.children('li').wrapAll(allocationWrapper);
}
});
results.append(addination.render(data));
};
};