sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

fixlinks.sh (1408B)


      1 #!/bin/sh
      2 
      3 HEAD() { url=${1:?}
      4 	curl --connect-timeout 10 --insecure -sIL "$url"
      5 }
      6 
      7 resolve() { url=${1:?}
      8 	HEAD "$url" \
      9 	| awk -v url="$url" '
     10 		{ gsub("\r", "") }
     11 		tolower($1) == "location:" { url=$2 }
     12 		$1 ~ "^HTTP/" && $2 == "200" { print url; exit }
     13 	'
     14 }
     15 
     16 sed_escape_left() { exp=${1:?}
     17 	echo "$exp" | sed 's/[^^]/[&]/g; s/\^/\\^/'
     18 }
     19 
     20 sed_escape_right() { exp=${1:?}
     21 	echo "$exp" | sed 's/[&/]/\\&/g'
     22 }
     23 
     24 fix_url() { file=${1:?} url=${2:?}
     25 	new=$(resolve "$url")
     26 
     27 	if [ -z "$new" ]; then
     28 		echo "$url"
     29 		return 0
     30 	fi
     31 
     32 	if [ "$url" = "$new" ]; then
     33 		return 0
     34 	fi
     35 
     36 	old=$(sed_escape_left "$url")
     37 	new=$(sed_escape_right "$new")
     38 	sed -i "s/$old/$new/" "$file"
     39 }
     40 
     41 http_to_https() { file=${1:?} url=${2:?}
     42 	case "$url" in
     43 	(http://*)
     44 		old=$(sed_escape_left "$url")
     45 		new=$(sed_escape_right "https://${url#http://}")
     46 		sed -i "s/$old/$new/" "$file"
     47 		;;
     48 	esac
     49 }
     50 
     51 https_to_http() { file=${1:?} url=${2:?}
     52 	case "$url" in
     53 	(https://*)
     54 		if ! HEAD "$url" >/dev/null; then
     55 			old=$(sed_escape_left "$url")
     56 			new=$(sed_escape_right "http://${url#https://}")
     57 			sed -i "s/$old/$new/" "$file"
     58 		fi
     59 		;;
     60 	esac
     61 }
     62 
     63 fix_file() { file=${1:?}
     64 	./md-printlinks <"$file" \
     65 	| grep // \
     66 	| sed 's,^//,https://,' \
     67 	| while read url; do
     68 		case url in (*bell-labs*) continue ;; esac
     69 		http_to_https "$file" "$url"
     70 		https_to_http "$file" "$url"
     71 		fix_url "$file" "$url"
     72 	done
     73 }
     74 
     75 for file in "$@"; do
     76 	fix_file "$file"
     77 done