GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa secara otomatis mengonversi semua file kode sumber dalam folder (secara rekursif) menjadi satu PDF dengan penyorotan sintaks?

Saya tertarik dengan pertanyaan Anda dan agak terbawa suasana. Solusi ini akan menghasilkan file PDF yang bagus dengan indeks yang dapat diklik dan kode warna yang disorot. Ini akan menemukan semua file di direktori dan subdirektori saat ini dan membuat bagian di file PDF untuk masing-masingnya (lihat catatan di bawah untuk cara membuat perintah find Anda lebih spesifik).

Anda harus menginstal yang berikut (petunjuk penginstalan adalah untuk sistem berbasis Debian tetapi ini harus tersedia di repositori distribusi Anda):

  • pdflatex , color dan listings

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

    Ini juga harus menginstal sistem LaTeX dasar jika Anda belum menginstalnya.

Setelah terinstal, gunakan skrip ini untuk membuat dokumen LaTeX dengan kode sumber Anda. Caranya adalah menggunakan listings (bagian dari texlive-latex-recommended ) dan color (dipasang oleh latex-xcolor ) paket LaTeX. \usepackage[..]{hyperref} adalah apa yang membuat cantuman di daftar isi menjadi tautan yang dapat diklik.

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

Jalankan skrip di direktori yang berisi file sumber

bash src2pdf

Itu akan membuat file bernama all.pdf di direktori saat ini. Saya mencobanya dengan beberapa file sumber acak yang saya temukan di sistem saya (khususnya, dua file dari sumber vlc-2.0.0 ) dan ini adalah tangkapan layar dari dua halaman pertama hasil PDF:

Beberapa komentar:

  • Skrip tidak akan berfungsi jika nama file kode sumber Anda berisi spasi. Karena kita berbicara tentang kode sumber, saya akan menganggap mereka tidak melakukannya.
  • Saya menambahkan ! -name "*~" untuk menghindari file cadangan.
  • Saya sarankan Anda menggunakan find yang lebih spesifik perintah untuk menemukan file Anda, jika tidak, file acak apa pun akan disertakan dalam PDF. Jika semua file Anda memiliki ekstensi tertentu (.c dan .h misalnya), Anda harus mengganti find dalam skrip dengan sesuatu seperti ini

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • Bermain-main dengan listings opsi, Anda dapat mengubah ini menjadi persis seperti yang Anda inginkan.

(dari StackOverflow)

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

Ini akan menghasilkan result.txt yang berisi:

  • Nama file
  • pemisah (---)
  • Isi file .src
  • Ulangi dari atas hingga semua file *.src selesai

Jika kode sumber Anda memiliki ekstensi yang berbeda, ubah saja seperlunya. Anda juga dapat mengedit bit gema untuk menambahkan informasi yang diperlukan (mungkin gema "nama file $1" atau mengubah pemisah, atau menambahkan pemisah akhir file).

tautan memiliki metode lain, jadi gunakan metode apa pun yang paling Anda sukai. Menurut saya yang satu ini paling fleksibel, meskipun memiliki sedikit kurva pembelajaran.

Kode akan berjalan dengan sempurna dari terminal bash (baru diuji di VirtualBox Ubuntu)

Jika Anda tidak peduli dengan nama file dan hanya peduli dengan konten file yang digabungkan:

cat *.src > result.txt

akan bekerja dengan sangat baik.

Metode lain yang disarankan adalah:

grep "" *.src > result.txt

Yang akan mengawali setiap baris dengan nama file, yang mungkin bagus untuk sebagian orang, secara pribadi saya menemukan terlalu banyak informasi, oleh karena itu mengapa saran pertama saya adalah for loop di atas.

Penghargaan untuk orang-orang di forum StackOverflow.

EDIT:Saya baru menyadari bahwa Anda secara khusus menginginkan HTML atau PDF sebagai hasil akhirnya, beberapa solusi yang saya lihat adalah mencetak file teks menjadi PostScript dan kemudian mengubah postscript menjadi PDF. Beberapa kode yang saya lihat:

groff -Tps result.txt > res.ps

lalu

ps2pdf res.ps res.pdf 

(Anda harus memiliki ghostscript)

Semoga ini bisa membantu.


Saya tahu saya sangat terlambat, tetapi seseorang yang mencari solusi mungkin menganggap ini berguna.

Berdasarkan jawaban @terdon, saya telah membuat skrip BASH yang berfungsi:https://github.com/eljuanchosf/source-code-to-pdf


Linux
  1. Cara Mengonversi File ke Encoding UTF-8 di Linux

  2. Bagaimana saya bisa menemukan semua ekstensi file yang berbeda dalam hierarki folder?

  3. Bagaimana saya bisa menyalin file secara rekursif dengan ekstensi file, mempertahankan struktur direktori?

  1. Cara Menemukan File Di Linux Di Semua Direktori Secara Rekursif

  2. Bagaimana saya bisa menemukan semua file yang di-hardlink pada sistem file?

  3. Bagaimana saya bisa melakukan bzip2 secara rekursif semua file yang tidak di-bzip?

  1. Cara Menghapus Semua File Dalam Folder Kecuali Satu File Tertentu Di Linux

  2. Bagaimana Cara Menampilkan Penyorotan Sintaks Pada File?

  3. Bagaimana Cara Menghapus Semua File Dengan Ekstensi Tertentu Di Folder Tertentu?