]> git.plutz.net Git - shellwiki/blob - index.cgi
basic locking and editing
[shellwiki] / index.cgi
1 #!/bin/sh
2
3 . "${_EXEC:-${0%/*}}/cgilite/cgilite.sh"
4 set -- nocookie
5 . "${_EXEC}/cgilite/session.sh"
6 . "${_EXEC}/cgilite/file.sh"
7 . "${_EXEC}/cgilite/users.sh"
8
9 . "${_EXEC}/themes/default.sh"
10
11 CACHE_AGE=${CACHE_AGE:-1800}
12 export MD_MACROS="$_EXEC/macros"
13 export MD_HTML="${MD_HTML:-false}"
14
15 if [ "$(which awk)" ]; then
16   md() { awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; }
17 elif [ "$(which busybox)" ]; then
18   md() { busybox awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; }
19 else
20   md() { cat; }
21 fi
22
23 wiki_text() {
24   # Print source text of a wiki page
25   # Get page from data or underlay dir
26   local page="$(PATH "$1")"
27
28   if [ -f "$_DATA/pages/$page/#page.md" ]; then
29     cat -- "$_DATA/pages/$page/#page.md"
30   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
31     cat -- "$_EXEC/pages/$page/#page.md"
32   else
33     return 1
34   fi
35 }
36
37 wiki() {
38   # Print content of a wiki page
39   # Get page from data or underlay dir, handle caching
40   local page="$(PATH "$1")" md cache cachetime
41
42   cache="$_DATA/pages/$page/#page.cache"
43   if [ -f "$_DATA/pages/$page/#page.md" ]; then
44     md="$_DATA/pages/$page/#page.md"
45   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
46     md="$_EXEC/pages/$page/#page.md"
47   else
48     return 1
49   fi
50
51   cachetime="$(stat -c %Y -- "$md" "$cache" 2>/dev/null)"
52
53   if [ "${cachetime#*${BR}}" -gt "${cachetime%${BR}*}" \
54     -a "${cachetime#*${BR}}" -gt "$((_DATE - CACHE_AGE))" ]; then
55     cat "${cache}"
56   else
57     mkdir -p -- "$_DATA/pages/$page/"
58     # Macros expect to find page directory as working dir
59     ( cd -- "$_DATA/pages/$page/";
60       md <"$md" |tee -- "${cache}.$$"
61     )
62     mv -- "${cache}.$$" "${cache}"
63   fi
64 }
65
66 attachment() {
67   local file="$(PATH "$1")"
68
69   # TODO: deliver downscaled images, etc.
70   if [ -f "$_DATA/pages/${file%/*}/#attachments/${file#*/}" ]; then
71     FILE "$_DATA/pages/${file%/*}/#attachments/${file#*/}"
72   elif [ -f "$_EXEC/pages/${file%/*}/#attachments/${file#*/}" ]; then
73     FILE "$_EXEC/pages/${file%/*}/#attachments/${file#*/}"
74   elif [ -d "$_DATA/pages/${file}/" -o -d "$_EXEC/pages/${file}" ]; then
75     # path looks like a rogue page name (without trailing slash), so redirect
76     REDIRECT "$_BASE/${file}/"
77   else
78     return 1
79   fi
80 }
81
82 . "$_EXEC/page_edit.sh"
83
84 case "${PATH_INFO}" in
85   /"[.]"/*)
86     FILE "${_EXEC}/${PATH_INFO#/\[.\]}"
87     ;;
88   */)
89     if [ -f "$_DATA/pages/$PATH_INFO/#page.md" \
90       -o -f "$_EXEC/pages/$PATH_INFO/#page.md" ]; then
91       theme_page "${PATH_INFO}"
92     else
93       theme_404
94     fi
95     ;;
96   */"[login]")
97     [ "$USER_NAME" ] \
98     && REDIRECT "./" \
99     || theme_login
100     ;;
101   */"[register]")
102     theme_register
103     ;;
104   */"[attachment]"/*)
105     :  # TODO: Original attachment file
106     ;;
107   */"#"*)
108     :  # TODO: Invalid page name
109     ;;
110   *)
111     attachment "${PATH_INFO}"
112     ;;
113 esac