Skip to content

Instantly share code, notes, and snippets.

@bct
Created February 9, 2012 22:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bct/1783919 to your computer and use it in GitHub Desktop.
Save bct/1783919 to your computer and use it in GitHub Desktop.
#!/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
print
}
}
'
}
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