Run lebab

This commit is contained in:
Mimi 2020-07-22 22:44:50 +08:00
parent 96406e79ae
commit 924318a19d
4 changed files with 106 additions and 113 deletions

View File

@ -1,7 +1,7 @@
<script{{ pjax }}> <script{{ pjax }}>
(function() { (function() {
// Initialization // Initialization
var calendar = { const calendar = {
orderBy : 'startTime', orderBy : 'startTime',
showLocation: false, showLocation: false,
offsetMax : 72, offsetMax : 72,
@ -14,9 +14,9 @@
// Read config form theme config file // Read config form theme config file
Object.assign(calendar, {{ theme.calendar | safedump }}); Object.assign(calendar, {{ theme.calendar | safedump }});
var now = new Date(); const now = new Date();
var timeMax = new Date(); const timeMax = new Date();
var timeMin = new Date(); const timeMin = new Date();
timeMax.setHours(now.getHours() + calendar.offsetMax); timeMax.setHours(now.getHours() + calendar.offsetMax);
timeMin.setHours(now.getHours() - calendar.offsetMin); timeMin.setHours(now.getHours() - calendar.offsetMin);
@ -32,88 +32,37 @@
maxResults : calendar.maxResults maxResults : calendar.maxResults
}; };
var request_url = 'https://www.googleapis.com/calendar/v3/calendars/' + calendar.calendar_id + '/events?' + Object.entries(params).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join('&'); const request_url = 'https://www.googleapis.com/calendar/v3/calendars/' + calendar.calendar_id + '/events?' + Object.entries(params).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join('&');
fetchData();
var fetchDataTimer = setInterval(fetchData, 60000);
document.addEventListener('pjax:send', () => {
clearInterval(fetchDataTimer);
});
function fetchData() {
var eventList = document.querySelector('.event-list');
if (!eventList) return;
fetch(request_url).then(response => {
return response.json();
}).then(data => {
if (data.items.length === 0) {
eventList.innerHTML = '<hr>';
return;
}
// Clean the event list
eventList.innerHTML = '';
var prevEnd = 0; // used to decide where to insert an <hr>
data.items.forEach(event => {
// Parse data
var utc = new Date().getTimezoneOffset() * 60000;
var start = event.start.dateTime = new Date(event.start.dateTime || (new Date(event.start.date).getTime() + utc));
var end = event.end.dateTime = new Date(event.end.dateTime || (new Date(event.end.date).getTime() + utc));
tense = judgeTense(now, start, end); // 0:now 1:future -1:past
if (tense === 1 && prevEnd < now) {
eventList.innerHTML += '<hr>';
}
eventDOM = buildEventDOM(tense, event);
eventList.innerHTML += eventDOM;
prevEnd = end;
});
});
}
function getRelativeTime(current, previous) { function getRelativeTime(current, previous) {
var msPerMinute = 60 * 1000; const msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60; const msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24; const msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30; const msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365; const msPerYear = msPerDay * 365;
var elapsed = current - previous; let elapsed = current - previous;
var tense = elapsed > 0 ? 'ago' : 'later'; const tense = elapsed > 0 ? 'ago' : 'later';
elapsed = Math.abs(elapsed); elapsed = Math.abs(elapsed);
if (elapsed < msPerHour) { if (elapsed < msPerHour) {
return Math.round(elapsed / msPerMinute) + ' minutes ' + tense; return Math.round(elapsed / msPerMinute) + ' minutes ' + tense;
} } else if (elapsed < msPerDay) {
else if ( elapsed < msPerDay ) {
return Math.round(elapsed / msPerHour) + ' hours ' + tense; return Math.round(elapsed / msPerHour) + ' hours ' + tense;
} } else if (elapsed < msPerMonth) {
else if ( elapsed < msPerMonth ) {
return 'about ' + Math.round(elapsed / msPerDay) + ' days ' + tense; return 'about ' + Math.round(elapsed / msPerDay) + ' days ' + tense;
} } else if (elapsed < msPerYear) {
else if ( elapsed < msPerYear ) {
return 'about ' + Math.round(elapsed / msPerMonth) + ' months ' + tense; return 'about ' + Math.round(elapsed / msPerMonth) + ' months ' + tense;
} }
else {
return 'about' + Math.round(elapsed / msPerYear) + ' years' + tense;
}
}
function judgeTense(now, eventStart, eventEnd) { return 'about' + Math.round(elapsed / msPerYear) + ' years' + tense;
if (eventEnd < now) { return -1; }
else if (eventStart > now) { return 1; }
else { return 0; }
} }
function buildEventDOM(tense, event) { function buildEventDOM(tense, event) {
var tenseClass = ''; let tenseClass = '';
var start = event.start.dateTime; const start = event.start.dateTime;
var end = event.end.dateTime; const end = event.end.dateTime;
switch (tense) { switch (tense) {
case 0: // now case 0: // now
tenseClass = 'event-now'; tenseClass = 'event-now';
@ -125,22 +74,22 @@
tenseClass = 'event-past'; tenseClass = 'event-past';
break; break;
default: default:
throw 'Time data error'; throw new Error('Time data error');
} }
var durationFormat = { const durationFormat = {
weekday: 'short', weekday: 'short',
hour : '2-digit', hour : '2-digit',
minute : '2-digit' minute : '2-digit'
}; };
var relativeTimeStr = (tense === 0) ? 'NOW' : getRelativeTime(now, start); const relativeTimeStr = tense === 0 ? 'NOW' : getRelativeTime(now, start);
var durationStr = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat); const durationStr = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat);
var locationDOM = ''; let locationDOM = '';
if (calendar.showLocation && event.location) { if (calendar.showLocation && event.location) {
locationDOM = '<span class="event-location event-details">' + event.location + '</span>'; locationDOM = '<span class="event-location event-details">' + event.location + '</span>';
} }
var eventContent = `<div class="event ${tenseClass}"> const eventContent = `<div class="event ${tenseClass}">
<h2 class="event-summary"> <h2 class="event-summary">
${event.summary} ${event.summary}
<span class="event-relative-time">${relativeTimeStr}</span> <span class="event-relative-time">${relativeTimeStr}</span>
@ -150,5 +99,49 @@
</div>`; </div>`;
return eventContent; return eventContent;
} }
function fetchData() {
const eventList = document.querySelector('.event-list');
if (!eventList) return;
fetch(request_url).then(response => {
return response.json();
}).then(data => {
if (data.items.length === 0) {
eventList.innerHTML = '<hr>';
return;
}
// Clean the event list
eventList.innerHTML = '';
let prevEnd = 0; // used to decide where to insert an <hr>
data.items.forEach(event => {
// Parse data
const utc = new Date().getTimezoneOffset() * 60000;
const start = event.start.dateTime = new Date(event.start.dateTime || (new Date(event.start.date).getTime() + utc));
const end = event.end.dateTime = new Date(event.end.dateTime || (new Date(event.end.date).getTime() + utc));
let tense = 0; // 0:now 1:future -1:past
if (end < now) {
tense = -1;
} else if (start > now) {
tense = 1;
}
if (tense === 1 && prevEnd < now) {
eventList.innerHTML += '<hr>';
}
eventList.innerHTML += buildEventDOM(tense, event);
prevEnd = end;
});
});
}
fetchData();
const fetchDataTimer = setInterval(fetchData, 60000);
document.addEventListener('pjax:send', () => {
clearInterval(fetchDataTimer);
});
})(); })();
</script> </script>

