#!/bin/bash
# bash_completion_ordbanken – bash-basert autofullføring for skriptet ordbanken.
#
# Copyright © 2008, 2009 Karl Ove Hufthammer <karl@huftis.org>.
#
#     This file is part of Ordbanken.
#
#     Ordbanken is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 3 of the License, or
#     (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Bruk: source bash_completion_ordbanken
#       (og bruk so ordbankskriptet som før)

shopt -s extglob # Nødvendig for testane som brukar @()-syntaksen.

# Finn ut kva språk brukaren har valt.
_ordbanken_finn_sprak()
{
  # Enten har brukaren definert språket på kommandolinja.
  for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ ))
  do
    sprak_arg=${COMP_WORDS[i]}
    case $sprak_arg in
      -snn ) sprak=nn;;
      -snb ) sprak=nb;;
      --sprak|-s ) sprak=${COMP_WORDS[i+1]};;
    esac
  done

  # Eller so har brukaren (forhåpentligvis) definert eit standardspråk.
  if [ -z "$sprak" ]
  then
    if [[ "$SPRAK_ORDBANKEN" == @(nn|nb) ]]
    then
      sprak=$SPRAK_ORDBANKEN
    fi
  fi

  # Namnet på bokmålsordlista er ulik språkkoden.
  if [ "$sprak" = "nb" ]
  then
    sprak="bm"
  fi
  echo $sprak
}

# Hent alle orda frå gjeldande språk som begynner med teksten under skrivemerket.
_ordbanken_hent_ord()
{
  # Må først finna ut kva språk me har.
  sprak=$(_ordbanken_finn_sprak)

  # Mappa der ordbankfilene ligg.
  local ordbanken_mappe="/usr/local/share/ordbanken"

  # Sjekk at ordlistefila finst (språkkoden er rett)
  # og at me ikkje søkjer gjennom heile (tom søkjetekst).
  fil="$ordbanken_mappe/fullform_$sprak.dat"
  if [ -r "$fil" ] && [ -n "$cur" ]
  then
    LOOK_PROG=$(command -v look) # Sjekk om programmet «look» finst.
    LOOK_FINST=$?
    if [ $LOOK_FINST -eq 0 ] # Bruk «look» om programmet finst, «grep» elles.
    then
      LC_ALL=C $LOOK_PROG "$cur" $fil | cut -f1 | uniq
    else
      LC_ALL=C grep ^$cur $fil | cut -f1 | uniq
    fi
  fi
}

# Hent alle ordklassane (morfologiske skildringar) frå gjeldande
# språk som begynner med teksten under skrivemerket.
_ordbanken_hent_klassar()
{
  # Må først finna ut kva språk me har.
  sprak=$(_ordbanken_finn_sprak)
  
  LOOK_PROG=$(command -v look) # Sjekk om programmet «look» finst.
  LOOK_FINST=$?

  # Mappa der ordbankfilene ligg.
  local ordbanken_mappe="/usr/local/share/ordbanken"

  # Sjekk at ordlistefila finst (språkkoden er rett).
  fil="$ordbanken_mappe/fullform_$sprak.dat"
  if [ -r "$fil" ] && [ -n "$prev" ]
  then
    if [ $LOOK_FINST -eq 0 ] # Bruk «look» om programmet finst, «awk» elles.
    then
      oppslag="$(LC_ALL=C $LOOK_PROG "$prev " $fil)
$(LC_ALL=C $LOOK_PROG "$prev	" $fil)"
    else
      oppslag="$(LC_ALL=C awk '{ if ( $1 == '\"$prev\"') {print $0}}' $fil)"
    fi
    echo "$oppslag" \
    | grep -v '^\*' \
    | cut -f3- -d"	" \
    | sed -r 's/<[^>]*>//g;s/	/\n/g' \
    | sed -r 's/[0-9\*][^ ]*//g' \
    | sort \
    | uniq 
  fi
}

# Hovudfunksjonen som autofullfører for oss.
_ordbanken()
{
  local cur prev

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}

  # Tips om gyldige språkkodar eller ordkodar.
  while true; do
    case $prev in
      --sprak | -s) # Tips om språkkodar.
      COMPREPLY=( $( compgen -W 'nb nn' -- $cur ) )
      return 0
      ;;
      nn | nb ) break;; # Førre ord var ein språkkode.
      ordbanken) break;; # Me er berre på første ord.
      -*) break;; # Førre ord var eit val.
      *) # Førre ord var eit oppslagsord. Føreslå derfor ordkodar.
      COMPREPLY=( $( compgen -W "$(_ordbanken_hent_klassar)" -- $cur ) )
      return 0;;
    esac
  done

  # Tips om gyldige argument som startar med «-».
  if [[ "$cur" == -* ]]; then
    COMPREPLY=( $( compgen -W '-s --sprak -snn -snb -e --eksempel -f --fargekod\
    -F --ikkje-fargekod -k --klammer -K --ikkje-klammer -p\
    --parentes -P --ikkje-parentes --tekst --html -h --hjelp -v --versjon'\
    -- $cur ) )
  else
    # Sjå om brukaren alt har valt språk,
    # anten ved at han/ho har definert standardspråk …
    if [[ "$SPRAK_ORDBANKEN" == @(nn|nb) ]]
    then
      local sprakvald="ja"
    else # … eller ved å definera det på kommandolinja
      for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ ))
      do
        if [[ ${COMP_WORDS[i]} == @(--sprak|-s|-snn|-snb|--sprak=nn|--sprak=nb) ]]
        then
          local sprakvald="ja"
        fi
      done
    fi
    if [ -z "$sprakvald" ] # Viss språket ikkje er valt, legg til «--sprak» …
    then
      COMPREPLY="--sprak"
    else # … elles hent oversikt over ord som begynner med vald tekst.
      COMPREPLY=( $( compgen -W "$(_ordbanken_hent_ord)" -- $cur ) )
    fi
  fi
}

# Legg til slutt til støtte for autofullføring.
complete -F _ordbanken ordbanken
