]> git.plutz.net Git - shellwiki/blob - tools.sh
speed improvement: save fork when checking mdfile existence
[shellwiki] / tools.sh
1 #!/bin/sh
2
3 [ "$include_tools" ] && return 0
4 include_tools="$0"
5
6 if [ "$(which awk)" ]; then
7   md() { awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; }
8 elif [ "$(which busybox)" ]; then
9   md() { busybox awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; }
10 else
11   md() { cat; }
12 fi
13
14 mdfile(){
15   #  Check if page exists, if possible fall
16   #  back to default page from installation
17   local page="$(PATH "$1")"
18
19   if   [ -f "$_DATA/pages/$page/#page.md" ]; then
20     printf %s\\n "$_DATA/pages/$page/#page.md"
21     return 0
22   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
23     printf %s\\n "$_EXEC/pages/$page/#page.md"
24     return 0
25   else
26     return 1
27   fi 2>&-
28   #  ^^ suppress error messages produced
29   #     by printf when stdout was closed
30 }
31
32 size_human(){
33   local size="$1"
34
35   if [ $size -gt $((1024 * 1024 * 1024)) ]; then
36     size=$((size / 1024 / 1024 / 1024 * 10 + size / 1024 / 1024 % 1024 / 100))
37     printf "%i.%i GB" "$((size / 10))" "$((size % 10))"
38
39   elif [ $size -gt $((1024 * 1024)) ]; then
40     size=$((size / 1024 / 1024 * 10 + size / 1024 % 1024 / 100))
41     printf "%i.%i MB" "$((size / 10))" "$((size % 10))"
42
43   elif [ $size -gt $((1024)) ]; then
44     size=$((size / 1024 * 10 + size % 1024 / 100))
45     printf "%i.%i KB" "$((size / 10))" "$((size % 10))"
46
47   else
48     printf "%i B" "$size"
49   fi
50 }
51
52 page_glob(){
53   local pattern="${1%/}/" IFS=''
54   local glob page pagedir
55
56   case $pattern in
57   /*)
58     for glob in "$_DATA/pages"$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
59     for glob in "$_EXEC/pages"$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
60     ;;
61   *)
62     for glob in "$_DATA/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
63     for glob in "$_EXEC/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
64     ;;
65   esac \
66   | sort -u \
67   | while read -r page; do
68     case $page in
69       \#*|*/\#*) continue;;
70       *) pagedir="$(page_abs "$page")";;
71     esac
72     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
73     && printf '%s\n' "$page"
74   done
75 }
76
77 page_children(){
78   local page="${1:-${PATH_INFO}}" depth="${2:-1}"
79   local glob pagedir IFS=''
80   page="${page%/}/"
81
82   [ "$depth" -eq 0 ] && return 0
83
84   case $page in
85   /*)
86     for glob in "$_DATA/pages/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/"}"; done
87     for glob in "$_EXEC/pages/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/"}"; done
88     ;;
89   *)
90     for glob in "$_DATA/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
91     for glob in "$_EXEC/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
92     ;;
93   esac \
94   | sort -u \
95   | while read -r page; do
96     case $page in
97       \#*|*/\#*) continue;;
98       *) pagedir="$(page_abs "$page")";;
99     esac
100     if [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ]; then
101       printf %s\\n "$page"
102       page_children "$page" "$((depth - 1))"
103     fi
104   done
105 }
106
107 page_abs(){
108   case $1 in
109     /*) PATH "${1%/}/";;
110     *)  PATH "${PATH_INFO%/*}/${1%/}/";;
111   esac
112 }