X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=tools.sh;h=b19a83d92c5c87be2005c6e3035982275aa69548;hb=HEAD;hp=a298394c9cf5881cb4a764587302fe4467030d67;hpb=fed4d5f078dbbb6c730ddd7ab8c0157afb460fe1;p=shellwiki diff --git a/tools.sh b/tools.sh index a298394..b19a83d 100755 --- a/tools.sh +++ b/tools.sh @@ -3,7 +3,7 @@ [ "$include_tools" ] && return 0 include_tools="$0" -# Copyright 2022 - 2023 Paul Hänsch +# 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 @@ -19,6 +19,10 @@ include_tools="$0" . "${_EXEC}/cgilite/storage.sh" +CACHE_AGE=${CACHE_AGE:-300} +export MD_MACROS="$_EXEC/macros" +export MD_HTML="${MD_HTML:-false}" + md(){ local parser @@ -57,6 +61,34 @@ mdfile(){ return 0 } +wiki() { + # Print content of a wiki page + # Get page from data or underlay dir, handle caching + local page="$(PATH "$1")" mdfile cache cachetime + + cache="$_DATA/pages/$page/#page:${LANGUAGE}.${USER_ID}.cache" + + mdfile="$(mdfile "$page")" || return 4 + acl_read "$page" || return 3 + + cachetime="$(stat -c %Y -- "$mdfile" "$cache" 2>/dev/null)" + + if [ "${cachetime#*${BR}}" -gt "${cachetime%${BR}*}" \ + -a "${cachetime#*${BR}}" -gt "$((_DATE - CACHE_AGE))" ]; then + cat "${cache}" + else + mkdir -p -- "$_DATA/pages/$page/" + # Macros expect to find page directory as working dir + ( cd -- "$_DATA/pages/$page/"; + md <"$mdfile" \ + | tee -- "${cache}.$$" + ) + grep -q '^%nocache' "$mdfile" \ + && rm -- "${cache}.$$" \ + || mv -- "${cache}.$$" "${cache}" + fi +} + size_human(){ local size="$1" @@ -185,3 +217,38 @@ has_tag() { done return 1 } + +page_title() { + local mdfile='' PAGE_TITLE='' + + if mdfile="$(mdfile "${1}")"; then + PAGE_TITLE="$( + # pick title from %title pragma + sed -nE ' + s;^%title[ \t]+([[:graph:]][[:print:]]+)\r?$;\1;p; tQ; + b; :Q q; + ' "$mdfile" + )" + [ ! "${PAGE_TITLE}" ] && PAGE_TITLE="$( + # pick title from first h1/h2 headline + MD_MACROS="" md <"$mdfile" \ + | sed -nE ' + s;^.*]*>(.*>)?([^<]+)(<.*)?.*$;\2;; tQ; + s;^.*]*>(.*>)?([^<]+)(<.*)?.*$;\2;; tQ; + b; :Q + # reverse escapes of cgilite HTML function, + # to prevent later double escaping + # later escaping must not be omited + s/<//g; s/"/'\"'/g; s/'/'\''/g; + s/[/[/g; s/]/]/g; s/ /\r/g; s/&/\&/g; + p; q; + ' + )" + fi + if [ ! "${PAGE_TITLE}" ]; then + # use last part of page URL as title + PAGE_TITLE="${1%/}" + PAGE_TITLE="${PAGE_TITLE##*/}" + fi + printf %s\\n "$PAGE_TITLE" +}