summaryrefslogtreecommitdiff
path: root/test/script/check-toc
blob: 8e411589feb773b23c7934683d6c36778881b2d1 (plain)
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
#!/usr/bin/env bash

set -e
set -u

# This script checks that the table of contents for the supported tools is
# sorted, and that the table matches the files.

toc_start_line="$( \
    grep -m1 -n 'Integration Documentation.*|ale-integrations|' doc/ale.txt \
    | sed 's/\([0-9]*\).*/\1/' \
)"
# shellcheck disable=SC2003
toc_start_line="$(expr "$toc_start_line" + 1)"
toc_section_size="$( \
    tail -n +"$toc_start_line" doc/ale.txt \
    | grep -m1 -n '^  [0-9]\+\.' \
    | sed 's/\([0-9]*\).*/\1/' \
)"
# shellcheck disable=SC2003
toc_end_line="$(expr "$toc_start_line" + "$toc_section_size" - 2)"

toc_file="$(mktemp -t table-of-contents.XXXXXXXX)"
heading_file="$(mktemp -t headings.XXXXXXXX)"
tagged_toc_file="$(mktemp -t ale.txt.XXXXXXXX)"
sorted_toc_file="$(mktemp -t sorted-ale.txt.XXXXXXXX)"

sed -n "$toc_start_line,$toc_end_line"p doc/ale.txt \
    | sed 's/^    \( *[^.][^.]*\)\.\.*|\(..*\)|/\1, \2/' \
    > "$toc_file"

# Get all of the doc files in a natural sorted order.
doc_files="$(/bin/ls -1v doc | grep ^ale- | sed 's/^/doc\//' | paste -sd ' ' -)"

# shellcheck disable=SC2086
grep -h '\*ale-.*-options\|^[a-z].*\*ale-.*\*$' $doc_files \
    | sed 's/^/  /' \
    | sed 's/ALE Shell Integration/ALE sh Integration/' \
    | sed 's/  ALE \(.*\) Integration/\1/' \
    | sed 's/ *\*\(..*\)\*$/, \1/' \
    | tr '[:upper:]' '[:lower:]' \
    | sed 's/objective-c/objc/' \
    | sed 's/c++/cpp/' \
    > "$heading_file"

exit_code=0
in_section=0
section_index=0

# Prefix numbers to table of contents entries so that sections aren't mixed up
# with sub-sections when they are sorted.
while read -r; do
    if [[ "$REPLY" =~ ^\  ]]; then
        if ! ((in_section)); then
            let section_index='section_index + 1'
            in_section=1
        fi
    else
        if ((in_section)); then
            let section_index='section_index + 1'
            in_section=0
        fi
    fi

    echo "$section_index $REPLY" >> "$tagged_toc_file"
done < "$toc_file"

# Sort the sections and sub-sections and remove the tags.
sort -sn "$tagged_toc_file" | sed 's/[0-9][0-9]* //' > "$sorted_toc_file"

echo 'Check for bad ToC sorting:'
echo
diff -U2 "$sorted_toc_file" "$toc_file" || exit_code=$?

echo 'Check for mismatched ToC and headings:'
echo
diff -U3 "$toc_file" "$heading_file" || exit_code=$?

rm "$toc_file"
rm "$heading_file"
rm "$tagged_toc_file"
rm "$sorted_toc_file"

exit "$exit_code"