diff --git a/README.md b/README.md
index 1d8190a..32b24f2 100644
--- a/README.md
+++ b/README.md
@@ -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`
diff --git a/baker b/baker
index bf1f5a3..ae21304 100755
--- a/baker
+++ b/baker
@@ -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
@@ -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|-*$||'
}
#
@@ -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
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!
+
+