153 lines
3.7 KiB
JavaScript
153 lines
3.7 KiB
JavaScript
"use strict";
|
|
|
|
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) {
|
|
req.query = req.query || {};
|
|
let filtered = [];
|
|
if (Object.keys(req.query).length > 0) {
|
|
let q = req.query,
|
|
cards = require("../lib/cards.json");
|
|
|
|
q.search_in = q.search_in || [];
|
|
q.search_for = (q.search_for || "").trim().toLowerCase();
|
|
q.pantheons = q.pantheons || [];
|
|
q.pantheons = Array.isArray(q.pantheons) ? q.pantheons : [q.pantheons];
|
|
q.elements = q.elements || [];
|
|
q.elements = Array.isArray(q.elements) ? q.elements : [q.elements];
|
|
q.types = q.types || [];
|
|
q.types = Array.isArray(q.types) ? q.types : [q.types];
|
|
q.races = q.races || [];
|
|
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();
|
|
|
|
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))
|
|
)
|
|
) {
|
|
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.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 (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 (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 (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;
|
|
});
|
|
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 (${filtered.length})`,
|
|
query: req.query,
|
|
cards: filtered,
|
|
});
|
|
});
|
|
|
|
module.exports = router;
|