summaryrefslogtreecommitdiff
path: root/modules/html.source.sh
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2021-05-11 19:54:23 +0100
committerPaul Buetow <git@mx.buetow.org>2021-05-21 05:11:04 +0100
commita453bf2f909e0ea01b0649ce8dc42d54689f738f (patch)
treec8da545ea95fae6a9d6c4658f0318afd3ac58ccf /modules/html.source.sh
parentad828d07774d29f129e1c92ed59baa8c7d75418b (diff)
refactor
Diffstat (limited to 'modules/html.source.sh')
-rw-r--r--modules/html.source.sh147
1 files changed, 147 insertions, 0 deletions
diff --git a/modules/html.source.sh b/modules/html.source.sh
new file mode 100644
index 0000000..9fb4a30
--- /dev/null
+++ b/modules/html.source.sh
@@ -0,0 +1,147 @@
+html::special () {
+ $SED '
+ s|\&|\&amp;|g;
+ s|<|\&lt;|g;
+ s|>|\&gt;|g;
+ ' <<< "$@"
+}
+
+html::make_paragraph () {
+ local -r text="$1"; shift
+ test -n "$text" && echo "<p>$(html::special "$text")</p>"
+}
+
+html::make_heading () {
+ local -r text=$($SED -E 's/^#+ //' <<< "$1"); shift
+ local -r level="$1"; shift
+
+ echo "<h${level}>$(html::special "$text")</h${level}>"
+}
+
+html::make_quote () {
+ local -r quote="${1/> }"
+ echo "<pre>$(html::special "$quote")</pre>"
+}
+
+html::make_img () {
+ local link="$1"; shift
+ local descr="$1"; shift
+
+ if [ -z "$descr" ]; then
+ echo -n "<a href=\"$link\"><img src=\"$link\" /></a>"
+ else
+ echo -n "<i>$descr:</i>"
+ echo -n "<a href=\"$link\"><img alt=\"$descr\" title=\"$descr\" src=\"$link\" /></a>"
+ fi
+
+ echo "<br />"
+}
+
+html::make_link () {
+ local link="$1"; shift
+ local descr="$1"; shift
+
+ grep -F -q '://' <<< "$link" || link=${link/.gmi/.html}
+ test -z "$descr" && descr="$link"
+ echo "<a class=\"textlink\" href=\"$link\">$descr</a><br />"
+}
+
+html::fromgmi () {
+ local -r gmi_file=$1
+ local -i is_list=0
+ local -i is_plain=0
+
+ while IFS='' read -r line; do
+ if [ $is_list -eq 1 ]; then
+ if [[ "$line" == '* '* ]]; then
+ echo "<li>${line/\* /}</li>"
+ else
+ is_list=0
+ echo "</ul>"
+ fi
+ continue
+
+ elif [ $is_plain -eq 1 ]; then
+ if [[ "$line" == '```'* ]]; then
+ echo "</pre>"
+ is_plain=0
+ else
+ html::special "$line"
+ fi
+ continue
+ fi
+
+ case "$line" in
+ '* '*)
+ is_list=1
+ echo "<ul>"
+ echo "<li>${line/\* /}</li>"
+ ;;
+ '```'*)
+ is_plain=1
+ echo "<pre>"
+ ;;
+ '# '*)
+ html::make_heading "$line" 1
+ ;;
+ '## '*)
+ html::make_heading "$line" 2
+ ;;
+ '### '*)
+ html::make_heading "$line" 3
+ ;;
+ '> '*)
+ html::make_quote "$line"
+ ;;
+ '=> '*)
+ generate::make_link html "$line"
+ ;;
+ *)
+ html::make_paragraph "$line"
+ ;;
+ esac
+ done
+}
+
+html::test () {
+ local line='Hello world! This is a paragraph.'
+ assert::equals "$(html::make_paragraph "$line")" '<p>Hello world! This is a paragraph.</p>'
+
+ line=''
+ assert::equals "$(html::make_paragraph "$line")" ''
+
+ line='Foo &<>& Bar!'
+ assert::equals "$(html::make_paragraph "$line")" '<p>Foo &amp;&lt;&gt;&amp; Bar!</p>'
+
+ line='# Header 1'
+ assert::equals "$(html::make_heading "$line" 1)" '<h1>Header 1</h1>'
+
+ line='## Header 2'
+ assert::equals "$(html::make_heading "$line" 2)" '<h2>Header 2</h2>'
+
+ line='### Header 3'
+ assert::equals "$(html::make_heading "$line" 3)" '<h3>Header 3</h3>'
+
+ line='> This is a quote'
+ assert::equals "$(html::make_quote "$line")" '<pre>This is a quote</pre>'
+
+ line='=> https://example.org'
+ assert::equals "$(generate::make_link html "$line")" \
+ '<a class="textlink" href="https://example.org">https://example.org</a><br />'
+
+ line='=> index.gmi'
+ assert::equals "$(generate::make_link html "$line")" \
+ '<a class="textlink" href="index.html">index.html</a><br />'
+
+ line='=> http://example.org Description of the link'
+ assert::equals "$(generate::make_link html "$line")" \
+ '<a class="textlink" href="http://example.org">Description of the link</a><br />'
+
+ line='=> http://example.org/image.png'
+ assert::equals "$(generate::make_link html "$line")" \
+ '<a href="http://example.org/image.png"><img src="http://example.org/image.png" /></a><br />'
+
+ line='=> http://example.org/image.png Image description'
+ assert::equals "$(generate::make_link html "$line")" \
+ '<i>Image description:</i><a href="http://example.org/image.png"><img alt="Image description" title="Image description" src="http://example.org/image.png" /></a><br />'
+}