wimdupont.com

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

generate.sh (6486B)


      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/lists/booklist.csv
     19 readonly LINKS_FILE=$REPO_PATH/lists/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 	declare -r DEST_FILE="${NGINX_DIR}/${name}.adoc"
     90 
     91 	cd "${ref_dir}"
     92 	get_page_header "${name}" > "${DEST_FILE}"
     93 
     94 	test -e $HREF_REPO_DIR/$name.adoc && cat $HREF_REPO_DIR/$name.adoc | sed -e '/\/\/content/,$d' >> "${DEST_FILE}"
     95 
     96 	readarray -t files < <(stat -c '%Y %n' * | sort -n -r)
     97 
     98 	for file in "${files[@]#* }" ; do
     99 		filename=$(echo "${file##*/}" | sed 's/.html//')
    100 		if [[ $with_date -eq 1 ]]; then
    101 			date=$(date -r "$file" "+%Y-%m-%d")
    102 			art_fileref=$(as_href "$name" "$filename" "$date")
    103 		else
    104 			art_fileref=$(as_href "$name" "$filename")
    105 		fi
    106 		echo "* $art_fileref" >> "$NGINX_DIR/$name.adoc"
    107 	done
    108 
    109 	test -e $HREF_REPO_DIR/$name.adoc && cat $HREF_REPO_DIR/$name.adoc | sed -e '1,/\/\/content/d' >> "${DEST_FILE}"
    110 
    111 	cd "${NGINX_DIR}"
    112 	get_page_footer "" >> "${DEST_FILE}"
    113 	asciidoctor "$name.adoc"
    114 	rm "$name.adoc"
    115 }
    116 
    117 generate_error_pages() {
    118 	for file in "$ERROR_REPO_DIR"/* ; do
    119 		cp $file "$NGINX_DIR/"
    120 		cd $NGINX_DIR
    121 		filename=$(basename "${file}" .adoc)
    122 		htmlfile=$(echo "$file" | sed 's/.adoc$/.html/')
    123 		asciidoctor $filename.adoc
    124 		rm "$filename.adoc"
    125 	done
    126 }
    127 
    128 generate_books_page() {
    129 	declare -r DEST_FILE="${NGINX_DIR}/books.adoc"
    130 
    131 	get_page_header "Books" > $DEST_FILE
    132 	echo -e "[.subheader]\nThis is the collection of books of which I own a physical copy\n" >> $DEST_FILE
    133 	
    134 	sort -t';' -k4,4 -k2,2 -k5,5 -k6,6 -o $BOOKLIST_FILE $BOOKLIST_FILE
    135 	
    136 	category_check=
    137 	while IFS=';' read title author isbn category series series_number; do
    138 		if [[ $category_check != $category ]]; then
    139 			test -n "$category_check" && echo "|===" >> $DEST_FILE
    140 			echo -e "\n$category\n\n[cols=\"<70%,>30%\"]\n|===" >> $DEST_FILE
    141 			category_check=$category
    142 		fi
    143 		if [[ -z "$series" ]]; then
    144 			echo "|link:https://openlibrary.org/isbn/$isbn[$title]|$author" >> $DEST_FILE
    145 		else
    146 			series=$(test -z $series_number && echo -n $series || echo -n "$series #$series_number")
    147 			echo "|link:https://openlibrary.org/isbn/$isbn[$title] [.series]#($series)#|$author" >> $DEST_FILE
    148 		fi
    149 	done < "$BOOKLIST_FILE"
    150 
    151 	echo "|===" >> $DEST_FILE
    152 	cd $NGINX_DIR
    153 	get_page_footer >> $DEST_FILE
    154 	asciidoctor $DEST_FILE
    155 	rm $DEST_FILE
    156 }
    157 
    158 generate_links_page() {
    159 	declare -r DEST_FILE="${NGINX_DIR}/links.adoc"
    160 
    161 	get_page_header "Links" > $DEST_FILE
    162 	echo -e "[.subheader]\nLinks to websites on various topics\n" >> $DEST_FILE
    163 
    164 	sort -t';' -k4,4 -k1,1 -o $LINKS_FILE $LINKS_FILE
    165 	
    166 	category_check='1'
    167 	while IFS=';' read title url description category image ; do
    168 		if [[ $category_check != "$category" ]]; then
    169 			test -n "$category" && echo -e "\n== $category\n" >> $DEST_FILE
    170 			category_check=$category
    171 		fi
    172 		echo "* link:$url[$title] - $description" >> $DEST_FILE
    173 	done < "$LINKS_FILE"
    174 
    175 	cd $NGINX_DIR
    176 	get_page_footer >> $DEST_FILE
    177 	asciidoctor $DEST_FILE
    178 	rm $DEST_FILE
    179 }
    180 
    181 generate_rss() {
    182 	cd $BLOG_REPO_DIR
    183 	echo '<rss version="2.0"><channel><title>Wim Dupont - Blog</title><link>https://wimdupont.com/blog</link><language>en</language>' > $RSS_DEST_FILE
    184 	readarray -t files < <(stat -c '%Y %n' * | sort -n -r)
    185 
    186 	for file in "${files[@]#* }" ; do
    187 		filename=$(basename "${file}" .adoc)
    188 		date=$(stat -c '%y' "$file")
    189 
    190 		asciidoctor -e "$file"
    191 		content=$(cat "${filename}.html" | sed 's/</\&lt;/g')
    192 
    193 		rm "${filename}.html"
    194 
    195 		echo "<item>
    196 <title>$filename</title>
    197 <description>$content</description>
    198 <link>https://wimdupont.com/blog/$filename</link>
    199 <author>Wim Dupont</author>
    200 <pubDate>$date</pubDate>
    201 <guid>$filename-$date</guid>
    202 </item>" >> $RSS_DEST_FILE
    203 	done
    204 	echo '</channel></rss>' >> $RSS_DEST_FILE
    205 }
    206 
    207 generate_error_pages
    208 
    209 generate_books_page
    210 generate_links_page
    211 
    212 generate_pages $PAGES_REPO_DIR $NGINX_DIR
    213 generate_pages $GUIDE_REPO_DIR $GUIDES_DEST_DIR "../" 1
    214 generate_pages $SOFTWARE_REPO_DIR $SOFTWARE_DEST_DIR "../" 1
    215 generate_pages $BLOG_REPO_DIR $BLOG_DEST_DIR "../" 1
    216 
    217 generate_href_page "guides" $GUIDES_DEST_DIR
    218 generate_href_page "software" $SOFTWARE_DEST_DIR
    219 generate_href_page "blog" $BLOG_DEST_DIR 1
    220 
    221 generate_rss