Skip to content

Commit

Permalink
added (very basic) query parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
bafto committed Nov 24, 2024
1 parent 4ef529c commit e1a7901
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 1 deletion.
103 changes: 103 additions & 0 deletions lib/stdlib/Duden/Uri.ddp
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,106 @@ Die öffentliche Funktion Uri_Zu_Text mit dem Parameter uri vom Typ Uri, gibt ei

Gib t zurück.
Und überlädt den "als" Operator.

[
TODO: Query parsing sollte in einem Duden/Http Module o.ä. sein, und nicht hier,
da die URI specification kein Query Format vorschreibt.
]

[
Ein einzelner Parameter einer Abfrage im Format "name=wert".
]
Wir nennen die öffentliche Kombination aus
dem öffentlichen Text name mit Standardwert "",
dem öffentlichen Text wert mit Standardwert "",
einen AbfragenParameter,
und erstellen sie so:
"ein AbfragenParameter <name>=<wert>",
"einem AbfragenParameter <name>=<wert>",
"ein leerer AbfragenParameter",
"einem leeren AbfragenParameter"

[
Gibt p im Format name=wert zurück.
]
Die öffentliche Funktion AbfragenParameter_als_Text mit dem Parameter p vom Typ AbfragenParameter, gibt einen Text zurück, macht:
Wenn (name von p) leer ist, gib "" zurück.
Wenn (wert von p) leer ist, gib name von p zurück.
Gib name von p verkettet mit '=' verkettet mit wert von p zurück.
Und überlädt den "als" Operator.

[
Gibt abfrage im Format "name=wert&name2=wert2..." zurück.
]
Die öffentliche Funktion AbfragenParameter_Liste_als_Text mit dem Parameter abfrage vom Typ AbfragenParameter Liste, gibt einen Text zurück, macht:
Der Text t ist "".
Für jede Zahl i von 1 bis die Länge von abfrage, mache:
Der Text p ist ((abfrage an der Stelle i) als Text).
Wenn p nicht leer ist, dann:
Füge p an t an.
Wenn i ungleich die Länge von abfrage ist, Füge '&' an t an.
Gib t zurück.
Und überlädt den "als" Operator.

[
Gibt eine Liste aller AbfragenParameter in abfrage zurück,
angenommen abfrage ist im Format "name=wert&name2=wert2..." sein (was nicht bei jeder URI der Fall ist).
]
Die öffentliche Funktion Abfragen_Parameter_Liste mit dem Parameter abfrage vom Typ Text, gibt eine AbfragenParameter Liste zurück, macht:
Wenn abfrage leer ist, gib eine leere AbfragenParameter Liste zurück.

Die AbfragenParameter Liste ergebnis ist eine Leere AbfragenParameter Liste.
Die Zahl i ist 1.
Die Zahl l ist die Länge von abfrage.
Solange i kleiner als, oder l ist, mache:
Der AbfragenParameter p ist ein leerer AbfragenParameter.

Die Zahl name_start ist i.
Erhöhe i um 1.
Solange i kleiner als, oder l ist und abfrage an der Stelle i ungleich '=' ist und abfrage an der Stelle i ungleich '&' ist, mache:
Erhöhe i um 1.

Speichere abfrage im Bereich von name_start bis (i minus 1) in name von p.

Wenn abfrage an der Stelle i gleich '&' ist, dann:
Erhöhe i um 1.
Speichere ergebnis verkettet mit p in ergebnis.
Fahre mit der Schleife fort.

Erhöhe i um 1.
Die Zahl wert_start ist i.
Solange i kleiner als, oder l ist und abfrage an der Stelle i ungleich '&' ist, mache:
Erhöhe i um 1.
Speichere abfrage im Bereich von wert_start bis (i minus 1) in wert von p.
Erhöhe i um 1.
Speichere ergebnis verkettet mit p in ergebnis.

Gib ergebnis zurück.
Und kann so benutzt werden:
"alle AbfragenParameter aus <abfrage>",
"allen AbfragenParametern aus <abfrage>"

