aboutsummaryrefslogtreecommitdiff
path: root/v2/src/bin/series
blob: 67123684774317d9f50318fa6563e93e1710f3dc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/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"