3 # This is a simple script that will produce my blog on repo.or.cz
5 # The idea is to have source-<timestamp>.txt files as input, having the
6 # stories, and this script turning them into nice HTML, committing
7 # everything, and then pushing it to my repository.
9 # The blog will then be served using gitweb.
11 # To make it easier on me, if a file "source.txt" exists, it is
12 # automatically renamed using the current timestamp.
14 # TODO: generate an RSS feed, too
15 # TODO: have a configurable maximum number of entries per page, and links
18 # make sure we're in the correct working directory
21 GITWEBURL
="$(git config gitweb.url)"
22 test -z "$GITWEBURL" && {
23 echo "Please set gitweb.url in the Git config first!" >&2
27 URLPREFIX
="$(dirname "$GITWEBURL")"/
28 REMOTEREPOSITORY
="$(basename "$GITWEBURL")"
30 URL
="$REMOTEREPOSITORY?a=blob_plain;hb=$BRANCH;f="
39 move_new_entry_back
() {
40 test -f source-
$now.txt
&&
41 mv source-
$now.txt
$NEW &&
42 git
rm --cached -f source-
$now.txt
52 # add illogical suffix
54 *1?|
*[04-9]) echo "$1th";;
61 make_chinese_hour
() {
92 make_roman_number
() {
95 ?
) digit_to_roman
$1 I V X
;;
96 ??
) echo $
(digit_to_roman
${1%?} X L C
)$
(make_roman_number
${1#?});;
97 ???
) echo $
(digit_to_roman
${1%??} C D M
)$
(make_roman_number
${1#?});;
98 ????
) echo $
(digit_to_roman
${1%???} M
)$
(make_roman_number
${1#?});;
103 printf "%s, %s of %s, Anno Domini %s, at the hour of the %s\n" \
105 $
(nth $
(date +%e
-d @
$1)) \
107 $
(make_roman_number $
(date +%Y
-d @
$1)) \
108 $
(make_chinese_hour $
(date +%H
-d @
$1))
111 # make an argument for sed, to replace $1..$1 by <$2>..</$2>
112 markup_substitution
() {
114 ?
) echo "s/$1\\([^$1]*\\)$1/<$2>\\\\1<\/$2>/g";;
117 tmp2
="\\|${1%?}[^${1#?}]$tmp"
118 tmp3
="\\($tmp\\($tmp2\\($tmp2\\($tmp2\\)\\)\\)\\)"
119 echo "s/$1$tmp3$1/<$2>\\\\1<\/$2>/g"
124 # transform markup in stdin to HTML
126 image_pattern
="\\[\\[Image:\([^]]*\)"
127 image_pattern2
="$image_pattern\(\\|[^\]]*\)\?\]\]"
128 sed -e 's!^$!</p><p>!' \
129 -e 's!IMHO!in my humble opinion!g' \
130 -e 's!BTW!By the way,!g' \
131 -e 's!repo.or.cz!<a href=http://&>&</a>!g' \
132 -e 's!:-)!\☺!g' \
133 -e "s!$image_pattern2!<center><img src=$URL\1></center>!g" \
135 border=1 bgcolor=black>\
136 <tr><td bgcolor=lightblue colspan=3>\
140 <table cellspacing=5 border=0\
141 style="color:#ffffff;">\
144 -e 's!</bash>! </pre>\
149 -e "$(markup_substitution "''" i)" \
150 -e "$(markup_substitution "_
" u)"
155 body_style
="width:800px"
156 body_style
="$body_style;background-image:url(${URL}paper.jpg)"
157 body_style
="$body_style;background-repeat:repeat-y"
158 body_style
="$body_style;background-attachment:scroll"
159 body_style
="$body_style;padding:0px;"
160 text_style
="width:610px"
161 text_style
="$text_style;margin-left:120px"
162 text_style
="$text_style;margin-top:50px"
163 text_style
="$text_style;align:left"
164 text_style
="$text_style;vertical-align:top;"
168 <title>$TITLE</title>
169 <meta http-equiv="Content-Type"
170 content="text/html; charset=UTF-8"/>
172 <body style="$body_style">
173 <div style="$text_style">
180 toc_style
="position:absolute;top:50px;left:810px;width=$toc_width"
182 echo "<div style=\"$toc_style\">"
183 echo "<table width=$toc_width bgcolor=#e0e0e0 border=1>"
184 echo "<tr><th>Table of contents:</th></tr>"
187 for file in $
(ls -r source-
*.txt
)
189 basename=${file%.txt}
190 timestamp
=${basename#source-}
191 date="$(date +"%d
%b
%Y
" -d @$timestamp)"
192 title
="$(sed 1q < $file | markup)"
193 echo "<li><a href=#$timestamp>$date $title</a>"
196 echo '</td></tr></table>'
197 test -f links.html
&& {
199 echo "<table width=$toc_width bgcolor=#e0e0e0 border=1>"
200 echo "<tr><th>Links:</th></tr>"
203 echo "</td></tr></table>"
206 } |
sed -s "s/^/$indent/"
209 # timestamps will not need padding to sort correctly, for some time...
210 for file in $
(ls -r source-
*.txt
)
212 basename=${file%.txt}
213 timestamp
=${basename#source-}
214 echo "<h6>$(make_date $timestamp)</h6>"
215 echo "<a name=$timestamp>"
216 echo "<h2>$(sed 1q < $file | markup)</h2>"
219 sed 1d
< $file | markup
222 sed -e "s/^./$indent&/" \
223 -e "/<pre>/,/<\/pre>/s/^$indent//"
232 # never, ever have spaces in the file names
233 commit_new_images
() {
235 for image
in $
(cat source-
* |
237 sed -n 's/.*\[\[Image://p' |
241 git add
$image || die
"Could not git add image $image"
242 images
="$images $image"
245 git update-index
--refresh &&
246 git diff-files
--quiet -- $images &&
247 git
diff --cached --quiet HEAD
-- $images ||
248 git commit
-s -m "Commit some images on $(make_date $now)" $images
252 # parse command line option
254 *dry
*) DRYRUN
=1; shift;;
255 *show
*) firefox
"$(pwd)"/$TEST; exit;;
256 *remote
*) firefox
$URLPREFIX$URL$OUTPUT; exit;;
260 die
"Usage: $0 [--dry-run]"
262 # make sure we're on the correct branch
263 test refs
/heads
/$BRANCH = $
(git symbolic-ref HEAD
) ||
264 die
"Not on branch $BRANCH"
266 # make sure there are no uncommitted changes
267 git update-index
--refresh &&
268 git diff-files
--quiet ||
269 die
"Have unstaged changes!"
271 # rename the new blog entry if it exists
274 mv -i $NEW source-
$now.txt
&&
275 git add source-
$now.txt
277 die
"Could not rename source.txt"
279 # commit the images that are referenced and not yet committed
280 test ! -z "$DRYRUN" ||
282 die
"Could not commit new images"
284 # to find the images reliably, we have to use the commit name, not the branch
285 # we use the latest commit touching an image file.
286 IMAGEFILES
="$(git ls-files |
287 grep -v '\.\(html\|gitignore\|in\|sh\|txt\)$')"
288 REV
=$
(git rev-list
-1 HEAD
-- $IMAGEFILES)
289 test -z "$REV" && REV
=$BRANCH
290 URL
="$REMOTEREPOSITORY?a=blob_plain;hb=$REV;f="
292 if test ! -z "$DRYRUN"
294 # Output to test.html and have local links into the current directory
299 make_html
> $OUTPUT || die
"Could not write $OUTPUT"
301 test ! -z "$DRYRUN" && {
307 git commit
-s -m "Update $(make_date $now)" &&
308 git push origin
+$BRANCH