#!/bin/sh
# Liferea/newsbeuter compatible RSS generator from gopher flat file phlog
# gopher://sdf.org/1/users/ulcer/rss
# ulcer <ulcer@sdf.org>, WTFPL, 2017

FETCH="/usr/bin/curl --retry 0 -s -L -m 8 --retry-delay 1 -N"
# FETCH="/usr/bin/wget -O - -c -t 1 -q"
LINK="gopher://sdf.org/1/users/sgilles/phlog"

# number of articles to download
count=10
# skip n lines
head_n=
# skip until regexp
head_re=
# skip after regexp
tail_re=
# links order: direct, reverse
order='reverse'
# date expression
date_re=

# feed head

cat << EOF
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
    <title>$(basename $0)</title>
    <link>${LINK}</link>
    <description>phlog feed generated from gopher://sdf.org/1/users/ulcer/rss</description>
    <ttl>1800</ttl>

EOF

# articles

${FETCH} "${LINK}" | tr -d '\r' | awk -v head_n="${head_n:-0}" -v head_re="${head_re}" \
    -v tail_re="${tail_re}" -v date_re="${date_re}" -v count="${count}" \
    -v link="${LINK}" -v author="$(basename $0)" -v fetch="${FETCH}" -- '
    BEGIN { item = 1 }
    !head_match {
        if (NR > head_n) { head_match = 1; next }
        if (head_re && $0 ~ head_re) { head_match = 1; next }
        next
    }
    /^$/ || /^i/ { next }
    tail_re && $0 ~ tail_re { exit }
    /^[01]/{
        split($0, g, "\t")
        s = substr(g[1], 2)
        p = "<item><author>" author "</author><title>" s "</title>"
        if (date_re) {
            if (match(s, date_re)) {
                s = substr(s, RSTART, RLENGTH)
                p = p "<pubDate>" s "</pubDate>"
            }
        }
        type = substr(g[1], 1, 1)
        item_link = "gopher://" g[3] ":" g[4] "/" type g[2]
        p = p "<link>" item_link "</link>"
        p = p "<description><![CDATA[<pre>"
        prefix[ item ] = p
        
        entry[ item ] = fetch " '\''" item_link "'\'' | tr -d '\''\r'\''"

        suffix[ item ] = "</pre>]]></description></item>"
        item++
    }
    # direct/reverse order entries
    END {
        if (order == "direct") {
            i = 1
            while ((item > 0) && (i < count)) {
                print prefix[ item ]
                system(entry[ item ])
                print suffix[ item ]
                item--
                i++
            }
        } else {
            i = 1
            while ((i < count) && (i <= item)) {
                print prefix[ i ]
                system(entry[ i ])
                print suffix[ i ]
                i++
            }
        }

    }
' -

# finish feed

cat << EOF
    </channel>
</rdf:RDF>
EOF

