Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

1. Give it a title: `./baker post I love pizza so much!` This command will create a markdown file that has the slug `i-love-pizza-so-much` in the `post` directory. If the `$EDITOR` environment variable is set, it will open up the post markdown file with the editor.

2. Change `draft` from `true` to `false` to publish the post.
2. Change `draft` from `true` to `false` to publish the post (or use the `./baker toggle id`).

3. Bake all posts: `./baker bake`

Expand Down
166 changes: 132 additions & 34 deletions baker
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ readonly POST_DIR=post
# OUTPUT_DIR stores all compiled html
readonly OUTPUT_DIR=out

# DRAFT_DIR stores all compiled html
readonly DRAFT_DIR=draft

# LAYOUT_DIR stores all layout markdown files
readonly LAYOUT_DIR=layout

Expand Down Expand Up @@ -56,7 +59,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 @@ -263,64 +266,159 @@ render_file() {
echo "$content"
}

#
# usage
#
usage() {
cat <<-EOF
baker
post [title] draft a post
bake ship all posts
EOF
exit 1
# post_toggle toggles the status of a post (either use ID or post name)
post_toggle() {
local _fname=''
if [ -z "${1:-}" ]; then
usage
elif [ -z "${1//[0-9]/}" ]; then
readarray -t posts < <(find "$POST_DIR" -name '*.md' | sort -r)
if [ ${1} -lt ${#posts[@]} ]; then
_fname="${posts[${1}]}"
fi
elif [ -f "${POST_DIR}/${1}" -o -f "${POST_DIR}/${1}.md" ]; then
_fname="${POST_DIR}/${1//\.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
}

(( $# == 0 )) && usage
# post_list list the id title and status of posts
post_list() {
local 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
}

case "$1" in
bake)
# post_post creates a post (in the POST_DIR) with the minimum information
post_post() {
readonly title="${@}"
[[ "$title" ]] || usage

mkdir -p "$POST_DIR" || ( echo "Can't create '$POST_DIR'" >&2; exit 1 )
readonly post_file="$POST_DIR/$(date +%Y-%m-%d)-$(slug <<< "$title").md"
cat > "$post_file" <<-EOF
---
title: $title
date: $(date -u +%FT%TZ)
layout: post
draft: true
summary:
---
EOF

echo "$post_file"
[[ "$EDITOR" ]] && $EDITOR "$post_file"
}

# post_bake it's where the magic start
post_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
;;
post)
readonly title="${@:2}"
[[ "$title" ]] || usage
}

mkdir -p "$POST_DIR"
readonly post_file="$POST_DIR/$(date +%Y-%m-%d)-$(slug <<< "$title").md"
cat > "$post_file" <<-EOF
---
title: $title
date: $(date -u +%FT%TZ)
layout: post
draft: true
summary:
---
#
# usage
#
usage() {
cat <<-EOF
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
}

echo "$post_file"
[[ "$EDITOR" ]] && $EDITOR "$post_file"
(( $# == 0 )) && usage

case "$1" in
bake)
post_bake
;;
post)
post_post "${@:2}"
;;
list)
post_list
;;
toggle)
post_toggle "${@:2}"
;;
*)
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>