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>
