Aneamal-Version 27

Ein paar Monate später als geplant ist sie nun da, Version 27 des Aneamal-Übersetzers. Auf dieser Seite stelle ich ausgewählte Neuerungen vor – es gibt eine komplette Liste an anderer Stelle – und gebe einen Ausblick auf die Zukunft nach dieser größten Aktualisierung in der Aneamal-Geschichte.

Version 27 des Aneamal-Übersetzers steht zum Herunterladen bereit.

So aktualisierst du eine ältere Version

Die Aktualisierung wird allen Nutzern empfohlen. Vergewissere dich, dass PHP mindestens in der Version 7.1 auf deinem Webspace läuft. Lege eine Sicherheitskopie deines aneamal-Ordners an. Übernehme deine Einstellungen wie unten erläutert aus aneamal-config.php nach @meta.nml. Lade die folgenden vier Dateien hoch:

Nach dem erfolgreichen Update kannst du die zwei Dateien

entfernen. Sie werden nicht mehr verwendet. Übernehme bei Bedarf die auf dieser Seite beschriebenen CSS-Angaben in deine Datei @look.css.

@meta.nml statt aneamal-config.php

Der Aneamal-Übersetzer wird ab sofort nicht mehr über aneamal-config.php konfiguriert, wofür man Programmierkenntnisse benötigte und leicht etwas kaputt machen konnte. Stattdessen nimmt man jetzt per @meta.nml Einstellungen vor. Das funktioniert wie bei Metadeklaration in jeder anderen Aneamal-Datei.

aneamal-config.php hatte schon in den letzten Jahren Stück für Stück an Nutzen verloren, zum Beispiel als die supereinfache Installation von Modulen fürs Darstellen mathematischer Formeln eingeführt wurde (Ordner hochladen und schon ist man fertig) oder seit Dateien wie @header.nml und @footer.nml fürs Layout automatisch geladen wurden.

Wie du die bislang verbliebenen Einstellmöglichkeiten in aneamal-config.php ins neue Format übersetzt, erkläre ich im Folgenden.

In aneamal-config.php konnte man eine Adresse definieren, unter der sich Erläuterungen für alle möglichen Fehlermeldungen finden. Das ging so:

define ('ANEAMAL_ERROR_BASE_URI', 'https://aneamal.org/error/');

Das geht nun in @meta.nml oder jeder anderen Aneamal-Datei so:

@errormore: ->https://aneamal.org/error/

Man muss diese Angabe nicht machen. Wird @errormore nicht deklariert, verwendet der Aneamal-Übersetzer von sich aus https://aneamal.org/error/ für weiterführende Erläuterungen von Fehlern.


Bislang musste man, wenn man Aneamal nicht direkt unter der Domain betrieb, sondern nur in einem Unterverzeichnis wie http://www.fantasie-uni.example/prof-mueller/, den Pfad zum Aneamal-Root-Verzeichnis so angeben:

define ('ANEAMAL_ROOT', '/prof-mueller');

Dies entfällt komplett. Der Aneamal-Übersetzer erkennt das Verzeichnis jetzt selbst.


Bislang konnte man HTML-Code in den HTML-<head>-Bereich per aneamal-config.php so einfügen:

// this is inserted after the opening <head>-tag in the HTML-output
$custom['HEAD_START'] = '<meta name="viewport" content="width=device-width,initial-scale=1">';

// this is inserted before the closing </head>-tag in the HTML-output
$custom['HEAD_END'] = '';

In @meta.nml stehen einem viele Metaangaben zur Verfügung, von denen einige auch in den HTML-<head>-Bereich weitergegeben werden. Insbesondere lassen sich der @viewport sowie @rss und @atom-Feeds jetzt direkt deklarieren, zum Beispiel:

@atom:    ->https://prlbr.de/feed.xml
@author:    Migo
@viewport:  width=device-width,initial-scale=1

Man kann aber auch weiterhin beliebigen HTML-Code in den HTML-<head>-Bereich injizieren. Das geht mit @htmlhead so:

@htmlhead
@|<link rel="author" href="https://prlbr.de/2008/plan">
@|<!-- If you read this, send me food! -->

Statt den HTML-Code derart in die Metadeklaration einzubetten, kann man auch einen Link zu einer Datei mit HTML-Code angeben, welche vom Aneamal-Übersetzer in den HTML-<head>-Bereich eingebaut wird:

