From 3491c1a06c876795881f14b7d5d920b128a7e3d6 Mon Sep 17 00:00:00 2001 From: Chris Jaekl Date: Sun, 12 Nov 2017 20:31:51 +0900 Subject: [PATCH] Run eslint on lib.js and fix problems that it spotted. --- app/.eslintrc.js | 30 +++ app/lib.js | 490 +++++++++++++++++++++++------------------------ 2 files changed, 275 insertions(+), 245 deletions(-) create mode 100644 app/.eslintrc.js diff --git a/app/.eslintrc.js b/app/.eslintrc.js new file mode 100644 index 0000000..e239734 --- /dev/null +++ b/app/.eslintrc.js @@ -0,0 +1,30 @@ +module.exports = { + "env": { + "browser": true, + "es6": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 4 + ], + "linebreak-style": [ + "error", + "unix" + ], + "no-console": "off", + "no-unused-vars": "off", + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +}; diff --git a/app/lib.js b/app/lib.js index 0f70f32..6edaa47 100644 --- a/app/lib.js +++ b/app/lib.js @@ -1,311 +1,311 @@ //QuanLib: eBook Library //(C) 2017 by Christian Jaekl (cejaekl@yahoo.com) -g_state = { - cache: [], - count: 0, - mousePos: { // Last known position of the mouse cursor - x: undefined, - y: undefined - }, - first: 0, - ids: [], - last: (-1), - map: {}, // map from book.Id to index into cache[] - pageSize: 48, - tooltip: { - bookId: undefined, - milliSecs: 500, // time to wait before displaying tooltip - mousePos: { - x: undefined, - y: undefined - }, - threshold: 10, // number of pixels that mouse can move before tip is dismissed - timer: undefined - } -} +var g_state = { + cache: [], + count: 0, + mousePos: { // Last known position of the mouse cursor + x: undefined, + y: undefined + }, + first: 0, + ids: [], + last: (-1), + map: {}, // map from book.Id to index into cache[] + pageSize: 48, + tooltip: { + bookId: undefined, + milliSecs: 500, // time to wait before displaying tooltip + mousePos: { + x: undefined, + y: undefined + }, + threshold: 10, // number of pixels that mouse can move before tip is dismissed + timer: undefined + } +}; document.onmousemove = onMouseMove; function adjustPos(setting) { - var value = parseInt(setting) + var value = parseInt(setting); - if (g_state.first === value) { - // No change - return; - } + if (g_state.first === value) { + // No change + return; + } - var maxFirst = Math.max(0, g_state.count - g_state.pageSize); + var maxFirst = Math.max(0, g_state.count - g_state.pageSize); - if (value < 0) { - g_state.first = 0; - } else if (value > maxFirst) { - g_state.first = maxFirst; - } else { - g_state.first = value; - } + if (value < 0) { + g_state.first = 0; + } else if (value > maxFirst) { + g_state.first = maxFirst; + } else { + g_state.first = value; + } - g_state.last = g_state.first + g_state.pageSize - 1; - if (g_state.last >= g_state.count) { - g_state.last = g_state.count - 1; - } + g_state.last = g_state.first + g_state.pageSize - 1; + if (g_state.last >= g_state.count) { + g_state.last = g_state.count - 1; + } - document.getElementById('slider').value = setting; + document.getElementById('slider').value = setting; - refreshData(); + refreshData(); } function bookHtml(book) { - var result = '
' - + '' - + '' - + '' - + '' - + '' - + '
'; - if (0 == book.CoverId) { - result += '(No cover available)' - } else { - result += '' - } - result += '' - + '

' + book.Title + '

' - + '

' - + '' + book.AuthorReading + ''; - if (typeof(book.SeriesName) !== 'undefined' && book.SeriesName.length > 0) { - result += '
' + book.SeriesName + ' ' + book.Volume + ''; - } - result += '

' - + '
' - + '
'; - return result; + var result = '
' + + '' + + '' + + '' + + '' + + '' + + '
'; + if (0 == book.CoverId) { + result += '(No cover available)'; + } else { + result += ''; + } + result += '' + + '

' + book.Title + '

' + + '

' + + '' + book.AuthorReading + ''; + if (typeof(book.SeriesName) !== 'undefined' && book.SeriesName.length > 0) { + result += '
' + book.SeriesName + ' ' + book.Volume + ''; + } + result += '

