GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso convertire automaticamente tutti i file di codice sorgente in una cartella (in modo ricorsivo) in un singolo PDF con evidenziazione della sintassi?

Sono stato incuriosito dalla tua domanda e mi sono lasciato trasportare. Questa soluzione genererà un bel file PDF con un indice cliccabile e un codice evidenziato a colori. Troverà tutti i file nella directory corrente e nelle sottodirectory e creerà una sezione nel file PDF per ciascuno di essi (vedere le note di seguito per come rendere più specifico il comando find).

Richiede che tu abbia installato quanto segue (le istruzioni di installazione sono per i sistemi basati su Debian ma queste dovrebbero essere disponibili nei repository della tua distribuzione):

  • pdflatex , color e listings

    sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
    

    Questo dovrebbe anche installare un sistema LaTeX di base se non ne hai uno installato.

Una volta installati, usa questo script per creare un documento LaTeX con il tuo codice sorgente. Il trucco sta nell'usare il listings (parte di texlive-latex-recommended ) e color (installato da latex-xcolor ) Pacchetti LaTeX. Il \usepackage[..]{hyperref} è ciò che rende cliccabili gli elenchi nel sommario.

#!/usr/bin/env bash

tex_file=$(mktemp) ## Random temp file name

cat<<EOF >$tex_file   ## Print the tex file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}  %% Allow color names
\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  xleftmargin=\parindent,
  language=C++,   %% Change this to whatever you write in
  breaklines=true, %% Wrap long lines
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{Gray},
  stringstyle=\color{Black},
  keywordstyle=\bfseries\color{OliveGreen},
  identifierstyle=\color{blue},
  xleftmargin=-8em,
}        
\usepackage[colorlinks=true,linkcolor=blue]{hyperref} 
\begin{document}
\tableofcontents

EOF

find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' |                 ## Change ./foo/bar.src to foo/bar.src

while read  i; do                ## Loop through each file
    name=${i//_/\\_}             ## escape underscores
    echo "\newpage" >> $tex_file   ## start each section on a new page
    echo "\section{$i}" >> $tex_file  ## Create a section for each filename

   ## This command will include the file in the PDF
    echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . && 
pdflatex $tex_file -output-directory .  ## This needs to be run twice 
                                           ## for the TOC to be generated    

Esegui lo script nella directory che contiene i file sorgente

bash src2pdf

Questo creerà un file chiamato all.pdf nella directory corrente. Ho provato questo con un paio di file sorgente casuali che ho trovato sul mio sistema (in particolare, due file dalla fonte di vlc-2.0.0 ) e questo è uno screenshot delle prime due pagine del PDF risultante:

Un paio di commenti:

  • Lo script non funzionerà se i nomi dei file del codice sorgente contengono spazi. Dato che stiamo parlando di codice sorgente, presumo che non lo facciano.
  • Ho aggiunto ! -name "*~" per evitare file di backup.
  • Ti consiglio di utilizzare un find più specifico comando per trovare i tuoi file, altrimenti qualsiasi file casuale verrà incluso nel PDF. Se tutti i tuoi file hanno estensioni specifiche (.c e .h ad esempio), dovresti sostituire find nello script con qualcosa di simile

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • Gioca con il listings opzioni, puoi modificarlo in modo che sia esattamente come lo desideri.

(da StackOverflow)

for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt

Questo risulterà un result.txt contenente:

  • Nome file
  • separatore (---)
  • Contenuto del file .src
  • Ripeti dall'alto finché tutti i file *.src non sono stati completati

Se il tuo codice sorgente ha un'estensione diversa, basta modificarlo secondo necessità. Puoi anche modificare il bit echo per aggiungere le informazioni necessarie (magari echo "filename $1" o cambiare il separatore, o aggiungere un separatore di fine file).

il collegamento ha altri metodi, quindi usa quello che ti piace di più. Trovo che questo sia il più flessibile, anche se presenta una leggera curva di apprendimento.

Il codice funzionerà perfettamente da un terminale bash (appena testato su VirtualBox Ubuntu)

Se non ti interessa il nome del file e ti interessa solo il contenuto dei file uniti insieme:

cat *.src > result.txt

funzionerà perfettamente.

Un altro metodo suggerito era:

grep "" *.src > result.txt

Che aggiungerà il prefisso a ogni singola riga con il nome del file, che può essere utile per alcune persone, personalmente trovo troppe informazioni, quindi perché il mio primo suggerimento è il ciclo for sopra.

Ringraziamo le persone del forum di StackOverflow.

EDIT:mi sono appena reso conto che stai cercando specificamente HTML o PDF come risultato finale, alcune soluzioni che ho visto sono stampare il file di testo in PostScript e quindi convertire il postscript in PDF. Alcuni codici che ho visto:

groff -Tps result.txt > res.ps

allora

ps2pdf res.ps res.pdf 

(Richiede che tu abbia ghostscript)

Spero che questo aiuti.


So di essere mooolto in ritardo, ma qualcuno che cerca una soluzione potrebbe trovarlo utile.

Sulla base della risposta di @terdon, ho creato uno script BASH che fa il lavoro:https://github.com/eljuanchosf/source-code-to-pdf


Linux
  1. Come convertire file in codifica UTF-8 in Linux

  2. Come rimuovere tutti i file in una cartella tranne un file specifico in Linux

  3. Come eliminare tutti i file con un'estensione particolare in una cartella particolare?

  4. Come trovare tutti i file con dimensione del file zero (0) byte in una directory in modo ricorsivo

  5. Come posso trovare tutte le estensioni di file distinte in una gerarchia di cartelle?

Come modificare le autorizzazioni dei file in modo ricorsivo con chmod in Linux

Come trovare un file in Linux in tutte le directory in modo ricorsivo

Come convertire in batch file PDF su Linux

Come copiare file con estensione di file specifica in modo ricorsivo

Come posso trovare tutti i file hardlink su un filesystem?

Come posso annullare l'evidenziazione di Evince per i file PDF?