Weiterentwicklung

Aneamal wird aktiv weiterentwickelt. Diese Seite listet Probleme und Ideen auf, die auf Bearbeitung warten. Orientierung bieten dabei W-Fragen:

Berücksichtigt werden sollten auch die Fragen, ob es Implikationen für Sicherheit und Datenschutz hätte, ob es Kollisionen mit bestehender Syntax gibt und ob Alternativen denkbar sind.

Bekannte Probleme

Unerwünschte Liste bei Satzende am Blockanfang

Wenn wie in dem Beispiel:

Faszinierend, dass im rechtwinkligen Dreieck die Formel

$$a^2+b^2=c^2$$

gilt.

Faszinierend, dass im rechtwinkligen Dreieck die Formel

$$a^2+b^2=c^2$$

das Ende eines Satzes am Blockanfang steht („gilt.“), dann interpretiert Aneamal das als Listenpunkt. Noch schlimmer kann es kommen, wenn das Wort vor dem Endpunkt so lang ist, dass der Browser es als zu lang für eine Listennummer ansieht und stattdessen auf die nächste noch unbenutzte Nummer (im Beispiel „a.“) zurückfällt:

Ich habe es schon zuvor gesagt: Die Formel

$$a^2+b^2=c^2$$

fasziniert.

Ich habe es schon zuvor gesagt: Die Formel

$$a^2+b^2=c^2$$

Dies lässt sich mit einem Backslash verhindern, ist aber ein überraschendes, wohl kaum erwünschtes Verhalten.

Diskussion

Variablendefinition und Variablennutzung am Zeilenanfang verwechselbar

Wenn man Variablen am Zeilenanfang verwenden möchte, geht das nicht einfach mit @varname wie sonst im Fließtext, weil das zur Verwechslung mit einer Meta-Variablendefinition führt. So entsteht im folgenden Beispiel ein Fehler:

% Variablendefinition
@ author: Martin

% beabsichtigt als Variablennutzung,
% wird aber als fehlerhafte Definition interpretiert
@author wurde in Potsdam geboren.
Errors in ghost markup (/projekt/aneamal/entwicklung/index.nml: embedded file):
240: Value missing in metadata declaration for @author wurde in Potsdam geboren. (line 6, more info).

Behelfen kann man sich mit Gravis, sodass die genutzte Variable nicht mehr am Zeilenanfang steht:

@ author: Martin

`@author` wurde in Potsdam geboren.

Martin wurde in Potsdam geboren.

Code inline am Absatzanfang und Codeblock verwechselbar

Wenn man Code am Absatzanfang kennzeichnen möchte, geht das nicht einfach mit |…| wie sonst im Fließtext, weil das zur Verwechslung mit einem Codeblock führt, welcher mit | am Anfang jeder Zeile gekennzeichnet wird. Im folgenden Beispiel wird also die ganze Zeile als Codeblock interpretiert, nicht nur das erste Wort als Inline-Code:

|echo| gibt in PHP eine Zeichenkette aus

Behelfen kann man sich zum Beispiel mit Gravis, sodass kein | mehr am Absatzanfang steht:

`|echo|` gibt in PHP eine Zeichenkette aus

Sprache einer eingebundenen Datei kann vom Direktaufruf abweichen

Eine direkt im Browser angesteuerte Datei erhält ihre Sprachangabe aus @meta.nml, wenn sie nicht in der Datei selbst deklariert ist. Wird dieselbe Datei jedoch in eine andere Datei eingebunden, erbt sie ab Aneamal 29 die Sprache der einbindenden Datei.

Auch wenn dies konzeptionell suboptimal sein mag, ist das praktisch unproblematisch und sowieso immer durch eine explizite Deklaration mit @lang in der fraglichen Datei lösbar.

Vor Aneamal 29 wurde die Sprache einer eingebundenen Datei ohne Deklaration als unbekannt behandelt und in HTML markiert. Praktisch war dies insbesondere bei ja in der Regel einsprachigen Websites ungünstiger.

Geplantes

Scoped Styles

Was
ermöglichen, dass Stylesheets aus eingebundenen Dateien auch nur den eingebundenen Bereich betreffen und nicht das komplette Dokument, wohingegen Stylesheets aus dem Hauptdokument auch auf eingebundene Bereiche wirken
Wozu
einfachere Kontrolle der Darstellung, geringeres Risiko von Nebenwirkungen
Warum
weniger zerbissene Lippen und ausgerissene Haare; Verhalten von Stylesheets wäre dann analog zum Beispiel zu Metavariablen in Aneamal, die auch an eingebundene Bereiche vererbt werden, aber nicht umgekehrt, und einheitliches Verhalten senkt die Lernkurve, was wiederum zu einer größeren Nutzerzufriedenheit führt
Woher
Martin wünscht sich das quasi seit Anbeginn von Aneamal
Wann
wenn es irgendeine annehmbare Form von Browserunterstützung gibt
Wo
html.php oder im Falle einer Lösung mittels eigenem CSS-Parser eine Extradatei
Wer
Martin?
Wie
auf Browserunterstützung warten/hinwirken oder CSS parsen und automatisch umschreiben, um das Ergebnis zu simulieren, was aber einen riesigen Aufwand oder neue Abhängigkeiten mit andauernder Update-Notwendigkeit bedeutet
Weitere

