]> git.plutz.net Git - shellwiki/blob - tools.sh
avoid nonexitent globs in attachment_glob() (i.e. foo-*.bar)
[shellwiki] / tools.sh
1 #!/bin/sh
2
3 [ "$include_tools" ] && return 0
4 include_tools="$0"
5
6 md(){
7   local parser
8
9   if [ "$#" = 0 ]; then
10     md "${_EXEC}"/parsers/*
11   elif [ "$#" = 1 ]; then
12     "$1"
13   else
14     parser="$1"
15     shift 1
16     "$parser" |md "$@"
17   fi
18 }
19
20 mdfile(){
21   #  Check if page exists, if possible fall
22   #  back to default page from installation
23   local page="$(PATH "$1")"
24   page="${page%/}"
25
26   # Regular processing, keep in sync with tools.sh
27   if   [ -f "$_DATA/pages/$page/:$LANGUAGE/#page.md"  ]; then
28     printf %s\\n "$_DATA/pages/$page/:$LANGUAGE/#page.md"
29   elif [ -f "$_DATA/pages/$page/#page.md" ]; then
30     printf %s\\n "$_DATA/pages/$page/#page.md"
31   elif [ -f "$_EXEC/pages/$page/:$LANGUAGE/#page.md"  ]; then
32     printf %s\\n "$_EXEC/pages/$page/:$LANGUAGE/#page.md"
33   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
34     printf %s\\n "$_EXEC/pages/$page/#page.md"
35   else
36     return 1
37   fi 2>&-
38   #  ^^ suppress error messages produced
39   #     by printf when stdout was closed
40
41   return 0
42 }
43
44 size_human(){
45   local size="$1"
46
47   if [ $size -gt $((1024 * 1024 * 1024)) ]; then
48     size=$((size / 1024 / 1024 / 1024 * 10 + size / 1024 / 1024 % 1024 / 100))
49     printf "%i.%i GB" "$((size / 10))" "$((size % 10))"
50
51   elif [ $size -gt $((1024 * 1024)) ]; then
52     size=$((size / 1024 / 1024 * 10 + size / 1024 % 1024 / 100))
53     printf "%i.%i MB" "$((size / 10))" "$((size % 10))"
54
55   elif [ $size -gt $((1024)) ]; then
56     size=$((size / 1024 * 10 + size % 1024 / 100))
57     printf "%i.%i KB" "$((size / 10))" "$((size % 10))"
58
59   else
60     printf "%i B" "$size"
61   fi
62 }
63
64 attachment_glob(){
65   local pattern="${1%/}" IFS=''
66   local glob page pagedir
67
68   page="${pattern%/*}"
69   [ "$page" = "$pattern" ] && page=.
70   [ ! "$page" ] && page=/
71   pattern="${pattern##*/}"
72   [ ! "$pattern" ] && pattern="*"
73
74   case $page in
75   /*)
76     for glob in "$_DATA/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
77     for glob in "$_EXEC/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
78     ;;
79   *)
80     for glob in "$_DATA/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
81     for glob in "$_EXEC/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
82     ;;
83   esac \
84   | sort -u \
85   | while read -r glob; do
86     [ -e "$glob" ] || continue
87     pagedir="$(page_abs "${glob%%/#attachments/*}/")"
88     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
89     && printf '%s\n' "${glob%%/#attachments/*}/${glob#*/#attachments/}"
90   done
91 }
92
93 page_glob(){
94   local pattern="${1%/}/" IFS=''
95   local glob page pagedir
96
97   case $pattern in
98   /*)
99     for glob in "$_DATA/pages"$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
100     for glob in "$_EXEC/pages"$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
101     ;;
102   *)
103     for glob in "$_DATA/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
104     for glob in "$_EXEC/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
105     ;;
106   esac \
107   | sort -u \
108   | while read -r page; do
109     case $page in
110       \#*|*/\#*) continue;;
111       *) pagedir="$(page_abs "$page")";;
112     esac
113     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
114     && printf '%s\n' "$page"
115   done
116 }
117
118 page_children(){
119   local page="${1:-${PATH_INFO}}" depth="${2:-1}"
120   local glob pagedir IFS=''
121   page="${page%/}/"
122
123   [ "$depth" -eq 0 ] && return 0
124
125   case $page in
126   /*)
127     for glob in "$_DATA/pages/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/"}"; done
128     for glob in "$_EXEC/pages/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/"}"; done
129     ;;
130   *)
131     for glob in "$_DATA/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
132     for glob in "$_EXEC/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
133     ;;
134   esac \
135   | sort -u \
136   | while read -r page; do
137     case $page in
138       \#*|*/\#*) continue;;
139       *) pagedir="$(page_abs "$page")";;
140     esac
141     if [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ]; then
142       printf %s\\n "$page"
143       page_children "$page" "$((depth - 1))"
144     fi
145   done
146 }
147
148 page_abs(){
149   case $1 in
150     /*) PATH "${1%/}/";;
151     *)  PATH "${PATH_INFO%/*}/${1%/}/";;
152   esac
153 }