repos/kloeckner.com.ar

Backup of part of my webpage
Commits Files Refs README LICENSE
scripts/sync.sh (198 lines)
   1 #!/bin/bash
   2 
   3 root_folder="$(pwd)"
   4 blog_folder="blog"
   5 html_folder="blog"
   6 blog_index_file="common/blog_index.shtml"
   7 latest_uploads_file="common/latest_uploads.shtml"
   8 rss_feed_file=$root_folder/"rss.xml"   # RSS feed file
   9 blog_folders=$("$root_folder"/scripts/sort_blog_index.py "$blog_folder")
  10 index_latest_uploads_count=8
  11 blog_index_need_regen=false
  12 
  13 check_if_blog_index_needs_regen() {
  14     for i in $(ls $root_folder/$blog_folder); do
  15         if [ -d $root_folder/$blog_folder/$i ]; then
  16             last_modified=$(stat "$root_folder/$blog_folder/$i/$i.md" --format "%Y" 2>/dev/null)
  17             blog_index_file_date=$(stat "$blog_index_file" --format "%Y" 2>/dev/null)
  18 
  19             if [ -z $last_modified ] || [ -z $blog_index_file_date ] || [ "$last_modified" -gt "$blog_index_file_date" ]
  20             then
  21                 echo "     └─ $i.html is newer than $blog_index_file"
  22                 echo "+ Blog index file needs to be regenerated"
  23                 blog_index_need_regen=true
  24                 break
  25             fi
  26         fi
  27     done
  28 }
  29 
  30 # $destination_file, $entries_count=all (optional)
  31 generate_blog_index() {
  32     [ "$blog_index_need_regen" = "false" ] && \
  33         echo "     └─ Blog index file up to date" && return
  34 
  35     echo "     └─ Updating blog index"
  36     generate_blog_index_table
  37 }
  38 
  39 # $destination_file, $entries_count=all (optional)
  40 generate_blog_index_table() {
  41     [ ! -z "$1" ] && destination_file="$1" || destination_file="$root_folder/$blog_index_file"
  42     [ ! -z "$2" ] && count="$2" || count=
  43 
  44     rm -rfv "$destination_file" ||:
  45     touch "$destination_file"
  46 
  47     cat << EOF > "$destination_file"
  48     <table id="blog-index-table">
  49         <thead id="blog-index-thead">
  50         </thead>
  51         <tbody id="blog-index-tbody">
  52 EOF
  53 
  54     curr_count=1
  55     for i in ${blog_folders[@]}; do
  56         [ ! -z "$count" ] && [ "$curr_count" -gt "$count" ] && break
  57 
  58         # deprecated format
  59         # article_date=$(cat $i | grep -oP '(?<=% date: \")(.*?)(?=\")')
  60         # article_title=$(cat $i | grep -oP '(?<=% title: \")(.*?)(?=\")')
  61         article_date=$(cat $i | sed '/^%%/,/^%%/!d' | grep -oP '(?<=date: \")(.*?)(?=\")')
  62         article_title=$(cat $i | sed '/^%%/,/^%%/!d' | grep -oP '(?<=title: \")(.*?)(?=\")')
  63         [ -z "$article_title" ] || [ -z "$article_date" ] && echo "error: no metadata found on file $input" && exit 1
  64 
  65         file_name=$(echo "$i" | grep -oE '[^/]*$' | cut -d '.' -f 1)
  66 
  67         # printf "<li><b-time>%s</b-time> <a href=\"/$blog_folder/$file_name/$file_name.html\">%s</a></li>\n" \
  68         #     "${article_date}" "${article_title}" >> $root_folder/$blog_index_file
  69 
  70         # printf "<li><b-time>%s</b-time> <a href=\"/$blog_folder/$file_name/$file_name.html\">%s</a></li>\n" \
  71         #     "${article_date}" "${article_title}" >> $root_folder/$blog_index_file
  72 
  73         cat << EOF >> "$destination_file"
  74         <tr id="entry" onclick="window.location='/$blog_folder/$file_name/';">
  75             <td id="date"><a href="/$blog_folder/$file_name/">$article_date</a></td>
  76             <td id="title"><a href="/$blog_folder/$file_name/">$article_title</a></td>
  77         </tr>
  78 EOF
  79 
  80         curr_count=$((curr_count + 1))
  81     done
  82 
  83     cat << EOF >> "$destination_file"
  84     </tbody>
  85 </table>
  86 EOF
  87 }
  88 
  89 generate_latest_uploads() {
  90     [ "$blog_index_need_regen" = "false" ] && \
  91         echo "     └─ Latest uploads up to date" && return
  92 
  93     echo "     └─ Updating latest uploads file"
  94 
  95     rm -rf "$root_folder/$latest_uploads_file" ||:
  96 
  97     # head -n "$index_latest_uploads_count" "$root_folder/$blog_index_file" > "$root_folder/$latest_uploads_file"
  98     generate_blog_index_table "$root_folder/$latest_uploads_file" "$index_latest_uploads_count"
  99 }
 100 
 101 generate_rss_feed() {
 102     rm $rss_feed_file &> /dev/null
 103 
 104     cp "$root_folder"/scripts/rss_feed_top.xml $rss_feed_file
 105     printf "<lastBuildDate>%s</lastBuildDate>\n" "$(date)" >> $rss_feed_file
 106 
 107     for i in ${blog_folders[@]}; do
 108         # article_date=$(cat $i | grep -oP '(?<=<meta name="article-date" content=")(.*?)(?=")')
 109         # article_title=$(cat $i | grep -oP '(?<=<meta name="article-title" content=")(.*?)(?=")')
 110         # deprecated format
 111         # article_date=$(cat $i | grep -oP '(?<=% date: \")(.*?)(?=\")')
 112         # article_title=$(cat $i | grep -oP '(?<=% title: \")(.*?)(?=\")')
 113 
 114         article_date=$(cat $i | sed '/^%%/,/^%%/!d' | grep -oP '(?<=date: \")(.*?)(?=\")')
 115         article_title=$(cat $i | sed '/^%%/,/^%%/!d' | grep -oP '(?<=title: \")(.*?)(?=\")')
 116         [ -z "$article_title" ] || [ -z "$article_date" ] && echo "error: no metadata found on file $input" && exit 1
 117 
 118         file_name=$(echo "$i" | grep -oE '[^/]*$' | cut -d '.' -f 1)
 119 
 120         article_description="$(sed '/^%%/,/^%%/d' $root_folder/$blog_folder/$file_name/$file_name.md | md2html |\
 121             sed -E -e 's/ \(last\ update//g' -e 's/\{[^\}]*\}//g'\
 122                    -e 's/<code>|<\/code>//g' -e 's/<em>|<\/em>//g')"
 123 
 124         # Create RSS feed item
 125         echo "<item>" >> $rss_feed_file
 126         echo "<title>$article_title</title>" >> $rss_feed_file
 127         echo "<link>https://kloeckner.com.ar/blog/$file_name/$file_name.html</link>" >> $rss_feed_file
 128         echo "<description>
 129                 <htmlData>
 130                     <![CDATA[<html>$article_description</html>]]>
 131                 </htmlData>
 132             </description>" >> $rss_feed_file
 133         echo "<pubDate>$article_date</pubDate>" >> $rss_feed_file
 134         echo "$article_date"
 135         echo "</item>" >> $rss_feed_file
 136         echo "" >> $rss_feed_file
 137     done
 138 
 139     # Close the RSS feed file
 140     echo "" >> $rss_feed_file
 141     echo "</channel>" >> $rss_feed_file
 142     echo "</rss>" >> $rss_feed_file
 143 }
 144 
 145 check_rss_feed_last_build() {
 146     [ ! -e $rss_feed_file ] && echo "+ Regenerating rss feed" && generate_rss_feed && return
 147     updated=false
 148     for i in $(ls $root_folder/$blog_folder); do
 149         # if exists and it's a directory
 150         if [ -d $root_folder/$blog_folder/$i ]; then
 151             last_modified=$(stat $root_folder/$blog_folder/$i/$i.md --format "%Y")
 152             rss_file_date=$(stat $rss_feed_file --format "%Y")
 153 
 154             if [ $last_modified -gt $rss_file_date ]
 155             then
 156                 echo "     └─ $i.html is newer than $rss_feed_file"
 157                 echo "+ Regenerating rss feed"
 158                 generate_rss_feed && updated=true
 159                 break
 160             fi
 161         fi
 162     done
 163     $updated || echo "     └─ Rss feed file up to date" && echo ""
 164 }
 165 
 166 [ ! -d $root_folder ] && \
 167     echo "error: root_folder: $root_folder not found" && exit 1
 168 
 169 echo "* root_folder: $root_folder"
 170 echo "* blog_folder: $blog_folder"
 171 echo "* blog_index_file: $blog_index_file"
 172 echo "* latest_uploads_file: $latest_uploads_file"
 173 echo "* rss_feed_file: $rss_feed_file"
 174 
 175 check_if_blog_index_needs_regen
 176 case "$1" in
 177     --force-update) 
 178         echo "+ [FORCED] generate_rss_feed"; generate_rss_feed;
 179         echo "+ [FORCED] blog_index_need_regen=true"; blog_index_need_regen=true;;
 180     *) echo "+ check_rss_feed_last_build"; check_rss_feed_last_build;;
 181 esac
 182 
 183 echo "+ generate_blog_index"
 184 generate_blog_index
 185 
 186 echo "+ generate_latest_uploads"
 187 generate_latest_uploads
 188 
 189 # <table>
 190 #     <thead id="blog-index-thead">
 191 #     </thead>
 192 #     <tbody id="blog-index-tbody">
 193 #         <tr id="entry">
 194 #             <td id="date"></td>
 195 #             <td id="title"></td>
 196 #         </tr>
 197 #     </tbody>
 198 # </table>