Diskussion

Automatisierte Tests

Was
Tests für Aneamal-Syntax-Elemente erstellen, die automatisiert ausgeführt und ausgewertet werden
Wozu
um Fehler beim Erweitern des Aneamal-HTML-Konverters und insbesondere unbeabsichtigte Nebenwirkungen zu erkennen; um zu erkennen, ob ein zukünftig möglicher alternativer Aneamal-HTML-Konverter zu gleichen Ergebnissen kommt
Warum
eine möglichst fehlerfreie Software erhöht die Sicherheit und Zufriedenheit von Autoren
Woher
Martin
Wann
?
Wo
Das Testsystem wird nicht in Aneamal integriert, sondern ist davon weitgehend unabhängig.
Wer
Martin?
Wie
.nml-Dokumente werden manuell erstellt, vom Konverter nach HTML übersetzt und die Ausgabe einmalig manuell auf Korrektheit überprüft. Diese Ausgabe wird als statische Datei (Soll-Wert) gespeichert. Der automatische Test besteht darin, die nml-Dokumente erneut vom Konverter übersetzen zu lassen und die Ausgabe mit dem Soll-Wert zu vergleichen. Im Fall von Abweichungen wird der Unterschied gemeldet.
Weitere

Diskussion

Mögliches

Übersetzung der Fehlermeldungen

Was
die Fehlermeldungen, die Aneamal direkt in einer Website ausgibt, bzw. die verlinkten Erläuterungen zu den Fehlermeldungen in andere Sprachen als Englisch übersetzen
Wozu
höhere Verständlichkeit für Autoren
Warum
Gerade, wenn man etwas falsch gemacht hat, ist es hilfreich, verständliche Erläuterungen in der eigenen Sprache zu erhalten. Das beschleunigt die Behebung und erhöht damit die Autorenzufriedenheit.
Woher
Martin
Wann
?
Wo
Die Präferenz für eine Sprache für Fehlermeldungen könnte in aneamal-config.php hinterlegt werden. Ein Orientierung an der Sprache der bearbeiteten Seite (@lang) erscheint mir weniger sinnvoll, weil sie nicht der Muttersprache des technischen Autors entsprechen muss. In html.php Fehlermeldungen in mehreren Sprachen zu speichern, erscheint mir nicht sinnvoll – eher ein Verzeichnis /aneamal/lang/ mit einer Übersetzungsdatei pro Sprache, vgl. Wordpress.
Für die verlinkten Erläuterungen zu den Fehlermeldungen besteht bereits die Möglichkeit, in aneamal-config.php eine Adresse für Erläuterungen in anderer Sprache zu hinterlegen
Wer
technische Umsetzung Martin; aber Übersetzungen ?
Wie
eine Übersetzungsdatei als Vorlage erstellen und Leute einladen, Übersetzungen anzufertigen; diese auf aneamal.org zum Herunterladen anbieten – wenn eine solche Übersetzungsdatei im Verzeichnis /aneamal/lang/ liegt und der Sprachpräferenz in aneamal-config.php entspricht, die übersetzte Fehlermeldung statt der englischen Fehlermeldung anzeigen
Weitere
aneamal.org mehrsprachig machen

Diskussion

Heredoc-Kurzsyntax

Was
Heredocs bestehen aus einer Anweisung zum Einbinden einer Datei, in der Regel in eckigen Klammern [a-warnung] bzw. als Metaangabe @style, gefolgt von Zeilen die in der Regel alle mit einem | beginnen bzw. bei Metaangaben mit @|. Die wiederholten Zeichen am Zeilenanfang kann man per Sandwich-Markup automatisch setzen lassen, was einem Arbeit erspart. Allerdings erhält man dadurch einen zweizeiligen Start des Heredocs, zum Beispiel:
[a-warnung]
/|/⚠️

Eine einzeilige Lösung wäre wünschenswert.
Wozu
weniger Tipparbeit, mehr Übersichtlichkeit?
Warum
zur Tastenschonung und Freude von Autoren
Woher
David
Wann
?
Wo
html.php
Wer
Martin
Wie
vorzugsweise etwas wie […]/END, doch beachte die unten stehenden Anmerkungen – beim derzeitigen Konverteraufbau wäre etwas wie //…/END leichter umzusetzen
Weitere

Diskussion

Eine Syntax, die sich wie

[a-gedichtbox]/🐾
...
🐾

an das Gewohnte anlehnt, verkompliziert die Verarbeitung auf technischer Seite, wohingegen so etwas wie das Sandwich-Markup relativ einfach ist. Das hängt damit zusammen, dass Sandwich-Markup /…/… wie Kommentare % und Metadaten @ quasi überall am Zeilenanfang stehen kann, wohingegen eckige Klammern […] nur eine Sonderbedeutung haben, wenn sie am Blockanfang stehen. Daher kann Sandwich-Markup sehr früh bei der Interpretation eines Dokumentes verarbeitet werden. Die Zerlegung eines Dokumentes in Blöcke geschieht derzeit erst später. Das ist momentan zu spät für eine Tippsparsyntax, weil vorher schon Leerzeichen und Tabulatorzeichen von allen Zeilenanfängen getilgt werden. In Aneamal haben sie keine Bedeutung. In anderen Dateitypen wie zum Beispiel in Textdateien mit Quellcode der Programmiersprache Python spielen Leerzeichen aber eine entscheidende Rolle. In /2015/mehrdimensional-kuchen-schneiden/ zum Beispiel habe ich Python-Code eingebunden:

|def find (dimensions):
|    def findr (countdown, step, prod, cuts):
|        diff = step * (cuts[-1] - 1) + prod
|        if diff > 0:
|            cuts[-1] -= diff // step
|            diff %= step
|        if countdown == 1:
|            if diff == 0:
|                print (cuts)
|        else:
|            if diff == 0:
|                cuts[-1] += 1
|                diff += step
|            while cuts[-1] != findr (countdown - 1, diff, prod * (cuts[-1] + 1), cuts + [cuts[-1]]):
|                cuts[-1] += 1
|                diff += step
|        return cuts[-1]
|    if isinstance (dimensions, int) and dimensions > 0:
|        findr (dimensions, -1, 2, [1])

Die | am Anfang jeder Zeile verhindern auch, dass die Leerzeichen zur Einrückung der Befehle vom Aneamal-Konverter entfernt werden. Wenn ich hier Sandwich-Markup nutze

/|/🐾
def find (dimensions):
    def findr (countdown, step, prod, cuts):
        diff = step * (cuts[-1] - 1) + prod
        if diff > 0:
            cuts[-1] -= diff // step
            diff %= step
        if countdown == 1:
            if diff == 0:
                print (cuts)
        else:
            if diff == 0:
                cuts[-1] += 1
                diff += step
            while cuts[-1] != findr (countdown - 1, diff, prod * (cuts[-1] + 1), cuts + [cuts[-1]]):
                cuts[-1] += 1
                diff += step
        return cuts[-1]
    if isinstance (dimensions, int) and dimensions > 0:
        findr (dimensions, -1, 2, [1])
🐾

dann funktioniert das noch immer, denn das Sandwich-Markup wird ganz früh verarbeitet und in die Standardsyntax mit | an jedem Zeilenumfang umgewandelt, bevor Leerzeichen am Zeilenanfang entfernt werden. Aber die Zerlegung in Blöcke passiert erst später, sodass eine Verarbeitung von eckigen Klammern, die nur am Blockanfang eine besondere Bedeutung zur Dateieinbindung haben

[t-python]/🐾
def find (dimensions):
    def findr (countdown, step, prod, cuts):
        diff = step * (cuts[-1] - 1) + prod
        if diff > 0:
            cuts[-1] -= diff // step
            diff %= step
        if countdown == 1:
            if diff == 0:
                print (cuts)
        else:
            if diff == 0:
                cuts[-1] += 1
                diff += step
            while cuts[-1] != findr (countdown - 1, diff, prod * (cuts[-1] + 1), cuts + [cuts[-1]]):
                cuts[-1] += 1
                diff += step
        return cuts[-1]
    if isinstance (dimensions, int) and dimensions > 0:
        findr (dimensions, -1, 2, [1])
🐾

derzeit käme, wenn die Leerzeichen schon alle weg sind und der Python-Code also so aussieht:

def find (dimensions):
def findr (countdown, step, prod, cuts):
diff = step * (cuts[-1] - 1) + prod
if diff > 0:
cuts[-1] -= diff // step
diff %= step
if countdown == 1:
if diff == 0:
print (cuts)
else:
if diff == 0:
cuts[-1] += 1
diff += step
while cuts[-1] != findr (countdown - 1, diff, prod * (cuts[-1] + 1), cuts + [cuts[-1]]):
cuts[-1] += 1
diff += step
return cuts[-1]
if isinstance (dimensions, int) and dimensions > 0:
findr (dimensions, -1, 2, [1])

