Aufgabe: Entwicklung eines Bibliotheksmoduls zur Unterstützung deutsch- und englischsprachiger Formate für Datum und/oder Uhrzeit.
Konzeption
BearbeitenAlle Funktionen von anderem Lua-Modul aus nutzbar; soweit dazu geeignet, auch von Vorlage=#invoke
aufrufbar.
- Alle zweifelsfreien Datumsformate für den deutsch- und englischsprachigen Raum sind bei der Eingabe zu unterstützen: 15. Februar 2013; 15.2.2013; 15.02.13; 14.8.98; 2013-06-12; 3. Jänner 2012; 5 Mar 2011; December 9, 2010; 1. Apr. 2012.
- Die Ausgabe soll in einigen wesentlichen deutschsprachigen Standardformen + ISO + Wiki-Standards erfolgen.
- Mit Uhrzeit ähnlich, aber weniger Varianten möglich.
- Fehlerbehandlung für Wartungskats ist zu unterstützen.
Daten
BearbeitenEingabe
BearbeitenSiehe Diskussion
Abfangen aller
und U+00A0 und mehrfacher oder fehlender Leerzeichen bei der Eingabe. Interpretieren jedes eindeutigen Formats.
Neutrales Datenformat
BearbeitenSiehe Diskussion
Die Eingabe wird, sofern zweifelsfrei interpretiert, in eine table gewandelt. Diese kann auch direkt von anderen Lua-Modulen belegt oder für Vergleichsoperationen und Berechnungen herangezogen werden. Alle Zahlen sind ganzzahlig, wodurch sich Genauigkeiten und erforderliche Ausgabefomate schnell und sicher bestimmen lassen.
Alle Daten-Komponenten sind optional. Nicht belegte waren bei der Eingabe nicht angegeben worden.
Komponente | Typ | Bemerkung |
---|---|---|
year |
number | >0 (=0??) |
month |
number | 1–12; auch ohne year
|
dom |
number | Nur, wenn auch month
|
week |
number | Nach ISO berechnet |
hour |
number | |
min |
number | Nur, wenn auch hour
|
sec |
number | Nur, wenn auch min
|
msec |
number | Nur, wenn auch sec
|
zone |
string, number, boolean | Code (CET,CEST,MEZ) oder Anzahl der Minuten false, nil: Lokal, einschließlich Sommerzeit |
jul |
boolean | false, nil: Gregorianischer Kalender |
bc |
boolean | false, nil: n. Chr. |
leap |
boolean | false, nil: min<60
|
isValid() |
function | Die momentane Tabelle ist gültig. |
format(spec) |
function | Formatiere gemäß spec |
spec
BearbeitenMenschenfreundlicher Bezeichner für Ausgabeformat.
Bezeichner | Beispiel | #time | Bemerkung |
---|---|---|---|
T. Monat JJJJ hh:mm:ss Z nil, false |
8. Dezember 2024 23:39:23 (CEST) | j." "F Y H:i:s und Zeitzone
|
Sekunden, Minuten, Stunde nur wenn angegeben gewesen. |
dewiki
|
22:14, 12. Juni 2013 (CEST) |
|
Uhrzeit nur wenn angegeben gewesen. |
T. Monat JJJJ
|
12. Juni 2013 |
|
angegebene Uhrzeit unterdrücken |
T. Mon JJJJ
|
12. Jun. 2013 |
| |
T.Mon JJJJ
|
12. Jun. 2013 |
| |
TT.MM.JJJJ
|
12.06.2013 |
| |
T.M.JJJJ
|
12.6.2013 |
| |
ISO
|
2013-06-12 22:14:37+02:00 |
| |
ISO-T
|
2024-12-08T23:39:23+01:00 | c
| |
timestamp
|
20221030061027 |
|
{{REVISIONTIMESTAMP}} |
usw. usw. usw. |
mw.language:formatDate() kennt alle Formatierungsdetails gemäß Parser Funktion #time.
Funktionen
BearbeitenAlle Lua-zugänglich. Jede story und spec ignoriert Whitespace drumrum.
- story ist die Zeichenkette mit zu interpretierender Eingabe.
- factory( story, lethal )
- Generiere table=Objekt
- Nur Lua-intern; insbesondere Eigenbedarf
- story
- string: Parser
- false/nil: liefert leeres Objekt, →table
- table: wird um Methoden ergänzt und belegt jede freie number=0.
- lethal
- true: throws error, if anything invalid
- story
- Liefert neutrale table, oder string mit Fehlermeldung
- format( story, spec )
- auch für Vorlagen
- Rufe factory() auf und mit deren Ergebnis .format(spec)
- isValid( story, light, lethal )
- zweifelsfrei interpretierbar
- auch für Vorlagen
- light: erlaube leeren Wert
- Rufe factory() auf; true wenn diese eine table liefert und diese .isValid()
- isPretty( story, spec, light )
- interpretierbar, und abgesehen von identisch mit spec-Resultat formatiert gewesen
- auch für Vorlagen
- light: erlaube leeren Wert
- Rufe format() auf; true wenn dies identisch story liefert
- timezone( shift, local )
- Kennung für Zeitzone
- shift: string, number, nil, false
- nil, false: Server-Bezugszeit
- local:
- nil: +02:00
- false: CET/CEST
- true: MEZ/MESZ
- shift: string, number, nil, false
- Ausgabeformate; standard: +nn:mm
Parsen
Bearbeiten- nbsp usw. → Leerzeichen
- Hinten Zeitzone?
- Klammern weg, Ablegen in Feld, Entfernen aus dem string
- Erste vier Zeichen alles Ziffern?
- Wenn ja, dann Jahr allein oder ISO oder timestamp
- Wenn nicht: Buchstaben vorhanden?
- Keine Buchstaben: Am Anfang Gruppe aus drei Zahlen, durch Nicht-Ziffern getrennt.
- Buchstaben:
- Am Anfang Buchstabengruppe, danach zwei Zahlengruppen
- Zahlengruppe-Buchstabengruppe-Zahlengruppe
- Buchstabengruppe (Großschreibung des ersten Buchstaben in Kleinschreibung wandeln) in Liste der de/en-Monatsnamen und derer ersten drei Buchstaben suchen. Zugeordnete Nummer 1–12 auslesen.
- Dritte Zahlengruppe ist Jahreszahl
- Zweistellige Jahreszahl 00–20 und 50–99 akzeptieren, ggf. warnen (Millenium bug)
Zweite Ausbaustufe
Bearbeiten- Servicefunktionen für Vorlage:JULGREGDATUM + Vorlage:GREGDATUM
- Zeitdifferenz zwischen neutralen Objekten; Addition, Subtraktion, Vergleich (als Methoden)
- Gültigkeitsregeln:
- Generell: 30. Februar usw. werden als feherhaft erkannt
- Vorgegebene Kriterien, etwa:
- Nicht vor dem …
- Nicht nach dem …
- Nicht in der Zukunft
enWP
Bearbeiten- en:Module:Age
- metatable; ausschlachten
- en:Module:Duration
- Sehr mager, aber können wir auch.
- en:Module:Jewishholidays
- Schaffen wir auch noch.