"html-index" Creazione indici HTML

- A cura del Prof. Stefano Salvi -


#!/bin/bash
# html-index
# Script che scandisce un albero di directory e crea un file html
# di indice in ogni sottodirectory

# Stefano Salvi <stefano@salvi.mn.it>
# this file is available under the GNU general public license

# controlla che ci sia un parametro e che questo corrisponda ad una directory
if [ ! "$1" ]
then
	echo "Devi indicare la directory nella quale fare l'indice"
	exit 1
fi
if [ ! -d "$1" ]
then
	echo "$1 non e' una directory"
	exit 2
fi

# Stampa una riga di tabella con il link ad una directory o file da vedere
# $1 -> File
# $2 -> Descrizione
# $3 -> Link
# $4 -> Azione
function view {
  # produce la riga di tabella
  echo "<tr><td>$1</td><td align=\"center\">$2</td><td align=\"center\"><a href=\"$3\">$4</a></td></tr>"
}

# Stampa una riga di tabella con il link ad un file da scaricare
# $1 -> File
# $2 -> Descrizione
# $3 -> File con i caratteri corretti per il Web
function download {
  # lista il file (ls), ne estrae la dimensione (awk) e inserisce i punti (sed)
  DIMENSIONE=`ls -l "$1" | awk '{ print $5 }' | \
  	sed -e "s/\([0-9]\)\([0-9][0-9][0-9]\)$/\1.\2/" -e "s/\([0-9]\)\([0-9][0-9][0-9]\.\)/\1.\2/"`
  # Stampa la riga della tabella
  echo "<tr><td>$1</td><td align=\"center\">$2</td><td align=\"center\"><a href=\"$3\">scarica</a> ($DIMENSIONE byte)</td></tr>"
}

# Stampa un file "index.html"; ricorsivamente, si richiama e redirige il
# risultato sugli "index.html" delle sottodirectory
# Parametri:
# $1 -> percorso corrrente (titolo)
# $2 -> locazione directory corrente (per CD)
function index {
  # Dichiara due directory "locali", cioe' diverse per ogni invocazione
  # della funzione
  local OLDPWD
  # Recupera il percorso precedente, per tornarci
  OLDPWD=`pwd`
  
  # Entra nella directory indicata
  cd "$2"

  # Stampa la testata del file HTML (html molto grezzo)
  echo "<html>"
  echo "<head>"
  echo "<title>Files in $1</title>"
  echo "<body>"
  echo "<h1 align=\"center\">Files in $1</h1>"
  echo "<p align=\"center\">[<a href=\"../index.html\">Directory Superiore</a>]</p>"
  echo "<table border=\"1\" align=\"center\">"

  # Fa' un ciclo sui nomi dei file della directory idicata (corrente)
  for f in *
  do
  	# Corregge il nome file
  	FILE=`echo "$f" | \
	 sed -e "s/ /%20/g" -e "s/\//%5f/g"`
  	# Se il file corrente e' una directory
  	if [ -d "$f" ]
	then
		# Produce la figa di tabella che vi rimanda
		view "$f" "[Directory]" "$FILE/index.html" "entra"
		# si richiama ricorsivamente, per generarne l'indice
		index $1/$f $f > $f/index.html
	# Altrimenti (e' un file) se e' "index.html" (se stesso)
  	elif [ "$f" = "index.html" ]
	then
		#l'index stesso - non lo lista
		echo "<!-- Index.html saltato -->"
	else
		# estrae l'estensione del file
		ESTENSIONE=`echo $f | /bin/sed "s/^.*\.\([^.]*\)$/\1/"`
		# se l'estensione coincide con il file, 
		# il file non ha estensione
		if [ "$ESTENSIONE" = "$f" ]
		then
			ESTENSIONE="senza tipo"
		fi
		# In base all'estensione....
		case $ESTENSIONE in
			htm | html)
				view "$f" "Pagina WEB" "$FILE" "Leggi"
				;;
			txt)
				view "$f" "Documento di testo" "$FILE" "Leggi"
				;;
			*)
  				download "$f" "file $ESTENSIONE" "$FILE"
				;;
		esac
	fi
  done

  # stampa la coda del file HTML
  echo "</table>"
  echo "</body>"
  echo "</html>"

  # Ritorna alla directory precedente
  cd $OLDPWD
}

# richiama la funzione che produce l'indice principale dell'archivio
# e lo immagazzina nel file indice della directory
index "Archivio" $1 > $1/index.html