' + + '
' + + '
'; + return result; } //ce(s): "clear if empty()" //return s, unless it's undefined, in which case return an empty ("clear") string function ce(s) { - if (typeof s !== 'undefined') { - return s; - } - return ''; + if (typeof s !== 'undefined') { + return s; + } + return ''; } function constructSearchUrl() { - var url = window.location.protocol + '//' + window.location.host + '/search/'; - - var firstTime = true; - var terms = ['aut', 'tit', 'ser']; - - for (idx in terms) { - var term = terms[idx]; - var elem = document.getElementById(term); - if (null === elem) { - console.log('Error: could not find form element for search term "' + term + '".'); - continue; - } - - var value = elem.value; - if (value.length > 0) { - if (firstTime) { - url += '?'; - firstTime = false; - } - else { - url += '&'; - } - url += term + '=' + encodeURIComponent('%' + value + '%'); - } - } - - return url; + var url = window.location.protocol + '//' + window.location.host + '/search/'; + + var firstTime = true; + var terms = ['aut', 'tit', 'ser']; + + for (var idx in terms) { + var term = terms[idx]; + var elem = document.getElementById(term); + if (null === elem) { + console.log('Error: could not find form element for search term "' + term + '".'); + continue; + } + + var value = elem.value; + if (value.length > 0) { + if (firstTime) { + url += '?'; + firstTime = false; + } + else { + url += '&'; + } + url += term + '=' + encodeURIComponent('%' + value + '%'); + } + } + + return url; } // Set the book ID for the details pane, and then show it function displayDetails(bookId) { - g_state.tooltip.bookId = bookId; - showDetails(); + g_state.tooltip.bookId = bookId; + showDetails(); } function hideDetails() { - g_state.tooltip.mousePos.x = undefined; - g_state.tooltip.mousePos.y = undefined; - - var elem = document.getElementById('details'); - elem.innerHTML = ''; - elem.style.display = 'none'; + g_state.tooltip.mousePos.x = undefined; + g_state.tooltip.mousePos.y = undefined; + + var elem = document.getElementById('details'); + elem.innerHTML = ''; + elem.style.display = 'none'; } function onMouseMove(event) { - if (typeof event === 'undefined') { - return; - } - - var x = event.pageX; - var y = event.pageY; - - if ( x === g_state.mousePos.x - && y === g_state.mousePos.y) - { - // No change from previous known position. - // Nothing to see (or do) here, move along. - return; - } - - // Remember current mouse (x,y) position - g_state.mousePos.x = x; - g_state.mousePos.y = y; - - // Is there an active tooltip? - if (typeof g_state.tooltip.mousePos.x === 'undefined') { - // No active tooltip, so nothing further to do - return; - } - - var deltaX = Math.abs(x - g_state.tooltip.mousePos.x); - var deltaY = Math.abs(y - g_state.tooltip.mousePos.y); - - if ( deltaX > g_state.tooltip.threshold - || deltaY > g_state.tooltip.threshold ) - { - hideDetails(); - } + if (typeof event === 'undefined') { + return; + } + + var x = event.pageX; + var y = event.pageY; + + if ( x === g_state.mousePos.x + && y === g_state.mousePos.y) + { + // No change from previous known position. + // Nothing to see (or do) here, move along. + return; + } + + // Remember current mouse (x,y) position + g_state.mousePos.x = x; + g_state.mousePos.y = y; + + // Is there an active tooltip? + if (typeof g_state.tooltip.mousePos.x === 'undefined') { + // No active tooltip, so nothing further to do + return; + } + + var deltaX = Math.abs(x - g_state.tooltip.mousePos.x); + var deltaY = Math.abs(y - g_state.tooltip.mousePos.y); + + if ( deltaX > g_state.tooltip.threshold + || deltaY > g_state.tooltip.threshold ) + { + hideDetails(); + } } function onNext() { - if (g_state.last < (g_state.count - 1)) { - adjustPos(g_state.first + g_state.pageSize); - } + if (g_state.last < (g_state.count - 1)) { + adjustPos(g_state.first + g_state.pageSize); + } } function onPrev() { - if (g_state.first > 0) { - adjustPos(g_state.first - g_state.pageSize); - } + if (g_state.first > 0) { + adjustPos(g_state.first - g_state.pageSize); + } } function onSlide(value) { - adjustPos(value); + adjustPos(value); } function onSearch() { - var url = constructSearchUrl(); - - fetch(url, {method:'GET', cache:'default'}) - .then(response => response.json()) - .then((jsonValue) => { - // console.log('JSON response: ', jsonValue); - g_state.ids = jsonValue - g_state.count = g_state.ids.length; - g_state.first = (-1) - - var elem = document.getElementById('slider'); - elem.max = g_state.count; - - adjustPos(0); - }) - .catch(err => { - var msg = 'Error fetching JSON from URL: ' + url + ': ' + err + ':' + err.stack; - console.log(msg); - report(msg); - }); + var url = constructSearchUrl(); + + fetch(url, {method:'GET', cache:'default'}) + .then(response => response.json()) + .then((jsonValue) => { + // console.log('JSON response: ', jsonValue); + g_state.ids = jsonValue; + g_state.count = g_state.ids.length; + g_state.first = (-1); + + var elem = document.getElementById('slider'); + elem.max = g_state.count; + + adjustPos(0); + }) + .catch(err => { + var msg = 'Error fetching JSON from URL: ' + url + ': ' + err + ':' + err.stack; + console.log(msg); + report(msg); + }); } function refreshData() { - var i; - var url = '/info/?ids='; - g_state.map = {}; - for (i = g_state.first; i <= g_state.last; ++i) { - if (i > g_state.first) { - url += ','; - } - var id = g_state.ids[i]; - url += id; - g_state.map[id] = i - g_state.first; - } - - fetch(url, {method:'GET', cache:'default'}) - .then(response => response.json()) - .then((jsonValue) => { - console.log('JSON response for info: ', jsonValue); - g_state.cache = jsonValue; - refreshLayout(); - }) - .catch(err => { - var msg = 'Error fetching book details via URL: ' + url + ': ' + err; - console.log(msg, err.stack); - report(msg); - }); + var i; + var url = '/info/?ids='; + g_state.map = {}; + for (i = g_state.first; i <= g_state.last; ++i) { + if (i > g_state.first) { + url += ','; + } + var id = g_state.ids[i]; + url += id; + g_state.map[id] = i - g_state.first; + } + + fetch(url, {method:'GET', cache:'default'}) + .then(response => response.json()) + .then((jsonValue) => { + console.log('JSON response for info: ', jsonValue); + g_state.cache = jsonValue; + refreshLayout(); + }) + .catch(err => { + var msg = 'Error fetching book details via URL: ' + url + ': ' + err; + console.log(msg, err.stack); + report(msg); + }); } function refreshLayout() { - var i; - var html = ''; - var limit = g_state.last - g_state.first; - for (i = 0; i <= limit; ++i) { - var book = g_state.cache[i]; - html += bookHtml(book); - } - - document.getElementById('books').innerHTML = html; - document.getElementById('first').innerHTML = (g_state.first + 1); - document.getElementById('last').innerHTML = (g_state.last + 1); - document.getElementById('count').innerHTML = g_state.count; + var i; + var html = ''; + var limit = g_state.last - g_state.first; + for (i = 0; i <= limit; ++i) { + var book = g_state.cache[i]; + html += bookHtml(book); + } + + document.getElementById('books').innerHTML = html; + document.getElementById('first').innerHTML = (g_state.first + 1); + document.getElementById('last').innerHTML = (g_state.last + 1); + document.getElementById('count').innerHTML = g_state.count; } function report(message) { - document.getElementById('books').innerHTML = message; + document.getElementById('books').innerHTML = message; } function showDetails() { - var id = g_state.tooltip.bookId; - var elem = document.getElementById('details'); - var index = g_state.map[id]; - var book = g_state.cache[index]; - var html = '

