Add a portable URI escaping function
This commit is contained in:
parent
b3ee7a9849
commit
a18262a60c
30
geminawk.sh
30
geminawk.sh
|
@ -50,6 +50,30 @@ geminawk() {
|
|||
gsub(/'\''/, "'\''\\'\'''\''", s)
|
||||
return ("'\''" s "'\''")
|
||||
}
|
||||
function uriescape(s, c) {
|
||||
split(s, uriescape_a, "")
|
||||
uriescape_cmd = "printf %s " escape(s) \
|
||||
" | od -An -tx1 | tr a-z A-Z"
|
||||
uriescape_hex = ""
|
||||
while (uriescape_cmd | getline uriescape_line)
|
||||
uriescape_hex = uriescape_hex uriescape_line
|
||||
close(uriescape_cmd)
|
||||
sub(/^[[:space:]]+/, "", uriescape_hex)
|
||||
split(uriescape_hex, uriescape_x, /[[:space:]]+/)
|
||||
s = ""
|
||||
for (uriescape_i = 1; uriescape_i in uriescape_a;
|
||||
uriescape_i++) {
|
||||
uriescape_c = uriescape_a[uriescape_i]
|
||||
if (uriescape_c ~ /[-.0-9A-Z_a-z~]/ || \
|
||||
index(c, uriescape_c) > 0)
|
||||
s = s uriescape_c
|
||||
else
|
||||
s = s "%" uriescape_x[uriescape_i]
|
||||
}
|
||||
delete uriescape_a
|
||||
delete uriescape_x
|
||||
return (s);
|
||||
}
|
||||
function command(u) {
|
||||
url = u
|
||||
sub(/^gemini:\/\//, "", url)
|
||||
|
@ -97,11 +121,9 @@ geminawk() {
|
|||
(i > 2 ? " " : "") $i
|
||||
print prompt
|
||||
getline
|
||||
vis = "printf %s "escape($0)" | vis -h"
|
||||
vis | getline
|
||||
close(vis)
|
||||
sub(/\?.*/, "", u)
|
||||
u = u "?" $0
|
||||
u = u "?" uriescape($0, \
|
||||
"!$&'\''()*+,/:;=?@")
|
||||
} else if ($1 ~ /^2/) { # OK
|
||||
while (cmd | getline)
|
||||
print
|
||||
|
|
Loading…
Reference in New Issue