#!/bin/bash # Copyright (c) 2023 Rodrigo Arias Mallo # SPDX-License-Identifier: GPL-3.0-or-later IFS= read -d '>' auth # Ignore auth IFS= read -d '>' cmd case "$cmd" in "\n" printf "Content-type: text/plain\r\n\r\n" manpage="$1" apropos="$2" if [ -z "$1" ]; then echo "Not found" exit 0 fi echo "Manual page not found: $1" if [ -n "$apropos" ]; then printf "\nRelated pages:\n" man -k "$apropos" fi } inject_css() { css=$(cat "$(dirname $(readlink -f $0))/style.css" | tr '\n' ' ') sed "s__$css\n_" } link_xrefs() { # Link references to other pages to a man:xyz link # mandoc(1) sed 's_\([^<]*\)_\1_g' | # bzip2(1) sed 's_\([^<]*\)(\([0-9][^)]*\))_\1(\2)_g' | # nroff(1) sed 's_\([^<]*\)(\([0-9][^)]*\))_\1(\2)_g' } fix_br() { # Line breaks
inside
 show duplicated breaks
  awk '/
/ {inpre=1}; inpre && / *$/ { next }; /<\/pre>/ { inpre=0 } { print }'
}

serve_manpage() {
  url="$1"
  ref="${url#"man:"}"
  # Reverse open(3) -> 3 open if given
  manpage=$(echo "$ref" | sed 's/\(.*\)(\(.*\))/\2 \1/')
  # If page not found, return 404
  if [ -z "$manpage" ]; then
    serve_404
    exit 0
  fi
  if ! man -w $manpage 2>/dev/null; then
    apropos=$(echo "$ref" | sed 's/(.*)//')
    serve_404 "$manpage" "$apropos"
  else
    printf "\n"
    printf "Content-type: text/html\r\n\r\n"
    unset MANROFFOPT
    man -Thtml $manpage | fix_br | inject_css | link_xrefs 2>&1
  fi
}

case "$url" in
  man:*) serve_manpage "$url";;
  *) serve_404;;
esac