ADDED card sorting.

ADDED pantheon to each card (duplicate of culture).
ADDED demo cards.
ADDED wikipedia links to most entries.
ADDED Lovecraft Wikia links to all Cthulhu cards.
UPDATED to 0.1.6.
This commit is contained in:
Eric Woodward
2018-01-18 20:10:49 -05:00
parent 1979bd4f97
commit 0f605db8fa
9 changed files with 1663 additions and 545 deletions

View File

@@ -1,7 +1,24 @@
'use strict';
var express = require('express');
var router = express.Router();
const
express = require('express'),
sortByName = function(list) {
let
coll_opts = {
sensitivity: 'accent',
numeric: true,
caseFirst: "upper"
},
coll = new Intl.Collator({}, coll_opts);
list.sort((a,b) => {
if (a[field] && b[field]) {
return coll.compare(a[field], b[field]);
}
return 1;
});
return list;
};
let router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
@@ -12,11 +29,18 @@ router.get('/cards/:card_num', (req, res) => {
req.params.card_num = (req.params.card_num || 'all');
let
cards = require('../lib/cards.json'),
filtered = cards.filter(card => card.num.toLowerCase().indexOf(req.params.card_num.toLowerCase()) > -1 || req.params.card_num.toLowerCase() === 'all');
links = require('../lib/links.json'),
filtered = cards.filter(card =>
card.num.toLowerCase().indexOf(req.params.card_num.toLowerCase()) > -1 || req.params.card_num.toLowerCase() === 'all'
);
if (filtered.length === 1) {
res.render('single', { title: filtered[0].name + ' (' + filtered[0].num + ')', card: filtered[0] });
let card = filtered[0];
if (links && card.hasOwnProperty('name') && links.hasOwnProperty(card.name)) {
Object.assign(card, links[card.name]);
}
res.render('single', { title: card.name + ' (' + card.num + ')', card: card });
} else {
filtered = sortByName(filtered);
res.render('all', { title: 'All Cards', cards: filtered });
}
});
@@ -25,5 +49,4 @@ router.get('/cards', function(req, res) {
res.redirect('/cards/all');
});
module.exports = router;

View File

@@ -1,7 +1,32 @@
'use strict';
var express = require('express');
var router = express.Router();
const
express = require('express'),
sortByField = function(field, order, list) {
field = (field || 'num');
order = (order || 'asc');
let
coll_opts = {
sensitivity: 'accent',
numeric: true,
caseFirst: "upper"
},
coll = new Intl.Collator({}, coll_opts);
list.sort((a,b) => {
if (a[field] && b[field]) {
let res = coll.compare(a[field], b[field]) * (order !== 'asc' ? -1 : 1);
if (res === 0 && field !== 'name') {
return coll.compare(a['name'], b['name']) * (order !== 'asc' ? -1 : 1);
}
return res;
}
return 1;
});
return list;
};
let router = express.Router();
/* GET search results page. */
router.get('/', function(req, res) {
@@ -23,89 +48,96 @@ router.get('/', function(req, res) {
q.races = Array.isArray(q.races) ? q.races : [q.races];
q.releases = (q.releases || []);
q.releases = Array.isArray(q.releases) ? q.releases : [q.releases];
q.sort_by = (q.sort_by || 'num').trim().toLowerCase();
q.sort_order = (q.sort_order || 'asc').trim().toLowerCase();
console.log(`sort_by: ${q.sort_by}`);
filtered = cards.filter(card => {
if (q.search_in.length > 0 && q.search_for.trim() !== '') {
if (!(
(q.search_in.indexOf('name') > -1 && (card.name.toLowerCase().indexOf(q.search_for) > -1 || card.name_ang.indexOf(q.search_for) > -1)) ||
(q.search_in.indexOf('ability') > -1 && (card.ability_name.toLowerCase().indexOf(q.search_for) > -1 || card.ability_text.toLowerCase().indexOf(q.search_for) > -1)))) {
if (q.search_in.length > 0 && q.search_for.trim() !== '') {
if (!(
(q.search_in.indexOf('name') > -1 && (card.name.toLowerCase().indexOf(q.search_for) > -1 || card.name_ang.indexOf(q.search_for) > -1)) ||
(q.search_in.indexOf('ability') > -1 && (card.ability_name.toLowerCase().indexOf(q.search_for) > -1 || card.ability_text.toLowerCase().indexOf(q.search_for) > -1)))) {
return false;
}
}
if (q.pantheons.length > 0 && card.pantheon) {
let
has_pantheon = false;
for (let i=0; i < q.pantheons.length; i++) {
if (card.pantheon_idx.indexOf(q.pantheons[i]) > -1) {
has_pantheon = true;
}
}
if (!has_pantheon) {
return false;
}
}
}
if (q.pantheons.length > 0 && card.culture !== '') {
let
has_pantheon = false;
for (let i=0; i < q.pantheons.length; i++) {
if (card.culture_idx.indexOf(q.pantheons[i]) > -1) {
has_pantheon = true;
if (q.elements.length > 0) {
let
has_element = false;
for (let i=0; i < q.elements.length; i++) {
if (card.element_idx.indexOf(q.elements[i]) > -1) {
has_element = true;
}
}
if (!has_element) {
return false;
}
}
if (!has_pantheon) {
return false;
}
}
if (q.elements.length > 0) {
let
has_element = false;
for (let i=0; i < q.elements.length; i++) {
if (card.element_idx.indexOf(q.elements[i]) > -1) {
has_element = true;
if (q.races.length > 0 && card.race) {
let
has_race = false;
for (let i=0; i < q.races.length; i++) {
if (card.race_idx.indexOf(q.races[i]) > -1) {
has_race = true;
}
}
if (!has_race) {
return false;
}
}
if (!has_element) {
return false;
}
}
if (q.races.length > 0 && card.race !== '') {
let
has_race = false;
for (let i=0; i < q.races.length; i++) {
if (card.race_idx.indexOf(q.races[i]) > -1) {
has_race = true;
if (q.types.length > 0) {
let
has_type = false;
for (let i=0; i < q.types.length; i++) {
if (card.type_idx.indexOf(q.types[i]) > -1) {
has_type = true;
}
}
if (!has_type) {
return false;
}
}
if (!has_race) {
return false;
}
}
if (q.types.length > 0) {
let
has_type = false;
for (let i=0; i < q.types.length; i++) {
if (card.type_idx.indexOf(q.types[i]) > -1) {
has_type = true;
if (q.releases.length > 0) {
let
has_release = false;
for (let i=0; i < q.releases.length; i++) {
if (card.num.toLowerCase().indexOf(q.releases[i]) > -1) {
has_release = true;
}
}
if (!has_release) {
return false;
}
}
if (!has_type) {
return false;
}
}
if (q.releases.length > 0) {
let
has_release = false;
for (let i=0; i < q.releases.length; i++) {
if (card.num.toLowerCase().indexOf(q.releases[i]) > -1) {
has_release = true;
}
}
if (!has_release) {
return false;
}
}
return true;
});
return true;
});
if (q.sort_by !== 'name') {
filtered = sortByField('name', q.sort_order, filtered);
}
filtered = sortByField(q.sort_by, q.sort_order, filtered);
}
res.render('search', { title: 'Search Results', query: req.query, cards: filtered });
res.render('search', { title:`Search Results (${filtered.length})`, query: req.query, cards: filtered });
});
module.exports = router;