@htmlhead: ->snippet.html

Wer an alle Seitentitel beispielsweise aus markenpolitischen Gründen stets etwas anhängen will, konnte das in aneamal-config.php so:

// this is inserted before the closing </title>-tag in the HTML-output
$custom['TITLE_END'] = ' – MYSITE';

Dafür steht nun @titletail zur Verfügung und wird aus @meta.nml ebenfalls in alle Seitentitel übernommen:

@titletail: – MYSITE

Es gab die Möglichkeit, per aneamal-config.php HTML-Code in den HTML-<body>-Bereich zu injizieren:

// this is inserted after the opening <body>-tag in the HTML-output
$custom['BODY_START'] = '';

// this is inserted before the opening <main>-tag in the HTML-output
$custom['MAIN_BEFORE'] = '';

// this is inserted after the closing </main>-tag in the HTML-output
$custom['MAIN_AFTER'] = '';

// this is inserted before the closing </body>-tag in the HTML-output
$custom['BODY_END'] = '';

Dank des 2018 eingeführten automatischen Ladens der Dateien @header.nml, @aside.nml und @footer.nml ist das quasi nicht mehr nötig. In diesen Dateien kann man beliebigen HTML-Code so einbauen:

[h]
|<!-- Did you send the food already? -->

Statt den HTML-Code direkt in die jeweilige Aneamal-Datei einzubetten, kann man auch eine HTML-Datei verknüpfen. Sie wird dann vom Aneamal-Übersetzer in die Webseite integriert:

[h]->snackit.html

Nicht mehr direkt mit PHP arbeiten zu müssen, um Einstellungen vorzunehmen, ist nicht der einzige Vorteil von @meta.nml.

Genau wie auch bei anderen automatisch geladenen Datei à la @look.css und @header.nml kann man in einem Teilbereich eines Internetauftritts ganz einfach eine andere Datei @meta.nml nutzen. Jede Datei @meta.nml gilt in ihrem eigenen Verzeichnis und allen Unterverzeichnissen, sofern dort keine andere Datei @meta.nml liegt.

Bei Bedarf kann man in einzelnen Aneamal-Dateien das Verwenden der eigentlich anzuwendenden @meta.nml abschalten:

@meta: off

Alternativ kann man in einer Aneamal-Datei auch eine andere manuell verknüpfen, aus der Metadaten geladen werden sollen:

@meta: ->einstellungen.nml

Cache

Rund ums Zwischenspeichern der übersetzten Seiten und Vorschaubilder gibt es drei Verbesserungen.

Ein Vorschaubild

Gültigkeitsdauer

In der Datei .htaccess kann man bereits seit Jahren einen serverseitigen Cache aktivieren. Neben der Option

AneamalCache on

um den Cache außer bei Anfrage mit der POST-Methode zu nutzen, und

AneamalCache forced

um den Cache einschließlich bei Anfrage mit der POST-Methode zu nutzen, gibt es nun auch die Möglichkeit, eine Zahl anzugeben:

AneamalCache 86400

Diese Variante entspricht on, aber mit beschränkter Gültigkeitsdauer auf die angegebene Zahl an Sekunden. In diesem Beispiel wären das 24 Stunden. Spätestens nach dieser Zeit würde eine wieder aufgerufene Aneamal-Datei neu generiert und das Resultat wieder für bis zu 24 Stunden gespeichert.

Die zeitliche Beschränkung gilt nur für Webseiten, also übersetzte Aneamal-Dateien, nicht für Vorschaubilder.

Vorschaubilder

Während neu bearbeitete Aneamal-Dateien im Cache automatisch aktualisiert wurden und werden, galt das für Vorschaubilder – also per [j]-> generierte Versionen von Originalbildern – bislang nicht. Das ändert sich nun. Wird das Originalbild aktualisiert und eine Aneamal-Datei aufgerufen, in der das Bild mit [j]-> verknüpft ist, dann wird ein neues Vorschaubild unter einer neuen Adresse erstellt.

Zusammenarbeit mir Browser-Caches

Es gibt nicht nur den serverseitigen Cache. Auch Browser legen Webseiten clientseitig in einem Zwischenspeicher ab. Wenn ein Besucher eine Seite zum zweiten Mal besucht und sie in seinem Browser noch gespeichert ist, dann braucht sie kein zweites Mal heruntergeladen zu werden, sofern sie sich auch serverseitig in der Zwischenzeit nicht verändert hat.

