obsolete.computer

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/"

Meta