Eine Nanoc Website from Scratch (Teil 2)

Nachdem wir in Teil 1 das Grundgerüst von Nanoc angesehen haben, mochte ich im heutigen Teil 2 ein paar Worte darüber verlieren, wie Nanoc arbeitet, wenn es unsere Website erstellt und ein paar der wichtigsten Begriffe einführen, mit denen wir es bei Nanoc immer wieder zu tun haben. In Teil 3 stürzen wir uns dann mitten in die Arbeit.

Items und Sources

Alle Dinge die Nanoc verarbeitet sind Items. Dabei können das durchaus sehr verschiedene Dinge sein. Da wir eine Website für einen Podcast bauen möchten sind unsere Items zum Beispiel die mp3 Dateien für die einzelnen Folgen. Jeder Text ist ein Item, jeder Blogeintrag also, jedes Bild ist ebenfalls ein Item. Nanoc kennt dabei grundsätzlich zwei verschiedene Arten von Item:

  • Binäre Items und
  • Textitems

Die letzteren sind recht einfach zu erkennen. Man kann sie in der Regel mit einem einfachen Texteditor erstellen, und sie lassen sich eben auch lesen wie Text. Darunter fallen neben ganz einfachen TXT Dateien auch so verbreitete Formate wir Markdown, oder das von mir für diesen Artikel verwendete Textile. Nanoc macht es sich recht einfach, welche Dateien es als Textitems betrachtet, man kann ihm die Dateiendungen, die es für Text halten soll ganz einfach in der Konfiguration mitteilen, die gängigsten kennt es bereits.

Alle Dateien, die nicht in dieser Konfiguration über ihre Dateiendung als Text eingetragen sind, werden automatisch von Nanoc als binäre Items betrachtet.

Wie selbstverständlich sind wir die ganze Zeit davon ausgegangen, das diese Items aus Dateien erzeugt werden. In Wirklichkeit verfügt Nanoc über das Konzept der "Datenquelle", die in der Praxis als Source bezeichnet wird. Das bedeutet, das wir für alle möglichen Dinge, wir die wir ein Ruby-Modul mit einer festgelegten Schnittstelle bauen Items erzeugen können. Das können Einträge in einer Datenbank sein, aber mit etwas Fantasie könnte man auch Suchmaschinentreffer, oder jede Frucht in seinem Obstkorb zu einem Item machen, indem man sich lediglich eine passende Umsetzung von Daten in ein Item ausdenkt.

Für unser Beispielprojekt bleiben wir aber bei Dateien. Nanoc macht es uns dadurch leicht, indem es für diesen gängigen Anwendungsfall bereits mehrere Sources mitliefert. Die beliebteste davon ist filesystem_unified

Attribute

Das besondere an der Datenquelle filesystem_unified ist, das sie nicht einfach eine Datei zu einem Item umwandelt, sondern nebenbei auch noch diesen Items Eigenschaften mitgeben kann, die in Attributen abgespeichert werden. Bei Text-Items ist das sehr einfach. Diese stammen sowieso aus einer Textdatei, da können wir die Attribute einfach an den Anfang der Datei schreiben. Für diesen Blogeintrag sehen die Attribute zum Beispiel so aus:

---
kind: article
category: meta
topic: tech
title: "Eine Nanoc Website from Scratch (Teil 2)"
created_at: 2015/12/06 13:00:00
tags: [nanoc, nachtnerd, blog, podcast]
pic: nanocworkshop.png
flattr: yes
excerpt: "Nachdem wir in Teil 1  das Grundgerüst von Nanoc angesehen haben, mochte ich im heutigen Teil 2 ein paar Worte darüber verlieren, wie Nanoc arbeitet, wenn es unsere Website erstellt und ein paar der wichtigsten Begriffe einführen, mit denen wir es bei Nanoc immer wieder zu tun haben."
---

Welche Attribute wir benutzen ist dabei völlig uns überlassen. Ich benutze für dieses Blog allerdings ein Artikelsystem, das dafür sorgt, dass die Artikel in der richtigen zeitlichen Reihenfolge auf der Website erscheinen. Dieses kümmert sich per Vereinbarung nur um Items, die @kind: article@ als Attribut haben. Die Attribute category und topic benutze ich in diesem Blog, um die Artikel ein wenig thematisch zu trennen. Im Endeffekt bestimmt sich darüber auch das kleine Icon unter dem Datum bei jedem Artikel, und es hat auch Einfluss auf das Titelbild des Artikels. Aber das habe ich mir mal selbst programmiert, von Hause aus wertet Nanoc diese Attribute nicht aus, wir werden uns aber einige Attribute ausdenken, und die auch einsetzen. Attribute sind ein guter Ort um verschiedenen Items verschiedene Eigenschaften zuzuweisen. Der Attributblock selbst wird mit einer kleinen Linie aus 3 Bindestrichen eingeleitet, und auch abgeschlossen. Unter dem abschließenden Trennstrich kommt dann der eigentliche Text.

Bei binären Items können wir natürlich nicht einfach in die Datei schreiben. Normalerweise sieht man bei Bildern oder MP3 Dateien auch keinen Klartext im Editor. Hier benötigen wir also einen anderen Weg Attribute "anzuhängen". Das unified_filesystem benutzt dazu einfach eine Datei die genau so heißt wie die Binärdatei selbst, nur mit der Dateiendung .yaml. Wenn wir also Attribute an die Datei Sendung1.mp3 anhängen wollen, dann schreiben wir die einfach in eine Textdatei namens Sendung1.yaml und alles ist gut. Sobald Nanoc aus unseren Dateien Items erzeugt hat, können wir die Attribute für jedes Item auf dem gleichen Weg lesen und schreiben, unabhängig davon, ob sie wie bei einer Textdatei unmittelbar in der Datei geschrieben wurden, oder wie bei einer Binärdatei in einer separaten YAML-Datei. Der Kopf der Textdatei hat das gleiche Format wie der Text in der separaten Datei nämlich das YAML Format. Das wichtigste in Kürze: Das Leerzeichen hinter dem Doppelpunkt ist wichtig. Auf die Details gehen wir dann später ein.

Items

Wenn aus all diesen Dateien dann Items werden, ist es für Nanoc völlig unerheblich, dass das mal Dateien waren. Konsequenterweise findet man dann in der Bezeichnung des Items auch keinen Hinweis mehr darauf. Ein typisches Item könnte zum Beispiel "Sendungen/Folge1/Titelbild" heißen. Items werden also in der Regel hierarchisch in einem Baum organisiert, und beginnen und enden immer mit einem /. Aus einem Item muss später auch nicht zwingend eine HTML Datei werden. Es kann durchaus nur intern verwendet werden, oder gar mehrfach in verschiedenen Dateien verwendet werden. So können zum Beispiel aus einer JPG Datei für die Ausgabe neben der Originaldatei noch weitere Dateien in kleineren Größen erzeugt werden. Es handelt sich aber nur um ein Item mit verschiedenen Repräsentationen.

Nachdem wir also die wichtigstem Begriffe in Nanoc (allen voran das "Item") zumindest umrissen haben, begeben wir uns in der kommenden Folge 3 unmittelbar in die Arbeit an unserer Podcast-Website.

Der Stand zum Ende dieses Teil findet sich "hier":https://github.com/andydrop/nachtnerd/tree/87caa28a1101f46a20f239c0b6d85967