Dafür wird bei aktiviertem AneamalCache nun der HTTP-Header Last-Modified gesandt, der von Browsern übertragene Header If-Modified-Since ausgewertet und ggf. mit dem HTTP-Status-Code 304 Not Modified statt der ganzen Webseite geantwortet.

Zitate im Textfluss

Die geraden Anführungszeichen "…" aus dem ASCII-Zeichensatz werden nach HTML jetzt so übersetzt: <q>…</q>. Per CSS kann ihre Darstellung variiert werden. Sinnvoll ist, die angezeigten Anführungszeichen von der Sprache des Textes abhängig zu machen. Auf dieser Seite habe ich beispielhaft folgende CSS-Angaben eingefügt:

q {quotes: '"' '"' "'" "'"}
q:lang(en) {quotes: '“' '”' '‘' '’'}
q:lang(de) {quotes: '„' '“' '‚' '‘'}
q:lang(de-ch) {quotes: '«' '»' '‹' '›'}

Ein Text in Esperanto, für den keine spezifische Darstellung vorgegeben ist, wird dementsprechend mit geraden Anführungszeichen dargestellt:

@lang: eo
"Saluton!"

Saluton!

Der englische Text wird mit typografisch bevorzugten englischen Anführungszeichen ausgegeben:

@lang: en
"Hello!"

Hello!

Der österreichische Text, ein Dialekt des Deutschen, wird mit den Anführungszeichen für die deutsche Sprache präsentiert:

@lang: de-at
"Grüß Gott!"

Grüß Gott!

Fürs Deutsch nach Schweizer Rechtschreibung werden aber andere Anführungszeichen angezeigt, wie man sie ähnlich auch im Französischen verwendet:

@lang: de-ch
"Grüezi!"

Grüezi!

Durchstreichen

Textabschnitte kann man nun durchstreichen. Sinnvoll ist das vor allem, wenn man Änderungen dokumentieren möchte. Es kann aber auch humoristischen Effekten dienen. So geht es:

+-Urbi-+ Urso et Orbi

Urbi Urso et Orbi

Listennummern als Linkziel

Listennummern werden nun auch als solche erkannt, wenn man sie mit vorgestelltem # zum Ziel für Links macht. So lassen sich Fußnoten1 als nummerierte Liste2 verwalten:

___
#1. Das ist eine Anmerkung unterhalb des Textes zu einer Textstelle.
#2. "Nummerieren" kann man man in Aneamal auch mit Buchstaben.

  1. Das ist eine Anmerkung unterhalb des Textes zu einer Textstelle.
  2. Nummerieren kann man man in Aneamal auch mit Buchstaben.

Per CSS kann man über einen Link angesteuerte Listenpunkte übrigens hervorheben:

li:target {background: yellow}

Eingerückte Stichpunkte

In Aufzählungslisten kann man Einträge mit Punkten einrücken. Leerzeichen dazwischen sind optional. Damit kann man „Unterstichpunkte“ erzeugen:

<> Banane
<> Kirsche
. <> Süßkirsche
. . <> Knupper
. <> Sauerkirsche
  • Banane
  • Kirsche
    • Süßkirsche
      • Knupper
    • Sauerkirsche

In Aneamal sind prinzipiell auch Einrückungen ohne einen „übergeordneten Eintrag“ möglich:

. . <> Sabre
. <> Odin
. . <> Romance
<> Wotan
. . <> Benno
. <> Fina
. . <> Elvira
      • Sabre
    • Odin
      • Romance
  • Wotan
      • Benno
    • Fina
      • Elvira

Beachte: In HTML sind die Listen mit geschachtelten <ul>- und <li>-Elementen implementiert. Bei diesen ist es prinzipiell unmöglich, eine Schachtelungstiefe zu überspringen. Der Aneamal-Übersetzer fügt daher bei den in Aneamal nicht angegebenen, aber in HTML nötigen, <li>-Elementen die Klasse _skip hinzu. Per CSS können diese mit

._skip {list-style-type: none}

unsichtbar gemacht werden, wie es auf dieser Seite auch gemacht wurde.

Dateien und Formelblöcke in Listen

