mirror of
https://github.com/next-theme/hexo-theme-next.git
synced 2026-01-18 18:33:42 +00:00
Run lebab
This commit is contained in:
parent
96406e79ae
commit
924318a19d
@ -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>
|
||||
|
||||
2
layout/_third-party/math/mathjax.njk
vendored
2
layout/_third-party/math/mathjax.njk
vendored
@ -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);
|
||||
|
||||
20
layout/_third-party/statistics/firestore.njk
vendored
20
layout/_third-party/statistics/firestore.njk
vendored
@ -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);
|
||||
});
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user