Skip to content
Open
136 changes: 112 additions & 24 deletions baker
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,38 @@
#
# config
#
config() {
if [ -f "${1:-}" ]; then
. "${1}"
fi
# POST_DIR stores all post markdown files
export POST_DIR="${POST_DIR:=post}"

# POST_DIR stores all post markdown files
readonly POST_DIR=post
# OUTPUT_DIR stores all compiled html
export OUTPUT_DIR="${OUTPUT_DIR:=out}"

# OUTPUT_DIR stores all compiled html
readonly OUTPUT_DIR=out
# DRAFT_DIR stores all compiled html
export DRAFT_DIR="${DRAFT_DIR:=draft}"

# LAYOUT_DIR stores all layout markdown files
readonly LAYOUT_DIR=layout
# LAYOUT_DIR stores all layout markdown files
export LAYOUT_DIR="${LAYOUT_DIR:=layout}"

# PUBLIC_DIR stores css and static images
readonly PUBLIC_DIR=public
# PUBLIC_DIR stores css and static images
export PUBLIC_DIR="${PUBLIC_DIR:=public}"

# site
readonly SITE_NAME='a baker blog'
readonly SITE_DESC='written in bash'
readonly DISQUS='bakerbash'
# site
export SITE_NAME="${SITE_NAME:=a baker blog}"
export SITE_DESC="${SITE_DESC:=written in bash}"
export DISQUS="${DISQUS:=bakerbash}"

# author
readonly AUTHOR_NAME='baker'
readonly AUTHOR_DESC='a very-experienced bread baker, who also loves planting trees.'
readonly AUTHOR_EMAIL='email@example.org'
readonly AUTHOR_EMAIL_HASH="$(md5sum <<< "$AUTHOR_NAME" | awk '{ print $1 }')"
readonly AUTHOR_TWITTER='twitter'
readonly AUTHOR_GITHUB='github'
# author
export AUTHOR_NAME="${AUTHOR_NAME:=baker}"
export AUTHOR_DESC="${AUTHOR_DESC:=a very-experienced bread baker, who also loves planting trees.}"
export AUTHOR_EMAIL="${AUTHOR_EMAIL:=email@example.org}"
export AUTHOR_EMAIL_HASH="${AUTHOR_EMAIL_HASH:=$(md5sum <<< "$AUTHOR_NAME" | awk '{ print $1 }')}"
export AUTHOR_TWITTER="${AUTHOR_TWITTER:=twitter}"
export AUTHOR_GITHUB="${AUTHOR_GITHUB:=github}"
}