Listen können nun nicht nur Text, sondern auch eingebettete und verknüpfte Dateien sowie Formelblöcke $$…$$ enthalten, zum Beispiel:

Auf dem Bauernhof sah ich diese Tiere:

<> [i]->huhn.jpg
<> [i]->rind.jpg
<> [i]->mensch.jpg

Dies gilt für einfache Aufzählungslisten wie im Beispiel, für nummerierte Liste, Zuordnungslisten und auch „Tabellen“ als zweidimensionale Zuordnungslisten.

Ausrichtung

Bislang konnte man einzelne Textabsätze bei Bedarf durch eine vorgestellte Markierung explizit links :.. oder zentriert .:. oder rechts ..: ausrichten. Das funktioniert nun nicht nur mit einfachen Textabsätzen, sondern mit jedem Block. Außerdem gibt es acht neue Markierungen für zusätzliche Ausrichtungen. Diese Tabelle fasst alle zusammen und gibt an, welche Klassen ihnen in HTML zugeordnet werden.

Aneamal HTML-Klassen
:.. _align _left
::. _align _mid _left
.:. _align _center
.:: _align _mid _right
..: _align _right
:.: _align _justify
: : _columns
::: _row
:. _float _port
.: _float _starboard
:: _clear

Die Klassen werden in der Regel in einem HTML-<div>-Element, bei Überschriften ausklappbarer Abschnitte im HTML-<summary>-Element gesetzt.

Welche Wirkung sie haben sollen, kannst du auf der Demoseite zur Ausrichtung sehen. Die konkrete Umsetzung allerdings liegt in der Hand dessen, der die CSS-Angaben schreibt – in der Regel in der Datei @look.css. Aneamal fügt keine CSS-Angaben für die Ausrichtung mehr direkt ins HTML-Dokument ein, da diese gegebenenfalls mit den restlichen CSS-Angaben abgestimmt sein müssen.

Die Demoseite enthält beispielhaft folgende CSS-Angaben – aber fasse das bitte nicht als ein So muss es sein oder ein Das klappt für alle Fälle auf:

._left {text-align: left}
._center {text-align: center}
._right {text-align: right}
._justify {text-align: justify}
._mid {display: table; margin: 0 auto}
._align :not(._align) {text-align: inherit}
._columns {columns: 3 14em}
._row {column-span: all}
._float {margin: 0 0 .5em 0}
._port {clear: left; float: left; margin-right: 1em}
._starboard {clear: right; float: right; margin-left: 1em}
._float figure {display: table; margin: 0}
._float img {display: block}
._float figcaption {caption-side: bottom; display: table-caption; margin-top:.5em}
._clear {clear: both}

Die Markierungen können kombiniert werden, um beispielsweise Spalten zentrierten Textes zu erhalten. Beachte, dass nach einer Markierung ein Zeilenumbruch oder anderer Leerraum folgen muss. Ansonsten wäre etwas wie :..:. mehrdeutig. Richtig ist da entweder :. .:. oder :.. :.

Klasse für einfache Textdateien

Mit [t] ohne Zusatzmodul geladene Textdateien werden nun mit einer Klasse _plain ausgegeben:

<pre class='_plain'>…</pre>

Du kannst dafür die bisher in die HTML-Ausgabe gepackte CSS-Angabe in @look.css hinterlegen:

pre._plain {white-space: pre-wrap}

Fehlermeldungen per CSS ausblenden

Fehlermeldungen dienen dazu, Autoren auf Markup-Probleme hinzuweisen und ihnen zu helfen, sie zu lösen. Dessen ungeachtet kann Fehlermeldungen auszublenden wünschenswert sein. Allgemein geht das per CSS mit ._error {display:none}. Fortan lässt sich auch nur eine bestimmte Fehlermeldung ausblenden. Möchtest du das, so nutze dazu wie im Fall der Fehlernummer 207 diese CSS-Angabe:

[class='_error _207'], ._error ._207 {display:none}

Zur Erläuterung: Fehlermeldungen werden in HTML so ausgegeben:

<div class="_error _206 _207" …>
    <b>Errors in the previous block</b> …:
    <span class="_206"><br>206: …</span>
    <span class="_207"><br>207: …</span>
</div>

