generate.sh (6482B)
1 #!/bin/bash 2 3 shopt -s extglob 4 5 readonly NGINX_DIR=/usr/share/nginx/html 6 readonly BLOG_DEST_DIR=$NGINX_DIR/blog 7 readonly GUIDES_DEST_DIR=$NGINX_DIR/guides 8 readonly SOFTWARE_DEST_DIR=$NGINX_DIR/software 9 readonly RSS_DEST_FILE=$NGINX_DIR/rss.xml 10 11 readonly REPO_PATH=$(echo "$(dirname -- "$(readlink -f "${BASH_SOURCE}")")") 12 readonly PAGES_REPO_DIR=$REPO_PATH/pages 13 readonly HREF_REPO_DIR=$PAGES_REPO_DIR/href 14 readonly BLOG_REPO_DIR=$HREF_REPO_DIR/blog 15 readonly GUIDE_REPO_DIR=$HREF_REPO_DIR/guides 16 readonly SOFTWARE_REPO_DIR=$HREF_REPO_DIR/software 17 readonly ERROR_REPO_DIR=$PAGES_REPO_DIR/error 18 readonly BOOKLIST_FILE=$REPO_PATH/content/booklist.csv 19 readonly LINKS_FILE=$REPO_PATH/content/links.csv 20 readonly HEADER_FILE=$PAGES_REPO_DIR/header.adoc 21 readonly FOOTER_FILE=$PAGES_REPO_DIR/footer.adoc 22 23 rm -rf $NGINX_DIR/* 24 25 mkdir -p $NGINX_DIR/files 26 mkdir -p $NGINX_DIR/stylesheets 27 mkdir -p $BLOG_DEST_DIR 28 mkdir -p $GUIDES_DEST_DIR 29 mkdir -p $SOFTWARE_DEST_DIR 30 31 cp -rf $REPO_PATH/images "$NGINX_DIR/files" 32 cp $REPO_PATH/pubkey.gpg "$NGINX_DIR/files" 33 cp $REPO_PATH/main.css $NGINX_DIR/stylesheets 34 cp $REPO_PATH/robots.txt "$NGINX_DIR/" 35 36 get_page_header() { 37 declare -r TITLE="${1^}" 38 declare -r ROOT_NAV=$(echo $2 | sed 's/\//\\\//g') 39 declare -r SUB_TITLE=$3 40 41 cat $HEADER_FILE | sed "s/{root_nav}/${ROOT_NAV}/g" | sed "s/{title}/${TITLE}/g" && test "$SUB_TITLE" == 1 && echo -e "[.subheader]\n--\n${TITLE}\n-- " 42 } 43 44 get_page_footer() { 45 declare -r ROOT_NAV=$(echo $1 | sed 's/\//\\\//g') 46 47 cat $FOOTER_FILE | sed "s/{root_nav}/${ROOT_NAV}/g" 48 } 49 50 generate_pages() { 51 local repo_path=$1 52 local dest_path=$2 53 local root_nav=$3 54 local sub_title=$4 55 56 for file in $repo_path/!(header.adoc|footer.adoc) ; do 57 if [[ -f $file ]]; then 58 cd ${repo_path} 59 date=$(git log --follow --pretty="format:%ci" "$file" | tail -1) 60 61 cd ${dest_path} 62 filename=$(basename "${file}" .adoc) 63 get_page_header "$filename" "$root_nav" "$sub_title" >> "$dest_path/$filename.adoc" 64 cat "$file" >> "$dest_path/$filename.adoc" 65 get_page_footer "$root_nav" >> "$dest_path/$filename.adoc" 66 67 asciidoctor "$dest_path/$filename.adoc" 68 rm "$dest_path/$filename.adoc" 69 70 touch -a -m -d "${date}" "$dest_path/$filename.html" 71 touch -a -m -d "${date}" "$repo_path/$filename.adoc" 72 fi 73 done 74 } 75 76 as_href() { 77 local dir_ref=$1 78 local filename=$2 79 local date=$3 80 local filelink=$(echo "$filename" | sed 's/ /%20/g') 81 82 echo -n "link:$dir_ref/$filelink[$filename]" && test -n "$date" && echo -n " _- ${date}_" 83 } 84 85 generate_href_page() { 86 local name=$1 87 local ref_dir=$2 88 local with_date=$3 89 90 cd $ref_dir 91 get_page_header "${name}" > "$NGINX_DIR/$name.adoc" 92 93 test -e $HREF_REPO_DIR/$name.adoc && cat $HREF_REPO_DIR/$name.adoc | sed -e '/\/\/content/,$d' >> "$NGINX_DIR/$name.adoc" 94 95 readarray -t files < <(stat -c '%Y %n' * | sort -n -r) 96 97 for file in "${files[@]#* }" ; do 98 filename=$(echo "${file##*/}" | sed 's/.html//') 99 if [[ $with_date -eq 1 ]]; then 100 date=$(date -r "$file" "+%Y-%m-%d") 101 art_fileref=$(as_href "$name" "$filename" "$date") 102 else 103 art_fileref=$(as_href "$name" "$filename") 104 fi 105 echo "* $art_fileref" >> "$NGINX_DIR/$name.adoc" 106 done 107 108 test -e $HREF_REPO_DIR/$name.adoc && cat $HREF_REPO_DIR/$name.adoc | sed -e '1,/\/\/content/d' >> "$NGINX_DIR/$name.adoc" 109 110 cd $NGINX_DIR 111 get_page_footer "" >> "$NGINX_DIR/$name.adoc" 112 asciidoctor "$name.adoc" 113 rm "$name.adoc" 114 } 115 116 generate_error_pages() { 117 for file in "$ERROR_REPO_DIR"/* ; do 118 cp $file "$NGINX_DIR/" 119 cd $NGINX_DIR 120 filename=$(basename "${file}" .adoc) 121 htmlfile=$(echo "$file" | sed 's/.adoc$/.html/') 122 asciidoctor $filename.adoc 123 rm "$filename.adoc" 124 done 125 } 126 127 generate_books_page() { 128 declare -r DEST_FILE=/usr/share/nginx/html/books.adoc 129 130 get_page_header "Books" > $DEST_FILE 131 echo -e "[.subheader]\nThis is the collection of books of which I own a physical copy\n" >> $DEST_FILE 132 133 sort -t';' -k4,4 -k2,2 -k5,5 -k6,6 -o $BOOKLIST_FILE $BOOKLIST_FILE 134 135 category_check= 136 while IFS=';' read title author isbn category series series_number; do 137 if [[ $category_check != $category ]]; then 138 test -n "$category_check" && echo "|===" >> $DEST_FILE 139 echo -e "\n$category\n\n[cols=\"<70%,>30%\"]\n|===" >> $DEST_FILE 140 category_check=$category 141 fi 142 if [[ -z "$series" ]]; then 143 echo "|link:https://openlibrary.org/isbn/$isbn[$title]|$author" >> $DEST_FILE 144 else 145 series=$(test -z $series_number && echo -n $series || echo -n "$series #$series_number") 146 echo "|link:https://openlibrary.org/isbn/$isbn[$title] [.series]#($series)#|$author" >> $DEST_FILE 147 fi 148 done < "$BOOKLIST_FILE" 149 150 echo "|===" >> $DEST_FILE 151 cd $NGINX_DIR 152 get_page_footer >> $DEST_FILE 153 asciidoctor $DEST_FILE 154 rm $DEST_FILE 155 } 156 157 generate_links_page() { 158 declare -r DEST_FILE=/usr/share/nginx/html/links.adoc 159 160 get_page_header "Links" > $DEST_FILE 161 echo -e "[.subheader]\nLinks to websites on various topics\n" >> $DEST_FILE 162 163 sort -t';' -k4,4 -k1,1 -o $LINKS_FILE $LINKS_FILE 164 165 category_check='1' 166 while IFS=';' read title url description category image ; do 167 if [[ $category_check != "$category" ]]; then 168 test -n "$category" && echo -e "\n== $category\n" >> $DEST_FILE 169 category_check=$category 170 fi 171 echo "* link:$url[$title] - $description" >> $DEST_FILE 172 173 done < "$LINKS_FILE" 174 cd $NGINX_DIR 175 get_page_footer >> $DEST_FILE 176 asciidoctor $DEST_FILE 177 rm $DEST_FILE 178 } 179 180 generate_rss() { 181 cd $BLOG_REPO_DIR 182 echo '<rss version="2.0"><channel><title>Wim Dupont - Blog</title><link>https://wimdupont.com/blog</link><language>en</language>' > $RSS_DEST_FILE 183 readarray -t files < <(stat -c '%Y %n' * | sort -n -r) 184 185 for file in "${files[@]#* }" ; do 186 filename=$(basename "${file}" .adoc) 187 date=$(stat -c '%y' "$file") 188 189 asciidoctor -e "$file" 190 content=$(cat "${filename}.html" | sed 's/</\</g') 191 192 rm "${filename}.html" 193 194 echo "<item> 195 <title>$filename</title> 196 <description>$content</description> 197 <link>https://wimdupont.com/blog/$filename</link> 198 <author>Wim Dupont</author> 199 <pubDate>$date</pubDate> 200 <guid>$filename-$date</guid> 201 </item>" >> $RSS_DEST_FILE 202 done 203 echo '</channel></rss>' >> $RSS_DEST_FILE 204 } 205 206 generate_error_pages 207 208 generate_books_page 209 generate_links_page 210 211 generate_pages $PAGES_REPO_DIR $NGINX_DIR 212 generate_pages $GUIDE_REPO_DIR $GUIDES_DEST_DIR "../" 1 213 generate_pages $SOFTWARE_REPO_DIR $SOFTWARE_DEST_DIR "../" 1 214 generate_pages $BLOG_REPO_DIR $BLOG_DEST_DIR "../" 1 215 216 generate_href_page "guides" $GUIDES_DEST_DIR 217 generate_href_page "software" $SOFTWARE_DEST_DIR 218 generate_href_page "blog" $BLOG_DEST_DIR 1 219 220 generate_rss