fedi2html/fedi2html.sh

126 lines
3.3 KiB
Bash
Raw Normal View History

2024-03-28 00:43:34 -05:00
#!/bin/sh
#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
# Name: fedi2html.sh
# Desc:
# Reqs:
# Date:
#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
url_id() {
local url="$1"
# Pleroma-style URLs: https://jam.xwx.moe/notice/Ac6PIZAP0ZzkMTYBBg
# Mastodon-style URLs: https://esperanto.masto.host/@minjo/111461250815264185
if echo "$url" | grep "/notice/" > /dev/null; then
echo "$url" \
| sed 's%.*/notice/%%'
else
echo "$url" \
| sed 's%.*/@[[:alnum:]]*/%%'
fi
}
url_server() {
local url="$1"
local protocol="$(echo "$url" | grep --only-matching '[[:alnum:]]*://')"
printf "$protocol"
echo "$url" \
| sed 's%^'"$protocol"'%%' \
| sed 's%/.*%%'
}
statuses_api_request() {
local post_url="$1"
local api_request="$2"
if test -n "$api_request"; then
api_request="/$api_request"
fi
local id="$(url_id "$url")"
local server="$(url_server "$url")"
curl --location --header 'Accept: application/json,application/activity+json' \
"$server/api/v1/statuses/${id}${api_request}"
}
fetch_post_context() {
local url="$1"
statuses_api_request "$url" "context"
}
fetch_post() {
local url="$1"
statuses_api_request "$url"
}
POST_TEMPLATE='
<!DOCTYPE html>
<html>
<body>
<link rel="stylesheet" href="comments.css" type="text/css">
<div id="comments">
<a class="comment-user" href="$ACCOUNT_URL">
<img class="comment-avatar" src="$ACCOUNT_AVATAR">
<strong class="comment-username">$ACCOUNT_NAME</strong>
<em class="comment-useraddress">$ACCOUNT_ID</em>
</a>
<a class="comment-address" href="$POST_URL">
<time class="comment-time" title="$POST_DATE">$(date --date=$POST_DATE)</time>
</a>
<div class="comment-body">
$POST_CONTENT
</div>
</div>
</body>
</html>
'
EMOJI_TEMPLATE='<img class="emoji" src="$EMOJI_URL" alt="$EMOJI_SHORTCODE">'
2024-03-28 00:43:34 -05:00
replace_emojis() {
local post_data="$1"
local emojis="$(echo "$post_data" | jq -r '.emojis[]|(.url + "\t" + .shortcode)')"
local temp="$(mktemp)"
local IFS="
"
cat > "$temp"
for line in $emojis; do
local EMOJI_URL="$(echo "$line" | awk '{print $1}')"
local EMOJI_SHORTCODE="$(echo "$line" | awk '{print $2}')"
local value="$(env_subst "$EMOJI_TEMPLATE")"
sed -i "s%:${EMOJI_SHORTCODE}:%${value}%g" "$temp"
done
cat "$temp"
rm "$temp"
2024-03-28 00:43:34 -05:00
}
prep_template() {
local template="$1"
echo "$template" \
| sed 's%\"%\\\"%g'
}
env_subst() {
local template="$1"
eval "echo \"$(prep_template "$template")\""
}
2024-03-28 00:43:34 -05:00
render_post() {
local post_data="$1"
local ACCOUNT_URL="$(echo "$post_data" | jq -r .account.url)"
local ACCOUNT_ID="$(echo "$post_data" | jq -r .account.fqn)"
local ACCOUNT_NAME="$(echo "$post_data" | jq -r .account.display_name | replace_emojis "$post_data")"
local ACCOUNT_AVATAR="$(echo "$post_data" | jq -r .account.avatar)"
local POST_URL="$(echo "$post_data" | jq -r .url)"
local POST_DATE="$(echo "$post_data" | jq -r .created_at)"
local POST_CONTENT="$(echo "$post_data" | jq -r .content | replace_emojis "$post_data")"
env_subst "$POST_TEMPLATE"
2024-03-28 00:43:34 -05:00
}