From 21fd5c66eecedddd0bf33379a6d3731ea6ea3a7e Mon Sep 17 00:00:00 2001
From: Case Duckworth
Date: Fri, 6 Jan 2023 16:22:15 -0600
Subject: Add plugins

Plugins	go in the vienna directory as hidden .sh files.  They're sourced by
vienna so pages or whatever can use them.
---
 plugins/el.sh | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 vienna        |  11 ++++
 2 files changed, 213 insertions(+)
 create mode 100644 plugins/el.sh

diff --git a/plugins/el.sh b/plugins/el.sh
new file mode 100644
index 0000000..6d0780a
--- /dev/null
+++ b/plugins/el.sh
@@ -0,0 +1,202 @@
+# el.sh --- insert html elements using sh
+
+### Code:
+
+el() { # el NAME ARGS...
+    ## Create an HTML element named NAME using ARGS.
+    # Any ARGS that contain an equals sign will be made into attributes of the
+    # element, until the special argument '--' which will stop attribute
+    # processing.  While some nesting is possible with 'el', the way bash
+    # expansion works it's not great.
+    #
+    # No validation is done on any arguments in this function.  It could create
+    # something that looks vaguely like an HTML element but isn't valid.
+    _name="$1"; shift || return 1 # Require at least an element name
+    _element="\\<$_name"
+    _content=""
+    _process_args=true
+
+    while test -n "$1"; do
+        case "$1" in
+            --) if "$_process_args"; then
+                    _process_args=false
+                else
+                    _content="$_content${_content:+ }$1"
+                fi
+                ;;
+            *=*)
+                if "$_process_args"; then
+                    _element="$_element ${1%%=*}=\"${1#*=}\""
+                else
+                    _content="$_content${_content:+ }$1"
+                fi
+                ;;
+            *)
+                if "$_process_args"; then
+                    _process_args=false
+                fi
+                _content="$_content${_content:+ }$1"
+                ;;
+        esac
+        shift
+    done
+    _element="$_element\\>"
+    printf '%s%s\\</%s\\>\n' "$_element" "$_content" "$_name"
+}
+
+### HTML5 element aliases
+## These come from https://developer.mozilla.org/en-US/docs/Web/HTML/Element
+
+# To avoid clobbering the shell's namespace, a prefix is used.  Change this
+# variable when sourcing el.sh in order to change or disable the prefix.  E.g.:
+# $ EL_PREFIX= . ./el.sh
+# $ EL_PREFIX=HTML . ./el.sh
+: "${EL_PREFIX:=_}"
+
+for e in \
+    html \
+        base \
+        head \
+        link \
+        meta \
+        style \
+        title \
+        body \
+        address \
+        article \
+        aside \
+        footer \
+        header \
+        h1 \
+        h2 \
+        h3 \
+        h4 \
+        h5 \
+        h6 \
+        main \
+        nav \
+        section \
+        blockquote \
+        dd \
+        div \
+        dl \
+        dt \
+        figcaption \
+        figure \
+        hr \
+        li \
+        menu \
+        ol \
+        p \
+        pre \
+        ul \
+        a \
+        abbr \
+        b \
+        bdi \
+        bdo \
+        br \
+        cite \
+        code \
+        data \
+        dfn \
+        em \
+        i \
+        kbd \
+        mark \
+        q \
+        rp \
+        rt \
+        ruby \
+        s \
+        samp \
+        small \
+        span \
+        strong \
+        sub \
+        sup \
+        time \
+        u \
+        var \
+        wbr \
+        area \
+        audio \
+        img \
+        map \
+        track \
+        video \
+        embed \
+        iframe \
+        object \
+        picture \
+        portal \
+        source \
+        svg \
+        math \
+        canvas \
+        noscript \
+        script \
+        del \
+        ins \
+        caption \
+        col \
+        colgroup \
+        table \
+        tbody \
+        td \
+        tfoot \
+        th \
+        thead \
+        tr \
+        button \
+        datalist \
+        fieldset \
+        form \
+        input \
+        label \
+        legend \
+        meter \
+        optgroup \
+        option \
+        output \
+        progress \
+        select \
+        textarea \
+        details \
+        dialog \
+        summary \
+        slot \
+        template \
+        acronym \
+        applet \
+        bgsound \
+        big \
+        blink \
+        center \
+        content \
+        dir \
+        font \
+        frame \
+        frameset \
+        image \
+        keygen \
+        marquee \
+        menuitem \
+        nobr \
+        noembed \
+        noframes \
+        param \
+        plaintext \
+        rb \
+        rtc \
+        shadow \
+        spacer \
+        strike \
+        tt \
+        xmp \
+    ; do
+    eval "alias $EL_PREFIX$e='el $e'"
+done
+
+
+# el.sh ends here
diff --git a/vienna b/vienna
index 5528463..dba855b 100755
--- a/vienna
+++ b/vienna
@@ -105,6 +105,17 @@ main() {
         log "Can't find configuration \`$CONFIG'."
         exit 2
     fi
+    ## Plugins
+    # Plugins are .*.sh files in build directory.  They're sourced here.
+    for plugin in ./.*.sh; do
+	case "$plugin" in
+	    *"$CONFIG"*) continue ;;
+	    *)
+		log plugin "source $plugin"
+		. "$plugin"
+		;;
+	esac
+    done
     mkdir -p "$OUTD" || exit 2
     mkdir -p "$TMPD" || exit 2
     # Build pages
-- 
cgit 1.4.1-21-gabe81