[
Gibt den Wert des AbfragenParameters mit dem Namen name zurück
angenommen abfrage ist im Format "name=wert&name2=wert2..." sein (was nicht bei jeder URI der Fall ist).
]
Die öffentliche Funktion Abfragen_Parameter_Wert mit den Parametern abfrage und name vom Typ Text und Text, gibt einen Text zurück, macht:
Die AbfragenParameter Liste l ist alle AbfragenParameter aus abfrage.
Für jede Zahl i von 1 bis die Länge von l, mache:
Wenn (name von (l an der Stelle i)) gleich name ist, dann:
Gib (wert von (l an der Stelle i)) zurück.
Gib "" zurück.
Und kann so benutzt werden:
"den Wert des AbfragenParameters <name> aus <abfrage>"

[
Überprüft ob der Abfragen Teil einer URI einen benannten Parameter (name=) enthält,
angenommen abfrage ist im Format "name=wert&name2=wert2..." sein (was nicht bei jeder URI der Fall ist).
]
Die öffentliche Funktion Hat_Abfragen_Parameter mit den Parametern abfrage und name vom Typ Text und Text, gibt einen Wahrheitswert zurück, macht:
Die AbfragenParameter Liste l ist alle AbfragenParameter aus abfrage.
Für jede Zahl i von 1 bis die Länge von l, mache:
Wenn (name von (l an der Stelle i)) gleich name ist, gib wahr zurück.
Gib falsch zurück.
Und kann so benutzt werden:
"<abfrage> einen AbfragenParameter mit Namen <name> enthält"
20 changes: 19 additions & 1 deletion tests/testdata/stdlib/Uri/Uri.ddp
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,22 @@ Schreibe ("tel:+1-816-555-1212" als Uri).
Schreibe ("telnet://192.0.2.16:80/" als Uri).
Schreibe ("urn:oasis:names:specification:docbook:dtd:xml:4.1.2" als Uri).
Schreibe ("git://github.com/rails/rails.git" als Uri).
Schreibe ("crid://broadcaster.com/movies/BestActionMovieEver" als Uri).
Schreibe ("crid://broadcaster.com/movies/BestActionMovieEver" als Uri).

Schreibe "\nAbfragen\n" auf eine Zeile.

Schreibe ("a=b&c=d" einen AbfragenParameter mit Namen "a" enthält) auf eine Zeile.
Schreibe ("a=hi&b=bye" einen AbfragenParameter mit Namen "b" enthält) auf eine Zeile.
Schreibe ("a=b&c=d" einen AbfragenParameter mit Namen "d" enthält) auf eine Zeile.
Schreibe ("a&c=d" einen AbfragenParameter mit Namen "a" enthält) auf eine Zeile.
Schreibe ("" einen AbfragenParameter mit Namen "a" enthält) auf eine Zeile.

Schreibe ((alle AbfragenParameter aus "a=b&c=d") als Text) auf eine Zeile.
Schreibe ((alle AbfragenParameter aus "a&c=d") als Text) auf eine Zeile.
Schreibe ((alle AbfragenParameter aus "a=hi&b=bye") als Text) auf eine Zeile.
Schreibe ((alle AbfragenParameter aus "") als Text) auf eine Zeile.

Schreibe (den Wert des AbfragenParameters "a" aus "a=b&c=d") auf eine Zeile.
Schreibe (den Wert des AbfragenParameters "a" aus "a&c=d") auf eine Zeile.
Schreibe (den Wert des AbfragenParameters "a" aus "a=hi&c=d") auf eine Zeile.
Schreibe (den Wert des AbfragenParameters "a" aus "") auf eine Zeile.
16 changes: 16 additions & 0 deletions tests/testdata/stdlib/Uri/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,19 @@ telnet://192.0.2.16:80/ | telnet | | 192.0.2.16 | 80 | / | |
urn:oasis:names:specification:docbook:dtd:xml:4.1.2 | urn | | | | oasis:names:specification:docbook:dtd:xml:4.1.2 | |
git://github.com/rails/rails.git | git | | github.com | | /rails/rails.git | |
crid://broadcaster.com/movies/BestActionMovieEver | crid | | broadcaster.com | | /movies/BestActionMovieEver | |

Abfragen

wahr
wahr
falsch
wahr
falsch
a=b&c=d
a&c=d
a=hi&b=bye

b

hi

0 comments on commit e1a7901

Please sign in to comment.