pub / serci

Search the web with !keywords
git clone https://https://src.jayvii.de/pub/serci.git
Home | Log | Files | Exports | Refs | README | RSS

commit 88886732e821f8f851b7147115a3d765a44fd0b4
parent e8ad02c7d6838c9dc5f29b8c9f3c92f426649a6c
Author: JayVii <jayvii[AT]posteo[DOT]de>
Date:   Wed, 10 Jul 2024 21:34:12 +0200

feat: use mappings for faster processing

Diffstat:
A.gitignore | 1+
MREADME.md | 13+++++++++++--
Mconfig/config.php | 4++++
Mindex.php | 35++++++++++++++---------------------
Alib/generate_mappings.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/read_mappings.php | 27+++++++++++++++++++++++++++
6 files changed, 116 insertions(+), 23 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1 @@ +config/*.json diff --git a/README.md b/README.md @@ -64,7 +64,15 @@ Simply upload the entire content of this repository to your webhost. Edit sed -e 's/%%URL%%/http:\/\/search.example.com/g' -i opensearch.xml ``` -Search-Engines and `!keywords` are configured in `config/config.php`. +Search-Engines and `!keywords` are configured in `config/config.php`. For fast +access to `!keywords` and categories, seriĉi uses mappings written to `json` +files. Before first run, you need to generate them from your config via +`lib/generate_mappings.php`. This needs to be re-run everytime you adjust your +`config/config.php`. + +```bash +php lib/generate_mappings.php +``` Speed-Deployment: ```bash @@ -73,7 +81,8 @@ mkdir -p /var/www/serci && \ cd /var/www/serci && \ wget https://src.jayvii.de/pub/serci/exports/main.tar.gz -O - | \ tar xfvz - && \ - sed -e "s/%%URL%%/https:\/\/${DOMAIN}/g" -i opensearch.xml + sed -e "s/%%URL%%/https:\/\/${DOMAIN}/g" -i opensearch.xml && \ + php lib/generate_mappings.php ``` Example-configuration for Apache2: diff --git a/config/config.php b/config/config.php @@ -342,4 +342,8 @@ $categories = array( */ $default_search = "metager_web"; +/* Pre-generated mapping files */ +$searchkeys_file = "./config/keys_to_search.json"; +$searchcats_file = "./config/cats_to_search.json"; + ?> diff --git a/index.php b/index.php @@ -6,8 +6,11 @@ /* Load Configuration */ include("config/config.php"); + include("lib/read_mappings.php"); - /* Fetch and sanitize search query via GET request */ + /* Fetch and sanitize search query via GET request + * Allow both "query" and "q" + */ $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); if (!is_null($_GET["query"])) { $query = rawurldecode($_GET["query"]); @@ -28,13 +31,10 @@ $keyword = strtolower($keyword); /* Based on given keyword, choose a search engine */ - $search = $default_search; - foreach (array_keys($searches) as $key) { - if (array_search($keyword, $searches[$key]["keywords"]) !== false) { - /* If keyword has been found, assign search engine & end loop */ - $search = $key; - break; - } + if (array_search($keyword, array_keys($searchkeys)) !== false) { + $search = $searchkeys[$keyword]; + } else { + $search = $default_search; } /* Strip keyword from search term */ @@ -189,11 +189,11 @@ <!-- Search Engine Categorical Lists --> <?php - foreach (array_keys($categories) as $cat) { + foreach ($searchcats as $category => $searchids) { ?> <details> - <summary><?php echo $categories[$cat]["name"]; ?></summary> + <summary><?php echo $categories[$category]["name"]; ?></summary> <table> <tr> <th>Engine</th> @@ -201,21 +201,14 @@ <tr> <?php /* Print one table row for each search engine in category */ - foreach (array_keys($searches) as $key) { - /* Skrip, if search engine is not in current category */ - if ( - array_search($cat, $searches[$key]["categories"]) - === false - ) { - continue; - } + foreach ($searchids as $searchid) { ?> <tr> <td> - <a href="<?php echo $searches[$key]["website"]; ?>" + <a href="<?php echo $searches[$searchid]["website"]; ?>" target="_blank"> <?php - echo $searches[$key]["name"]; + echo $searches[$searchid]["name"]; ?> </a> </td> @@ -225,7 +218,7 @@ echo "!" . implode( "</code>, <code>!", - $searches[$key]["keywords"] + $searches[$searchid]["keywords"] ); ?> </code> diff --git a/lib/generate_mappings.php b/lib/generate_mappings.php @@ -0,0 +1,59 @@ +<?php + +include("./config/config.php"); + +/* Keyword to Search Engine mapping ----------------------------------------- */ + +$searchkeys = array(); +foreach (array_keys($searches) as $search) { + foreach ($searches[$search]["keywords"] as $keyword) { + $searchkeys[$keyword] = $search; + } +} + +/* Export the mapping to file */ +$file = fopen( + $searchkeys_file, + "w" +); +fwrite( + $file, + json_encode($searchkeys) +); +fclose($file); + +/* Category to Search Engine mapping ---------------------------------------- */ + +$searchcats = array(); +foreach (array_keys($categories) as $category) { + + $currentcat = array(); + foreach (array_keys($searches) as $search) { + + /* Skrip, if search engine is not in current category */ + if ( + array_search($category, $searches[$search]["categories"]) + === false + ) { + continue; + } + + /* Add to current category */ + array_push($currentcat, $search); + } + + $searchcats[$category] = $currentcat; +} + +/* Export the mapping to file */ +$file = fopen( + $searchcats_file, + "w" +); +fwrite( + $file, + json_encode($searchcats) +); +fclose($file); + +?> diff --git a/lib/read_mappings.php b/lib/read_mappings.php @@ -0,0 +1,27 @@ +<?php + +/* Keyword to Search Engine mapping ----------------------------------------- */ + +$file = fopen( + $searchkeys_file, + "r" +); +$searchkeys = json_decode( + fread($file, filesize($searchkeys_file)), + true +); +fclose($file); + +/* Category to Search Engine mapping ---------------------------------------- */ + +$file = fopen( + $searchcats_file, + "r" +); +$searchcats = json_decode( + fread($file, filesize($searchcats_file)), + true +); +fclose($file); + +?>