Bread
In diesem Artikel will ich Bread und was dazugehört auf technischer Ebene erläutern.
Statisches HTML
Prinzipiell war ja die Idee von ben_ nicht schlecht, direkt statische HTML-Dateien zu schreiben. Ich habe das vor zirka einem Jahr schon mit Yuki versucht, aber kaum zwei Wochen durchgehalten. Das Problem war, dass ich zunächst sowohl den Blog-Index als auch den Feed von Hand schreiben musste. Das macht einfach keinen Spaß und ich bewundere ben_ dafür, dass er das über ein Jahr so durchgehalten hat. (Auch wenn bei ihm zumindest der Feed automatisch generiert wurde.)
Markdown
Was das Schreiben angeht, habe ich mich dann für Konstantins Ansatz mit Markdown als Markup-Sprache entschieden. Markdown finde ich ganz vorzüglich zum Schreiben von allen möglichen Texten, weil es dem Schreiben nicht im Weg steht. Das scheinen in den letzten Jahren auch einige andere bemerkt zu haben und so ist Markdown an allen möglichen Ecken zu finden.
Umsetzung
Ich habe Bread für Node.js geschrieben. Das hat mehrere Gründe:
- Node.js hat ein paar interessante Konzepte, die mir sofort eingeleuchtet haben, und die wirklich Sinn ergeben. Dazu vielleicht an anderer Stelle mehr.
- Node.js ist eine sehr schlanke Plattform. Da JavaScript einen kleinen Sprachkern hat, gibt es kaum unnötigen Balast.
- Node.js hat ein sehr komfortables Modulsystem. Für viele Dinge gibt es schon fertige Module, die einfach installiert und verwendet werden können. Außerdem kann man in JavaScript auf sehr einfache Weise sehr modular programmieren.
- Ich finde PHP auf Dauer ziemlich langweilig. Es ist auch immer nützlich, neues zu lernen.
Da es sich anbietet, JavaScript-Programme modular zu schreiben, besteht Bread selbst aus einigen kleineren Modulen:
Zunächst sei einmal Dive genannt. Dive macht nichts anderes, als eine Ordnerstruktur zu durchlaufen und für jede Datei, die eine bestimmte Dateiendung hat, eine Aktion auszuführen.
Darauf baut Bake auf. Bake definiert die von Dive ausgeführte Aktion so:
„Wenn die Dateiendung
.txt
ist, wandle den Text in HTML um und schreibe das Ergebnis in die zugehörige HTML-Datei.“Zusätzlich werden Zusatzinformationen wie die Schlagwörter oder das Datum vom Anfang der Textdateien gelesen und in einer Datenbank (in meinem Fall MongoDB) abgelegt.
Nachdem die Dateien alle Transformiert wurden, werden noch Index-Dateien und Tag-Seiten erstellt. Dafür wird die Datenbank verwendet. Hieraus können die benötigten Informationen auf einfache Weise bereitgestellt werden.
Sowohl für das Generieren der Artikel als auch für die anderen HTML-Dateien werden Templates mit embedded JavaScript verwendet, weil EJS die selben Prinzipien wie PHP verfolgt und ich PHP für die Template-Sprache schlechthin halte.
Das alles lässt sich mit dem Node package manager prima so zusammenklöppeln, dass man nur noch Node.js und MongoDB und installiert zu haben braucht. Dann kann man bread und alles was dazu gehört ganz bequem per Kommandozeile mit npm install -g bread
installieren.
Anschließend braucht man nur noch in das Verzeichnis zu wechseln, das die Texte enthält und dann bread
zu starten. Das Programm holt sich die benötigten Informationen zur Konfiguration aus dem Verzeichnis .conf/ und legt sofort mit dem Übersetzen los.
Hier mal beispielhaft, wie so ein Aufruf dann konkret ausschaut:
$ bread
Beginning to bake c:\Dev\Src\web\vorb.de\public.
* c:\Dev\Src\web\vorb.de\public\info\contact.html written.
* c:\Dev\Src\web\vorb.de\public\info\markdown.de.html written.
* c:\Dev\Src\web\vorb.de\public\log\blogroll.html written.
* c:\Dev\Src\web\vorb.de\public\license\mit.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\02\node-and-npm-on-debian.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\03\was-lange-waehrt.html written.
* c:\Dev\Src\web\vorb.de\public\info\index.html written.
* c:\Dev\Src\web\vorb.de\public\info\markdown.en.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\02\beginning.html written.
* c:\Dev\Src\web\vorb.de\public\log\subscription.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\03\bread.html written.
Content files written.
Beginning to write index and tag files.
* c:\Dev\Src\web\vorb.de\public\log\tag\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\feed.xml written.
* c:\Dev\Src\web\vorb.de\public\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\linux.html written.
Tag files written.
* c:\Dev\Src\web\vorb.de\public\log\tag\weblog.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\misc.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\html.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\markdown.html written.
* c:\Dev\Src\web\vorb.de\public\log\index.html written.
Index files written.
* c:\Dev\Src\web\vorb.de\public\log\tag\dev.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\cms.html written.
* c:\Dev\Src\web\vorb.de\public\log\2011\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\03\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\2011\09\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\2012\02\index.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\deutsch.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\nodejs.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\bread.html written.
* c:\Dev\Src\web\vorb.de\public\log\tag\english.html written.
Autoindex files written.
ok
Vor- und Nachteile
Natürlich bringt das System seine Vor- und Nachteile mit sich.
Vorteile
- Komfort:
- Neue Artikel lassen sich einfach und schnell schreiben. Markdown eignet sich hervorragend genau für diesen Zweck.
- Standortunabhängigkeit:
Die HTML-Dateien lassen sich eins zu eins auf einen beliebigen Webserver übertragen. Damit kann man das Blog dann auf jedem Billig-Hoster veröffentlichen, solange dieser einen FTP-Zugang anbietet. Außerdem lassen sich, wie ben_ schon vor einer Ewigkeit erkannt hat, alle Dateien prima mit Git sichern und versionieren.
Dass Node.js und MongoDB benötigt werden ist hierfür kein Problem. Die Website kann (und das wird von mir auch so betrieben) komplett auf dem Client generiert werden. Es reicht, die Resultate per FTP auf den Server zu schieben. Die MongoDB wird sowieso mit jedem Aufruf neugestartet und wird somit auch nicht auf dem Server benötigt.
- Editor der Wahl:
Web-Editoren sind Mist. Viel komfortabler lassen sich Texte mit den Tools schreiben, die man bei sich auf dem Rechner laufen lassen kann.
Da mir leider der iAwriter wegen mangelnder Unterstützung für Windows noch verwehrt bleibt, kommt aktuell Vim zum Einsatz. Damit und mit der Kommandozeile lässt sich sehr komfortabel und schnell arbeiten.
Nachteile
Nachteile sehe ich im Moment in folgenden Bereichen:
- Datenbank:
- Die Tatsache, dass ich eine Datenbank brauche, um die Inhalte so zu generieren wie ich sie brauche, stört mich. Das muss auch besser und einfacher gehen. Der Einsatz von MongoDB ist eher eine Notlösung.
- Langer Übersetzungsprozess:
- Noch läuft der gesamte Übersetzungsprozess innerhalb von – mal schnell ausprobieren – weniger als zwei Sekunden ab. Fraglich ist jedoch, wie das aussieht, wenn ich erst mal mehrere hundert oder gar tausend Artikel geschrieben habe, sieht das aber anders aus. Dafür muss ich mir noch eine Lösung einfallen lassen.
- Komplexität:
Die vielen Module (und ich habe noch ein paar wichtige ausgelassen) führen zwangsläufig zu einer selbst erschaffenen Komplexität. Teilweise ist auch der Code selbst etwas kompliziert geworden, woran Node.js mit schuld ist. Da in Node.js sämtliche I/O asynchron abläuft, benötigt man viele Closures, was schon mal zu sechs Schachtelungsebenen führen kann. Das ist suboptimal und für Laien schlecht zu verstehen.
Da ich das meiste aber selbst geschrieben habe, komme ich recht gut mit dieser Komplexität klar. Schön wäre aber, wenn ich da in Zukunft einiges vereinfachen könnte.
Was noch kommt
Ein paar Sachen habe ich vorerst noch nicht beschrieben:
- Veröffentlichen mit Git
- Kommentare und Pingbacks
Das soll aber nicht lange so bleiben. Wer nicht warten kann, kann sich auch gerne das Repository zu dieser Website auf Github anschauen.
Standing on the shoulders of giants
Wie der Blogracer steht auch Bread auf den Schultern von Giganten. Ich möchte mich bei ben_, Konstantin und Maurice sowie allen Kommentatoren auf den jeweiligen Blogs bedanken, die einige wertvolle Gedanken zu diesem Thema zusammengetragen haben.
Wer sich für die Hintergründe interessiert, wird unter anderem hier fündig:
So, jetzt muss ich mich aber mal zügeln. Das mag ja sonst keiner mehr lesen. Ich freue mich schon auf die Diskussion. Was meint ihr dazu?