knazarov.com/bin/rss.sh

126 lines
2.9 KiB
Bash
Raw Permalink Normal View History

2023-06-12 12:40:15 +00:00
#!/usr/bin/env bash
2021-09-12 16:16:30 +00:00
remove_nbsp() {
2023-06-11 17:41:26 +00:00
sed 's#\ # #g'
2021-09-12 16:16:30 +00:00
}
date_rfc_822() {
2021-09-25 15:58:42 +00:00
if [[ "$OSTYPE" == "darwin"* ]]; then
date -j '+%a, %d %b %Y %H:%M:%S %z'
else
date '+%a, %d %b %Y %H:%M:%S %z'
fi
2021-09-12 16:16:30 +00:00
}
date_to_rfc_822() {
2021-09-25 15:58:42 +00:00
if [[ "$OSTYPE" == "darwin"* ]]; then
date -f "%Y-%m-%dT%H:%M:%SZ" -j '+%a, %d %b %Y %H:%M:%S %z' "$1T00:00:00Z"
else
date '+%a, %d %b %Y %H:%M:%S %z' -d "$1T00:00:00Z"
fi
2021-09-12 16:16:30 +00:00
}
get_header() {
2023-08-19 15:29:04 +00:00
HFILE="$1"
HEADER="$2"
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
FILTER="{ \
if (match(\$0, /^$HEADER: /)) {print substr(\$0, RLENGTH+1, length(\$0) - RLENGTH)}; \
if (\$0~/^$/) {exit}; \
if (!\$0~/^[^ ]*: .*$/) {exit}; \
}"
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
awk "$FILTER" "$HFILE"
2021-09-12 16:16:30 +00:00
}
list_items() {
2023-08-19 15:29:04 +00:00
DIR="$1"
pushd "$DIR" > /dev/null
find . ! -path . -type d | while read -r FN
do
PAGE="$(echo "$FN" | sed 's/^\.\///g')"
#echo "FILE: $PAGE"
MD="$PAGE/note.md"
if [ ! -f "$MD" ]; then
echo "$MD doesn't exist"
exit 1;
fi
SUBJECT="$(get_header "$MD" "Subject")"
FDATE="$(get_header "$MD" "X-Date" | sed 's/T.*$//g')"
if [ -z "$SUBJECT" ]; then
echo "No subject in $MD"
exit 1
fi
if [ -z "$FDATE" ] && [ "$NODATE" == "0" ]; then
echo "No date in $MD"
exit 1
fi
echo "$FDATE $PAGE $SUBJECT"
done
popd > /dev/null
2021-09-12 16:16:30 +00:00
}
render_item() {
DIR="$1"
base_url="$2"
item="$3"
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
site_url="$(echo "$base_url"| sed 's#\(.*//.*\)/.*#\1#')"
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
date=$(echo "$item"|awk '{print $1}')
page=$(echo "$item"|awk '{print $2}')
2023-08-19 15:29:04 +00:00
title=$(echo "$item"| cut -d ' ' -f 3- )
2021-09-12 16:16:30 +00:00
guid="$base_url/$(echo "$page" | sed 's#^/##')"
content=$(cat $DIR/$page/note.md | ./bin/mdpage_plain.sh)
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
cat <<-EOF
<item>
<guid>$guid</guid>
<link>$guid</link>
<pubDate>$(date_to_rfc_822 "$date")</pubDate>
<title>$title</title>
<description><![CDATA[$content]]></description>
2023-08-19 15:29:04 +00:00
</item>
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
EOF
2021-09-12 16:16:30 +00:00
}
render_items() {
DIR="$1"
base_url="$2"
2021-09-12 16:16:30 +00:00
2023-08-19 15:29:04 +00:00
while read -r i
do render_item "$DIR" "$base_url" "$i"
2023-08-19 15:29:04 +00:00
done
2021-09-12 16:16:30 +00:00
}
render_feed() {
2023-08-19 15:29:04 +00:00
url="$1"
title=$(echo "$2" | remove_nbsp)
description="$3"
base_url="$(echo "$url" | cut -d '/' -f1-3)"
cat <<-EOF
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="$url" rel="self" type="application/rss+xml" />
<title>$title</title>
<description>$description</description>
<link>$base_url/</link>
<lastBuildDate>$(date_rfc_822)</lastBuildDate>
$(cat)
</channel></rss>
EOF
2021-09-12 16:16:30 +00:00
}
list_items "$1" | sort | tail -10 | render_items "$1" "$2$3" | render_feed "$2" "Konstantin Nazarov" "Konstantin Nazarov's blog"