gemlog-new (view raw)
1#!/bin/sh -e
2
3# script to create new gemposts
4
5GEMINI_HOME="$HOME/Documents/gemini-aaoth.xyz"
6# gemlog page on your capsule, e.g. gemini://foo.bar/gemlog/
7# ^----^
8GEMLOG_DIR="gemlog"
9GEMLOG_HOME="$GEMINI_HOME/$GEMLOG_DIR"
10GEMLOG_INDEX="$GEMLOG_HOME/index.gmi"
11GEMLOG_TEMPLATE="$GEMLOG_HOME/.template"
12# gemlikes view binary location
13GEMLIKES="/cgi-bin/gemlikes/view"
14
15die() {
16 echo "$1" && exit 1
17}
18
19usage() {
20 echo "add new post to gemlog"
21 echo
22 echo "this script is using gemini subscription specification and also \
23utilizes gemlikes utility for likes and comments"
24 echo
25 echo "usage:"
26 echo " $0 [OPTIONS]"
27 echo
28 echo "options:"
29 echo " -T, --title <title>"
30 echo " specify new post title"
31 echo " -t, --tags <tags>"
32 echo " specify new post tags (space separated, now they are just decorative)"
33 echo " -h, --help"
34 echo " print this help message"
35}
36
37read_title() {
38 echo "new post title:"
39 read -r _new_post_title
40}
41
42read_tags() {
43 echo "new post tags:"
44 read -r _new_post_tags
45}
46
47update_index() {
48 sed "$_new_post_loc i => $_new_post_rel_url $_new_post_date $_new_post_title" < "$GEMLOG_INDEX" > "$GEMLOG_INDEX.tmp"
49 mv "$GEMLOG_INDEX.tmp" "$GEMLOG_INDEX"
50}
51
52edit_post() {
53 _new_post_gemlikes=$(echo "$_new_post_gemlikes" | sed 's/\//\\\//g')
54
55 cp "$GEMLOG_TEMPLATE" "$_new_post_filename"
56
57 [ -n "$_new_post_tags" ] && sed -e "s/{{ tags }}/\* tags: $_new_post_tags/" \
58 < "$_new_post_filename" > "$_new_post_filename.tmp"
59 mv "$_new_post_filename.tmp" "$_new_post_filename"
60
61 sed -e '/{{ tags }}/d' < "$_new_post_filename" > "$_new_post_filename.tmp"
62 mv "$_new_post_filename.tmp" "$_new_post_filename"
63
64 sed -e "s/{{ title }}/$_new_post_title/" \
65 -e "s/{{ gemlog_location }}/\/$GEMLOG_DIR\//" \
66 -e "s/{{ date }}/$_new_post_date/" \
67 -e "s/{{ gemlog_title }}/back to post list/" \
68 -e "s/{{ gemlikes }}/${_new_post_gemlikes#/}/" < "$_new_post_filename" \
69 > "$_new_post_filename.tmp"
70 mv "$_new_post_filename.tmp" "$_new_post_filename"
71
72 nvim -c ":Go" -c "normal 6j" -c "startinsert" "$_new_post_filename"
73}
74
75main() {
76 if [ $# -gt 0 ]
77 then
78 while [ -n "$1" ]
79 do
80 case "$1" in
81 --title|-T)
82 shift
83 _new_post_title="$1"
84 ;;
85 --tags|-t)
86 shift
87 _new_post_tags="$1"
88 ;;
89 --help|-h)
90 shift
91 usage
92 exit
93 ;;
94 *)
95 usage
96 exit 1
97 ;;
98 esac
99 shift
100 done
101 fi
102
103 [ -z "$_new_post_title" ] && read_title
104 [ -z "$_new_post_title" ] && die "title could not be empty"
105
106 [ -z "$_new_post_tags" ] && read_tags
107 [ -z "$_new_post_tags" ] && echo "no tags specified"
108
109 _new_post_date=$(date +%F)
110 _new_post_title_for_file=$(echo "$_new_post_title" | tr '[:upper:]' '[:lower:]' \
111 | sed 's/ /-/g')
112 _new_post_basename="$_new_post_date-$_new_post_title_for_file.gmi"
113 _new_post_filename="$GEMLOG_HOME/$_new_post_basename"
114 _new_post_rel_url="/$GEMLOG_DIR/$_new_post_basename"
115 _new_post_loc=$(awk '/^## posts/ { print NR+2 }' < "$GEMLOG_INDEX")
116 _new_post_gemlikes="$GEMLIKES?$_new_post_basename"
117
118 update_index
119
120 edit_post
121
122 {
123 cd "$GEMINI_HOME"
124 git add "$GEMLOG_INDEX" "$_new_post_filename"
125 git commit && git push
126 }
127}
128
129main "$@"