aboutsummaryrefslogblamecommitdiff
path: root/v2/src/bin/series
blob: 67123684774317d9f50318fa6563e93e1710f3dc (plain) (tree)





































































































                                                                                         
#!/bin/sh
set -eu

usage() {
	cat <<-'EOF'
		Usage:
		  series FILENAME
		  series -h
	EOF
}

help() {
	cat <<-'EOF'
		Options:
		  -h, --help    show this message

		  FILENAME      the sentinel file to be touched


		  Enumerate and sort all items of a collection type, and notify
		  them about their '<link rel="next" ... />' and '<link rel="prev" .../>.
		  The collection type and language are inferred by FILENAME.

		  The "notifying" part is done via a "$TARGET.next" file, that
		  is, a ".next" file is created to notify "$TARGET" about which
		  item is next to it via the content of the file.  The same
		  applies for ".prev" files.


		Examples:

		  Generate the ".next" and ".prev" files for english pastebins:

		    $ index src/en/pastebin/index.series
	EOF
}


for flag in "$@"; do
	case "$flag" in
		--)
			break
			;;
		--help)
			usage
			help
			exit
			;;
		*)
			;;
	esac
done

while getopts 'h' flag; do
	case "$flag" in
		h)
			usage
			help
			exit
			;;
		*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))


. src/lib.sh

FILENAME="${1:-}"
eval "$(assert_arg "$FILENAME" 'FILENAME')"
DIR="$(dirname "$FILENAME")"


find "$DIR"/*.sortdata 2>/dev/null |
		sort -n |
		xargs cat |
		awk '
		BEGIN { split("", items) }
		{ items[NR] = $0 }
		END {
			first = 1
			last = length(items)
			for (i in items) {
				item = items[i]
				if (i != first) {
					file = item ".prev"
					prev = items[i-1]
					print prev > file
				}
				if (i != last) {
					file = item ".next"
					nextt = items[i+1]
					print nextt > file
				}
			}
		}
		'

touch "$FILENAME"