Skip to content

Instantly share code, notes, and snippets.

@ragusa87
Last active February 26, 2019 12:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ragusa87/6688202 to your computer and use it in GitHub Desktop.
Save ragusa87/6688202 to your computer and use it in GitHub Desktop.
Highlight the source code of a directory and embed all files into a single PDF. Usefull to print a lab. This file needs other software like: htmldoc,source-highlight,pdftk, iconv. (installed via macport) ## See Readme.md ##

Impression d'un code source

Le but de ce script est de parcourir les fichiers présents dans un dossier et de les fusioner en un seul pdf. C'est utile pour imprimer le code source d'un laboratoire sans avoir à faire l'impression fichier par fichier.

Le script fonctionne comme suit:

  1. Copier les fichiers dans un dossier temporaire
  2. Mise en couleur via "source-highlight" en un fichier html
  3. Conversion du fichier html en pdf via htmldoc
  4. Fusion des résultat en un seul pdf via pdftk
  5. Supprime les fichiers temporaires

Afin de faciliter l'impression recto-verso, une page blache est ajoutée si besoin afin de ne pas avoir deux fichiers différents sur une même page. La page blache contient le texte "néant" pour ne pas être ignorée par les imprimantes "intelligentes".

Les fichiers doivent êtres codés en ISO-8859-1 à cause d'une limitation de htmldoc (version <1.9.X) Une conversion d'utf8 en ISO peut être faite via iconv.

Languages

Les languages suivants sont configurés:

  • java
  • c
  • cpp
  • ada

La compatibilité est plus grande. Voir la documentation de source-highlight: http://www.gnu.org/software/src-highlite/source-highlight.html#Supported-languages

Fichiers du projet

  • code-css.txt Est utile pour personnaliser la coloration de Java
  • print.sh Permet de faire l'impresion du dossier courant
  • printfolder.sh Permet de lancer print.sh sur les sous dossiers sur un niveau et de fusioner les résultats.

Installation

Les fichiers .sh doivent êtres executables et présents dans le "path" système

Les executables suivants doivent êtres installés et dans le "path".

  • htmldoc
  • source-highlight
  • pdftk
  • iconv
