Update src/main.sh

This commit is contained in:
ben
2026-07-09 09:51:45 +02:00
parent f7856f6b0f
commit 2be6153fdd
+250 -53
View File
@@ -1,89 +1,286 @@
#!/bin/bash #!/bin/bash
if command -v jq >/dev/null 2>&1; then set -uo pipefail
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
if command -v less >/dev/null 2>&1; then CONFIG_DIR="$HOME/.config/wiki-cli"
echo CONFIG_FILE="$CONFIG_DIR/config.conf"
else LANG_CODE="en" # fallback totdat config geladen is
echo "less ontbreekt." SUPPORTED_LANGS=(nl en fr de)
sudo apt install less -y || {
echo "installatie less mislukt. abort" load_config() {
echo "probeer later opnieuw" if [ -f "$CONFIG_FILE" ]; then
# shellcheck source=/dev/null
source "$CONFIG_FILE"
fi
}
save_config() {
mkdir -p "$CONFIG_DIR"
cat > "$CONFIG_FILE" <<EOF
# wiki-cli configuratie
# Toegestane waarden voor LANG_CODE: nl, en, fr, de
LANG_CODE="$LANG_CODE"
EOF
}
is_supported_lang() {
local code="$1"
for l in "${SUPPORTED_LANGS[@]}"; do
[ "$l" = "$code" ] && return 0
done
return 1
}
first_run_setup() {
echo "Choose your language "
echo " 1) Nederlands (nl)"
echo " 2) English (en)"
echo " 3) Français (fr)"
echo " 4) Deutsch (de)"
read -rp "> " 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 <term>"
MSG["en,no_search_yet"]="Search for something first with: search <term>"
MSG["fr,no_search_yet"]="Recherchez d'abord avec : search <terme>"
MSG["de,no_search_yet"]="Suche zuerst etwas mit: search <begriff>"
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 <term> Zoek naar Wikipedia-pagina's
open <nummer> 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 <term> Search for Wikipedia pages
open <number> 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 <terme> Rechercher des pages Wikipédia
open <numéro> 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 <begriff> Nach Wikipedia-Seiten suchen
open <nummer> 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 exit 1
} }
echo echo "$pkg $(t dep_installed)"
echo "less is geïnstalleerd. Wiki-terminal wordt gestart." }
echo
fi check_dependencies() {
ensure_dependency jq
ensure_dependency less
ensure_dependency curl
}
TITELS=()
zoek() { zoek() {
echo "Zoek naar pagina's:" local term="$*"
read -p "> " PAGINANAAM if [ -z "$term" ]; then
echo echo "$(t search_prompt)"
read -rp "> " term
fi
[ -z "$term" ] && return
mapfile -t TITELS < <( mapfile -t TITELS < <(
curl -sG \ curl -sG \
--data-urlencode "action=query" \ --data-urlencode "action=query" \
--data-urlencode "list=search" \ --data-urlencode "list=search" \
--data-urlencode "srsearch=$PAGINANAAM" \ --data-urlencode "srsearch=$term" \
--data-urlencode "format=json" \ --data-urlencode "format=json" \
"https://en.wikipedia.org/w/api.php" | "https://${LANG_CODE}.wikipedia.org/w/api.php" |
jq -r '.query.search[]?.title' jq -r '.query.search[]?.title'
) )
if [ ${#TITELS[@]} -eq 0 ]; then if [ ${#TITELS[@]} -eq 0 ]; then
echo "Geen resultaten gevonden." echo "$(t no_results)"
return return
fi fi
for i in "${!TITELS[@]}"; do for i in "${!TITELS[@]}"; do
echo "$((i+1)). ${TITELS[$i]}" echo "$((i + 1)). ${TITELS[$i]}"
done done
} }
pick() { open_result() {
echo local nummer="$1"
echo "kies een nummer"
read -p "> " PAGINANUMMER
if [[ $PAGINANUMMER =~ ^[0-9]+$ ]] && [ $PAGINANUMMER -ge 1 ] && [ $PAGINANUMMER -le ${#TITELS[@]} ]; then if [ ${#TITELS[@]} -eq 0 ]; then
INDEX=$((PAGINANUMMER - 1)) echo "$(t no_search_yet)"
PAGINANAAMNUMMER="${TITELS[$INDEX]}" return
return 0
else
echo "Ongeldige keuze"
return 199
fi fi
}
getSamenvatting() { 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 \ curl -sG \
--data-urlencode "action=query" \ --data-urlencode "action=query" \
--data-urlencode "prop=extracts" \ --data-urlencode "prop=extracts" \
--data-urlencode "explaintext=true" \ --data-urlencode "explaintext=true" \
--data-urlencode "titles=$PAGINANAAMNUMMER" \ --data-urlencode "titles=$titel" \
--data-urlencode "format=json" \ --data-urlencode "format=json" \
"https://en.wikipedia.org/w/api.php" \ "https://${LANG_CODE}.wikipedia.org/w/api.php" |
| jq -r '.query.pages[].extract' | sed '/^== External links ==/,$d' | less jq -r '.query.pages[].extract' | sed '/^== External links ==/,$d' | less
else
echo "$(t invalid_choice)"
fi
} }
zoek set_lang() {
pick 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
}
if pick; then dispatch() {
getSamenvatting local cmd="$1"
else shift || true
echo "probeer opnieuw" 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
}
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
dispatch "$@"
fi fi