Skip to content
Snippets Groups Projects
src2pdf.sh 6.76 KiB
Newer Older
lenoelda's avatar
lenoelda committed
# CREATE PDF FROM SOURCE CODE
# original source http://superuser.com/questions/601198/how-can-i-automatically-convert-all-source-code-files-in-a-folder-recursively
# modified source https://samhobbs.co.uk/2017/01/bash-script-generate-pdf-source-code-syntax-highlighting-using-latex
# source code file names must not contain spaces

##############################
lenoelda's avatar
lenoelda committed
#use this in Hochautomatisiertes-Fahren/documentation/mainDocument/sections
##############################

touch sourcecode.tex
tex_file="sourcecode.tex"
#tex_file=$(mktemp) ## Random temp file name
 
if [ $? -ne 0 ]; then
    echo "ERROR: failed to create temporary file"
    exit 1;
fi
 
# DOCUMENT HEADER

cat<<EOF >$tex_file   ## Print the tex file header
\section{Anhang}
\subsection{Quellcode}

EOF
 
###############
 
# ask the user which file extensions to include
 
#read -p "Provide a space separated list of extensions to include (default is 'h cpp qml') : " answer
# 
#if [[ $answer == "" ]]; then
#    answer="h cpp qml"
#fi

answer="c cpp h py"

# replace spaces with double escaped pipe using substring replacement  http://www.tldp.org/LDP/abs/html/parameter-substitution.html
 
extensions="${answer// /\\|}"
 
###############
 
# FINDING FILES TO INCLUDE
# inline comments http://stackoverflow.com/questions/2524367/inline-comments-for-bash#2524617
# not all of the conditions below are necessary now that the regex for c++ files has been added, but they don't harm
 
#echo $(echo $PWD)
cd ..
cd ..
cd ..
cd modules/catkin_ws
#echo $(echo $PWD)

filesarray=(
$(
find .                                                         `# find files in the current directory` \
        -type f                                                `# must be regular files` \
        -regex ".*\.\($extensions\)"                           `# only files with the chosen extensions (.h, .cpp and .qml) by default` \
        ! -regex ".*/\..*"                                     `# exclude hidden directories - anything slash dot anything (Emacs regex on whole path https://www.emacswiki.org/emacs/RegularExpression)` \
        ! -name ".*"                                           `# not hidden files` \
        ! -name "*~"                                           `# don't include backup files` \
        ! -name 'src2pdf'                                      `# not this file if it's in the current directory` \
		! -path "./build/*"                                    `# extra` \
		! -path "./devel/*"                                    `# extra` \
		! -path "./install/*"                                  `# extra` \
		! -path "./src/VeloxProtocolLib/*"                     `# extra` \
		! -path "./src/wiringPi/*"                             `# extra` \
		! -path "./src/MessageLib/cmake-build-debug/*"         `# extra` \
		! -path "./src/NetworkingLib/cmake-build-debug/*"      `# extra` \
		! -path "./src/PC2CarLib/cmake-build-debug/*"          `# extra` \
		! -path "./src/PlatoonProtocolLib/cmake-build-debug/*" `# extra`
))

cd ..
cd ..
cd documentation/mainDocument/sections
 
###############
 
# sort the array https://stackoverflow.com/questions/7442417/how-to-sort-an-array-in-bash#11789688
# internal field separator $IFS https://bash.cyberciti.biz/guide/$IFS
 
IFS=$'\n' filesarray=($(sort <<<"${filesarray[*]}"))
unset IFS
 
###############
 
#read -p "Re-order files to place header files in front of cpp files? (y/n) : " answer
answer="y"

if [[ $answer == "y" ]] || [[ $answer == "Y" ]] ; then
    echo "Re-ordering files..."
 
    # if this element is a .cpp file, check the next element to see if it is a matching .h file
    # if it is, swap the order of the two elements
    re="^(.*)\.cpp$"
 
    # this element is ${filesarray[$i]}, next element is ${filesarray[$i+1]}
    for (( i=0; i<=$(( ${#filesarray[@]} -1 )); i++ ))
    do
        # if the element is a .cpp file, check the next element to see if it is a matching .h file
        if [[ ${filesarray[$i]} =~ $re ]]; then
            header=${BASH_REMATCH[1]}
            header+=".h"
            if [[ ${filesarray[$i+1]} == $header ]]; then
                # replace the next element in the array with the current element
                filesarray[$i+1]=${filesarray[$i]}
                # replace the current element in the array with $header
                filesarray[$i]=$header
            fi
        fi
    done
fi

if [[ ! $answer == "n" ]] && [[ ! $answer == "N" ]] ; then
    echo "Re-ordering files..."
 
    # if this element is a .cpp file, check the next element to see if it is a matching .h file
    # if it is, swap the order of the two elements
    re="^(.*)\.c$"
 
    # this element is ${filesarray[$i]}, next element is ${filesarray[$i+1]}
    for (( i=0; i<=$(( ${#filesarray[@]} -1 )); i++ ))
    do
        # if the element is a .cpp file, check the next element to see if it is a matching .h file
        if [[ ${filesarray[$i]} =~ $re ]]; then
            header=${BASH_REMATCH[1]}
            header+=".h"
            if [[ ${filesarray[$i+1]} == $header ]]; then
                # replace the next element in the array with the current element
                filesarray[$i+1]=${filesarray[$i]}
                # replace the current element in the array with $header
                filesarray[$i]=$header
            fi
        fi
    done
fi
 
###############
 
# Change ./foo/bar.src to foo/bar.src
IFS=$'\n' filesarray=($(sed 's/^\..//' <<<"${filesarray[*]}"))
unset IFS
 
###############
 

read -p "Review files found? (y/n) : " answer
 
if [[ $answer == "y" ]] || [[ $answer == "Y" ]] ; then
 
    echo "The following files will be included in the document..."
 
    for i in "${filesarray[@]}"
    do
        echo $i
    done
 
    # allow the user to abort
    read -p "Proceed? (y/n) : " answer
    if [[ $answer == "n" ]] || [[ $answer == "N" ]] ; then
        exit 0
    fi
 
fi
 
###############
 
# create a .tex file with each section on its own page
 
echo "Creating tex file..."
 
for i in "${filesarray[@]}"
do
    echo "\subsubsection{catkin\_ws/${i//_/\\_}}" >> $tex_file  # create a section for each source file
    echo "\lstinputlisting[style=customasm,title={\phantom{ }}]{../../modules/catkin_ws/$i}" >> $tex_file # place the contents of each file in a listing
    echo "\newpage" >> $tex_file   # start each section on a new page
done
 
###############
 
# run pdflatex twice to produce TOC
#echo "Creating pdf..."
#echo
 
#pdflatex $tex_file -output-directory . 
 
#if [ $? -ne 0 ]; then
#    echo "ERROR: pdflatex command failed on first run, refer to tmp.log for more information"
#    exit 1;
#fi
 
#pdflatex $tex_file -output-directory .
 
#if [ $? -ne 0 ]; then
#    echo "ERROR: pdflatex command failed on second run, refer to tmp.log for more information"
#    exit 1;
#fi
 
###############
 
#echo "Renaming output files..."
 
#echo "Done, output file is $title.pdf in this directory"