From 503e611b5be02c1dcf99c7c509090004df258990 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Tue, 4 Nov 2025 13:08:50 +0100 Subject: [PATCH] macro for displaying page teasers, mostly a copy of include macro --- macros/Teaser | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 macros/Teaser diff --git a/macros/Teaser b/macros/Teaser new file mode 100755 index 0000000..55ae1fb --- /dev/null +++ b/macros/Teaser @@ -0,0 +1,122 @@ +#!/bin/sh + +# Copyright 2022 - 2023 Paul Hänsch +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +. "$_EXEC/cgilite/cgilite.sh" +. "$_EXEC/acl.sh" +. "$_EXEC/tools.sh" + +from='/^::: {\([^}]* \)*teaser\( [^}]*\)*}/'; to='/^:::/'; rev=''; items='$'; hl=0; link='true'; depth=0; tags=''; ntags=''; page=''; + +set -- "$@" -- +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;; + --nolink) link=""; shift 1;; + --hl|-hl) hl=$2; shift 2;; + --depth) depth=$2; shift 2;; + \#*) tags="${tags}${tags:+ }${1}"; shift 1;; + \!*) ntags="${ntags}${ntags:+ }${1}"; shift 1;; + --) shift 1; break;; + *) set -- "$@" "$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 + +for page in "$@"; do + page_glob "$page" "$depth" +done \ +| sort $rev \ +| sed "${items}q" \ +| while read glob; do + page="$(page_abs "$glob")" + mdfile="$(mdfile "$page")" || continue + acl_read "$page" || continue + has_tags "$page" $tags || continue + has_tag "$page" $ntags && continue + printf %s\\n "$INCLUDE_LIST" |grep -qxF "$page" && continue + export INCLUDE_LIST="${INCLUDE_LIST}${INCLUDE_LIST:+${BR}}$page" + hglob="$(HTML "$glob")" + refpfx="$(printf %s\\n "$hglob" |sed 's;[\;&\;];\\&;g')" + [ "$link" ] \ + && printf '
+ %s +
' \ + "${hglob}" "${hglob}" "${hglob}" \ + || printf '
+
' \ + "${hglob}" + ( # PATH_INFO may be used by macros in the included page + export PATH_INFO="$page" + cd -- "${mdfile%/*}/" + sed -n "${from},${to}p" <"$mdfile" \ + | md \ + | grep -vx '' + ) | sed -E ' + s;(<[^>]+ )(href|src)="([^"]+://[^"]*|[mM][aA][iI][lL][tT][oO]:[^"]*)"([^>]*>);\1\2="/#safe/\3"\4;g + s;(<[^>]+ )(href|src)="([^#/"][^"]*)"([^>]*>);\1\2="'"${refpfx}"'\3"\4;g + s;(<[^>]+ )(href|src)="/#safe/([^"]*)"([^>]*>);\1\2="\3"\4;g + ' | case $hl in + 1) sed -E 's;();\16\2;g; + s;();\15\2;g; + s;();\14\2;g; + s;();\13\2;g; + s;();\12\2;g; + ';; + 2) sed -E 's;();\16\2;g; + s;();\16\2;g; + s;();\15\2;g; + s;();\14\2;g; + s;();\13\2;g; + ';; + 3) sed -E 's;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + s;();\15\2;g; + s;();\14\2;g; + ';; + 4) sed -E 's;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + s;();\15\2;g; + ';; + 5|[6789]) + sed -E 's;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + s;();\16\2;g; + ';; + *) cat;; + esac + printf '
' +done -- 2.39.5