' + book.Title + '

' - + '

' + ce(book.AuthorReading) + '
' + ce(book.Series) + ' ' + ce(book.Volume) + '

' - + ce(book.Description) - + '
'; - - // Remember the current mouse (x,y). - // If we move the mouse too far from this point, that will trigger hiding the tooltip. - g_state.tooltip.mousePos.x = g_state.mousePos.x; - g_state.tooltip.mousePos.y = g_state.mousePos.y; - - elem.innerHTML = html; - - elem.style.display = 'block'; // show, and calculate size, so that we can query it below - - var x = g_state.mousePos.x; - var y = g_state.mousePos.y; - - var bcr = elem.getBoundingClientRect(); - - var width = bcr.width; - var height = bcr.height; - - x = Math.max(x - (width / 2), 0); - y = Math.max(y - (height / 2), 0); - - elem.style.left = x + 'px'; - elem.style.top = y + 'px'; + var id = g_state.tooltip.bookId; + var elem = document.getElementById('details'); + var index = g_state.map[id]; + var book = g_state.cache[index]; + var html = '

' + book.Title + '

' + + '

' + ce(book.AuthorReading) + '
' + ce(book.Series) + ' ' + ce(book.Volume) + '

' + + ce(book.Description) + + '
'; + + // Remember the current mouse (x,y). + // If we move the mouse too far from this point, that will trigger hiding the tooltip. + g_state.tooltip.mousePos.x = g_state.mousePos.x; + g_state.tooltip.mousePos.y = g_state.mousePos.y; + + elem.innerHTML = html; + + elem.style.display = 'block'; // show, and calculate size, so that we can query it below + + var x = g_state.mousePos.x; + var y = g_state.mousePos.y; + + var bcr = elem.getBoundingClientRect(); + + var width = bcr.width; + var height = bcr.height; + + x = Math.max(x - (width / 2), 0); + y = Math.max(y - (height / 2), 0); + + elem.style.left = x + 'px'; + elem.style.top = y + 'px'; } function startTooltipTimer(bookId) { - if (typeof g_state.tooltip.timer !== 'undefined') { - clearTimeout(g_state.tooltip.timer); - } - g_state.tooltip.bookId = bookId; - g_state.tooltip.timer = setTimeout(showDetails, g_state.tooltip.milliSecs); + if (typeof g_state.tooltip.timer !== 'undefined') { + clearTimeout(g_state.tooltip.timer); + } + g_state.tooltip.bookId = bookId; + g_state.tooltip.timer = setTimeout(showDetails, g_state.tooltip.milliSecs); } function stopTooltipTimer() { - if (typeof g_state.tooltip.timer === 'undefined') { - return; - } - - clearTimeout(g_state.tooltip.timer); - g_state.tooltip.timer = undefined; - hideDetails(); + if (typeof g_state.tooltip.timer === 'undefined') { + return; + } + + clearTimeout(g_state.tooltip.timer); + g_state.tooltip.timer = undefined; + hideDetails(); } -- 2.30.2