summaryrefslogtreecommitdiff
path: root/http/bin/gmi2upphtml
diff options
context:
space:
mode:
Diffstat (limited to 'http/bin/gmi2upphtml')
-rwxr-xr-xhttp/bin/gmi2upphtml176
1 files changed, 176 insertions, 0 deletions
diff --git a/http/bin/gmi2upphtml b/http/bin/gmi2upphtml
new file mode 100755
index 0000000..608f4e8
--- /dev/null
+++ b/http/bin/gmi2upphtml
@@ -0,0 +1,176 @@
+#!/bin/sh -e
+
+post_title="${1:-}"
+
+is_in_list=0
+is_in_link_block=0
+is_in_preformatted_block=0
+is_in_blockquote=0
+
+if_in_list_then_close()
+{
+ if [ $is_in_list -ne 0 ]
+ then
+ echo "</ul>"
+ is_in_list=0
+ fi
+}
+
+if_in_link_block_then_close()
+{
+ if [ $is_in_link_block -ne 0 ]
+ then
+ echo "</p>"
+ is_in_link_block=0
+ fi
+}
+
+if_in_preformatted_block_then_close()
+{
+ if [ $is_in_preformatted_block -ne 0 ]
+ then
+ echo "</pre>"
+ is_in_preformatted_block=0
+ fi
+}
+
+if_in_blockquote_then_close()
+{
+ if [ $is_in_blockquote -ne 0 ]
+ then
+ echo "</blockquote>"
+ is_in_blockquote=0
+ fi
+}
+
+close_all_open_blocks()
+{
+ if_in_list_then_close
+ if_in_link_block_then_close
+ if_in_preformatted_block_then_close
+ if_in_blockquote_then_close
+}
+
+escape_upphtml()
+{
+ echo "$1" | sed "s/\`/\\\\\`/g" | sed "s/\"/\\\\\"/g" | sed "s/\\\$/\\\\\$/g"
+}
+
+close_all_open_blocks_except()
+{
+ except="$1"
+ if [ "$except" != "list" ]
+ then
+ if_in_list_then_close
+ fi
+ if [ "$except" != "link" ]
+ then
+ if_in_link_block_then_close
+ fi
+ if [ "$except" != "pre" ]
+ then
+ if_in_preformatted_block_then_close
+ fi
+ if [ "$except" != "blockquote" ]
+ then
+ if_in_blockquote_then_close
+ fi
+}
+
+if [ -z "$post_title" ]
+then
+ read first_line
+ if [ "$(echo "$first_line" | cut -c1-2)" != "# " ]
+ then
+ echo >&2 "Error: no [post_title] argument provided and no top-level heading at top of the document."
+ exit 1
+ fi
+ post_title="${first_line### }"
+fi
+
+echo "#!
+export TITLE=\"${post_title} | joeac's blog\"
+export DESCRIPTION=\"${post_title} | joeac's blog\"
+pp \"\${SHARE}\"/components/meta.upphtml
+#!"
+
+while read line
+do
+ if [ "$(echo $line | sed "s/[[:space:]]//g")" = "" ]
+ then
+ continue
+ fi
+
+ if [ "$(echo $line | cut -c1)" = "#" ]
+ then
+ title="$(escape_upphtml "${line#*# }")"
+ heading="${line%%$title}"
+ heading="${heading%% }"
+ heading_level="${#heading}"
+ if [ "$(echo "$line" | cut -c$(( $heading_level + 1 )) )" = " " ]
+ then
+ close_all_open_blocks
+ echo "<h${heading_level}>${title}</h${heading_level}>"
+ continue
+ fi
+ fi
+
+ if [ "$(echo "$line" | cut -c1-2)" = "=>" ]
+ then
+ close_all_open_blocks_except link
+ href="$(escape_upphtml "$(echo "$line" | sed "s/^=>[[:space:]]*\([[:alnum:][:punct:]]\+\).*$/\1/")")"
+ title="$(escape_upphtml "$(echo "$line" | sed "s/^=>[[:space:]]*[[:alnum:][:punct:]]\+[[:space:]]\(.*\)$/\1/")")"
+ if [ $is_in_link_block -eq 0 ]
+ then
+ echo "<p>"
+ else
+ echo "<br/>"
+ fi
+ is_in_link_block=1
+ echo "=> <a href='${href}'>${title}</a>"
+ continue
+ fi
+
+ if [ "$( echo "$line" | cut -c1-2)" = "* " ]
+ then
+ close_all_open_blocks_except list
+ if [ $is_in_list -eq 0 ]
+ then
+ echo "<ul>"
+ fi
+ is_in_list=1
+ echo "<li>$(escape_upphtml "$(echo "$line" | cut -c3-)")</li>"
+ continue
+ fi
+
+ if [ "$(echo "$line" | cut -c1)" = ">" ]
+ then
+ close_all_open_blocks_except blockquote
+ if [ $is_in_blockquote -eq 0 ]
+ then
+ echo "<blockquote>"
+ fi
+ is_in_blockquote=1
+ echo "<p>$(escape_upphtml "$(echo "$line" | cut -c2-)")</p>"
+ continue
+ fi
+
+ if [ "$(echo "$line" | cut -c1-3)" = "\`\`\`" ]
+ then
+ close_all_open_blocks_except pre
+ if [ $is_in_preformatted_block -eq 0 ]
+ then
+ echo "<pre>"
+ else
+ echo -e "\n"
+ fi
+ is_in_preformatted_block=1
+ echo "$(escape_upphtml "$(echo "$line" | cut -c4-)")"
+ continue
+ fi
+
+ close_all_open_blocks
+ echo "<p>$(escape_upphtml "${line}")</p>"
+done
+
+close_all_open_blocks