search

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

bang.js (2059B)


      1 const custom = require("./bangs/custom.js")
      2 const tech = require("./bangs/tech.js")
      3 const multimedia = require("./bangs/multimedia.js")
      4 const entertainment = require("./bangs/entertainment.js")
      5 const research = require("./bangs/research.js")
      6 const services = require("./bangs/services.js")
      7 const news = require("./bangs/news.js")
      8 const shopping = require("./bangs/shopping.js")
      9 
     10 const bangs = [
     11     ...custom.bangs,
     12     ...tech.bangs,
     13     ...multimedia.bangs,
     14     ...entertainment.bangs,
     15     ...research.bangs,
     16     ...services.bangs,
     17     ...news.bangs,
     18     ...shopping.bangs,
     19 ];
     20 
     21 /*
     22 // NEW
     23 bangs = [].concat([
     24     {
     25         // default
     26         d: "html.duckduckgo.com",
     27         // bang
     28         b: "dh",
     29         // url
     30         u: "https://html.duckduckgo.com/html/?q={{{s}}}"
     31     },
     32 ], bangs);
     33 */
     34 
     35 // const LS_DEFAULT_BANG = "ddg"; // localStorage.getItem("default-bang") ?? "g";
     36 const LS_DEFAULT_BANG = "g";
     37 const defaultBang = bangs.find((b) => b.b === LS_DEFAULT_BANG);
     38 
     39 function getBangredirectUrl(req) {
     40     const query = req.query.q.trim() ?? "";
     41     if (!query) { return; }
     42 
     43     const match = query.match(/!(\S+)/i);
     44 
     45     const bangCandidate = match?.[1]?.toLowerCase();
     46     const selectedBang = bangs.find((b) => b.b === bangCandidate) ?? defaultBang;
     47 
     48     // Remove the first bang from the query
     49     const cleanQuery = query.replace(/!\S+\s*/i, "").trim();
     50 
     51     // If the query is just `!gh`, use `github.com` instead of `github.com/search?q=`
     52     if (cleanQuery === "")
     53         return selectedBang ? `https://${selectedBang.d}` : null;
     54 
     55     // Format of the url is:
     56     // https://www.google.com/search?q={{{s}}}
     57     const searchUrl = selectedBang?.u.replace(
     58         "{{{s}}}",
     59         // Replace %2F with / to fix formats like "!ghr+t3dotgg/unduck"
     60         encodeURIComponent(cleanQuery).replace(/%2F/g, "/"),
     61     );
     62     if (!searchUrl) return null;
     63 
     64     return searchUrl;
     65 }
     66 
     67 function redirect(req, res) {
     68     const searchUrl = getBangredirectUrl(req);
     69     if (!searchUrl) return;
     70     res.redirect(searchUrl);
     71 }
     72 
     73 
     74 module.exports = {
     75     redirect
     76 };