xdg-sanity/xdg-sanity

134 lines
3.5 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# Copyright (c) 20222023 Emma Tebibyte <emma@tebibyte.media>
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see https://www.gnu.org/licenses/.
set -e
argv0="$0"
get_urls() {
i="0"
until ! tomcat replace.urls["$i"] "$file" >/dev/null 2>&1
do
URLS="$(printf "%s\n%s" \
"$URLS" \
"$(tomcat replace.urls["$i"] "$file")"
)"
i="$(printf "%s+1\n" "$i" | bc)"
done
}
# check if usage is valid
if test -z "$1"; then
printf "Usage: %s [resource...]\n" "$argv0" 1>&2
exit 64 # sysexits(3) EX_USAGE
fi
for dep in \
curl \
handlr
do
if ! command -v "$dep" >/dev/null 2>&1; then
printf "%s: Missing dependency: %s(1)\n" "$argv0" "$dep" 1>&2
exit 69 # sysexits(3) EX_UNAVAILABLE
fi
done
# check if we have a BROWSER
if test -z "$BROWSER"; then
printf "%s: \$BROWSER not filled.\n" "$argv0" 1>&2
exit 71 # sysexits(3) EX_OSERR
fi
while test -n "$1"; do
URL="$1"
# use curl(1) to write out the request header's content_type, strip everything
# after the first semicolon, chop off any weird whitespace remnants
MIME="$(curl -Ls -o /dev/null -w '%{content_type}' "$1" | sed 's/\;.*//' \
| xargs echo)"
# get the URL with no scheme
NO_SCHEME="$(printf "%s\n" "$URL" | sed -n 's/^h.\+\/\///p')"
# get the pattern for the extensions to MATCH
MATCH="$(printf "%s\n" "$NO_SCHEME" | sed 's/\/.*\+//g')"
# get the non-domain of the URI for tacking onto the end of replaced URIs
URI="$(printf "%s\n" "$NO_SCHEME" | sed -n 's/^[^/]*\///p')"
# only check for extensions if tomcat(1) is installed
if command -v tomcat >/dev/null 2>&1; then
# run through MIME extensions
for file in \
"$XDG_DATA_HOME"/xdg-sanity/*.mime.toml \
/usr/share/xdg-sanity/*.mime.toml \
/usr/local/share/xdg-sanity/*.mime.toml
do
if test -e "$file"; then
get_urls
for url in $URLS; do
if [ "$MATCH" = "$url" ]; then
MIME="$(tomcat with.mime "$file")"
fi
done
fi
done
# then replace extensions
for file in \
"$XDG_DATA_HOME"/xdg-sanity/*.replace.toml \
/usr/share/xdg-sanity/*.replace.toml \
/usr/local/share/xdg-sanity/*.replace.toml
do
if test -e "$file"; then
get_urls
for url in $URLS; do
if [ "$MATCH" = "$url" ]; then
URL="$(tomcat with.url "$file")$URI"
fi
done
fi
done
# and the scheme extensions
for file in \
"$XDG_DATA_HOME"/xdg-sanity/*.scheme.toml \
/usr/share/xdg-sanity/*.scheme.toml \
/usr/local/share/xdg-sanity/*.scheme.toml
do
get_urls
for url in $URLS; do
if [ "$URL" = "$url" ]; then
URL="$(tomcat with.scheme "$file")$MATCH"
fi
done
done
fi
# these commands may fail; this is intentional
if [ "$MIME" = "text/html" ]; then
"$BROWSER" "$URL"
else
handlr launch "$MIME" -- "$URL"
fi
shift
done
exit 0