misc-scripts/build-code-markdown.sh
File Type: text/x-shellscript
#!/bin/bash
set -e
RSYNC="rsync -czrt --delete"
PELICANDIR="$HOME/Projects/obsolete.computer"
PROJECTSDIR="$HOME/Projects"
TEMPDIR="$HOME/Temp/code-markdown"
TEMPCODEDIR="$TEMPDIR/code"
TEMPMARKDOWNDIR="$TEMPDIR/markdown"
STATICCODEURL="static/code"
MARKDOWNURL="code"
FINALMARKDOWNDIR="$PELICANDIR/content/pages/$MARKDOWNURL"
FINALSTATICCODEDIR="$PELICANDIR/content/$STATICCODEURL"
PROJECTS=( multistream the-maze awesomeconf download-video-subs vermiculate-standalone brave-filters simplemonitor-web misc-scripts )
#make sure this will match subdirs, too or mkdir -p will make the parent dir.
RENDER_EXCLUDE_REGEX="\.git/|\.git$"
[[ -d "$TEMPDIR" ]] && rm -rf "$TEMPDIR"
mkdir -p "$TEMPDIR"
mkdir -p "$TEMPCODEDIR"
mkdir -p "$TEMPMARKDOWNDIR"
#Start the main index page
cat <<-EOF > "$TEMPMARKDOWNDIR/index.md"
Title: Code
Order: 10
Save_As: $MARKDOWNURL/index.html
URL: $MARKDOWNURL/index.html
{% from 'macros.md' import codedir %}
*A listing of code projects. Like my own personal GitHub, but without any of the hubbub.*
EOF
for project in ${PROJECTS[@]}; do
#Copy each project to the working directory.
RSYNC_EXCLUDE=
[[ -f "$PROJECTSDIR/$project/.gitignore" ]] && RSYNC_EXCLUDE=--exclude-from="$PROJECTSDIR/$project/.gitignore"
$RSYNC $RSYNC_EXCLUDE "$PROJECTSDIR/$project/" "$TEMPCODEDIR/$project/"
#Add project to the main code index.
echo "{{ codedir(\"$project\") }}" >> "$TEMPMARKDOWNDIR/index.md"
mkdir -p "$TEMPMARKDOWNDIR/$project"
cd "$TEMPCODEDIR/$project"
#Make a tarball of each project.
tar cjf "$TEMPCODEDIR/$project.tar.bz2" .
#Copy directory structure & build an index of each directory.
find . -type d | sed "s|^\./||" | while read subdir; do
[[ "$subdir" =~ $RENDER_EXCLUDE_REGEX ]] && continue;
[[ ! -d "$TEMPMARKDOWNDIR/$project/$subdir" ]] && mkdir -p "$TEMPMARKDOWNDIR/$project/$subdir"
cat <<-EOF > "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
Title: $project/$subdir
Status: Hidden
Save_As: $MARKDOWNURL/$project/$subdir/index.html
Order: 50
{% from 'macros.md' import code %}
EOF
if [[ -f "$TEMPCODEDIR/$project/$subdir/summary.md" ]]; then
cat "$TEMPCODEDIR/$project/$subdir/summary.md" | while read line || [ -n "$line" ] ; do
echo "$line " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
done
fi
echo "## Directory Listing" >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
ls -Ggahp --group-directories-first "$subdir" | while read line; do
filename=$(echo "$line" | tr -s ' ' | tr -d '/' | cut -f7- -d' ')
[[ "$filename" =~ $RENDER_EXCLUDE_REGEX ]] && continue;
if [[ "$line" =~ ^-.+ ]]; then
echo "[\`$line\`](/$MARKDOWNURL/$project/$subdir/$filename.html) " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
elif [[ "$line" =~ ^d.+ ]]; then
echo "[\`$line\`](/$MARKDOWNURL/$project/$subdir/$filename/index.html) " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
else
echo "\`$line\` " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
fi
done
if [[ "$subdir" == "." ]]; then
cat <<-EOF >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
## Download
$([[ -d "$TEMPCODEDIR/$project/.git" ]] && echo "- Git clone URL: \`{{ SITEURL }}/$STATICCODEURL/$project/.git\` ")
- Download Tarball: [$project.tar.bz2](/$STATICCODEURL/$project.tar.bz2)
EOF
fi
if [[ -f "$TEMPCODEDIR/$project/$subdir/README.md" ]]; then
echo "## Readme" >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
cat "$TEMPCODEDIR/$project/$subdir/README.md" | while read line || [ -n "$line" ] ; do
echo "> $line " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
done
fi
if [[ -d "$TEMPCODEDIR/$project/.git" && "$subdir" == "." ]]; then
echo "## Recent Changes" >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
git log --format="[%h] %cs: %s" -n 5 | while read line || [ -n "$line" ] ; do
echo "- $line " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
done
fi
if [[ -f "$TEMPCODEDIR/$project/LICENSE" ]]; then
echo "## License" >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
cat "$TEMPCODEDIR/$project/LICENSE" | while read line || [ -n "$line" ] ; do
echo "> $line " >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
done
fi
cat <<-EOF >> "$TEMPMARKDOWNDIR/$project/$subdir/index.md"
## Meta
$([[ "$subdir" != "." ]] && echo "- [Parent Directory](../index.html) ")
$([[ "$subdir" != "." ]] && echo "- [Project Main Page](/$MARKDOWNURL/$project/index.html) ")
- [Articles Related to This Project](/tag/$project.html)
- [Back to List of All Projects](/$MARKDOWNURL/index.html)
EOF
done
#Build a markdown file for each source file in the project.
find . -type f | sed "s|^\./||" | while read file; do
[[ "$file" =~ $RENDER_EXCLUDE_REGEX ]] && continue;
filetype=$(file -i ./$file | cut -d ' ' -f2 | tr -d ";")
if [[ $filetype =~ ^text/.+ || $filetype =~ /javascript ]]; then
filebody="{{ code(\"/$STATICCODEURL/$project/$file\") }}"
elif [[ $filetype =~ ^image/.+ ]]; then
filebody="{{ image(\"/$STATICCODEURL/$project/$file\") }}"
else
filebody="{{ binary(\"/$STATICCODEURL/$project/$file\") }}"
fi
cat <<-EOF > "$TEMPMARKDOWNDIR/$project/$file.md"
Title: $project/$file
Status: Hidden
Save_As: $MARKDOWNURL/$project/$file.html
Order: 50
{% from 'macros.md' import code,binary,image %}
*File Type: $filetype*
$filebody
## Meta
- [Parent Directory](./index.html)
- [Project Main Page](/$MARKDOWNURL/$project/index.html)
- [Back to List of All Projects](/$MARKDOWNURL/index.html)
EOF
done
done
$RSYNC -v "$TEMPCODEDIR/" "$FINALSTATICCODEDIR/"
$RSYNC -v "$TEMPMARKDOWNDIR/" "$FINALMARKDOWNDIR/"