View File

@ -38,7 +38,7 @@
} }
}; };
(function () { (function () {
var script = document.createElement('script'); const script = document.createElement('script');
script.src = '{{ url_for(mathjax_uri) }}'; script.src = '{{ url_for(mathjax_uri) }}';
script.defer = true; script.defer = true;
document.head.appendChild(script); document.head.appendChild(script);

View File

@ -10,7 +10,7 @@
function getCount(doc, increaseCount) { function getCount(doc, increaseCount) {
// IncreaseCount will be false when not in article page // IncreaseCount will be false when not in article page
return doc.get().then(d => { return doc.get().then(d => {
var count = 0; let count = 0;
if (!d.exists) { // Has no data, initialize count if (!d.exists) { // Has no data, initialize count
if (increaseCount) { if (increaseCount) {
doc.set({ doc.set({
@ -41,13 +41,13 @@
</script> </script>
<script{{ pjax }}> <script{{ pjax }}>
(function() { (function() {
var db = firebase.firestore(); const db = firebase.firestore();
var articles = db.collection('{{ theme.firestore.collection }}'); const articles = db.collection('{{ theme.firestore.collection }}');
if (CONFIG.page.isPost) { // Is article page if (CONFIG.page.isPost) { // Is article page
var title = document.querySelector('.post-title').innerText.trim(); const title = document.querySelector('.post-title').innerText.trim();
var doc = articles.doc(title); const doc = articles.doc(title);
var increaseCount = CONFIG.hostname === location.hostname; let increaseCount = CONFIG.hostname === location.hostname;
if (localStorage.getItem(title)) { if (localStorage.getItem(title)) {
increaseCount = false; increaseCount = false;
} else { } else {
@ -56,13 +56,13 @@
} }
getCount(doc, increaseCount).then(appendCountTo(document.querySelector('.firestore-visitors-count'))); getCount(doc, increaseCount).then(appendCountTo(document.querySelector('.firestore-visitors-count')));
} else if (CONFIG.page.isHome) { // Is index page } else if (CONFIG.page.isHome) { // Is index page
var promises = [...document.querySelectorAll('.post-title')].map(element => { const promises = [...document.querySelectorAll('.post-title')].map(element => {
var title = element.innerText.trim(); const title = element.innerText.trim();
var doc = articles.doc(title); const doc = articles.doc(title);
return getCount(doc); return getCount(doc);
}); });
Promise.all(promises).then(counts => { Promise.all(promises).then(counts => {
var metas = document.querySelectorAll('.firestore-visitors-count'); const metas = document.querySelectorAll('.firestore-visitors-count');
counts.forEach((val, idx) => { counts.forEach((val, idx) => {
appendCountTo(metas[idx])(val); appendCountTo(metas[idx])(val);
}); });

View File

@ -7,15 +7,15 @@
} }
function addCount(Counter) { function addCount(Counter) {
var visitors = document.querySelector('.leancloud_visitors'); const visitors = document.querySelector('.leancloud_visitors');
var url = decodeURI(visitors.id); const url = decodeURI(visitors.id);
var title = visitors.dataset.flagTitle; const title = visitors.dataset.flagTitle;
Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url }))) Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url })))
.then(response => response.json()) .then(response => response.json())
.then(({ results }) => { .then(({ results }) => {
if (results.length > 0) { if (results.length > 0) {
var counter = results[0]; const counter = results[0];
leancloudSelector(url).innerText = counter.time + 1; leancloudSelector(url).innerText = counter.time + 1;
Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } }) Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
.catch(error => { .catch(error => {
@ -43,8 +43,8 @@
} }
function showTime(Counter) { function showTime(Counter) {
var visitors = document.querySelectorAll('.leancloud_visitors'); const visitors = document.querySelectorAll('.leancloud_visitors');
var entries = [...visitors].map(element => { const entries = [...visitors].map(element => {
return decodeURI(element.id); return decodeURI(element.id);
}); });
@ -63,7 +63,7 @@
let { app_id, app_key, server_url } = {{ theme.leancloud_visitors | safedump }}; let { app_id, app_key, server_url } = {{ theme.leancloud_visitors | safedump }};
function fetchData(api_server) { function fetchData(api_server) {
var Counter = (method, url, data) => { const Counter = (method, url, data) => {
return fetch(`${api_server}/1.1${url}`, { return fetch(`${api_server}/1.1${url}`, {
method, method,
headers: { headers: {
@ -82,7 +82,7 @@
} }
} }
let api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`; const api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
if (api_server) { if (api_server) {
fetchData(api_server); fetchData(api_server);