GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich automatisch alle Quellcodedateien in einem Ordner (rekursiv) in ein einziges PDF mit Syntaxhervorhebung konvertieren?

Ich war fasziniert von Ihrer Frage und wurde irgendwie mitgerissen. Diese Lösung generiert eine schöne PDF-Datei mit einem anklickbaren Index und farblich hervorgehobenem Code. Es findet alle Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen und erstellt für jede Datei einen Abschnitt in der PDF-Datei (siehe die Hinweise unten, um zu erfahren, wie Sie Ihren Suchbefehl spezifischer gestalten können).

Es erfordert, dass Sie Folgendes installiert haben (die Installationsanweisungen gelten für Debian-basierte Systeme, aber diese sollten in den Repositories Ihrer Distribution verfügbar sein):

  • pdflatex , color und listings

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

    Dies sollte auch ein grundlegendes LaTeX-System installieren, falls Sie noch keines installiert haben.

Sobald diese installiert sind, verwenden Sie dieses Skript, um ein LaTeX-Dokument mit Ihrem Quellcode zu erstellen. Der Trick besteht darin, die listings zu verwenden (Teil von texlive-latex-recommended ) und color (installiert von latex-xcolor ) LaTeX-Pakete. Die \usepackage[..]{hyperref} macht die Einträge im Inhaltsverzeichnis zu anklickbaren Links.

#!/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    

Führen Sie das Skript in dem Verzeichnis aus, das die Quelldateien enthält

bash src2pdf

Dadurch wird eine Datei namens all.pdf erstellt im aktuellen Verzeichnis. Ich habe dies mit ein paar zufälligen Quelldateien versucht, die ich auf meinem System gefunden habe (insbesondere zwei Dateien aus der Quelle von vlc-2.0.0 ) und dies ist ein Screenshot der ersten beiden Seiten der resultierenden PDF-Datei:

Ein paar Kommentare:

  • Das Skript funktioniert nicht, wenn Ihre Quellcode-Dateinamen Leerzeichen enthalten. Da wir über Quellcode sprechen, gehe ich davon aus, dass dies nicht der Fall ist.
  • Ich habe ! -name "*~" hinzugefügt Sicherungsdateien zu vermeiden.
  • Ich empfehle Ihnen, einen spezifischeren find zu verwenden Befehl, um Ihre Dateien zu finden, andernfalls wird eine zufällige Datei in das PDF aufgenommen. Wenn Ihre Dateien alle bestimmte Erweiterungen haben (.c und .h zum Beispiel) sollten Sie find ersetzen im Skript mit so etwas

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • Spielen Sie mit listings herum Optionen können Sie dies genau so anpassen, wie Sie es möchten.

(von StackOverflow)

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

Dies ergibt eine result.txt mit:

  • Dateiname
  • Trennzeichen (---)
  • Inhalt der .src-Datei
  • Wiederholen Sie von oben, bis alle *.src-Dateien fertig sind

Wenn Ihr Quellcode eine andere Erweiterung hat, ändern Sie sie einfach nach Bedarf. Sie können auch das Echo-Bit bearbeiten, um notwendige Informationen hinzuzufügen (vielleicht Echo "Dateiname $1" oder das Trennzeichen ändern oder ein Dateiende-Trennzeichen hinzufügen).

Der Link hat andere Methoden, also verwenden Sie die Methode, die Ihnen am besten gefällt. Ich finde dieses hier am flexibelsten, obwohl es mit einer leichten Lernkurve einhergeht.

Der Code wird perfekt von einem Bash-Terminal ausgeführt (gerade auf einem VirtualBox Ubuntu getestet)

Wenn Sie sich nicht für den Dateinamen interessieren und sich nur für den Inhalt der zusammengeführten Dateien interessieren:

cat *.src > result.txt

wird einwandfrei funktionieren.

Eine andere vorgeschlagene Methode war:

grep "" *.src > result.txt

Dadurch wird jeder einzelnen Zeile der Dateiname vorangestellt, was für manche Leute gut sein kann. Ich persönlich finde es zu viele Informationen, weshalb mein erster Vorschlag die for-Schleife oben ist.

Vielen Dank an die Leute im StackOverflow-Forum.

BEARBEITEN:Ich habe gerade festgestellt, dass Sie als Endergebnis speziell HTML oder PDF suchen. Einige Lösungen, die ich gesehen habe, bestehen darin, die Textdatei in PostScript zu drucken und dann PostScript in PDF zu konvertieren. Einige Codes, die ich gesehen habe:

groff -Tps result.txt > res.ps

dann

ps2pdf res.ps res.pdf 

(Erfordert Ghostscript)

Hoffe das hilft.


Ich weiß, dass ich viel zu spät bin, aber jemand, der nach einer Lösung sucht, könnte dies nützlich finden.

Basierend auf der Antwort von @terdon habe ich ein BASH-Skript erstellt, das die Arbeit erledigt:https://github.com/eljuanchosf/source-code-to-pdf


Linux
  1. Wie kann ich eine einzelne Datei RSYNC?

  2. Wie kann ich Dateien rekursiv nach Dateierweiterung kopieren und dabei die Verzeichnisstruktur beibehalten?

  3. Wie finde ich alle fest verlinkten Dateien in einem Dateisystem?

  4. Wie kann ich die Evince-Hervorhebung für PDF-Dateien rückgängig machen?

  5. Wie kann ich alle leeren Dateien und Verzeichnisse in Linux rekursiv löschen?

So ändern Sie Dateiberechtigungen rekursiv mit chmod in Linux

So konvertieren Sie PDF-Dateien im Stapelbetrieb unter Linux

So kopieren Sie Dateien mit einer bestimmten Dateierweiterung rekursiv

Wie kann ich alle Dateien bearbeiten, die von find in vi in ​​Linux zurückgegeben werden?

Wie kann ich alle PDF-Dateien in einem Verzeichnis (und seinen Unterverzeichnissen) rekursiv in ein einziges Ausgabeverzeichnis kopieren?

Wie kann ich alle Dateien, die nicht gezippt sind, rekursiv bzip2?