Software Anforderungen
Die folgenden Softwarepakete sind sowohl für Windows- als auch für Linux-Systeme verfügbar und für eine vollständige, funktionierende Lösung erforderlich:
- gvim - Wird zum Exportieren von syntaktisch hervorgehobenem Quellcode nach HTML verwendet.
- moria - Farbschema zum Hervorheben der Syntax.
- wkhtmltoimage - Wird zum Konvertieren von HTML-Dokumenten in PNG-Dateien verwendet.
- gawk and sed - Textverarbeitungswerkzeuge.
- ImageMagick - Zum Zuschneiden des PNG und Hinzufügen eines Rahmens.
Allgemeine Schritte
So funktioniert die Lösung:
- Laden Sie den Quellcode in einen Editor, der Farbtupfer hinzufügen kann.
- Exportieren Sie den Quellcode als HTML-Dokument (mit eingebetteten
FONT
Tags).
- Entfernen Sie das Hintergrundattribut aus dem HTML-Dokument (um Transparenz zu ermöglichen).
- Konvertieren Sie das HTML-Dokument in eine PNG-Datei.
- Schneiden Sie den PNG-Rand.
- Fügen Sie einen kleinen 25-Pixel-Rand um das Bild ein.
- Temporäre Dateien löschen.
Das Skript generiert Bilder mit der gleichen Breite für Quelldateien, die Zeilen mit einer Länge von weniger als 80 Zeichen enthalten. Quelldateien mit Zeilen von mehr als 80 Zeichen führen zu Bildern, die so breit sind, dass die gesamte Zeile erhalten bleibt.
Installation
Installieren Sie die Komponenten an folgenden Speicherorten:
- gvim -
C:\Program Files\Vim
- moria -
C:\Program Files\Vim\vim73\colors
- wkhtmltoimage -
C:\Program Files\wkhtml
- ImageMagick -
C:\Program Files\ImageMagick
- Gawk und Sed -
C:\Program Files\GnuWin32
Hinweis: ImageMagick verfügt über ein Programm convert.exe
, das den Windows- convert
Befehl nicht ersetzen kann . Aus diesem Grund muss der vollständige Pfad zu convert.exe
in der Batch-Datei fest codiert sein (im Gegensatz zum Hinzufügen von ImageMagick zu PATH
).
Umgebungsvariablen
Setzen Sie die Umgebungsvariable PATH auf:
"C:\Program Files\Vim\vim73";"C:\Program Files\wkhtml";"C:\Program Files\GnuWin32\bin"
Batch-Datei
Führen Sie es aus mit:
src2png.bat src2png.bat
Erstellen Sie eine Stapeldatei, src2png.bat
indem Sie den folgenden Inhalt kopieren:
@ECHO OFF
SET NUMBERS=-c "set number"
IF "%2" == "" SET NUMBERS=
ECHO Converting %1 to %1.html...
gvim -e %1 -c "set nobackup" %NUMBERS% -c ":colorscheme moria" ^
-c :TOhtml -c wq -c :q
REM Remove all background-color occurrences (without being self-referential)
sed -i "s/background-color: #......; \(.*\)}$/\1 }/g" %1.html
ECHO Converting %1.html to %1.png...
wkhtmltoimage --format png --transparent --minimum-font-size 80 ^
--quality 100 --width 3600 ^
%1.html %1.png
move %1.png %1.orig.png
REM If the text file has lines that exceed 80 characters, don't crop the
REM resulting image. (The book automatically shrinks large images to fit.)
REM The 3950 is the 80 point font at 80 characters with padding for line
REM numbers.
SET LENGTH=0
FOR /F %%l IN ('gawk ^
"BEGIN {x=0} {if( length($0)>x ) x=length()} END {print x;}" %1') ^
DO (
SET LENGTH=%%l
)
SET EXTENT=-extent 3950x
IF %LENGTH% GTR 80 SET EXTENT=
REM Trim the image height, then extend the width for 80 columns, if needed.
REM The result is that all images will be resized the same amount, thus
REM making the font size the same maximum for all source listings. Source
REM files beyond the 80 character limit will be scaled as necessary.
ECHO Trimming %1.png...
"C:\programs\ImageMagick\convert.exe" -format png %1.orig.png ^
-density 150x150 ^
-background none -antialias -trim +repage ^
%EXTENT% ^
-bordercolor none -border 25 ^
%1.png
ECHO Removing old files...
IF EXIST %1.orig.png DEL /q %1.orig.png
IF EXIST %1.html DEL /q %1.html
IF EXIST sed*. DEL /q sed*.
Verbesserungen und Optimierungen sind willkommen.
Hinweis: Die neueste Version von wkhtmltoimage behandelt das Überschreiben der Hintergrundfarbe ordnungsgemäß. Somit ist die Zeile zum Entfernen des CSS für Hintergrundfarben theoretisch nicht mehr erforderlich.
wkhtmltoimage
Einstellen der Seitenbreite nicht ausreichend? Die Höhe kann nicht angegeben werden, da sie durch den Inhalt des HTML-Materials bestimmt wird. Imho-Breite ist alles, was Sie tatsächlich benötigen. Sie können die erforderliche Breite basierend auf der Anzahl der gewünschten Pixel pro Zoll berechnen.