]> git.plutz.net Git - shellwiki/commitdiff
allow negative tag selection
authorPaul Hänsch <paul@plutz.net>
Tue, 14 Nov 2023 20:48:10 +0000 (21:48 +0100)
committerPaul Hänsch <paul@plutz.net>
Tue, 14 Nov 2023 20:48:10 +0000 (21:48 +0100)
macros/include
macros/pagelist
tools.sh

index fbc2ffffbde5b013584c5242bfc27cf244adf452..1fd734cbe5214b0a83fd73107c85a1f345d61064 100755 (executable)
@@ -18,7 +18,7 @@
 . "$_EXEC/acl.sh"
 . "$_EXEC/tools.sh"
 
-from='1'; to='$'; rev=''; items='$'; hl=0; link='true'; depth=0; tags=''; page='';
+from='1'; to='$'; rev=''; items='$'; hl=0; link='true'; depth=0; tags=''; ntags=''; page='';
 
 set -- "$@" --
 while [ $# -gt 0 ]; do case $1 in
@@ -33,6 +33,7 @@ while [ $# -gt 0 ]; do case $1 in
   --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
@@ -60,6 +61,7 @@ done \
   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")"
index 08764aabe4d91c4924557557c609f5037d9d489d..ced89eb1efedc8bf92ab66cc9b93ac2a09b51857 100755 (executable)
@@ -18,7 +18,7 @@
 . "$_EXEC/acl.sh"
 . "$_EXEC/tools.sh"
 
-tags='' dir='' depth='' glob_system_pages=false
+tags='' ntags='' dir='' depth='' glob_system_pages=false
 label='' labeltype='' altlabel='' cnt=0
 
 set -- "$@" --
@@ -26,6 +26,7 @@ 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;;
+  \!*) ntags="${ntags}${ntags:+ }${1##!}"; shift 1;;
   --h1|--h2|--h3|--h4|--h5|--h6|--label)
     labeltype="${1#--}" label="$2"; shift 2;;
   --alt-label)
@@ -54,7 +55,8 @@ done \
     if [ -f "$_DATA/pages/${pagedir}/#page.md" -o \
          -f "$_EXEC/pages/${pagedir}/#page.md" ] \
        && acl_read "$pagedir" \
-       && has_tags "$pagedir" $tags
+       && has_tags "$pagedir" $tags \
+       && ! has_tag "$pagedir" $ntags
     then
       [ "$cnt" -eq 0 -a "$label" ] \
       && printf '<%s class="macro pagelist label">%s</%s>' \
index 57ae8274cc6d1fde2a5be157531734c8b246832d..a298394c9cf5881cb4a764587302fe4467030d67 100755 (executable)
--- a/tools.sh
+++ b/tools.sh
@@ -151,11 +151,12 @@ page_abs(){
 }
 
 has_tags() {
+  # true if PAGE is tagges with all TAGS
   local page="$(page_abs "$1")"; shift 1;
   local tdir="$_DATA/tags" tag dt df
 
   for tag in "$@"; do
-    tag="$(printf %s "$tag" |awk '{ sub(/^#/, ""); gsub(/[^[:alnum:]]/, "_"); print toupper($0); }')"
+    tag="$(printf %s "$tag" |awk '{ sub(/^[#!]/, ""); gsub(/[^[:alnum:]]/, "_"); print toupper($0); }')"
     dt="$(DBM "${tdir}/${tag}" get "${page}")" || return 1
     df="$(stat -c %Y "$(mdfile "$page")")" || return 1
     if [ "$df" -gt "$dt" ]; then
@@ -165,3 +166,22 @@ has_tags() {
   done
   return 0
 }
+
+has_tag() {
+  # true if PAGE is tagged with any of TAGS
+  local page="$(page_abs "$1")"; shift 1;
+  local tdir="$_DATA/tags" tag dt df
+
+  for tag in "$@"; do
+    tag="$(printf %s "$tag" |awk '{ sub(/^[#!]/, ""); gsub(/[^[:alnum:]]/, "_"); print toupper($0); }')"
+    dt="$(DBM "${tdir}/${tag}" get "${page}")" || continue
+    df="$(stat -c %Y "$(mdfile "$page")")" || return 1
+    if [ "$df" -gt "$dt" ]; then
+      DBM "${tdir}/${tag}" remove "${page}"
+      continue
+    else
+      return 0
+    fi
+  done
+  return 1
+}