#!/bin/sh # Copyright 2022 - 2024 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" . "$_EXEC/db23.sh" tags='' ntags='' dir='' depth='' glob_system_pages=false label='' labeltype='' altlabel='' titles='' db3_data='' DB3 new # Use DB3 for in-memory cache set -- "$@" -- while [ $# -gt 0 ]; do case $1 in --system) glob_system_pages=true; shift 1;; --depth) depth="$2"; shift 2;; --title|--titles) titles=true; shift 1;; \#*) tags="${tags}${tags:+ }${1###}"; shift 1;; \!*) ntags="${ntags}${ntags:+ }${1##!}"; shift 1;; --h1|--h2|--h3|--h4|--h5|--h6|--label) labeltype="${1#--}" label="$2"; shift 2;; --alt-label|--altlabel) altlabel="$2"; shift 2;; --) shift 1; break;; *) if [ ! "$dir" ]; then dir="$1" set -- "$@" "$1"; shift 1; elif [ ! "$depth" ]; then depth="$1"; shift 1; else set -- "$@" "$1"; shift 1; fi;; esac; done [ "$*" ] || set -- "*" [ "$depth" -ge 0 -o "$depth" -le 0 ] 2>&- || depth=0 print_page() { # print page URL and resolve page title (for use with --title flag) # avoid calling this function via a subshell (i.e. $(print_page *)) # because it should be able to write its cache variable local page="${1%/}/" title='' pfrag='' pfrag="${page}" # resolve name of each path element while [ "${pfrag%/*}" -a "${pfrag%/*}" != "${pfrag}" ]; do pfrag="${pfrag%/*}" title="$(DB3 get "${pfrag}" || ! page_title "$(page_abs "${pfrag}")")/${title}" && break done # keep resolved names in cache DB3 set "${page%/*}" "${title%/}" [ "${page#/}" != "${page}" ] && title="/$title" printf '%s %s\n' "$(URL "$page")" "$(HTML "${title}")" } pagelist="$( for dir in "$@"; do page_glob "$dir" "$depth" done \ | sort -u \ | while read -r page; do pagedir="$(page_abs "$page")" if [ -f "$_DATA/pages/${pagedir}/#page.md" -o \ -f "$_EXEC/pages/${pagedir}/#page.md" ] \ && acl_read "$pagedir" \ && has_tags "$pagedir" $tags \ && ! has_tag "$pagedir" $ntags then # Be careful, not to fork the print_page function into a subshell # as it must be able to write its cache to the current context [ "$titles" ] \ && print_page "$page" \ || printf '%s %s\n' "$(URL "$page")" "$(HTML "$page")" fi done )" if [ "$pagelist" ]; then [ "$label" ] \ && printf '<%s class="macro pagelist label">%s%s>' "$labeltype" "$(HTML "$label")" "$labeltype" printf '