bgcolor "white"; // the background color for documents
context gray; // the color for context lines (when specified with line ranges)
keyword blue b ; // for language keywords
type darkgreen i, b ; // for basic types
usertype teal ; // for user defined types
string red f ; // for strings and chars
regexp orange f ; // for strings and chars
specialchar pink f ; // for special chars, e.g., \n, \t, \\
comment brown i, noref; // for comments
number purple ; // for literal numbers
preproc darkblue b ; // for preproc directives (e.g. #include, import)
symbol darkred ; // for simbols (e.g. <, >, +)
function black ; // for function calls and declarations
cbracket red; // for block brackets (e.g. {, })
todo bg:cyan b; // for TODO and FIXME
code bg:brightgreen b; // for code snippets
//Predefined variables and functions (for instance glsl)
predef_var darkblue ;
predef_func darkblue b ;
// for OOP
classname teal ; // for class names, e.g., in Java and C++
// line numbers
linenum black f;
// Internet related
url blue u, f;
// other elements for ChangeLog and Log files
date blue b ;
time, file darkblue b ;
ip, name darkgreen ;
// for Prolog, Perl...
variable darkgreen ;
// explicit for Latex
italics darkgreen i;
bold darkgreen b;
underline darkgreen u;
fixed green f;
argument darkgreen;
optionalargument purple;
math orange;
bibtex blue;
// for diffs
oldfile orange;
newfile darkgreen;
difflines blue;
// for css
selector purple;
property blue;
value darkgreen i;
// for oz
atom orange;
meta i;
// for file system
path orange;
// for C (or other language) labels
label teal b;
// for errors
error purple;
warning darkgreen;
#!/bin/sh
#
# Laurent Constantin
# REV 2.0 - 28.09.2010
#
# Generer un fichier PDF depuis les fichiers code sources ,.. pret a imprimer.
# Necessite: htmldoc,source-highlight,pdftk,(iconv,expr,grep,awk)
# Usage: ada|cpp|java "titre du rendu"
#
#
# NEW: Separe les codes sources d'une page blanche (si besoin)
# NEW: Impression JAVA en portrait avec marge reduite
# Choisit les Extensions de fichiers a traiter
rendu="labo.pdf"
tempdir="printme"
# Option de conversion
utf8toiso=0 # converit l'encodage HTML en ISO
landscape="--landscape" # Impression en paysage par defaut
marginleft="" # Marge de gauche du document non specifie
whitedoc="white.html" # fichier pour genrer un PDF blanc
styleopt=""
# choix du language suivant le parametre
# - L'extension 1 doit etre un nom de language pour html-highlight (java,cpp,ada)
# - Si il n'y a pas d'extension 2, mettre ext2=ext1
case "$1" in
java)
ext1='java'
ext2='java' # Pas d autres extensions donc idem
utf8toiso=0 # Java est en UTF8 on convertit en ISO-8859-1
landscape="" # impression en portrait
marginleft="--left 0.5cm" # marge de 0.5 cm
styleopt="--style-file `dirname $0`/code-css.txt"
;;
c)
ext1='c'
ext2='h'
marginleft="--left 0.5cm" # marge de 1/2 cm
landscape="" # impression en portrait
;;
cpp)
ext1='cpp'
ext2='h'
landscape=""
utf8toiso=1 # Java est en UTF8 on convertit en ISO-8859-1
;;
php)
ext1='php'
ext2='php'
utf8toiso=1
;;
ada)
ext1='adb'
ext2='ads'
landscape=""
marginleft="--left 0.5cm" # marge de 0.5 cm
;;
*)
echo "Usage : `basename $0` ada/cpp/c/java \"title\""
exit;
esac
function echod(){
#echo $1;
donothing=""
}
# Saisie de l entete..
if [ "$2" != "" ]; then
title=$2
else
echo "Entrez un header (laboN - Branche - Auteurs): "
read title
fi
echod "Generation de fichiers PDF depuis le code source"
# On copie les sources dans un repertoire temporaire..
echod "Recherche & Copie des fichiers"
if [ ! -d $tempdir ]; then
mkdir $tempdir
fi
#find . -path \( -name "*.$ext1" -or -name "*.$ext2" \) -exec cp {} ./$tempdir/ \;
pwd
for fl in *.$ext1; do
cp $fl ./$tempdir/
done
for fl in *.$ext2; do
cp $fl ./$tempdir/
done
cd $tempdir
echod "Conversion au format HTML"
# convertit chaque fichier avec l'extension 1 en pdf
for fl in *.$ext1; do
source-highlight --title "$title - Fichier: $fl" -s $ext1 -f html --tab 4 $styleopt --doc --line-number -i $fl -o $fl.html &> /dev/null
rm $fl
done
# convertit chaque fichier avec l'extension 2 en pdf
if [ $ext1 != $ext2 ]; then
for fl in *.$ext2; do
source-highlight --title "$title - Fichier: $fl" -s $ext1 -f html --tab 4 $styleopt --doc --line-number -i $fl -o $fl.html &> /dev/null
rm $fl
done
fi
# convertit chaque fichier HTML depuis UTF8 en ISO (seulement Java)
if [ $utf8toiso == 1 ]; then
echod "Change l'encodage UTF8 en ISO-8859-1"
for fl in *.html; do
mv $fl $fl.old
iconv --from-code=UTF-8 --to-code=ISO-8859-1 $fl.old > $fl
rm -f $fl.old
done
fi
echod "Conversion du HTML au format PDF"
find . -name "*.html" -exec htmldoc $marginleft $landscape --webpage --footer "/.d" -f {}.pdf {} \;
if [ ! -e $whitedoc.tmp ]; then
# echod "Cree un pdf blanc"
echo "<html><head></head><body>-- N&eacute;ant --</body></html>" > $whitedoc
htmldoc $landscape --webpage -t pdf --footer " " -f $whitedoc.tmp $whitedoc &> /dev/null
rm $whitedoc
fi
echod "Suppression des fichiers HTML temporaires.."
rm ./*.html
echod "Nettoyage des noms."
for f in ./*.$ext1.*.pdf; do
mv "$f" "`basename $f .html.pdf`.pdf"
done
if [ $ext1 != $ext2 ]; then
for f in ./*.$ext2.*.pdf; do
mv "$f" "`basename $f .html.pdf`.pdf"
done
fi
# Ajoute une page blanche si un code source a un nombre de page impaire
# (pour une impression recto-verso)
echod "Lien entre les fichiers"
for fl in *.pdf; do
# recupere le nb de page dans chaque PDF
nb=`pdftk $fl dump_data | grep NumberOfPages | awk '{print $2}'`
# Modulo pour savoir si c 'est paire
nb=`expr $nb % 2`
# si c'est impraire on fusionne avec un PDF blanc
if [ $nb -eq 1 ]; then
mv $fl $fl.new.pdf
#Join in1.pdf and in2.pdf into a new PDF, out1.pdf
pdftk $fl.new.pdf $whitedoc.tmp cat output $fl &> /dev/null
rm $fl.new.pdf
fi
done
# On supprime le PDF blanc
rm $whitedoc.tmp
# On supprime le resultat precedent si il existe
if [ -e $rendu ]; then
rm $rendu
fi
# fusionne les PDF
echod "Fusion en un pdf.."
pdftk *.pdf cat output $rendu &> /dev/null
rm `ls *.pdf | grep -v $rendu`
echod "Copie du ficher final et suppression du dossier temporaire"
if [ -e ../$rendu ]; then
rm ../$rendu
fi
mv $rendu ..
echod "ouverture du pdf.."
cd ..
rmdir $tempdir
#open ./$rendu || gnome-open ./$rendu
#
# Appel print.sh sur tous les sous-dossiers (1 niveau)
# et fusionne le resultat de chaque dossier en un seul pdf.
#
# Permet d'imprimer un projet hierarchise
#
#
pfolder="printme"
pdffile="labo.pdf" # fichier de sortie de print.sh
if [ ! -d $pfolder ]; then
mkdir $pfolder
fi
i=0
for file in *; do
if [[ "$file" != "$pfolder" && -d $file ]]; then
cd $file;
print.sh "$1" "$2" "$3" "$4"
mv $pdffile ../$pfolder/$file.$i.pdf
i=$(($i + 1))
cd ..
fi
done
cd $pfolder
# fusion en 1 pdf
pdftk *.pdf cat output $pdffile
rm `ls *.pdf | grep -v $pdffile`
# deplace le pdf
mv $pdffile ../
# supprime le cache
cd ..
rmdir $pfolder
# fin
open $pdffile || gnome-open $pdffile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment