mirror of
https://github.com/next-theme/hexo-theme-next.git
synced 2026-01-20 19:02:33 +00:00
Run lebab
This commit is contained in:
parent
96406e79ae
commit
924318a19d
@ -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,16 +32,76 @@
|
|||||||
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();
|
function getRelativeTime(current, previous) {
|
||||||
var fetchDataTimer = setInterval(fetchData, 60000);
|
const msPerMinute = 60 * 1000;
|
||||||
document.addEventListener('pjax:send', () => {
|
const msPerHour = msPerMinute * 60;
|
||||||
clearInterval(fetchDataTimer);
|
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() {
|
function fetchData() {
|
||||||
var eventList = document.querySelector('.event-list');
|
const eventList = document.querySelector('.event-list');
|
||||||
if (!eventList) return;
|
if (!eventList) return;
|
||||||
|
|
||||||
fetch(request_url).then(response => {
|
fetch(request_url).then(response => {
|
||||||
@ -53,102 +113,35 @@
|
|||||||
}
|
}
|
||||||
// Clean the event list
|
// Clean the event list
|
||||||
eventList.innerHTML = '';
|
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 => {
|
data.items.forEach(event => {
|
||||||
// Parse data
|
// Parse data
|
||||||
var utc = new Date().getTimezoneOffset() * 60000;
|
const utc = new Date().getTimezoneOffset() * 60000;
|
||||||
var start = event.start.dateTime = new Date(event.start.dateTime || (new Date(event.start.date).getTime() + utc));
|
const 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 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) {
|
if (tense === 1 && prevEnd < now) {
|
||||||
eventList.innerHTML += '<hr>';
|
eventList.innerHTML += '<hr>';
|
||||||
}
|
}
|
||||||
|
|
||||||
eventDOM = buildEventDOM(tense, event);
|
eventList.innerHTML += buildEventDOM(tense, event);
|
||||||
eventList.innerHTML += eventDOM;
|
|
||||||
|
|
||||||
prevEnd = end;
|
prevEnd = end;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRelativeTime(current, previous) {
|
fetchData();
|
||||||
var msPerMinute = 60 * 1000;
|
const fetchDataTimer = setInterval(fetchData, 60000);
|
||||||
var msPerHour = msPerMinute * 60;
|
document.addEventListener('pjax:send', () => {
|
||||||
var msPerDay = msPerHour * 24;
|
clearInterval(fetchDataTimer);
|
||||||
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;
|
|
||||||
}
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
2
layout/_third-party/math/mathjax.njk
vendored
2
layout/_third-party/math/mathjax.njk
vendored
@ -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);
|
||||||
|
|||||||
20
layout/_third-party/statistics/firestore.njk
vendored
20
layout/_third-party/statistics/firestore.njk
vendored
@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user