-dir="${1:-./}"
-depth="${2:-1}"
-
-printf '<ul class="pagelist">\n'
- page_glob "$dir" \
- | while read -r glob; do
- printf %s\\n "$glob"
- page_children "$glob" "$((depth - 1))"
- done \
- | while read -r page; do
- case $page in
- /*) pagedir="$(PATH "$page")";;
- *) pagedir="$(PATH "$PATH_INFO/$page")";;
- esac
- [ -f "$_DATA/pages/${pagedir}/#page.md" -o \
- -f "$_EXEC/pages/${pagedir}/#page.md" ] \
- && acl_read "$pagedir" \
- && printf '<li><a href="%s">%s</a></li>' "$(HTML "$page")" "$(HTML "$page")"
+tags='' dir='' depth='' glob_system_pages=false
+label='' labeltype='' altlabel='' cnt=0
+
+set -- "$@" --
+while [ $# -gt 0 ]; do case $1 in
+ --system) glob_system_pages=true; shift 1;;
+ --depth) depth="$2" shift 2;;
+ \#*) tags="${tags}${tags:+ }${1###}"; shift 1;;
+ --h1|--h2|--h3|--h4|--h5|--h6|--label)
+ labeltype="${1#--}" label="$2"; shift 2;;
+ --alt-label)
+ 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
+
+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
+ then
+ [ "$cnt" -eq 0 -a "$label" ] \
+ && printf '<%s class="macro pagelist label">%s</%s>' \
+ "$labeltype" "$(HTML "$label")" "$labeltype"
+ [ "$cnt" -eq 0 ] && printf '<ul class="macro pagelist">\n'
+
+ printf '<li><a href="%s">%s</a></li>' "$(HTML "$page")" "$(HTML "$page")"
+ cnt="$((cnt + 1))"
+ fi