womit er kaputt wäre. Aber das sind technische Details, die sich grundsätzlich lösen lassen.
Klären muss ich allerdings, ob sich solche Details so lösen lassen, dass das Programm nicht
nennenswert langsamer oder komplexer wird. Das relativ frühe Entfernen der Leerzeichen vom
Zeilenanfang spart nämlich einiges an Verarbeitungsaufwand in der Folge ein.

Version ohne mod_rewrite

Was
der Aneamal-Konverter setzt derzeit Unterstützung von URL-Rewriting per mod_rewrite voraus – es soll auch eine Version ohne diese Abhängigkeit geben
Wozu
Einsatz auf Systemen ohne mod_rewrite
Warum
einen größeren Nutzerkreis gewinnen
Woher
Martin
Wann
?
Wo
?
Wer
Martin
Wie
Denkbar wäre, URLs statt domain/pfad/datei als domain/index.php/pfad/datei oder domain/?/pfad/datei anzunehmen. Denkbar wäre auch, die Dateien in der URL mit .nml-Endung aufzurufen und dafür zu sorgen, dass diese Endung mit dem Konverter verknüpft wird
Weitere
Alternativen zu .htaccess anbieten für Server, die mit Alternativen funktionieren

Diskussion

Autokorrekturen statt Fehlermeldungen

Was
Für Fälle, in denen ein Dokument nicht der Aneamal-Syntax entspricht, könnte man definieren, wie diese interpretiert werden sollen, ohne eine Fehlermeldung auszugeben. Beispielsweise könnte in einem Textabsatz bei einem einzigen *, welcher den Beginn eines hervorgehobenen Abschnitts markiert und wozu eigentlich ein weiterer * als Endmarke erwartet wird, definiert werden, dass das Ende des Absatzes dann das Ende des hervorgehobenen Abschnitts ist. Oder es könnte definiert werden, dass ein einziger * in einem Textabsatz gleich \* nur für sich selbst und nicht für einer Hervorhebung steht.
Wozu
dem Autor Korrekturzeit ersparen; das Risiko senken, dass Leser unansehnliche/peinliche Fehlermeldungen sehen
Warum
weniger Störungen ergeben eine höhere Zufriedenheit mit Aneamal
Woher
Martin
Wann
fortlaufend
Wo
html.php
Wer
Martin
Wie
undefinierte Fälle vermeiden, Kurzschreibweisen erlauben, …
Weitere

Diskussion

einfache Update-Funktion

Was
eine automatische Update-Funktion oder eine Hilfe beim Update
Wozu
damit Aneamal-HTML-Konverter im Einsatz leicht auf dem aktuellen Stand bleiben
Warum
sollte eine Sicherheitslücke gefunden werden, wäre es wichtig, diese schnell zu schließen, sodass kein Schaden entsteht; auch ansonsten ist ein komfortables Aktualisieren wichtig im Wettbewerb mit anderer Software
Woher
David, Martin
Wann
?
Wo
?
Wer
Martin, ?
Wie
?
Weitere
Möglichkeit, sich per E-Mail über Updates informieren zu lassen; Update-Möglichkeit für [x]- und [t]-Erweiterungen

Diskussion

Unwahrscheinliches

Änderung der Schreibrichtung im Text

Was
explizite Markierungen für eine geänderte oder unbekannte Schreibrichtung im Text
Wozu
um im Fall einer Mischung von Text mit unterschiedlicher Schreibrichtung wie zum Beispiel in einem Arabisch-deutschen-Wörterbuch oder bei Zitaten oder Namensnennungen immer eine korrekte Darstellung zu gewährleisten
Warum
Den Bedürfnissen anderer Kulturkreise entgegenzukommen kann den Nutzerkreis erhöhen. Es wird aber auch Leuten, die hauptsächlich in europäischen Schriftsystemen schreiben, damit erleichtert, über Themen aus anderen Regionen der Welt zu schreiben.
Woher
Martin
Wann
?
Wo
html.php
Wer
Martin
Wie
Man könnte vordefinierter Platzhalter zur Angabe der Schreibrichtung einsetzen – ich dachte zunächst an &< und &>, allerdings ist problematisch, dass diese Zeichen abhängig von der Schreibrichtung der Schrift unterschiedlich herum dargestellt werden können und daher leicht verwechselt werden. Vielleicht wäre es sinnvoll, einfach auf Unicode-Kontrollzeichen zu verweisen.
Weitere

Diskussion

Siehe auch: Verworfene Ideen zur Weiterentwicklung