Toujours au sujet de mes scans de cours… j’ai aujourd’hui quelques gigas de cours scannés et je souhaitais pondre une page html avec l’arborescence globale du repertoire COURANT et de ses fils, et ne faire apparaitre que les PDF.
Bon, c’est pas encore completement terminé, mais je pense que je suis sur la bonne voie, à moins que qqn m’apprenne que ceci a déjà été fait par ailleurs.
Le prog pond juste l’arbo des repertoires fils à partir du repertoire en cours (ou dans la console…) en html.
PS: les images ont été trouvées sur le web, cf lien à la fin.
arbo2html.sh:
#! /usr/bin/awk -f
function SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, COL, i) {
i=LIGDEB+1
while ( i<=LIGMAX && TABLEAU[i, COL]!=CASE_L && TABLEAU[i, COL]!=CASE__ ) {
i ++
}
if ( TABLEAU[i, COL] == CASE_L ) {
return i
}
return LIGDEB
}
function SET_EMPTY_FIELDS_with(TABLEAU, LIGMAX, COLMAX,CHAR2FILL, i,j) {
for ( i=1; i <= LIGMAX; i ++) {
for ( j=1; j <= COLMAX; j ++) {
if ( TABLEAU[i, j] != CASE_L )
TABLEAU[i,j]=CHAR2FILL
}
}
}
function SET_T_in_TAB(TABLEAU, LIGMAX, COLMAX, i,j) {
for ( i=1; i <= LIGMAX-1; i ++) {
for ( j=1; j <= COLMAX; j ++) {
if ( TABLEAU[i, j] == CASE__ && TABLEAU[i+1, j] == CASE_L || TABLEAU[i, j] == CASE__ && TABLEAU[i+1, j] == CASE_I )
TABLEAU[i,j]=CASE_T
}
}
}
function SET_HORIZ_T_in_TAB(TABLEAU, LIGMAX, COLMAX, i,j) {
for ( i=1; i <= LIGMAX; i ++) {
for ( j=1; j <= COLMAX-1; j ++) {
if ( TABLEAU[i, j] == CASE_I && TABLEAU[i, j+1] == CASE__ )
TABLEAU[i,j]=CASE_HORIZ_T
}
}
for ( i=1; i <= LIGMAX-1; i ++) {
for ( j=1; j <= COLMAX; j ++) {
if ( TABLEAU[i, j] == CASE_L && TABLEAU[i+1, j] == CASE_L ||
TABLEAU[i, j] == CASE_L && TABLEAU[i+1, j] == CASE_I )
TABLEAU[i,j]=CASE_HORIZ_T
}
}
}
function SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL, LIGDEB, i,ifin,j) {
if ( CURRENTCOL > COLMAX ) {return}
ifin=SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, CURRENTCOL)
if ( LIGDEB < ifin ) {
for ( i=LIGDEB+1; i <= ifin-1; i ++) {
TABLEAU[i,CURRENTCOL]=CASE_I
}
SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL+1, LIGDEB, ifin-1)
SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL, ifin, LIGMAX)
}
else {
ifin=SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, CURRENTCOL+1)
SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL+1, LIGDEB, ifin)
}
}
function SET_UNDERSCORES_after_L_by_LIG(TABLEAU, LIGMAX, COLMAX, i,j,jbeg) {
for ( i=1; i <= LIGMAX; i ++) {
# un L dans la ligne??? test
j=1
while ( TABLEAU[i,j]!=CASE_L && j<=COLMAX ) {
j++
}
#sic, pour ne pas afficher les L pour les fichiers...
if ( j>COLMAX ) {
continue
}
for ( j=1; j <= COLMAX; j++) {
if ( TABLEAU[i, j] == CASE_L ) {
jbeg=j+1
break
}
}
for ( j=jbeg; j <= COLMAX; j ++) {
TABLEAU[i,j]=CASE__
}
}
}
function EXTRACT_NOM_FIC_from_FULL_PATH(EXPRESSION, TABEXPRESSION) {
#n contient le nbre d'elements
n=split( EXPRESSION, TABEXPRESSION, "/")
return TABEXPRESSION[n]
}
function COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, LIG, i, NBREP) {
if ( IS_DIRECTORY(TABLEAU[LIG,COLMAX+1]) == 0 ) {
#calcul du nombre de rep précédents!
NBREP=1
for(i=LIG; i>=1; i--) {
if ( IS_DIRECTORY(TABLEAU[i,COLMAX+1]) == 0 ) {
NBREP++
}
}
if ( NBREP % 2 == 0 ) {
return "#b5d3f2"
}
return "white"
}
return COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, LIG-1)
}
function DISPLAY_DIR_FULL_TREE(TABLEAU, LIGMAX, COLMAX, SEP, i,j) {
for ( i=1; i <= LIGMAX; i ++) {
for ( j=1; j <= COLMAX; j ++) {
printf "%s%s", TABLEAU[i, j], SEP
}
#printf "%s%s%s\n",EXTRACT_NOM_FIC_from_FULL_PATH(TABLEAU[i,COLMAX+1]), CASE_VIDE, TABLEAU[i,COLMAX+2]
printf "%s%s%s\n",TABLEAU[i,COLMAX+1], CASE_VIDE, TABLEAU[i,COLMAX+2]
}
}
function FILE_LINKED2(CHAR) {
if ( CHAR == CASE_VIDE ) {
return ""
}
else if ( CHAR == CASE_L ) {
return "12.gif"
}
else if ( CHAR == CASE_T ) {
return "234.gif"
}
else if ( CHAR == CASE_HORIZ_T ) {
return "123.gif"
}
else if ( CHAR == CASE_I ) {
return "1.gif"
}
else if ( CHAR == CASE__ ) {
return "24.gif"
}
}
function IS_DIRECTORY(EXPRESSION) {
if ( substr(EXPRESSION, 1,2) != "./" ) {
# il s'agit donc d'un rep...
return 0
}
else {
# sinon d'un fichier!!!
return 1
}
}
function DISPLAY_DIR_FULL_TREE_in_HTML(TABLEAU, LIGMAX, COLMAX, i,j ) {
#affichage entete...
print "<html>"
print "<head>"
print "<title>Scan Cours...</title>"
print "</head>"
print "<body bgcolor=\"#64a4e3\" link=\"black\" alink=\"black\" vlink=\"black\">"
print "<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>"
#titre de tableau dans la page html...
#print "<CAPTION valign=\"TOP\">Scan de cours...</CAPTION>"
print "<TR>"
print "<TD COLSPAN=\""COLMAX+3"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\" size=\"10pt\">Scan de Cours...</FONT></TD>"
print "</TR>"
print "<TR>"
print "<TH COLSPAN=\""COLMAX"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Dep.</FONT></TD>"
print "<TH COLSPAN=\""2"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Chemins et liens</FONT></TD>"
print "<TH bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Taille en Mo</FONT></TD>"
print "<TR>"
#remplissage du tableau
for ( i=1; i <= LIGMAX; i ++) {
print "<TR bgcolor=\"" COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, i) "\">"
for ( j=1; j <= COLMAX; j ++) {
#if ( FILE_LINKED2(TABLEAU[i, j])!="" ) {
if ( FILE_LINKED2(TABLEAU[i, j]) ) {
print "<TD><IMG SRC=\"" FILE_LINKED2(TABLEAU[i, j])"\" HEIGHT=20 WIDTH=20></TD>"
}
else {
print "<TD WIDTH=20></TD>"
}
}
# faire le lien ou pas le lien??? telle est la question!
if ( IS_DIRECTORY(TABLEAU[i,COLMAX+1])==0 ) {
# il s'agit donc d'un rep... => en gras
print "<TD> <B>" TABLEAU[i,COLMAX+1] "</B> </TD>"
print "<TD></TD>"
print "<TD ALIGN=\"center\"> " TABLEAU[i,COLMAX+2] " </TD>"
}
else{
# sinon d'un fichier!!! => proposer le lien.
print "<TD></TD>"
print "<TD> <A HREF=\"" TABLEAU[i,COLMAX+1] "\">" EXTRACT_NOM_FIC_from_FULL_PATH(TABLEAU[i,COLMAX+1]) "</A> </TD>"
print "<TD></TD>"
}
print "</TR>"
}
print "</body>"
print "</html>"
}
function SET_FULL_TAB_into_HTML(TABLEAU, NOMREPTABLEAU, NOMFICTABLEAU, TAILLEREPTABLEAU, LIGMAX, COLMAX, i,j,k,l, _LIGMAX, _COLMAX) {
# les var avec _ devant sont relatives au tab elargi
_LIGMAX=LIGMAX
#necessaire si on fait pointer les fichiers!
#_COLMAX=COLMAX+2
_COLMAX=COLMAX
#nb total de lig dans le nouveau tab
for ( i=1; i <= LIGMAX; i ++) {
_LIGMAX+=NOMFICTABLEAU[i,0]
}
i=LIGMAX
_i=_LIGMAX
while( i<_i && _i>0 ) {
#recherche de la colonne du CASE_L dans la ligne i, (j<=COLMAX inutile, mais bon)
j=1
while ( TABLEAU[i,j]!=CASE_L && j<=COLMAX ) { j++ }
#pour chaque fichier...
for(k=NOMFICTABLEAU[i,0]; k>=1; k--) {
#nettoyer toute la ligne
for(l=1; l<=_COLMAX+2; l++) {
TABLEAU[_i,l]=CASE_VIDE
}
#inserer nom du fic & CASE_L
TABLEAU[_i,_COLMAX+1]=NOMFICTABLEAU[i,k]
TABLEAU[_i,_COLMAX+2]=CASE_VIDE
#mettre un # pour ne pas pointer les fichiers...
#TABLEAU[_i,j+1]=CASE_L
_i--
}
#attention à l'effet de bord du '_i--' précédent qui est de trop pour ce cas là!
#si les deux sont égaux, il faut sortir!!! il ne reste alors que les reps à
#copier.
if ( _i == i ) { continue }
#nettoyer ligne
for(l=1; l<=_COLMAX; l++) {
TABLEAU[_i,l]=CASE_VIDE
}
#recopier CASE_L, nom du repertoire et taille...
TABLEAU[_i,j]=TABLEAU[i,j]
TABLEAU[_i,_COLMAX+1]=NOMREPTABLEAU[i]
TABLEAU[_i,_COLMAX+2]=TAILLEREPTABLEAU[i]
i--
_i--
}
#forcément il ne reste que des reps à copier alors...
#le décalage n'est pas à faire, SI on a utilisé SET_EMPTY_FIELDS_with CASE_VIDE...
#ce que je m'empresserai de faire par la suite... :)
while ( _i > 0 ) {
TABLEAU[_i,_COLMAX]=CASE_VIDE
TABLEAU[_i,_COLMAX+1]=NOMREPTABLEAU[i]
TABLEAU[_i,_COLMAX+2]=TAILLEREPTABLEAU[i]
_i--
i--
}
#completion du tableau avec les symboles "graphiques"...
SET_UNDERSCORES_after_L_by_LIG(TABLEAU, _LIGMAX, _COLMAX)
SET_I_between_L_by_COL(TABLEAU, _LIGMAX, _COLMAX,1,1)
SET_T_in_TAB(TABLEAU, _LIGMAX, _COLMAX)
SET_HORIZ_T_in_TAB(TABLEAU, _LIGMAX, _COLMAX)
#afficher simplement dans la console...
#DISPLAY_DIR_FULL_TREE(TABLEAU, _LIGMAX, _COLMAX, CASE_VIDE)
#pondre une page html de tout ce bouza.
DISPLAY_DIR_FULL_TREE_in_HTML(TABLEAU, _LIGMAX, _COLMAX)
}
#determine si c'est un rep ou non, son entrée, est la sortie de ls!
#si '.:' ou './ABC' alors ce sont des reps, sinon ben non.
function IS_DIRECTORY_from_LS(EXPRESSION) {
if ( substr(EXPRESSION, 1,1) == "." && substr(EXPRESSION, length(EXPRESSION),1) == ":" || substr(EXPRESSION, 1,2) == "./" ) {
# il s'agit donc d'un rep...
return 0
}
else {
# sinon d'un fichier!!!
return 1
}
}
BEGIN {
LIG=0
LIG_MAX=0
COL=1
COL_MAX=1
CASE_VIDE=" "
CASE_L="L"
CASE_T="T"
CASE_HORIZ_T=">"
CASE_I="|"
CASE__="-"
REP_COURANT=""
}
#REMPLIR LE TABLEAU à partir de ... ce sera l'entrée du programme.
#.:
#total 144
#4 1.gif
#4 12.gif
#4 24.gif
#4 123.gif
#4 234.gif
#4 ABC/
#4 ABC'/
$1==".:" && !match($1,"/") {
LIG=0
COL=1
COL_MAX=COL
REP_COURANT="./"
}
match ($1, ":") && IS_DIRECTORY_from_LS($1)==0 {
LIG++
n=split($1, TABLEAUBIDON, "/")
COL=n
if ( COL > COL_MAX ) { COL_MAX=COL }
TAB[LIG, COL]=CASE_L
NOMREP_TAB[LIG]=substr(TABLEAUBIDON[n],1 ,length(TABLEAUBIDON[n])-1)
NOMFIC_TAB[LIG,0]=0
REP_COURANT=substr($0,1,length($0)-1)
}
NF>=2 && !match($1,":") && !match($2,"/") && !match($1, "^total") && match($1, "[0-9]") && match($2,".pdf") {
#on a affaire à un fichier pdf!
NOMFIC_TAB[LIG,0]++
NOMFIC_TAB[LIG, NOMFIC_TAB[LIG,0] ]=REP_COURANT"/"$2 #substr($0, length($1)+1)
}
match ($1, "total") { TAILLEREP_TAB[LIG]=sprintf("%.2f",$2/1024) }
$1~/^$/ { next }
END {
LIG_MAX=LIG
COL_MAX+=1
# on complete les cases vides avec CASE_VIDE
SET_EMPTY_FIELDS_with(TAB, LIG_MAX, COL_MAX, CASE_VIDE)
# ajouter le nom des fichiers/reps, et la taille au tableau qui devient alors global!
# <- COL_MAX -><-COLMAX+1-><-COLMAX+2->
# | CASE_L | CASE_VIDE | CASE__ | CASE_T ... | NOM | TAILLE |
SET_FULL_TAB_into_HTML(TAB, NOMREP_TAB, NOMFIC_TAB, TAILLEREP_TAB, LIG_MAX, COL_MAX)
}
dans la console… pour isoler les pdf, taper:
ls -svR --format=single-column | arbo2html.sh > pagearbo.html
pour n’avoir que les repertoires…
ls -vR --format=single-column | arbo2html.sh > pagearbo.html
Voili, voilou…
PS: les fichiers images peuvent être trouvés ici… (Prendre toutes les images et les mettre dans le meme repertoire que pageargo.html qui doit rester dans le rep où on a lancé le ‘ls-svr | …’!!!)
PS2: le prog ne gere pas les ESPACES ni dans les noms de fichiers ni dans les repertoires… Faudra faire une moulinette pour renommer tous vos fichiers en remplaçant le " " par “_”… :ane: