diff options
| author | Paul Buetow <paul@buetow.org> | 2023-03-12 18:04:36 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2023-03-12 18:04:36 +0200 |
| commit | 706e67ede63b3ff45707e6299c06b50e94e5ecf4 (patch) | |
| tree | ee7725cd0d295b12bc53eeede31d2ddc9cd6f7a6 /lib/atomfeed.source.sh | |
| parent | fddc47943377cb2907cedb9f9ab7cb09fce63e57 (diff) | |
make meta cache redundant
Diffstat (limited to 'lib/atomfeed.source.sh')
| -rw-r--r-- | lib/atomfeed.source.sh | 123 |
1 files changed, 51 insertions, 72 deletions
diff --git a/lib/atomfeed.source.sh b/lib/atomfeed.source.sh index 785246d..6be22a2 100644 --- a/lib/atomfeed.source.sh +++ b/lib/atomfeed.source.sh @@ -1,37 +1,3 @@ -# Retrieve meta data of a given blog post. Generate new meta info if not yet exists. -atomfeed::meta () { - local -r gmi_file_path="$1"; shift - local -r meta_file=$($SED 's|gemtext|meta|; s|.gmi$|.meta|;' <<< "$gmi_file_path") - - log VERBOSE "Generating meta info for post $gmi_file_path" - - local -r meta_dir=$(dirname "$meta_file") - if [[ ! -d "$meta_dir" ]]; then - mkdir -p "$meta_dir" - fi - - if [ ! -f "$meta_file" ]; then - # Extract first heading as post title. - local title=$($SED -n '/^# / { s/# //; p; q; }' "$gmi_file_path" | tr '"' "'") - # Extract first paragraph from Gemtext - local summary=$($SED -n '/^[A-Z]/ { p; q; }' "$gmi_file_path" | tr '"' "'") - # Extract the date from the file name. - local filename_date=$(basename "$gmi_file_path" | cut -d- -f1,2,3) - local date=$($DATE --iso-8601=seconds --date "$filename_date $($DATE +%H:%M:%S)") - - cat <<META | tee "$meta_file" -local meta_date="$date" -local meta_author="$AUTHOR" -local meta_email="$EMAIL" -local meta_title="$title" -local meta_summary="$summary. .....to read on please visit my site." -META - return - fi - - cat "$meta_file" -} - atomfeed::_from_cache () { local -r gmi_file_path="$1"; shift local -r cache_file_path="$1"; shift @@ -82,27 +48,23 @@ atomfeed::content () { # Generate an atom.xml feed file. atomfeed::generate () { local -r gemfeed_dir="$CONTENT_BASE_DIR/gemtext/gemfeed" + if [ ! -d "$gemfeed_dir" ]; then return - fi - - if [ -n "$CONTENT_FILTER" ]; then + elif [ -n "$CONTENT_FILTER" ]; then log WARN "Not generating Atom feed in filter mode" return fi local -r atom_file="$gemfeed_dir/atom.xml" - local -r now=$($DATE --iso-8601=seconds) log INFO "Generating Atom feed to $atom_file" log INFO 'This may takes a while with an empty cache....' - assert::not_empty now "$now" - cat <<ATOMHEADER > "$atom_file.tmp" <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>$now</updated> + <updated>$($DATE $DATE_FORMAT)</updated> <title>$DOMAIN feed</title> <subtitle>$SUBTITLE</subtitle> <link href="gemini://$DOMAIN/gemfeed/atom.xml" rel="self" /> @@ -111,37 +73,7 @@ atomfeed::generate () { ATOMHEADER while read -r gmi_file; do - # Load cached meta information about the post. - source <(atomfeed::meta "$gemfeed_dir/$gmi_file") - - # Get HTML content for the feed - local content="$(atomfeed::content "$gemfeed_dir/$gmi_file")" - - assert::not_empty meta_title "$meta_title" - assert::not_empty meta_date "$meta_date" - assert::not_empty meta_author "$meta_author" - assert::not_empty meta_email "$meta_email" - assert::not_empty meta_summary "$meta_summary" - assert::not_empty content "$content" - - cat <<ATOMENTRY >> "$atom_file.tmp" - <entry> - <title>$meta_title</title> - <link href="gemini://$DOMAIN/gemfeed/$gmi_file" /> - <id>gemini://$DOMAIN/gemfeed/$gmi_file</id> - <updated>$meta_date</updated> - <author> - <name>$meta_author</name> - <email>$meta_email</email> - </author> - <summary>$meta_summary</summary> - <content type="xhtml"> - <div xmlns="http://www.w3.org/1999/xhtml"> - $content - </div> - </content> - </entry> -ATOMENTRY + atomfeed::_entry "$gemfeed_dir" "$gmi_file" "$atom_file.tmp" done < <(gemfeed::get_posts | head -n $ATOM_MAX_ENTRIES) cat <<ATOMFOOTER >> "$atom_file.tmp" @@ -159,6 +91,53 @@ ATOMFOOTER fi } +atomfeed::_entry () { + local -r gemfeed_dir="$1" + local -r gmi_file="$2" + local -r tmp_atom_file="$3" + + log INFO "Generating Atom feed entry for $gmi_file" + + # Get HTML content for the feed + local content="$(atomfeed::content "$gemfeed_dir/$gmi_file")" + assert::not_empty content "$content" + + # Extract first heading as post title. + local title=$($SED -n '/^# / { s/# //; p; q; }' "$gemfeed_dir/$gmi_file" | tr '"' "'") + assert::not_empty title "$title" + + # Extract first paragraph from Gemtext as the summary. + local summary=$($SED -n '/^[A-Z]/ { p; q; }' "$gemfeed_dir/$gmi_file" | tr '"' "'") + assert::not_empty summary "$summary" + + # Extract the date from the file name. + local publishing_date=$($SED -n '/^> Published at / { s/.*Published at //; s/;.*//; p; }' "$gemfeed_dir/$gmi_file") + if [ -z "$publishing_date" ]; then + publishing_date=$($DATE $DATE_FORMAT -r "$gemfeed_dir/$gmi_file") + log WARN "No publishing date specified for $gmi_file, assuming $publishing_date" + fi + assert::not_empty publishing_date "$publishing_date" + + cat <<ATOMENTRY >> "$tmp_atom_file" + <entry> + <title>$title</title> + <link href="gemini://$DOMAIN/gemfeed/$gmi_file" /> + <id>gemini://$DOMAIN/gemfeed/$gmi_file</id> + <updated>$publishing_date</updated> + <author> + <name>$AUTHOR</name> + <email>$EMAIL</email> + </author> + <summary>$summary</summary> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + $content + </div> + </content> + </entry> +ATOMENTRY +} + atomfeed::_xmllint () { local -r atom_feed="$1" |
