wimdupont.com

Source code for www.wimdupont.com
git clone git://git.wimdupont.com/wimdupont.com.git
Log | Files | Refs | README | LICENSE

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/</\&lt;/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