]> git.plutz.net Git - shellwiki/blob - tools.sh
Merge commit 'fb04e54ec3eecd4420c0f65780bc1099c911373a'
[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%/}/" depth="${2:-0}" 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     # Not a page directory (just a metadata dir)
110     [ ! "${page%%#*}" -o ! "${page%%*/#*}" ] && continue
111
112     # Omit "system" pages unless explicitly wanted
113     [ ! "${page%%\[*\]/*}" -o ! "${page%%*/\[*\]/*}" ] && [ "$glob_system_pages" != true ] && continue
114
115     # Omit translation pages if translations are enabled
116     [ ! "${page%%:*}" -o ! "${page%%*/:*}" ] && [ "$LANGUAGE_DEFAULT" ] && continue
117
118     pagedir="$(page_abs "$page")"
119
120     if [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ]; then
121       printf '%s\n' "$page"
122       if ! [ "$depth" -eq 0 ]; then
123         PATH_INFO="$pagedir" page_glob "*" "$((depth - 1))" \
124         | while read -r glob; do printf %s%s\\n "$page" "$glob"; done
125       fi
126     fi
127   done
128 }
129
130 page_abs(){
131   case $1 in
132     /*) PATH "${1%/}/";;
133     *)  PATH "${PATH_INFO%/*}/${1%/}/";;
134   esac
135 }