#!/bin/sh # Copyright (c) 2022–2023 Emma Tebibyte # 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