]> git.plutz.net Git - shellwiki/blob - tools.sh
LICENSE NOTICE: ISC License
[shellwiki] / tools.sh
1 #!/bin/sh
2
3 [ "$include_tools" ] && return 0
4 include_tools="$0"
5
6 # Copyright 2022 - 2023 Paul Hänsch
7
8 # Permission to use, copy, modify, and/or distribute this software for any
9 # purpose with or without fee is hereby granted, provided that the above
10 # copyright notice and this permission notice appear in all copies.
11
12 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
15 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
18 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 md(){
21   local parser
22
23   if [ "$#" = 0 ]; then
24     md "${_EXEC}"/parsers/*
25   elif [ "$#" = 1 ]; then
26     "$1"
27   else
28     parser="$1"
29     shift 1
30     "$parser" |md "$@"
31   fi
32 }
33
34 mdfile(){
35   #  Check if page exists, if possible fall
36   #  back to default page from installation
37   local page="$(PATH "$1")"
38   page="${page%/}"
39
40   # Regular processing, keep in sync with tools.sh
41   if   [ -f "$_DATA/pages/$page/:$LANGUAGE/#page.md"  ]; then
42     printf %s\\n "$_DATA/pages/$page/:$LANGUAGE/#page.md"
43   elif [ -f "$_DATA/pages/$page/#page.md" ]; then
44     printf %s\\n "$_DATA/pages/$page/#page.md"
45   elif [ -f "$_EXEC/pages/$page/:$LANGUAGE/#page.md"  ]; then
46     printf %s\\n "$_EXEC/pages/$page/:$LANGUAGE/#page.md"
47   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
48     printf %s\\n "$_EXEC/pages/$page/#page.md"
49   else
50     return 1
51   fi 2>&-
52   #  ^^ suppress error messages produced
53   #     by printf when stdout was closed
54
55   return 0
56 }
57
58 size_human(){
59   local size="$1"
60
61   if [ $size -gt $((1024 * 1024 * 1024)) ]; then
62     size=$((size / 1024 / 1024 / 1024 * 10 + size / 1024 / 1024 % 1024 / 100))
63     printf "%i.%i GB" "$((size / 10))" "$((size % 10))"
64
65   elif [ $size -gt $((1024 * 1024)) ]; then
66     size=$((size / 1024 / 1024 * 10 + size / 1024 % 1024 / 100))
67     printf "%i.%i MB" "$((size / 10))" "$((size % 10))"
68
69   elif [ $size -gt $((1024)) ]; then
70     size=$((size / 1024 * 10 + size % 1024 / 100))
71     printf "%i.%i KB" "$((size / 10))" "$((size % 10))"
72
73   else
74     printf "%i B" "$size"
75   fi
76 }
77
78 attachment_glob(){
79   local pattern="${1%/}" IFS=''
80   local glob page pagedir
81
82   page="${pattern%/*}"
83   [ "$page" = "$pattern" ] && page=.
84   [ ! "$page" ] && page=/
85   pattern="${pattern##*/}"
86   [ ! "$pattern" ] && pattern="*"
87
88   case $page in
89   /*)
90     for glob in "$_DATA/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
91     for glob in "$_EXEC/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
92     ;;
93   *)
94     for glob in "$_DATA/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
95     for glob in "$_EXEC/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
96     ;;
97   esac \
98   | sort -u \
99   | while read -r glob; do
100     [ -e "$glob" ] || continue
101     pagedir="$(page_abs "${glob%%/#attachments/*}/")"
102     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
103     && printf '%s\n' "${glob%%/#attachments/*}/${glob#*/#attachments/}"
104   done
105 }
106
107 page_glob(){
108   local pattern="${1%/}/" depth="${2:-0}" IFS=''
109   local glob page pagedir
110
111   case $pattern in
112   /*)
113     for glob in "$_DATA/pages"$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
114     for glob in "$_EXEC/pages"$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
115     ;;
116   *)
117     for glob in "$_DATA/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
118     for glob in "$_EXEC/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
119     ;;
120   esac \
121   | sort -u \
122   | while read -r page; do
123     # Not a page directory (just a metadata dir)
124     [ ! "${page%%#*}" -o ! "${page%%*/#*}" ] && continue
125
126     # Omit "system" pages unless explicitly wanted
127     [ ! "${page%%\[*\]/*}" -o ! "${page%%*/\[*\]/*}" ] && [ "$glob_system_pages" != true ] && continue
128
129     # Omit translation pages if translations are enabled
130     [ ! "${page%%:*}" -o ! "${page%%*/:*}" ] && [ "$LANGUAGE_DEFAULT" ] && continue
131
132     pagedir="$(page_abs "$page")"
133
134     if [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ]; then
135       printf '%s\n' "$page"
136       if ! [ "$depth" -eq 0 ]; then
137         PATH_INFO="$pagedir" page_glob "*" "$((depth - 1))" \
138         | while read -r glob; do printf %s%s\\n "$page" "$glob"; done
139       fi
140     fi
141   done
142 }
143
144 page_abs(){
145   case $1 in
146     /*) PATH "${1%/}/";;
147     *)  PATH "${PATH_INFO%/*}/${1%/}/";;
148   esac
149 }