#
# helper
Expand Down Expand Up @@ -56,7 +63,7 @@ body() {

# slug creates a friendly URL like 'hello-world'
slug() {
tr -cs '[:alnum:]\n' - | tr '[:upper:]' '[:lower:]' | sed 's|^-*||;s|-*$||'
iconv -f utf8 -t ascii//TRANSLIT | tr -cs '[:alnum:]\n' - | tr '[:upper:]' '[:lower:]' | sed 's|^-*||;s|-*$||'
}

#
Expand Down Expand Up @@ -271,35 +278,77 @@ usage() {
baker
post [title] draft a post
bake ship all posts
list list all posts with state
toggle [post] toggle the draft status of a post
EOF
exit 1
}

(( $# == 0 )) && usage

config
readonly POST_DIR; readonly OUTPUT_DIR; readonly DRAFT_DIR; readonly LAYOUT_DIR; readonly PUBLIC_DIR
readonly SITE_NAME; readonly SITE_DESC
readonly AUTHOR_NAME; readonly AUTHOR_DESC; readonly AUTHOR_EMAIL; readonly AUTHOR_EMAIL_HASH;
readonly AUTHOR_TWITTER; readonly AUTHOR_GITHUB; readonly DISQUS

case "$1" in
bake)
rm -rf "$DRAFT_DIR"
mkdir -p "$DRAFT_DIR"
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"

[[ -d "$POST_DIR" ]] || usage
[[ -d "$PUBLIC_DIR" ]] && cp -r "$PUBLIC_DIR"/. "$OUTPUT_DIR"
[[ -d "$PUBLIC_DIR" ]] && cp -r "$PUBLIC_DIR"/. "$DRAFT_DIR"
touch "$DRAFT_DIR/index.html"

readarray -t posts < <(find "$POST_DIR" -name '*.md' | sort -r)

echo "Rendering Posts..." >&2
idx=0
id_all=0
time for post in "${posts[@]}"; do
idx_prev=1;idx_next=1
id="$(basename "$post" .md)"
# skip drafts
[[ "$(header draft < "$post")" == false ]] || continue
if [ "$(header draft < "$post")" != false ]; then
(( id_all++ ))
POST_PREV='index.html';POST_NEXT='index.html'; render_file "$post" > "$DRAFT_DIR/$id.html"; continue;
fi
if [ ${idx} -eq 0 ]; then # It's the first post, so the newer one is index
id_prev=0
else # search for the previous post not draft
while [ -f "${posts[$((id_all-idx_prev))]}" -a "$(header draft < "${posts[$((id_all-idx_prev))]}" 2>/dev/null)" != false ]; do
(( idx_prev++ ))
if [ ${idx_prev} -gt ${id_all} ]; then idx_prev=${id_all}; break; fi
done 2>/dev/null
fi
# look for the next older post not draft
while [ -f "${posts[$((id_all+idx_next))]}" -a "$(header draft < "${posts[$((id_all+idx_next))]}" 2>/dev/null)" != false ]; do
(( idx_next++ ))
done 2>/dev/null

if [ ${idx} -eq 0 -o $((idx_all-idx_prev)) -eq 0 -a ${id_all} -eq 0 ]; then
POST_PREV="index.html"
else
POST_PREV="$( basename "${posts[$((id_all-idx_prev))]}" )"
POST_PREV="${POST_PREV%*.md}.html"
fi
POST_NEXT="$( basename "${posts[$((id_all+idx_next))]}" )"
[[ -z "${POST_PREV:=}" ]] && POST_PREV='index.html'
[[ -z "${POST_NEXT:=}" ]] && POST_NEXT='index.md'
echo "$idx - $idx_next - $id [Prev:${POST_PREV}][Next:${POST_NEXT}]"
POST_NEXT="${POST_NEXT%*.md}.html"

echo "$id"
render_file "$post" > "$OUTPUT_DIR/$id.html" &
declare "posts_${idx}_id"="$id"
export_headers "$post" "posts_${idx}_"
POST_PREV="$id.html"
(( id_all++ ))
(( idx++ ))
done

echo "Rendering Index..." >&2
render_file "$LAYOUT_DIR/index.md" > "$OUTPUT_DIR/index.html" &
wait
;;
Expand All @@ -322,6 +371,45 @@ post)
echo "$post_file"
[[ "$EDITOR" ]] && $EDITOR "$post_file"
;;
list)
idx=0
readarray -t posts < <(find "$POST_DIR" -name '*.md' | sort -r)
(
echo "id title status"
for post in "${posts[@]}"; do
id="$(basename "$post" .md)"
# skip drafts
if [ "$(header draft < "$post")" == 'false' ]; then
echo "${idx} $id [Published]"
else
echo "${idx} $id [Draft]"
fi
((idx++))
done
) | column -t
;;
toggle)
_fname=''
readarray -t posts < <(find "$POST_DIR" -name '*.md' | sort -r)
if [ -z "${2:-}" ]; then
usage
elif [ -z "${2//[0-9]/}" ]; then
if [ ${2} -lt ${#posts[@]} ]; then
_fname="${posts[${2}]}"
fi
elif [ -f "${POST_DIR}/${2}" -o -f "${POST_DIR}/${2}.md" ]; then
_fname="${POST_DIR}/${2//\.md/}.md"
fi
if [ -z "${_fname}" ]; then
echo "This post doesn't exist"
exit 1
fi
if [ "$(header draft < "${_fname}")" == 'false' ]; then
sed -i -e 's;^[[:space:]]*draft:[[:space:]]*false[[:space:]]*$;draft: true;g' "${_fname}"
else
sed -i -e 's;^[[:space:]]*draft:[[:space:]]*.*[[:space:]]*$;draft: false;g' "${_fname}"
fi
;;
*)
usage
;;
Expand Down
2 changes: 2 additions & 0 deletions layout/post.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
<nav>
<ul class="nav nav-pills pull-right">
<li class="active"><a href="index.html">Home</a></li>
<li><a href="{{ POST_PREV }}" title="Newer"><i class="fa fa-long-arrow-left fa-2x"></i></a></li>
<li><a href="{{ POST_NEXT }}" title="Older"><i class="fa fa-long-arrow-right fa-2x"></i></a></li>
<li><a href="#author">About</a></li>
</ul>
</nav>
Expand Down
11 changes: 11 additions & 0 deletions post/2015-11-20-welcome-to-baker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
title: Welcome to Baker!
date: 2015-11-20T11:06:07Z
layout: post
draft: false
summary: This is your second post.
---

With the **Markdown** syntax, expect more readbility. Be prepared to start blogging!

<iframe width="100%" height="166" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/121515363&color=ff5500"></iframe>