forked from ppa-cast/cast-store
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
264 lines (231 loc) · 9.26 KB
/
index.html
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
<script src="https://npmcdn.com/[email protected]/ejs.min.js"></script>
<script src="extensions.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-42547942-5"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-42547942-5');
</script>
<style>
body { background-color: #eee;}
@keyframes spinner {
to {transform: rotate(360deg);}
}
.spinner:before {
content: '';
box-sizing: border-box;
position: absolute;
top: 50%;
left: 50%;
width: 20px;
height: 20px;
margin-top: -10px;
margin-left: -10px;
border-radius: 50%;
border: 2px solid #ccc;
border-top-color: #000;
animation: spinner .6s linear infinite;
}
</style>
</head>
<body>
<div id="spinner" class="spinner"></div>
<div id="output"></div>
<script>
const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
const oneMonth = oneDay * 30;
const oneWeek = oneDay * 7;
var collect = (json) => {
var extensions = {};
json.rows.forEach((it) => {
if (! it.listed) return;
var extension = extensions[it.id];
if (! extension) {
extension = extensions[it.id] = {
id: it.id,
type: it.type,
createdOn: new Date(it.published), // do not use it.created, this is an odd date
analyzer: it.analyzer,
provider: it.author
};
}
// Save some properties for the latest version only
if (it.absoluteLatest) {
extension.title = it.title;
let downloads = extension.downloads = it.downloads;
extension.version = it.version;
extension.description = it.description;
let date = extension.date = extension.publishedOn = new Date(it.published);
extension.age = getDuration (extension.publishedOn, new Date());
extension.iconurl = it.iconurl;
extension.versionType = it.versionType;
extension.promoted = it.promoted;
extension.category = extensionsDirectory[it.id] || "unclassified";
}
// createdOn is the oldest date, it.downloads is the total download
if (it.published && extension.createdOn >= new Date(it.published)) {
extension.createdOn = new Date(it.published);
let months = Math.round(getDaysBetween(extension.createdOn, new Date()) / 30) || 1;
extension.score = Math.round(it.downloads / months); // average number of downloads per week
}
});
var addedLast30days = () => {
var arr = Object.keys(extensions).reduce(
(acc, it) => {
var extension = extensions[it];
if (((new Date()).getTime() - extension.createdOn.getTime()) < oneMonth)
acc.push(extension);
return acc;
}, []);
arr = arr.sort((it1, it2) => it2.date - it1.date);
return arr;
}
var upgradedLast30days = () => {
var arr = Object.keys(extensions).reduce(
(acc, it) => {
var extension = extensions[it];
if ((extension.provider === "CAST Product")
&& (extension.versionType === "funcrel" || extension.versionType === "lts")) return acc;
if (((new Date()).getTime() - extension.createdOn.getTime()) > oneMonth &&
((new Date()).getTime() - extension.publishedOn.getTime()) < oneMonth)
acc.push(extension);
return acc;
}, []);
arr = arr.sort((it1, it2) => it2.date - it1.date);
return arr;
}
var releasedLast30days = () => {
var arr = Object.keys(extensions).reduce(
(acc, it) => {
var extension = extensions[it];
if (extension.provider !== "CAST Product") return acc;
if (extension.versionType !== "funcrel" && extension.versionType !== "lts") return acc;
if (((new Date()).getTime() - extension.createdOn.getTime()) > oneMonth &&
((new Date()).getTime() - extension.publishedOn.getTime()) < oneMonth)
acc.push(extension);
return acc;
}, []);
arr = arr.sort((it1, it2) => it2.date - it1.date);
return arr;
}
var promoted = () => {
var arr = Object.keys(extensions).reduce(
(acc, it) => {
var extension = extensions[it];
if (extension.promoted)
acc.push(extension);
return acc;
}, []);
arr = arr.sort((it1, it2) => it2.date - it1.date);
return arr;
}
var category = (category) => {
var arr = Object.keys(extensions).reduce(
(acc, it) => {
var extension = extensions[it];
if (extension.category === category)
acc.push(extension);
return acc;
}, []);
arr = arr.sort((it1, it2) => it2.score - it1.score); // Ordered by score
return arr;
}
var allExtensions = {
added: addedLast30days(),
upgraded: upgradedLast30days(),
released: releasedLast30days(),
promoted: promoted(),
unclassified: category('unclassified'),
customCategories: {},
};
// Add custom categories (see extensions.js)
Object.keys(categories).forEach ((it) => allExtensions.customCategories[it] = category(it));
return allExtensions;
}
// This script is released to the public domain and may be used, modified and
// distributed without restrictions. Attribution not necessary but appreciated.
// Source: https://weeknumber.net/how-to/javascript
// Returns the ISO week of the date.
Date.prototype.getWeek = function() {
var date = new Date(this.getTime());
date.setHours(0, 0, 0, 0);
// Thursday in current week decides the year.
date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
// January 4 is always in week 1.
var week1 = new Date(date.getFullYear(), 0, 4);
// Adjust to Thursday in week 1 and count number of weeks from date to week1.
return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000
- 3 + (week1.getDay() + 6) % 7) / 7);
}
// get number of years between two dates
var getYearsBetween = (before, after) => {
return after.getFullYear() - before.getFullYear();
}
// get number of months between 2 dates;
var getMonthsBetween = (before, after) => {
if (after.getFullYear() === before.getFullYear())
return after.getMonth() - before.getMonth();
var deltaYears = after.getFullYear() - before.getFullYear();
var deltaMonths = after.getMonth() + (11 - before.getMonth()) + 1;
return deltaMonths + (deltaYears-1)*12;
}
// get number of weeks between 2 dates
var getWeeksBetween = (before, after) => {
if (after.getFullYear() === before.getFullYear())
return after.getWeek() - before.getWeek();
var deltaYears = after.getFullYear() - before.getFullYear();
var deltaWeeks = after.getWeek() + (52 - before.getWeek()) + 1;
return deltaWeeks + (deltaYears-1)*12;
}
// get number of days between two dates
var getDaysBetween = (before, after) => {
return Math.round(((new Date(after).setHours(0,0,0,0)) - (new Date(before).setHours(0,0,0,0))) / (24*60*60*1000));
}
var getDuration = (before, after) => {
let format = (nb, unit) => (nb === 1) ? (nb + " " + unit + " ago") : (nb + " " + unit + "s ago");
var days = getDaysBetween (before, after);
if (days == 0)
return "today";
if (days == 1)
return "yesterday";
if (days <= 3)
return format(days, "day");
var weeks = getWeeksBetween (before, after);
if (weeks == 0)
return "this week";
if (weeks == 1)
return "last week";
var months = getMonthsBetween (before, after);
if (months == 0)
return "this month";
if (months == 1)
return "last month";
if (months <= 6)
return format(months, "month");
var years = getYearsBetween (before, after);
if (years == 0)
return "this year";
if (years == 1)
return "last year";
return format(years, "year");
}
var render = (json, template) => {
$('#spinner').removeClass('spinner');
var allExtensions = collect(json[0]);
var html = ejs.render(template[0], allExtensions, null);
$('#output').html(html);
}
var unavailable = (e) => {
$('#spinner').removeClass('spinner');
$('#output').html('Service not available, please check <a href="https://extendng.castsoftware.com">https://extendng.castsoftware.com</a>');
}
$.when( $.ajax( "https://extendng.castsoftware.com/api/package" ), $.ajax( "template.html" ) )
.then( render, unavailable );
</script>
</body>