From 2be6153fdd2ba0f94d78dfac967010fd60c23c5a Mon Sep 17 00:00:00 2001 From: Ben de Roo Date: Thu, 9 Jul 2026 09:51:45 +0200 Subject: [PATCH] Update src/main.sh --- src/main.sh | 309 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 253 insertions(+), 56 deletions(-) diff --git a/src/main.sh b/src/main.sh index 0cc3109..1955614 100755 --- a/src/main.sh +++ b/src/main.sh @@ -1,89 +1,286 @@ #!/bin/bash -if command -v jq >/dev/null 2>&1; then - echo -else - echo "jq ontbreekt." - sudo apt install jq -y || { - echo "installatie jq mislukt. abort" - echo "probeer later opnieuw" - exit 1 - } - echo - echo "jq is geïnstalleerd. Wiki-terminal wordt gestart." - echo -fi +set -uo pipefail -if command -v less >/dev/null 2>&1; then - echo -else - echo "less ontbreekt." - sudo apt install less -y || { - echo "installatie less mislukt. abort" - echo "probeer later opnieuw" +CONFIG_DIR="$HOME/.config/wiki-cli" +CONFIG_FILE="$CONFIG_DIR/config.conf" +LANG_CODE="en" # fallback totdat config geladen is +SUPPORTED_LANGS=(nl en fr de) + +load_config() { + if [ -f "$CONFIG_FILE" ]; then + # shellcheck source=/dev/null + source "$CONFIG_FILE" + fi +} + +save_config() { + mkdir -p "$CONFIG_DIR" + cat > "$CONFIG_FILE" < " KEUZE + case "$KEUZE" in + 1) LANG_CODE="nl" ;; + 2) LANG_CODE="en" ;; + 3) LANG_CODE="fr" ;; + 4) LANG_CODE="de" ;; + *) LANG_CODE="en" ;; + esac +MSG["fr,no_results"]="Aucun résultat trouvé." +MSG["de,no_results"]="Keine Ergebnisse gefunden." + +MSG["nl,choose_number"]="Kies een nummer (of 'q' om te annuleren):" +MSG["en,choose_number"]="Choose a number (or 'q' to cancel):" +MSG["fr,choose_number"]="Choisissez un numéro (ou « q » pour annuler) :" +MSG["de,choose_number"]="Wähle eine Nummer (oder 'q' zum Abbrechen):" + +MSG["nl,invalid_choice"]="Ongeldige keuze." +MSG["en,invalid_choice"]="Invalid choice." +MSG["fr,invalid_choice"]="Choix invalide." +MSG["de,invalid_choice"]="Ungültige Auswahl." + +MSG["nl,cancelled"]="Geannuleerd." +MSG["en,cancelled"]="Cancelled." +MSG["fr,cancelled"]="Annulé." +MSG["de,cancelled"]="Abgebrochen." + +MSG["nl,no_search_yet"]="Zoek eerst naar iets met: search " +MSG["en,no_search_yet"]="Search for something first with: search " +MSG["fr,no_search_yet"]="Recherchez d'abord avec : search " +MSG["de,no_search_yet"]="Suche zuerst etwas mit: search " + +MSG["nl,lang_changed"]="Taal ingesteld op" +MSG["en,lang_changed"]="Language set to" +MSG["fr,lang_changed"]="Langue définie sur" +MSG["de,lang_changed"]="Sprache eingestellt auf" + +MSG["nl,lang_current"]="Huidige taal:" +MSG["en,lang_current"]="Current language:" +MSG["fr,lang_current"]="Langue actuelle :" +MSG["de,lang_current"]="Aktuelle Sprache:" + +MSG["nl,lang_invalid"]="Onbekende taalcode. Gebruik: nl, en, fr, de" +MSG["en,lang_invalid"]="Unknown language code. Use: nl, en, fr, de" +MSG["fr,lang_invalid"]="Code de langue inconnu. Utilisez : nl, en, fr, de" +MSG["de,lang_invalid"]="Unbekannter Sprachcode. Verwende: nl, en, fr, de" + +MSG["nl,unknown_command"]="Onbekend commando. Typ 'help' voor een overzicht." +MSG["en,unknown_command"]="Unknown command. Type 'help' for an overview." +MSG["fr,unknown_command"]="Commande inconnue. Tapez « help » pour un aperçu." +MSG["de,unknown_command"]="Unbekannter Befehl. Gib 'help' für eine Übersicht ein." + +MSG["nl,goodbye"]="Tot ziens!" +MSG["en,goodbye"]="Goodbye!" +MSG["fr,goodbye"]="Au revoir !" +MSG["de,goodbye"]="Auf Wiedersehen!" + +MSG["nl,dep_missing"]="ontbreekt." +MSG["en,dep_missing"]="is missing." +MSG["fr,dep_missing"]="est manquant." +MSG["de,dep_missing"]="fehlt." + +MSG["nl,dep_install_fail"]="installatie mislukt. Probeer later opnieuw." +MSG["en,dep_install_fail"]="installation failed. Try again later." +MSG["fr,dep_install_fail"]="l'installation a échoué. Réessayez plus tard." +MSG["de,dep_install_fail"]="Installation fehlgeschlagen. Versuche es später erneut." + +MSG["nl,dep_installed"]="is geïnstalleerd." +MSG["en,dep_installed"]="has been installed." +MSG["fr,dep_installed"]="a été installé." +MSG["de,dep_installed"]="wurde installiert." + +MSG["nl,help_text"]="Beschikbare commando's: + search Zoek naar Wikipedia-pagina's + open Open een resultaat uit de laatste zoekopdracht + lang [code] Toon of wijzig de interfacetaal (nl, en, fr, de) + help Toon deze hulptekst + exit / quit Sluit af" +MSG["en,help_text"]="Available commands: + search Search for Wikipedia pages + open Open a result from the last search + lang [code] Show or change the interface language (nl, en, fr, de) + help Show this help text + exit / quit Exit" +MSG["fr,help_text"]="Commandes disponibles : + search Rechercher des pages Wikipédia + open Ouvrir un résultat de la dernière recherche + lang [code] Afficher ou changer la langue de l'interface (nl, en, fr, de) + help Afficher cette aide + exit / quit Quitter" +MSG["de,help_text"]="Verfügbare Befehle: + search Nach Wikipedia-Seiten suchen + open Ein Ergebnis der letzten Suche öffnen + lang [code] Sprache der Oberfläche anzeigen oder ändern (nl, en, fr, de) + help Diese Hilfe anzeigen + exit / quit Beenden" + +t() { + echo "${MSG["$LANG_CODE,$1"]}" +} + +ensure_dependency() { + local pkg="$1" + if command -v "$pkg" >/dev/null 2>&1; then + return 0 + fi + echo "$pkg $(t dep_missing)" + sudo apt install "$pkg" -y || { + echo "$pkg: $(t dep_install_fail)" exit 1 } - echo - echo "less is geïnstalleerd. Wiki-terminal wordt gestart." - echo -fi + echo "$pkg $(t dep_installed)" +} + +check_dependencies() { + ensure_dependency jq + ensure_dependency less + ensure_dependency curl +} + +TITELS=() zoek() { - echo "Zoek naar pagina's:" - read -p "> " PAGINANAAM - echo + local term="$*" + if [ -z "$term" ]; then + echo "$(t search_prompt)" + read -rp "> " term + fi + [ -z "$term" ] && return mapfile -t TITELS < <( curl -sG \ --data-urlencode "action=query" \ --data-urlencode "list=search" \ - --data-urlencode "srsearch=$PAGINANAAM" \ + --data-urlencode "srsearch=$term" \ --data-urlencode "format=json" \ - "https://en.wikipedia.org/w/api.php" | + "https://${LANG_CODE}.wikipedia.org/w/api.php" | jq -r '.query.search[]?.title' ) if [ ${#TITELS[@]} -eq 0 ]; then - echo "Geen resultaten gevonden." + echo "$(t no_results)" return fi for i in "${!TITELS[@]}"; do - echo "$((i+1)). ${TITELS[$i]}" + echo "$((i + 1)). ${TITELS[$i]}" done } -pick() { - echo - echo "kies een nummer" - read -p "> " PAGINANUMMER +open_result() { + local nummer="$1" - if [[ $PAGINANUMMER =~ ^[0-9]+$ ]] && [ $PAGINANUMMER -ge 1 ] && [ $PAGINANUMMER -le ${#TITELS[@]} ]; then - INDEX=$((PAGINANUMMER - 1)) - PAGINANAAMNUMMER="${TITELS[$INDEX]}" - return 0 + if [ ${#TITELS[@]} -eq 0 ]; then + echo "$(t no_search_yet)" + return + fi + + if [ -z "$nummer" ]; then + echo "$(t choose_number)" + read -rp "> " nummer + fi + + if [ "$nummer" = "q" ]; then + echo "$(t cancelled)" + return + fi + + if [[ $nummer =~ ^[0-9]+$ ]] && [ "$nummer" -ge 1 ] && [ "$nummer" -le ${#TITELS[@]} ]; then + local index=$((nummer - 1)) + local titel="${TITELS[$index]}" + curl -sG \ + --data-urlencode "action=query" \ + --data-urlencode "prop=extracts" \ + --data-urlencode "explaintext=true" \ + --data-urlencode "titles=$titel" \ + --data-urlencode "format=json" \ + "https://${LANG_CODE}.wikipedia.org/w/api.php" | + jq -r '.query.pages[].extract' | sed '/^== External links ==/,$d' | less else - echo "Ongeldige keuze" - return 199 + echo "$(t invalid_choice)" fi } -getSamenvatting() { - curl -sG \ - --data-urlencode "action=query" \ - --data-urlencode "prop=extracts" \ - --data-urlencode "explaintext=true" \ - --data-urlencode "titles=$PAGINANAAMNUMMER" \ - --data-urlencode "format=json" \ - "https://en.wikipedia.org/w/api.php" \ - | jq -r '.query.pages[].extract' | sed '/^== External links ==/,$d' | less -} +set_lang() { + local code="${1:-}" + if [ -z "$code" ]; then + echo "$(t lang_current) $LANG_CODE" + return + fi + if is_supported_lang "$code"; then + LANG_CODE="$code" + save_config + echo "$(t lang_changed) $LANG_CODE" + else + echo "$(t lang_invalid)" + fi +} -zoek -pick +dispatch() { + local cmd="$1" + shift || true + case "$cmd" in + search|s|zoek) + zoek "$@" + ;; + open|o|select) + open_result "$*" + ;; + lang|language|taal) + set_lang "$*" + ;; + help|h|--help|-h) + t help_text + ;; + exit|quit|q) + echo "$(t goodbye)" + exit 0 + ;; + "") + ;; + *) + echo "$(t unknown_command)" + ;; + esac +} -if pick; then - getSamenvatting +interactive_mode() { + echo "wiki-cli — $(t lang_current) $LANG_CODE" + t help_text + while true; do + read -rp "wiki> " -a INPUT + dispatch "${INPUT[@]:-}" + done +} + +load_config +if [ ! -f "$CONFIG_FILE" ]; then + first_run_setup +fi + +check_dependencies + +if [ "$#" -eq 0 ]; then + interactive_mode else - echo "probeer opnieuw" + dispatch "$@" fi \ No newline at end of file