diff --git a/fedi2html.sh b/fedi2html.sh index 42d3255..d2ac55b 100755 --- a/fedi2html.sh +++ b/fedi2html.sh @@ -6,66 +6,6 @@ # Date: #――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― -# Return the ID of a post, based on its URL. -# url_id $url -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 -} - - -# Return the server (including protocol) of a post, based on its URL. -# url_server $url -url_server() { - local url="$1" - local protocol="$(echo "$url" | grep --only-matching '[[:alnum:]]*://')" - printf "$protocol" - echo "$url" \ - | sed 's%^'"$protocol"'%%' \ - | sed 's%/.*%%' -} - - -# Make a request to the /api/v1/statuses/:id/$request API endpoint. -# statuses_api_request $post_url $request -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}" -} - - -# Require the context-JSON of a post, by URL. -# fetch_post_context $url -fetch_post_context() { - local url="$1" - statuses_api_request "$url" "context" -} - - -# Given a post URL, request its JSON. -# fetch_post $url -fetch_post() { - local url="$1" - statuses_api_request "$url" -} - - POST_TEMPLATE='
@@ -82,7 +22,6 @@ POST_TEMPLATE='
$POST_ATTACHMENTS
-$tree_level¤
$POST_RESPONSES
@@ -118,6 +57,48 @@ ATTACH_IMAGE_TEMPLATE=' EMOJI_TEMPLATE='$EMOJI_SHORTCODE' +# Given a note’s JSON, render it as HTML. +# The most important part of the script! +# render_post $post_data $context_data $tree_level +render_post() { + local post_data="$1" + local responses_data="$2" + local POST_TREE_LEVEL="$3" + + 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 "$(echo "$post_data" | jq -r '.account')")" + 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")" + local POST_ATTACHMENTS="$(media_attachments "$post_data")" + local POST_RESPONSES="$(render_responses "$post_data" "$responses_data" "$POST_TREE_LEVEL")" + env_subst "$POST_TEMPLATE" +} + + +# Render a post’s responses one-by-one and recursively. +# Each branch of the response tree will be rendered completely before proceeding +# to the next. +# render_responses $post_data $context_data $tree_level +render_responses() { + local post_data="$1" + local responses_data="$2" + local level="$3" + if test -z "$level"; then level=0; fi + + local id="$(echo "$post_data" | jq -r '.id')" + local responses="$(echo "$responses_data" | grep "in_reply_to_id.*$id")" + local IFS=" +" + + for response in $responses; do + render_post "$response" "$responses_data" "$(expr "$level" + 1)" + done +} + + # Accepts a string over stdin; it will replace all emoji shortcodes along stdin # input with appropriate HTML, based on $EMOJI_TEMPLATE, and based on # a post’s JSON. @@ -164,6 +145,66 @@ media_attachments() { } +# Make a request to the /api/v1/statuses/:id/$request API endpoint. +# statuses_api_request $post_url $request +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}" +} + + +# Require the context-JSON of a post, by URL. +# fetch_post_context $url +fetch_post_context() { + local url="$1" + statuses_api_request "$url" "context" +} + + +# Given a post URL, request its JSON. +# fetch_post $url +fetch_post() { + local url="$1" + statuses_api_request "$url" +} + + +# Return the ID of a post, based on its URL. +# url_id $url +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 +} + + +# Return the server (including protocol) of a post, based on its URL. +# url_server $url +url_server() { + local url="$1" + local protocol="$(echo "$url" | grep --only-matching '[[:alnum:]]*://')" + printf "$protocol" + echo "$url" \ + | sed 's%^'"$protocol"'%%' \ + | sed 's%/.*%%' +} + + # Sanitize a template-string. # AKA, escape quotation-marks. # prep_template $template @@ -187,45 +228,3 @@ env_subst() { } -# Given a note’s JSON, render it as HTML. -# The most important part of the script! -# render_post $post_data $context_data $tree_level -render_post() { - local post_data="$1" - local context_data="$2" - local POST_TREE_LEVEL="$3" - - 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 "$(echo "$post_data" | jq -r '.account')")" - 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")" - local POST_ATTACHMENTS="$(media_attachments "$post_data")" - local POST_RESPONSES="$(render_context "$post_data" "$context_data" "$tree_level")" - env_subst "$POST_TEMPLATE" -} - - -# Render a post’s responses one-by-one and recursively. -# Each branch of the response tree will be rendered completely before proceeding -# to the next. -# render_context $post_data $context_data $tree_level -render_context() { - - local post_data="$1" - local context_data="$2" - local level="$3" - if test -z "$level"; then level=0; fi - - local id="$(echo "$post_data" | jq -r '.id')" - local responses="$(echo "$context_data" | jq -cr '.descendants[]' | grep "in_reply_to_id.*$id")" - local IFS=" -" - - for response in $responses; do - render_post "$response" "$context_data" "$(expr "$level" + 1)" - done -} -