diff --git a/layout/_scripts/pages/schedule.njk b/layout/_scripts/pages/schedule.njk index ce1dc4c..6e1c0e4 100644 --- a/layout/_scripts/pages/schedule.njk +++ b/layout/_scripts/pages/schedule.njk @@ -1,7 +1,7 @@ (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 = '' + event.location + ''; + } + + const eventContent = `
+

+ ${event.summary} + ${relativeTimeStr} +

+ ${locationDOM} + ${durationStr} +
`; + 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
+ let prevEnd = 0; // used to decide where to insert an
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 += '
'; } - 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 = '' + event.location + ''; - } - - var eventContent = `
-

- ${event.summary} - ${relativeTimeStr} -

- ${locationDOM} - ${durationStr} -
`; - return eventContent; - } + fetchData(); + const fetchDataTimer = setInterval(fetchData, 60000); + document.addEventListener('pjax:send', () => { + clearInterval(fetchDataTimer); + }); })(); diff --git a/layout/_third-party/math/mathjax.njk b/layout/_third-party/math/mathjax.njk index 26d0220..f103868 100644 --- a/layout/_third-party/math/mathjax.njk +++ b/layout/_third-party/math/mathjax.njk @@ -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); diff --git a/layout/_third-party/statistics/firestore.njk b/layout/_third-party/statistics/firestore.njk index 5ec1bae..912f4fd 100644 --- a/layout/_third-party/statistics/firestore.njk +++ b/layout/_third-party/statistics/firestore.njk @@ -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 @@ (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); }); diff --git a/layout/_third-party/statistics/lean-analytics.njk b/layout/_third-party/statistics/lean-analytics.njk index 86cb902..baf13d1 100644 --- a/layout/_third-party/statistics/lean-analytics.njk +++ b/layout/_third-party/statistics/lean-analytics.njk @@ -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);