diff --git a/baker b/baker
index bf1f5a3..2c5045f 100755
--- a/baker
+++ b/baker
@@ -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
@@ -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|-*$||'
}
#
@@ -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
;;
@@ -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
;;
diff --git a/layout/post.md b/layout/post.md
index 23f19d9..e5a926f 100644
--- a/layout/post.md
+++ b/layout/post.md
@@ -12,6 +12,8 @@
diff --git a/post/2015-11-20-welcome-to-baker.md b/post/2015-11-20-welcome-to-baker.md
new file mode 100644
index 0000000..7ba852f
--- /dev/null
+++ b/post/2015-11-20-welcome-to-baker.md
@@ -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!
+
+