]> git.plutz.net Git - shellwiki/blob - tools.sh
Merge commit '1b5b1676f9f6869aec5cd141a9670e12ccd28b5d'
[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     pagedir="$(page_abs "${glob%%/#attachments/*}/")"
87     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
88     && printf '%s\n' "${glob%%/#attachments/*}/${glob#*/#attachments/}"
89   done
90 }
91
92 page_glob(){
93   local pattern="${1%/}/" IFS=''
94   local glob page pagedir
95
96   case $pattern in
97   /*)
98     for glob in "$_DATA/pages"$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
99     for glob in "$_EXEC/pages"$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
100     ;;
101   *)
102     for glob in "$_DATA/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
103     for glob in "$_EXEC/pages/$PATH_INFO"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
104     ;;
105   esac \
106   | sort -u \
107   | while read -r page; do
108     case $page in
109       \#*|*/\#*) continue;;
110       *) pagedir="$(page_abs "$page")";;
111     esac
112     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
113     && printf '%s\n' "$page"
114   done
115 }
116
117 page_children(){
118   local page="${1:-${PATH_INFO}}" depth="${2:-1}"
119   local glob pagedir IFS=''
120   page="${page%/}/"
121
122   [ "$depth" -eq 0 ] && return 0
123
124   case $page in
125   /*)
126     for glob in "$_DATA/pages/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/"}"; done
127     for glob in "$_EXEC/pages/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/"}"; done
128     ;;
129   *)
130     for glob in "$_DATA/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
131     for glob in "$_EXEC/pages/$PATH_INFO/${page}"*/; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
132     ;;
133   esac \
134   | sort -u \
135   | while read -r page; do
136     case $page in
137       \#*|*/\#*) continue;;
138       *) pagedir="$(page_abs "$page")";;
139     esac
140     if [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ]; then
141       printf %s\\n "$page"
142       page_children "$page" "$((depth - 1))"
143     fi
144   done
145 }
146
147 page_abs(){
148   case $1 in
149     /*) PATH "${1%/}/";;
150     *)  PATH "${PATH_INFO%/*}/${1%/}/";;
151   esac
152 }