Created
February 9, 2012 22:40
-
-
Save bct/1783919 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# | |
# action | |
# new: add new profile template (creates file if not found), then edit | |
# edit: edit file (fall back to 'new' if file not found) | |
# load: load from file | |
# once: use temporary file to edit form once | |
# (empty): if file not available, new; otherwise, load | |
# | |
action=$1 | |
. "$UZBL_UTIL_DIR/uzbl-dir.sh" | |
. "$UZBL_UTIL_DIR/editor.sh" | |
mkdir -p "$UZBL_FORMS_DIR" || exit | |
file=$UZBL_FORMS_DIR/everywhere | |
GenForm () | |
{ | |
echo 'js uzbl.formfiller.dump();' \ | |
| socat - unix-connect:"$UZBL_SOCKET" \ | |
| awk ' | |
/^formfillerstart$/ { | |
while (getline) { | |
if ( /^%!end/ ) exit | |
} | |
} | |
' | |
} | |
GetOption () | |
{ | |
DMENU_SCHEME=formfiller | |
# util/dmenu.sh doesn't handle spaces in DMENU_PROMPT. a proper fix will be | |
# tricky. | |
DMENU_PROMPT="choose_profile" | |
DMENU_LINES=4 | |
. "$UZBL_UTIL_DIR/dmenu.sh" | |
if [ $(grep -c '^!profile' "$1") -gt 1 ] | |
then sed -n 's/^!profile=//p' "$1" | $DMENU | |
else sed -n 's/^!profile=//p' "$1" | |
fi | |
} | |
ParseProfile () | |
{ | |
sed "/^>/d; /^!profile=$1$/,/^!/!d; /^!/d" | |
} | |
ParseFields () | |
{ | |
awk '/^%/ { | |
sub ( /%/, "" ) | |
gsub ( /\\/, "\\\\\\\\" ) | |
gsub ( /@/, "\\@" ) | |
gsub ( /"/, "\\\"" ) | |
split( $0, parts, /\(|\)|\{|\}/ ) | |
field = $0 | |
sub ( /[^:]*:/, "", field ) | |
if ( parts[2] ~ /^(checkbox|radio)$/ ) | |
printf( "js uzbl.formfiller.insert(\"%s\",\"%s\",\"%s\",%s);\n", | |
parts[1], parts[2], parts[3], field ) | |
else if ( parts[2] == "textarea" ) { | |
field = "" | |
while (getline) { | |
if ( /^%/ ) break | |
sub ( /^\\/, "" ) | |
# JavaScript escape | |
gsub ( /\\/, "\\\\\\\\" ) | |
gsub ( /"/, "\\\"" ) | |
# To support the possibility of the last line of the textarea | |
# not being terminated by a newline, we add the newline here. | |
# The "if (field)" is so that this does not happen in the first | |
# iteration. | |
if (field) field = field "\\n" | |
field = field $0 | |
} | |
# Uzbl escape | |
gsub ( /\\/, "\\\\\\\\", field ) | |
gsub ( /@/, "\\@", field ) | |
printf( "js uzbl.formfiller.insert(\"%s\",\"%s\",\"%s\",0);\n", | |
parts[1], parts[2], field ) | |
} | |
else | |
printf( "js uzbl.formfiller.insert(\"%s\",\"%s\",\"%s\",0);\n", | |
parts[1], parts[2], field ) | |
}' | |
} | |
New () | |
{ | |
{ echo '!profile=NAME_THIS_PROFILE' | |
GenForm | sed 's/^!/\\!/' | |
echo '!' | |
} >> "$file" | |
chmod 600 "$file" | |
$UZBL_EDITOR "$file" | |
} | |
Edit () | |
if [ -e "$file" ] | |
then $UZBL_EDITOR "$file" | |
else New | |
fi | |
Load () | |
{ | |
test -e "$file" || exit | |
option=$(GetOption "$file") | |
case $option in *[!a-zA-Z0-9_-]*) exit 1; esac | |
ParseProfile $option < "$file" \ | |
| ParseFields \ | |
> "$UZBL_FIFO" | |
} | |
Once () | |
{ | |
tmpfile=/tmp/${0##*/}-$$-tmpfile | |
trap 'rm -f "$tmpfile"' EXIT | |
GenForm > "$tmpfile" | |
chmod 600 "$tmpfile" | |
$UZBL_EDITOR "$tmpfile" | |
test -e "$tmpfile" && | |
ParseFields < "$tmpfile" \ | |
> "$UZBL_FIFO" | |
} | |
case $action in | |
new) New; Load ;; | |
edit) Edit; Load ;; | |
load) Load ;; | |
once) Once ;; | |
'') if [ -e "$file" ]; then Load; else New; Load; fi ;; | |
*) exit 1 | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment