diff --git a/package/default.nix b/package/default.nix index 2d69e77..7b922db 100644 --- a/package/default.nix +++ b/package/default.nix @@ -261,6 +261,7 @@ in { "sentinèlla" = pkgs.callPackage (./. + "/sentinèlla") {}; shellplot = pkgs.callPackage ./shellplot {}; sops = pkgs.callPackage ./sops.nix {}; + onlinepubs2man = pkgs.callPackage ./onlinepubs2man {}; pg-17-ext-hemar = buildHemarExt pkgs "17"; pg-17-ext-http = buildHttpExt pkgs "17"; pg-17-ext-smtp-client = buildSmtpExt pkgs "17"; diff --git a/package/onlinepubs2man/build-man.sh b/package/onlinepubs2man/build-man.sh new file mode 100644 index 0000000..37bc4f3 --- /dev/null +++ b/package/onlinepubs2man/build-man.sh @@ -0,0 +1,41 @@ +# Batch-convert many HTML files to man(7) pages and install locally (~/.local/share/man) + +# nix shell nixpkgs#pandoc nixpkgs#man-db nixpkgs#gzip -c sh -eu <<'SH' + +sect=7 +dest="$HOME/.local/share/man/man$sect" +build="$(mktemp -d)" +mkdir -p "$dest" "$build" + +# post-process pandoc's roff so mandb can parse NAME +# +fix_name_section() { + awk 'BEGIN { inside=0 } + $0 ~ /^\.(SS|SH) NAME$/ { $0 = ".SH NAME"; inside=1 } + inside && /\\\[em]/ { gsub(/\\\[em]/,"\\-") } + inside && /^\.RE$/ { inside=0 } + { print }' $1 +} + +# find all *.html|*.htm under current dir (recursive) +find . -type f \( -iname '*.html' -o -iname '*.htm' \) | while IFS= read -r f; do + base="$(basename "${f%.*}")" + # sanitize name: lowercase, spaces->-, strip weird chars + name="$(printf '%s' "$base" | tr '[:upper:] ' '[:lower:]-' | tr -cd 'a-z0-9.-' | tr -s '-')" + out="$build/$name.$sect" + + # convert (pandoc will take if present) + pandoc -s "$f" -f html -t man \ + -M section="$sect" \ + -M date="$(date +'%B %Y')" \ + -o "$out.tmp" + + awk -f "$build/fix.awk" "$out.tmp" >"$out" + rm -f "$out.tmp" + + gzip -9f "$out" + install -m0644 "$out.gz" "$dest/" +done + +# index once +mandb "$HOME/.local/share/man" diff --git a/package/onlinepubs2man/default.nix b/package/onlinepubs2man/default.nix new file mode 100644 index 0000000..9829745 --- /dev/null +++ b/package/onlinepubs2man/default.nix @@ -0,0 +1,18 @@ +{ symlinkJoin, writeShellApplication, pandoc, gzip, man-db }: +let + build-man = writeShellApplication { + name = "build-man"; + runtimeInputs = [ pandoc gzip man-db ]; + text = builtins.readFile ./build-man.sh; + }; + + download-html = writeShellApplication { + name = "download-html"; + runtimeInputs = [ ]; + text = builtins.readFile ./download-html.sh; + }; +in +symlinkJoin { + name = "onlinepubs2man"; + paths = [ download-html build-man ]; +} diff --git a/package/onlinepubs2man/download-html.sh b/package/onlinepubs2man/download-html.sh new file mode 100644 index 0000000..e69de29