Mit ._error ._207 wird darin nur die Meldung zu Fehler 207 selektiert. Fehler 206 sowie die Einleitung der Fehlermeldungen bleiben unangetastet. Das folgende Beispiel zeigt dagegen die Ausgabe zu einem isolierten Fehler 207:

<div class="_error _207" …>
    <b>Errors in the previous block</b> …:
    <span class="_207"><br>207: …</span>
</div>

Hier selektiert [class='_error _207'] die ganze Meldung inklusive Einleitung.

Mindestanforderung PHP 7.1

Mit dieser Version springt die Mindestanforderung von PHP 5.6 auf PHP 7.1. Das ist die älteste PHP-Version, die noch Sicherheitsaktualisierungen erhält. Ganz unabhängig von Aneamal ist es empfehlenswert, nicht mehr mit älteren PHP-Versionen zu arbeiten und sich damit zu gefährden. PHP 7.x läuft außerdem signifikant schneller als PHP 5.x. Dank neuer Features in PHP ist der Aneamal-Übersetzer jetzt robuster, zum Beispiel wenn ein Nutzer ein defektes Zusatzmodul installiert.

Ausblick

In den kommenden Wochen und Monaten wird die Website https://aneamal.org/ in englischer Sprache aufgebaut. Sie wird zukünftig die primäre Quelle für Aneamal, den Aneamal-Übersetzer, für Module und Weiteres sein. Hier auf prlbr.de wird es mit etwas Verzögerung noch deutschsprachige Erläuterungen geben.

Mit dem Start von aneamal.org – wo hoffentlich auch mehr Nutzer Aneamal für sich entdecken werden – wird nun Rückwärtskompatibilität in jeder vernünftigen Hinsicht zum entscheidenden Kriterium für alle Weiterentwicklungen.

Was bedeutet vernünftig? Sollten Sicherheitslücken auftauchen, werden diese selbstverständlich geschlossen und nicht bewahrt. Auch Sicherheit bleibt ein entscheidendes Kriterium. Außerdem wird der Aneamal-Übersetzer auch zukünftig mit der Entwicklung seiner Programmiersprache (PHP) mitgehen, wobei vom neuesten Übersetzer stets die älteste noch mit Sicherheitsupdates versorgte PHP-Version unterstützt wird. Wer trotzdem eine ältere PHP-Version betreiben möchte, kann natürlich auch bei einer älteren Version des Aneamal-Übersetzers bleiben.

Versionsnummern

Die aktuelle Version des Aneamal-Übersetzers hat die Nummer 27, denn es ist die 27ste Veröffentlichung. Zukünftig werden Veröffentlichungen des Aneamal-Übersetzers Versionsnummern in einer der folgenden Varianten erhalten:

  • Planmäßige Veröffentlichungen erhalten eine einzige aufsteigende Nummer. Jetzt ist es 27, die nächste Version wird 28 sein. Nutzer können anhand ihres Bedarfs für neue Funktionen entscheiden, ob sie diese Aktualisierungen mitmachen.
  • Außerplanmäßige Veröffentlichungen, die ausschließlich Sicherheitslücken schließen oder andere dringende Fehler beheben, halten sich an das Format x.y, zum Beispiel 27.1. Bei ihnen ist eine Aktualisierung empfehlenswert bis notwendig.
  • Die dritte Variante x.y.z, beispielsweise 27.0.1, kommt bei kleinen Änderungen zum Zuge. Das könnte sein, um einen peinlichen Rechtschreibfehler in der readme-Datei zu beheben. Diese Veröffentlichungen werden nicht extra verkündet. Bestehende Installationen zu aktualisieren ist bei ihnen unwichtig bis sinnlos.

Sollte eine Vorschau auf eine künftige Version bereitgestellt werden, wird dies durch einen angehängten Bindestrich und einen Bezeichner signalisiert, zum Beispiel 28-rc1. Eine solche Vorschau ist weniger weit entwickelt als die offiziell veröffentlichte Version 28 ohne Bindestrich oder bestenfalls identisch mit ihr.

Danksagung

Merci beaucoup, David. Deine Ideen und unsere fruchtbaren Gespräche haben Aneamal besser gemacht. Ich danke meinen Eltern, die mich während der Entwicklung teils beherbergten, insbesondere Christoph der mich auch bei Bauarbeiten während dieser Zeit unterstützte, und Migo für seine Geduld. Gute Genesung, Cash!