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 }}>
(function() {
// Initialization
var calendar = {
const calendar = {
orderBy : 'startTime',
showLocation: false,
offsetMax : 72,
@ -14,9 +14,9 @@
// Read config form theme config file
Object.assign(calendar, {{ theme.calendar | safedump }});
var now = new Date();
var timeMax = new Date();
var timeMin = new Date();
const now = new Date();
const timeMax = new Date();
const timeMin = new Date();
timeMax.setHours(now.getHours() + calendar.offsetMax);
timeMin.setHours(now.getHours() - calendar.offsetMin);
@ -32,16 +32,76 @@
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 getRelativeTime(current, previous) {
const msPerMinute = 60 * 1000;
const msPerHour = msPerMinute * 60;
const msPerDay = msPerHour * 24;
const msPerMonth = msPerDay * 30;
const msPerYear = msPerDay * 365;
let elapsed = current - previous;
const tense = elapsed > 0 ? 'ago' : 'later';
elapsed = Math.abs(elapsed);
if (elapsed < msPerHour) {
return Math.round(elapsed / msPerMinute) + ' minutes ' + tense;
} else if (elapsed < msPerDay) {
return Math.round(elapsed / msPerHour) + ' hours ' + tense;
} else if (elapsed < msPerMonth) {
return 'about ' + Math.round(elapsed / msPerDay) + ' days ' + tense;
} else if (elapsed < msPerYear) {
return 'about ' + Math.round(elapsed / msPerMonth) + ' months ' + tense;
}
return 'about' + Math.round(elapsed / msPerYear) + ' years' + tense;
}
function buildEventDOM(tense, event) {
let tenseClass = '';
const start = event.start.dateTime;
const end = event.end.dateTime;
switch (tense) {
case 0: // now
tenseClass = 'event-now';
break;
case 1: // future
tenseClass = 'event-future';
break;
case -1: // past
tenseClass = 'event-past';
break;
default:
throw new Error('Time data error');
}
const durationFormat = {
weekday: 'short',
hour : '2-digit',
minute : '2-digit'
};
const relativeTimeStr = tense === 0 ? 'NOW' : getRelativeTime(now, start);
const durationStr = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat);
let locationDOM = '';
if (calendar.showLocation && event.location) {
locationDOM = '<span class="event-location event-details">' + event.location + '</span>';
}
const eventContent = `<div class="event ${tenseClass}">
<h2 class="event-summary">
${event.summary}
<span class="event-relative-time">${relativeTimeStr}</span>
</h2>
${locationDOM}
<span class="event-duration event-details">${durationStr}</span>
</div>`;
return eventContent;
}
function fetchData() {
var eventList = document.querySelector('.event-list');
const eventList = document.querySelector('.event-list');
if (!eventList) return;
fetch(request_url).then(response => {
@ -53,102 +113,35 @@
}
// Clean the event list
eventList.innerHTML = '';
var prevEnd = 0; // used to decide where to insert an <hr>
let 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));
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));
tense = judgeTense(now, start, end); // 0:now 1:future -1:past
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>';
}
eventDOM = buildEventDOM(tense, event);
eventList.innerHTML += eventDOM;
eventList.innerHTML += buildEventDOM(tense, event);
prevEnd = end;
});
});
}
function getRelativeTime(current, previous) {
var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var elapsed = current - previous;
var tense = elapsed > 0 ? 'ago' : 'later';
elapsed = Math.abs(elapsed);
if ( elapsed < msPerHour ) {
return Math.round(elapsed / msPerMinute) + ' minutes ' + tense;
}
else if ( elapsed < msPerDay ) {
return Math.round(elapsed / msPerHour) + ' hours ' + tense;
}
else if ( elapsed < msPerMonth ) {
return 'about ' + Math.round(elapsed / msPerDay) + ' days ' + tense;
}
else if ( elapsed < msPerYear ) {
return 'about ' + Math.round(elapsed / msPerMonth) + ' months ' + tense;
}
else {
return 'about' + Math.round(elapsed / msPerYear) + ' years' + tense;
}
}
function judgeTense(now, eventStart, eventEnd) {
if (eventEnd < now) { return -1; }
else if (eventStart > now) { return 1; }
else { return 0; }
}
function buildEventDOM(tense, event) {
var tenseClass = '';
var start = event.start.dateTime;
var end = event.end.dateTime;
switch(tense) {
case 0 : // now
tenseClass = 'event-now';
break;
case 1 : // future
tenseClass = 'event-future';
break;
case -1: // past
tenseClass = 'event-past';
break;
default:
throw 'Time data error';
}
var durationFormat = {
weekday: 'short',
hour : '2-digit',
minute : '2-digit'
};
var relativeTimeStr = (tense === 0) ? 'NOW' : getRelativeTime(now, start);
var durationStr = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat);
var locationDOM = '';
if (calendar.showLocation && event.location) {
locationDOM = '<span class="event-location event-details">' + event.location + '</span>';
}
var eventContent = `<div class="event ${tenseClass}">
<h2 class="event-summary">
${event.summary}
<span class="event-relative-time">${relativeTimeStr}</span>
</h2>
${locationDOM}
<span class="event-duration event-details">${durationStr}</span>
</div>`;
return eventContent;
}
fetchData();
const fetchDataTimer = setInterval(fetchData, 60000);
document.addEventListener('pjax:send', () => {
clearInterval(fetchDataTimer);
});
})();
</script>

View File

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

View File

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

View File

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