From 36c4c2d20510ed0006cac6799fc366cfda64ca38 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Thu, 31 Oct 2024 14:40:50 -0500 Subject: [PATCH] Replace `local` with ( functions ) That is, use functions defined with parens rather than curly-braces. --- fedi2html | 188 +++++++++++++++++++++++++++--------------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/fedi2html b/fedi2html index 80a5e58..9834412 100755 --- a/fedi2html +++ b/fedi2html @@ -70,151 +70,151 @@ fi # 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" +render_post() ( + post_data="$1" + responses_data="$2" + POST_TREE_LEVEL="$3" - local reblog="" - local acct_data="$(echo "$post_data" | jq -r .reblog.account)" + reblog="" + acct_data="$(echo "$post_data" | jq -r .reblog.account)" if test "$acct_data" = "null"; then acct_data="$(echo "$post_data" | jq -r .account)" else reblog="1" fi - local ACCOUNT_URL="$(echo "$acct_data" | jq -r .url)" - local ACCOUNT_ID="$(echo "$acct_data" | jq -r .fqn)" - local ACCOUNT_NAME="$(echo "$acct_data" | jq -r .display_name | replace_emojis "$acct_data")" - local ACCOUNT_AVATAR="$(echo "$acct_data" | jq -r .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")" + ACCOUNT_URL="$(echo "$acct_data" | jq -r .url)" + ACCOUNT_ID="$(echo "$acct_data" | jq -r .fqn)" + ACCOUNT_NAME="$(echo "$acct_data" | jq -r .display_name | replace_emojis "$acct_data")" + ACCOUNT_AVATAR="$(echo "$acct_data" | jq -r .avatar)" + POST_URL="$(echo "$post_data" | jq -r .url)" + POST_DATE="$(echo "$post_data" | jq -r .created_at)" + POST_CONTENT="$(echo "$post_data" | jq -r .content | replace_emojis "$post_data")" + POST_ATTACHMENTS="$(media_attachments "$post_data")" if test -z "$NO_RESPONSES"; then - local POST_RESPONSES="$(render_responses "$post_data" "$responses_data" "$POST_TREE_LEVEL")" + POST_RESPONSES="$(render_responses "$post_data" "$responses_data" "$POST_TREE_LEVEL")" fi 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" +render_responses() ( + post_data="$1" + responses_data="$2" + 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=" + id="$(echo "$post_data" | jq -r '.id')" + responses="$(echo "$responses_data" | grep "in_reply_to_id.*$id")" + 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. # echo ":blobcat:" | replace_emojis $post_data -replace_emojis() { - local post_data="$1" - local emojis="$(echo "$post_data" | jq -r '.emojis[]|(.url + "\t" + .shortcode)')" - local temp="$(mktemp)" - local IFS=" +replace_emojis() ( + post_data="$1" + emojis="$(echo "$post_data" | jq -r '.emojis[]|(.url + "\t" + .shortcode)')" + temp="$(mktemp)" + IFS=" " cat > "$temp" for line in $emojis; do - local EMOJI_URL="$(echo "$line" | awk -F'\t' '{print $1}')" - local EMOJI_SHORTCODE="$(echo "$line" | awk -F'\t' '{print $2}')" - local value="$(env_subst "$EMOJI_TEMPLATE")" + EMOJI_URL="$(echo "$line" | awk -F'\t' '{print $1}')" + EMOJI_SHORTCODE="$(echo "$line" | awk -F'\t' '{print $2}')" + value="$(env_subst "$EMOJI_TEMPLATE")" sed -i "s%:${EMOJI_SHORTCODE}:%${value}%g" "$temp" done cat "$temp" rm "$temp" -} +) # Given a post’s JSON data, return the appropriate HTML corresponding to its # media attachments, if any. Will return an empty string if none. # media_attachments $post_data -media_attachments() { - local post_data="$1" - local attachments="$(echo "$post_data" | jq -r '.media_attachments[]|(.type + "\t" + .url + "\t" + .description + "\t" + .preview_url)')" - local IFS=" +media_attachments() ( + post_data="$1" + attachments="$(echo "$post_data" | jq -r '.media_attachments[]|(.type + "\t" + .url + "\t" + .description + "\t" + .preview_url)')" + IFS=" " for line in $attachments; do - local ATTACH_TYPE="$(echo "$line" | awk -F'\t' '{print $1}')" - local ATTACH_URL="$(echo "$line" | awk -F'\t' '{print $2}')" - local ATTACH_DESC="$(echo "$line" | awk -F'\t' '{print $3}')" - local ATTACH_PREVIEW="$(echo "$line" | awk -F'\t' '{print $4}')" - local ATTACH_NAME="$(basename "$ATTACH_URL")" + ATTACH_TYPE="$(echo "$line" | awk -F'\t' '{print $1}')" + ATTACH_URL="$(echo "$line" | awk -F'\t' '{print $2}')" + ATTACH_DESC="$(echo "$line" | awk -F'\t' '{print $3}')" + ATTACH_PREVIEW="$(echo "$line" | awk -F'\t' '{print $4}')" + ATTACH_NAME="$(basename "$ATTACH_URL")" if test "$ATTACH_TYPE" = "image"; then env_subst "$ATTACH_IMAGE_TEMPLATE" else env_subst "$ATTACH_TEMPLATE" fi done -} +) # Pass a post’s context JSON along stdin; out comes the response_data in JSON. # fetch_post_context $url | context_to_responses -context_to_responses() { +context_to_responses() ( jq '.descendants' 2> /dev/null \ | jq 'sort_by(.created_at)' \ | maybe_jq_reverse \ | jq -cr '.[]' -} +) # 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" +statuses_api_request() ( + post_url="$1" + api_request="$2" if test -n "$api_request"; then api_request="/$api_request" fi - local id="$(url_post_id "$post_url")" - local server="$(url_server "$post_url")" + id="$(url_post_id "$post_url")" + server="$(url_server "$post_url")" curl --retry 3 --retry-delay 5 \ --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" +fetch_post_context() ( + url="$1" statuses_api_request "$url" "context" \ | context_to_responses -} +) # Given a post URL, request its JSON. # fetch_post $url -fetch_post() { - local url="$1" +fetch_post() ( + url="$1" statuses_api_request "$url" -} +) # Given a user-account URL, request JSON of its posts. # fetch_post $url -fetch_user_posts() { - local url="$1" - local server="$(url_server "$url")" - local status_url="$server/api/v1/accounts/$(url_user_id "$url")/statuses" +fetch_user_posts() ( + url="$1" + server="$(url_server "$url")" + status_url="$server/api/v1/accounts/$(url_user_id "$url")/statuses" status_url="${status_url}?exclude_reblogs=${EXCLUDE_REBLOGS}&limit=$MAX_POSTS" status_url="${status_url}&exclude_replies=${EXCLUDE_REPLIES}$TAG_FILTER" @@ -222,13 +222,13 @@ fetch_user_posts() { --location --header 'Accept: application/json,application/activity+json' \ "$status_url" \ | jq -c '.[]' -} +) # Return the ID of a user, based on its URL. # url_user_id $url -url_user_id() { - local url="$1" +url_user_id() ( + url="$1" # Pleroma-style URLs: https://jam.xwx.moe/users/Tirifto # Mastodon-style URLs: https://esperanto.masto.host/@jubiloEO if echo "$url" | grep "/users/" > /dev/null; then @@ -241,13 +241,13 @@ url_user_id() { else return 1 fi -} +) # Return the ID of a post, based on its URL. # url_post_id $url -url_post_id() { - local url="$1" +url_post_id() ( + 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 @@ -259,29 +259,29 @@ url_post_id() { else return 1 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:]]*://')" +url_server() ( + url="$1" + 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 -prep_template() { - local template="$1" +prep_template() ( + template="$1" echo "$template" \ | sed 's%\"%\\\"%g' -} +) # Rough replacement for gettext’s envsubst. Safe! @@ -291,37 +291,37 @@ prep_template() { # variables’ contents (AKA, post contents) aren’t evaluated. # env_subst $template # env_subst "$SHELL" → "/bin/sh" -env_subst() { - local template="$1" +env_subst() ( + template="$1" eval "echo \"$(prep_template "$template")\"" -} +) # Based on the environment variable $REVERSE_ORDER (whether or not user provided # the -I flag), reverse the JSON array over stdin. # This is used to enable/disable reverse-chronological order of posts. # fetch_context $url | jq '.descendants' | maybe_jq_reverse -maybe_jq_reverse() { - local input="$(cat)" +maybe_jq_reverse() ( + input="$(cat)" if test -n "$REVERSE_ORDER"; then echo "$input" \ | jq 'reverse' else echo "$input" fi -} +) # Render a user’s posts, one-by-one, taking into account cli arguments. # handle_user_url https://jam.xwx.moe/users/tirifto -handle_user_url() { - local url="$1" - local user_posts="$(fetch_user_posts "$url")" - local IFS=" +handle_user_url() ( + url="$1" + user_posts="$(fetch_user_posts "$url")" + IFS=" " echo "$user_posts" > jadedctrl.json for post in $user_posts; do - local url="$(echo "$post" | jq -r '.url')" + url="$(echo "$post" | jq -r '.url')" if test -z "$NO_RESPONSES"; then context="$(fetch_post_context "$url")" if test -n "$NO_PARENT"; then @@ -333,24 +333,24 @@ handle_user_url() { render_post "$post" "" 0 fi done -} +) # Render a post and/or its responses, taking into account cli arguments. -handle_post_url() { - local url="$1" - local post="$(fetch_post "$url")" - local context="$(fetch_post_context "$url")" +handle_post_url() ( + url="$1" + post="$(fetch_post "$url")" + context="$(fetch_post_context "$url")" if test -n "$NO_PARENT"; then render_responses "$post" "$context" 0 else render_post "$post" "$context" 0 fi -} +) -usage() { +usage() ( echo "usage: $(basename "$0") [-h] [-IRc] POST_URL" echo " $(basename "$0") [-h] [-IRcbBt] [-m MAX] USER_URL" echo @@ -396,7 +396,7 @@ usage() { echo 'See the first few lines of fedi2html for the default (example)' echo 'template values; see the README for a more detailed description' echo 'of these variables’ meanings.' -} +) TAG_FILTER=""