]> git.plutz.net Git - shellwiki/commitdiff
include macro
authorPaul Hänsch <paul@plutz.net>
Tue, 17 May 2022 21:25:40 +0000 (23:25 +0200)
committerPaul Hänsch <paul@plutz.net>
Tue, 17 May 2022 21:25:40 +0000 (23:25 +0200)
macros/include [new file with mode: 0755]

diff --git a/macros/include b/macros/include
new file mode 100755 (executable)
index 0000000..97f35a4
--- /dev/null
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+. "$_EXEC/cgilite/cgilite.sh"
+. "$_EXEC/acl.sh"
+. "$_EXEC/tools.sh"
+
+from=1
+to=\$
+rev=''
+items=\$
+path_info="$PATH_INFO"
+
+while [ $# -gt 0 ]; do case $1 in
+  --from) from="$2"; shift 2;;
+  from=*) from="${1#*=}"; shift 1;;
+  --to) to="$2"; shift 2;;
+  to=*) to="${1#*=}"; shift 1;;
+  --items) items="$2"; shift 2;;
+  items=*) items="${1#*=}"; shift 1;;
+  --rev|--reverse) rev="-r"; shift 1;;
+  *) page="$1"; shift 1;;
+esac; done
+
+if ! printf %s\\n "$from" |grep -qEx '[0-9]+|/([^/\\]|\\/|\\.)*/'; then
+  debug 'Include macro invalid argument: "from"'
+  exit 1
+fi
+if ! printf %s\\n "$to" |grep -qEx '[0-9]+|/([^/\\]|\\/|\\.)*/'; then
+  debug 'Include macro Invalid argument: "to"'
+  exit 1
+fi
+if ! printf %s\\n "$items" |grep -qEx '\$|[0-9]+'; then
+  debug 'Include macro Invalid argument: "items"'
+  exit 1
+fi
+
+page_glob "$page" \
+| sort $rev \
+| sed "${items}q" \
+| while read glob; do
+  case $glob in
+    /*) export PATH_INFO="$(PATH "$glob")";;
+     *) export PATH_INFO="$(PATH "$path_info/$glob")";;
+  esac
+  acl_read || continue
+  if   [ -f "$_DATA/pages/$PATH_INFO/#page.md" ]; then
+     mdfile="$_DATA/pages/$PATH_INFO/#page.md"
+  elif [ -f "$_EXEC/pages/$PATH_INFO/#page.md" ]; then
+     mdfile="$_EXEC/pages/$PATH_INFO/#page.md"
+  else
+    continue
+  fi
+  printf '<div class="macro include" page="%s">' "$(HTML "$glob")"
+  ( cd "${mdfile%/*}"
+    sed -n "${from},${to}p" <"$mdfile" \
+    | sed -E '1,20{ /^%[a-z]+/d; }' \
+    | md \
+    | grep -vx ''
+  ) | sed -E '
+    s;(<[^>]+ )(href|src)="([^#/"][^"]*)"([^>]*>);\1\2="'"$(HTML "$glob")"'\3"\4;g
+  '
+  printf '</div>'
+done