rev |
line source |
pascal@5859
|
1 #!/bin/sh
|
pascal@5859
|
2 #
|
pascal@5859
|
3 # TazWikiss - A tiny Wiki for busybox/httpd
|
pascal@5859
|
4 # Licence GNU/GPLv2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
pascal@5859
|
5 # Copyright (C) Pascal Bellard
|
pascal@5859
|
6 # Based on WiKiss - http://wikiss.tuxfamily.org/
|
pascal@5859
|
7
|
pascal@5859
|
8 . /usr/bin/httpd_helper.sh
|
pascal@5859
|
9
|
pascal@5859
|
10 cd $(dirname $0)
|
pascal@5859
|
11 CONFIG=config-${HTTP_ACCEPT_LANGUAGE%%,*}.sh
|
pascal@5859
|
12 [ -r "$CONFIG" ] || CONFIG=config.sh
|
pascal@5859
|
13 . ./$CONFIG
|
pascal@5859
|
14
|
pascal@5859
|
15 WIKI_VERSION="TazWiKiss 0.3"
|
pascal@5859
|
16
|
pascal@5859
|
17 # Initialisations
|
pascal@5859
|
18 toc='' # Table Of Content
|
pascal@5859
|
19 CONTENT='' # contenu de la page
|
pascal@5859
|
20 HISTORY='' # lien vers l'historique
|
pascal@5859
|
21 plugins_dir="plugins/" # repertoire ou stocker les plugins
|
pascal@5859
|
22 template="template.html" # Fichier template
|
pascal@5859
|
23 PAGE_TITLE_link=true # y-a-t-il un lien sur le titre de la page ?
|
pascal@5859
|
24 editable=true # la page est editable
|
pascal@5859
|
25 urlbase="$SCRIPT_NAME"
|
pascal@5859
|
26 #urlbase="./"
|
pascal@5859
|
27
|
pascal@5859
|
28 die()
|
pascal@5859
|
29 {
|
pascal@5859
|
30 echo $@
|
pascal@5859
|
31 exit
|
pascal@5859
|
32 }
|
pascal@5859
|
33
|
pascal@5859
|
34 redirect()
|
pascal@5859
|
35 {
|
pascal@5859
|
36 awk '{ printf "%s\r\n",$0 }' <<EOT
|
pascal@5859
|
37 HTTP/1.0 302 Found
|
pascal@5859
|
38 location: $1
|
pascal@5859
|
39
|
pascal@5859
|
40 EOT
|
pascal@5859
|
41 exit
|
pascal@5859
|
42 }
|
pascal@5859
|
43
|
pascal@5859
|
44 cache_auth()
|
pascal@5859
|
45 {
|
pascal@5859
|
46 local tmp
|
pascal@5859
|
47 tmp="$(echo $1$(date +%d) | md5sum | cut -c1-8)"
|
pascal@5859
|
48 [ "$(POST sc)" == "$1" ] && AUTH=$tmp || [ "$AUTH" == "$tmp" ]
|
pascal@5859
|
49 }
|
pascal@5859
|
50
|
pascal@5859
|
51 authentified()
|
pascal@5859
|
52 {
|
pascal@5859
|
53 [ -n "$PASSWORDS" ] && for i in $PASSWORDS ; do
|
pascal@5859
|
54 cache_auth "$i" && return
|
pascal@5859
|
55 done
|
pascal@5859
|
56 cache_auth "$PASSWORD"
|
pascal@5859
|
57 }
|
pascal@5859
|
58
|
pascal@5859
|
59 plugin_call_method()
|
pascal@5859
|
60 {
|
pascal@5859
|
61 local status
|
pascal@5859
|
62 local name
|
pascal@5859
|
63 name=$1
|
pascal@5859
|
64 shift
|
pascal@5859
|
65 [ -d "$plugins_dir" ] || return
|
pascal@5859
|
66 status=false
|
pascal@5859
|
67 for i in $plugins_dir/*.sh ; do
|
pascal@5859
|
68 [ -x $i ] || continue
|
pascal@5859
|
69 grep -q "^$name()" $i || continue
|
pascal@5859
|
70 . $i
|
pascal@5859
|
71 eval $name "$@"
|
pascal@5859
|
72 [ $? == 0 ] && status=true
|
pascal@5859
|
73 done
|
pascal@5859
|
74 $status
|
pascal@5859
|
75 }
|
pascal@5859
|
76
|
pascal@5859
|
77 curdate()
|
pascal@5859
|
78 {
|
pascal@5859
|
79 date '+%Y-%m-%d %H:%M'
|
pascal@5859
|
80 }
|
pascal@5859
|
81
|
pascal@5859
|
82 filedate()
|
pascal@5859
|
83 {
|
pascal@5859
|
84 stat -c %y $1 | sed -e 's|-|/|g' -e 's/\(:..\):.*/\1/'
|
pascal@5859
|
85 }
|
pascal@5859
|
86
|
pascal@5859
|
87 AUTH=$(GET auth)
|
pascal@5859
|
88 [ -n "$AUTH" ] || AUTH=$(POST auth)
|
pascal@5859
|
89 PAGE_TITLE="$(GET page)"
|
pascal@5859
|
90 [ -n "$PAGE_TITLE" ] || PAGE_TITLE="$(POST page)"
|
pascal@5859
|
91 if [ -z "$PAGE_TITLE" ]; then
|
pascal@5859
|
92 PAGE_TITLE="$START_PAGE"
|
pascal@5859
|
93 case "$(GET action)" in
|
pascal@5859
|
94 recent) PAGE_TITLE="$RECENT_CHANGES" ;;
|
pascal@5859
|
95 search) PAGE_TITLE="$LIST"
|
pascal@5859
|
96 [ -n "$(GET query)" ] && PAGE_TITLE="$SEARCH_RESULTS $(GET query)"
|
pascal@5859
|
97 esac
|
pascal@5859
|
98 fi
|
pascal@5859
|
99 case "$PAGE_TITLE" in
|
pascal@5859
|
100 */*|*\&*) PAGE_TITLE="$START_PAGE" ;;
|
pascal@5859
|
101 esac
|
pascal@5859
|
102 gtime=$(GET time)
|
pascal@5859
|
103 case "$gtime" in
|
pascal@5859
|
104 */*|*\&*) gtime="" ;;
|
pascal@5859
|
105 esac
|
pascal@5859
|
106 action=$(GET action)
|
pascal@5859
|
107 datew="$(curdate)"
|
pascal@5859
|
108 content="$(POST content)"
|
pascal@5859
|
109
|
pascal@5859
|
110 # Ecrire les modifications, s'il y a lieu
|
pascal@5859
|
111 PAGE_txt="$PAGES_DIR$PAGE_TITLE.txt"
|
pascal@5859
|
112 if [ -n "$content" ]; then # content => page
|
pascal@5859
|
113 if authentified; then
|
pascal@5859
|
114 sed 's/</\</g' > $PAGE_txt <<EOT
|
pascal@5859
|
115 $POST_content
|
pascal@5859
|
116 EOT
|
pascal@5859
|
117 if [ -n "$BACKUP_DIR" ]; then
|
pascal@5859
|
118 complete_dir_s="$BACKUP_DIR$PAGE_TITLE/"
|
pascal@5859
|
119 if [ ! -d "$complete_dir_s" ]; then
|
pascal@5859
|
120 mkdir -p $complete_dir_s
|
pascal@5859
|
121 chmod 777 $complete_dir_s
|
pascal@5859
|
122 fi
|
pascal@5859
|
123 cat >> "$complete_dir_s$(curdate).bak" <<EOT
|
pascal@5859
|
124
|
pascal@5859
|
125 // $datew / $REMOTE_ADDR
|
pascal@5859
|
126 $(cat $PAGE_txt)
|
pascal@5859
|
127 EOT
|
pascal@5859
|
128 fi
|
pascal@5859
|
129 plugin_call_method "writedPage" $PAGE_txt
|
pascal@5859
|
130 PAGE_TITLE="$PAGE_TITLE&auth=$AUTH"
|
pascal@5859
|
131 else
|
pascal@5859
|
132 PAGE_TITLE="$PAGE_TITLE&action=edit&error=1"
|
pascal@5859
|
133 fi
|
pascal@5859
|
134 redirect "$urlbase?page=$PAGE_TITLE"
|
pascal@5859
|
135 fi
|
pascal@5859
|
136
|
pascal@5859
|
137 if [ -r "$PAGE_txt" -o -n "$action" ]; then
|
pascal@5859
|
138 CONTENT=""
|
pascal@5859
|
139 if [ -e "$PAGE_txt" ]; then
|
pascal@5859
|
140 TIME=$(filedate $PAGE_txt)
|
pascal@5859
|
141 CONTENT="$(cat $PAGE_txt)"
|
pascal@5859
|
142 fi
|
pascal@5859
|
143 # Restaurer une page
|
pascal@5859
|
144 [ -n "$(GET page)" -a -n "$gtime" -a "$(GET restore)" == 1 ] &&
|
pascal@5859
|
145 [ -r "$BACKUP_DIR$PAGE_TITLE/$gtime" ] &&
|
pascal@5859
|
146 CONTENT="$(cat $BACKUP_DIR$PAGE_TITLE/$gtime)"
|
pascal@5859
|
147 CONTENT="$(sed -e 's/\$/\$/g' -e 's/\\/\\/g' <<EOT
|
pascal@5859
|
148 $CONTENT
|
pascal@5859
|
149 EOT
|
pascal@5859
|
150 )"
|
pascal@5859
|
151 else
|
pascal@5859
|
152 CONTENT="$(sed -e "s#%page%#$PAGE_TITLE#" <<EOT
|
pascal@5859
|
153 $DEFAULT_CONTENT
|
pascal@5859
|
154 EOT
|
pascal@5859
|
155 )"
|
pascal@5859
|
156 fi
|
pascal@5859
|
157
|
pascal@5859
|
158 htmldiff()
|
pascal@5859
|
159 {
|
pascal@5859
|
160 local files
|
pascal@5859
|
161 local old
|
pascal@5859
|
162 local new
|
pascal@5859
|
163 old="$BACKUP_DIR$(GET page)/$1"
|
pascal@5859
|
164 new="$BACKUP_DIR$(GET page)/$2"
|
pascal@5859
|
165 [ -s "$old" ] || old=/dev/null
|
pascal@5859
|
166 [ -n "$2" -a "$2" != "none" ] || new=$PAGES_DIR$(GET page).txt
|
pascal@5859
|
167 files="$old $new"
|
pascal@5859
|
168 [ "$old" -nt "$new" -a "$old" != "/dev/null" ] && files="$new $old"
|
pascal@5859
|
169 diff -aU 99999 $files | sed -e '1,3d' -e '/^\\/d' -e 's|$|<br/>|' \
|
pascal@5859
|
170 -e 's|^-\(.*\)$|<font color=red>\1</font>|' \
|
pascal@5859
|
171 -e 's|^+\(.*\)$|<font color=green>\1</font>|'
|
pascal@5859
|
172 }
|
pascal@5859
|
173
|
pascal@5859
|
174 # Actions speciales du Wiki
|
pascal@5859
|
175 case "$action" in
|
pascal@5859
|
176 edit)
|
pascal@5859
|
177 editable=false
|
pascal@5859
|
178 HISTORY="<a href=\"$urlbase?page=$(urlencode $PAGE_TITLE)\&action=history\" accesskey=\"6\" rel=\"nofollow\">$HISTORY_BUTTON</a><br />"
|
pascal@5859
|
179 CONTENT="<form method=\"post\" action=\"$urlbase\">
|
pascal@5859
|
180 <textarea name=\"content\" cols=\"83\" rows=\"30\" style=\"width: 100%;\">
|
pascal@5859
|
181 $CONTENT
|
pascal@5859
|
182 </textarea>
|
pascal@5859
|
183 <input type=\"hidden\" name=\"page\" value=\"$PAGE_TITLE\" /><br />
|
pascal@5859
|
184 <p align=\"right\">"
|
pascal@5859
|
185 if authentified; then
|
pascal@5859
|
186 CONTENT="$CONTENT<input type=\"hidden\" value=\"$(POST password)\""
|
pascal@5859
|
187 else
|
pascal@5859
|
188 CONTENT="$CONTENT$MDP : <input type=\"password\""
|
pascal@5859
|
189 fi
|
pascal@5859
|
190 CONTENT="$CONTENT name=\"sc\" /> <input type=\"submit\" value=\"$DONE_BUTTON\" accesskey=\"s\" /></p></form>"
|
pascal@5859
|
191 ;;
|
pascal@5859
|
192 history)
|
pascal@5859
|
193 complete_dir="$BACKUP_DIR$PAGE_TITLE/"
|
pascal@5859
|
194 if [ -n "$gtime" ]; then
|
pascal@5859
|
195 HISTORY="<a href=\"$urlbase?page=$PAGE_TITLE\&action=history\" rel=\"nofollow\">$HISTORY_BUTTON</a>"
|
pascal@5859
|
196 if [ -r "$complete_dir$gtime" ]; then
|
pascal@5859
|
197 HISTORY="$HISTORY <a href=\"$urlbase?page=$PAGE_TITLE\&action=edit\&time=$gtime&restore=1\" rel=\"nofollow\">$RESTORE</a>"
|
pascal@5859
|
198 CONTENT="$(cat $complete_dir$gtime | sed -e s/$(echo -ne '\r')//g -e 's|$|<br/>|g')"
|
pascal@5859
|
199 else
|
pascal@5859
|
200 HISTORY="$HISTORY -"
|
pascal@5859
|
201 fi
|
pascal@5859
|
202 else
|
pascal@5859
|
203 HISTORY="$HISTORY_BUTTON"
|
pascal@5859
|
204 CONTENT="$NO_HISTORY"
|
pascal@5859
|
205 if [ -d $complete_dir ]; then
|
pascal@5859
|
206 CONTENT="<form method=\"GET\" action=\"$urlbase\">\n<input type=hidden name=action value=diff><input type=hidden name=page value=\"$PAGE_TITLE\">"
|
pascal@5859
|
207 for file in $(ls $complete_dir | sort -r); do
|
pascal@5859
|
208 CONTENT="$CONTENT
|
pascal@5859
|
209 <input type=radio name=f1 value=$file><input type=radio name=f2 value=$file />
|
pascal@5859
|
210 <a href=\"$urlbase?page=$PAGE_TITLE&action=history&time=$file\">$file</a><br />
|
pascal@5859
|
211 "
|
pascal@5859
|
212 done
|
pascal@5859
|
213 CONTENT="$CONTENT<input type=submit value=diff></form>"
|
pascal@5859
|
214 fi
|
pascal@5859
|
215 fi ;;
|
pascal@5859
|
216 diff)
|
pascal@5859
|
217 if [ -n "$(GET f1)" ]; then
|
pascal@5859
|
218 HISTORY="<a href=\"$urlbase?page=$(urlencode "$PAGE_TITLE")\&action=history\">$HISTORY_BUTTON</a>"
|
pascal@5859
|
219 CONTENT="$(htmldiff "$(GET f1)" "$(GET f2)" )"
|
pascal@5859
|
220 else
|
pascal@5859
|
221 # diff auto entre les 2 dernières versions
|
pascal@5859
|
222 ls "$BACKUP_DIR$PAGE_TITLE/" | ( sort -r ; echo none ; echo ) | head -n 2 | while read f1 f2; do
|
pascal@5859
|
223 redirect "$urlbase?page=$(urlencode "$PAGE_TITLE")&action=$action&f1=$f1&f2=$f2"
|
pascal@5859
|
224 done
|
pascal@5859
|
225 fi ;;
|
pascal@5859
|
226 search)
|
pascal@5859
|
227 PAGE_TITLE_link=false
|
pascal@5859
|
228 editable=false
|
pascal@5859
|
229 query="$(GET query)"
|
pascal@5859
|
230 n=0
|
pascal@5859
|
231 for file in $(ls $PAGES_DIR/*.txt 2> /dev/null | sort) ; do
|
pascal@5859
|
232 [ -e $file ] || continue
|
pascal@5859
|
233 echo $file | grep -qs "$query" $file /dev/stdin || continue
|
pascal@5859
|
234 file=$(basename $file ".txt")
|
pascal@5859
|
235 CONTENT="$CONTENT<a href=\"$urlbase?page=$file\">$file</a><br />
|
pascal@5859
|
236 "
|
pascal@5859
|
237 n=$(($n + 1))
|
pascal@5859
|
238 done
|
pascal@5859
|
239 PAGE_TITLE="$PAGE_TITLE ($n)" ;;
|
pascal@5859
|
240 recent)
|
pascal@5859
|
241 PAGE_TITLE_link=false
|
pascal@5859
|
242 editable=false
|
pascal@5859
|
243 n=0
|
pascal@5859
|
244 for file in $(ls -l $PAGES_DIR/*.txt 2> /dev/null | awk '{ print $9 }' | tail -n 10) ; do
|
pascal@5859
|
245 filename=$(basename $file ".txt")
|
pascal@5859
|
246 timestamp=$(filedate $file)
|
pascal@5859
|
247 CONTENT="$CONTENT<a href=\"$urlbase?page=$filename\">$filename</a> ($timestamp - <a href=\"$urlbase?page=$filename&action=diff\">diff</a>)<br />
|
pascal@5859
|
248 "
|
pascal@5859
|
249 done ;;
|
pascal@5859
|
250 '') ;;
|
pascal@5859
|
251 *)
|
pascal@5859
|
252 plugin_call_method "action" $action || action="" ;;
|
pascal@5859
|
253 esac
|
pascal@5859
|
254 if [ -z "$action" ]; then
|
pascal@5859
|
255 if echo "$CONTENT" | grep -q '%html%\s'; then
|
pascal@5859
|
256 CONTENT="$(sed 's/%html%\s//' <<EOT
|
pascal@5859
|
257 $CONTENT
|
pascal@5859
|
258 EOT
|
pascal@5859
|
259 )"
|
pascal@5859
|
260 else
|
pascal@5859
|
261 tmpdir=/tmp/tazwiki$$
|
pascal@5859
|
262 mkdir $tmpdir
|
pascal@5859
|
263 unesc="$(echo "$CONTENT" | sed 's/\^\(.\)/\n^\1\n/g' | grep '\^' |\
|
pascal@5859
|
264 sort | uniq | grep -v "['[!]" | hexdump -e '"" 3/1 "%d " "\n"' |\
|
pascal@5859
|
265 awk '{ printf "-e '\''s/\\^%c/\\&#%d;/g'\'' ",$2,$2}') \
|
pascal@5859
|
266 -e 's/\\^'\\''/\\'/g' -e 's/\^\!/\!/g' \
|
pascal@5859
|
267 -e 's/\^\[/\[/g'"
|
pascal@5859
|
268 CONTENT="$(eval sed $unesc <<EOT | \
|
pascal@5859
|
269 sed -e 's/&/\&/g' -e s/$(echo -ne '\r')//g \
|
pascal@5859
|
270 -e 's/&lt;/\</g' -e 's/&#\([0-9]\)/\&#\1/g' | \
|
pascal@5859
|
271 awk -v tmpdir=$tmpdir 'BEGIN { n=1; state=0 } {
|
pascal@5859
|
272 s=$0
|
pascal@5859
|
273 while (1) {
|
pascal@5859
|
274 if (state == 0) {
|
pascal@5859
|
275 if (match(s,/\{\{/)) {
|
pascal@5859
|
276 printf "%s<pre><code>{{CODE%s}}</code></pre>",substr(s,1,RSTART-1),n
|
pascal@5859
|
277 s=substr(s,RSTART+RLENGTH)
|
pascal@5859
|
278 state=1
|
pascal@5859
|
279 }
|
pascal@5859
|
280 else {
|
pascal@5859
|
281 print s
|
pascal@5859
|
282 break
|
pascal@5859
|
283 }
|
pascal@5859
|
284 }
|
pascal@5859
|
285 if (state == 1) {
|
pascal@5859
|
286 if (match(s,/\}\}/)) {
|
pascal@5859
|
287 printf "%s",substr(s,1,RSTART-1) >> tmpdir "/CODE" n
|
pascal@5859
|
288 s=substr(s,RSTART+RLENGTH)
|
pascal@5859
|
289 n++
|
pascal@5859
|
290 state=0
|
pascal@5859
|
291 }
|
pascal@5859
|
292 else {
|
pascal@5859
|
293 print s >> tmpdir "/CODE" n
|
pascal@5859
|
294 break
|
pascal@5859
|
295 }
|
pascal@5859
|
296 }
|
pascal@5859
|
297 }
|
pascal@5859
|
298 }'
|
pascal@5859
|
299 $CONTENT
|
pascal@5859
|
300 EOT
|
pascal@5859
|
301 )"
|
pascal@5859
|
302 plugin_call_method formatBegin
|
pascal@5859
|
303 CONTENT="$(sed -e 's/<-->/\↔/g' -e 's/<==>/\⇔/g'\
|
pascal@5859
|
304 -e 's/-->/\→/g' -e 's/<--/\←/g' \
|
pascal@5859
|
305 -e 's/==>/\⇒/g' -e 's/<==/\⇐/g' \
|
pascal@5859
|
306 -e 's/([eE])/\€/g' -e 's/([pP])/\£/g' \
|
pascal@5859
|
307 -e 's/([yY])/\¥/g' -e 's/([tT][mM])/\™/g' \
|
pascal@5859
|
308 -e 's/([cC])/\©/g' -e 's/([rR])/\®/g' \
|
pascal@5859
|
309 -e 's/(<=)/\≤/g' -e 's/(>=)/\≥/g' \
|
pascal@5859
|
310 -e 's/(!=)/\≠/g' -e 's/(+-)/\±/g' <<EOT
|
pascal@5859
|
311 $CONTENT
|
pascal@5859
|
312 EOT
|
pascal@5859
|
313 )"
|
pascal@5859
|
314 rg_url="[0-9a-zA-Z\.\#/~\-\_%=\?\&,\+\:@;!\(\)\*\$']*" # TODO: verif & / &
|
pascal@5859
|
315 rg_link_local="$rg_url"
|
pascal@5859
|
316 rg_link_http="https\?://$rg_url"
|
pascal@5859
|
317 rg_img_local="$rg_url\.jpe\?g\|$rg_url\.gif\|$rg_url\.png"
|
pascal@5859
|
318 rg_img_http="$rg_link_http\.jpe\?g\|$rg_link_http\.gif\|$rg_link_http\.png"
|
pascal@5859
|
319
|
pascal@5859
|
320 # image, image link, link, wikipedia, email ...
|
pascal@5859
|
321 CONTENT="$(sed \
|
pascal@5859
|
322 -e "s#\[\($rg_img_http\)|*\([a-z]*\)*\]#<img src=\"\1\" alt=\"\1\" style=\"float:\2;\"/>#g" \
|
pascal@5859
|
323 -e "s#\[\($rg_img_local\)|*\([a-z]*\)*\]#<img src=\"\1\" alt=\"\1\" style=\"float:\2;\"/>#g" \
|
pascal@5859
|
324 -e "s#\[\($rg_img_http\)|\($rg_link_http\)|*\([a-z]*\)*\]#<a href=\"\2\" class=\"url\"><img src=\"\1\" alt=\"\1\" title=\"\1\"style=\"float:\3;\"/></a>#g" \
|
pascal@5859
|
325 -e "s#\[\($rg_img_http\)|\($rg_link_local\)|*\([a-z]*\)*\]#<a href=\"\2\" class=\"url\"><img src=\"\1\" alt=\"\1\" title=\"\1\"style=\"float:\3;\"/></a>#g" \
|
pascal@5859
|
326 -e "s#\[\($rg_img_local\)|\($rg_link_http\)|*\([a-z]*\)*\]#<a href=\"\2\" class=\"url\"><img src=\"\1\" alt=\"\1\" title=\"\1\"style=\"float:\3;\"/></a>#g" \
|
pascal@5859
|
327 -e "s#\[\($rg_img_local\)|\($rg_link_local\)|*\([a-z]*\)*\]#<a href=\"\2\" class=\"url\"><img src=\"\1\" alt=\"\1\" title=\"\1\"style=\"float:\3;\"/></a>#g" \
|
pascal@5859
|
328 -e "s#\[\([^]]*\)|\($rg_link_http\)\]#<a href=\"\2\" class=\"url\">\1</a>#g" \
|
pascal@5859
|
329 -e "s#\[\([^]]*\)|\($rg_link_local\)\]#<a href=\"\2\" class=\"url\">\1</a>#g" \
|
pascal@5859
|
330 -e "s#\[\($rg_link_http\)\]#<a href=\"\1\" class=\"url\">\1</a>#g" \
|
pascal@5859
|
331 -e "s#\([^>\"]\)\($rg_link_http\)#\1<a href=\"\2\" class=\"url\">\2</a>#g" \
|
pascal@5859
|
332 -e "s#\[?\([^]]*\)\]#<a href=\"http://$LANG.wikipedia.org/wiki/\1\" class=\"url\" title=\"Wikipedia\">\1</a>#g" \
|
pascal@5859
|
333 -e "s#\[\([^]]*\)\]#<a href=\"$urlbase?page=\1\">\1</a>#g" \
|
pascal@5859
|
334 -e 's#\([0-9a-zA-Z\./~\-\_][0-9a-zA-Z\./~\-\_]*@[0-9a-zA-Z\./~\-\_][0-9a-zA-Z\./~\-\_]*\)#<a href=\"mailto:\1\">\1</a>#g' \
|
pascal@5859
|
335 -e 's#^\*\*\*\(.*\)#<ul><ul><ul><li>\1</li></ul></ul></ul>#g' \
|
pascal@5859
|
336 -e 's#^\*\*\(.*\)#<ul><ul><li>\1</li></ul></ul>#g' \
|
pascal@5859
|
337 -e 's#^\*\(.*\)#<ul><li>\1</li></ul>#g' \
|
pascal@5859
|
338 -e 's,^\#\#\#\(.*\),<ol><ol><ol><li>\1</li></ol></ol></ol>,g' \
|
pascal@5859
|
339 -e 's,^\#\#\(.*\),<ol><ol><li>\1</li></ol></ol>,g' \
|
pascal@5859
|
340 -e 's,^\#\(.*\),<ol><li>\1</li></ol>,g' \
|
pascal@5859
|
341 -e "s/$(printf '\r')//" <<EOT | sed \
|
pascal@5859
|
342 -e ':x;/<\/ol>$/{N;s/\n//;$P;$D;bx;}' | sed \
|
pascal@5859
|
343 -e ':x;/<\/ul>$/{N;s/\n//;$P;$D;bx;}' | sed \
|
pascal@5859
|
344 -e ':x;s/<\/ul><ul>//g;tx' -e ':x;s/<\/ol><ol>//g;tx' \
|
pascal@5859
|
345 -e 's|----*$|<hr />|' -e 's|$|<br />|' \
|
pascal@5859
|
346 -e 's#</li>#&\n#g' -e 's#\(</h[123456]>\)<br />#\1#g' \
|
pascal@5859
|
347 -e "s#'--\([^']*\)--'#<del>\1</del>#g" \
|
pascal@5859
|
348 -e "s#'__\([^']*\)__'#<u>\1</u>#g" \
|
pascal@5859
|
349 -e "s#'''''\([^']*\)'''''#<strong><em>\1</em></strong>#g" \
|
pascal@5859
|
350 -e "s#'''\([^']*\)'''#<strong>\1</strong>#g" \
|
pascal@5859
|
351 -e "s#''\([^']*\)''#<em>\1</em>#g"
|
pascal@5859
|
352 $CONTENT
|
pascal@5859
|
353 EOT
|
pascal@5859
|
354 )"
|
pascal@5859
|
355 while read link; do
|
pascal@5859
|
356 [ -s $PAGES_DIR$link.txt ] && continue
|
pascal@5859
|
357 CONTENT="$(sed "s/\\?page=$link\"/& class=\"pending\"/" <<EOT
|
pascal@5859
|
358 $CONTENT
|
pascal@5859
|
359 EOT
|
pascal@5859
|
360 )"
|
pascal@5859
|
361 done <<EOT
|
pascal@5859
|
362 $(grep "$urlbase?page=" <<EOM | sed -e 's/^.*\?page=\([^"]*\).*$/\1/' -e 's/&.*//'
|
pascal@5859
|
363 $CONTENT
|
pascal@5859
|
364 EOM
|
pascal@5859
|
365 )
|
pascal@5859
|
366 EOT
|
pascal@5859
|
367 while echo "$CONTENT" | grep -q '^ ' ; do
|
pascal@5859
|
368 CONTENT="$(sed 's/^\( *\) \([^ ]\)/\1\ \ \ \ \2/' <<EOT
|
pascal@5859
|
369 $CONTENT
|
pascal@5859
|
370 EOT
|
pascal@5859
|
371 )"
|
pascal@5859
|
372 done
|
pascal@5859
|
373 read hastoc <<EOT
|
pascal@5859
|
374 $CONTENT
|
pascal@5859
|
375 EOT
|
pascal@5859
|
376 CONTENT="$(sed -e 's/^ /\ \ \ \ /' -e '1s/^TOC//' <<EOT
|
pascal@5859
|
377 $CONTENT
|
pascal@5859
|
378 EOT
|
pascal@5859
|
379 )"
|
pascal@5859
|
380 toc='<div id="toc">'
|
pascal@5859
|
381 i=1
|
pascal@5859
|
382 for pat in '^![^!]' '^!![^!]' '^!!![^!]' '^!!!![^!]' '^!!!!!' ; do
|
pascal@5859
|
383 while read line; do
|
pascal@5859
|
384 [ -n "$line" ] || continue
|
pascal@5859
|
385 label="$(echo $line | sed 's/[^\dA-Za-z]/_/g')"
|
pascal@5859
|
386 toc="$(cat <<EOT
|
pascal@5859
|
387 $toc
|
pascal@5859
|
388 <h$i><a href="#$label">$line</a></h$i>
|
pascal@5859
|
389 EOT
|
pascal@5859
|
390 )"
|
pascal@5859
|
391 CONTENT="$(sed "s#^!!* *$line\$#<h$i><a name=\"$label\">$line</a></h$i>#" <<EOT
|
pascal@5859
|
392 $CONTENT
|
pascal@5859
|
393 EOT
|
pascal@5859
|
394 )"
|
pascal@5859
|
395 done <<EOT
|
pascal@5859
|
396 $(grep "$pat" <<EOM | sed -e 's/^!!*//' -e 's/#/\#/g' -e 's/&/\\\&/g'
|
pascal@5859
|
397 $CONTENT
|
pascal@5859
|
398 EOM
|
pascal@5859
|
399 )
|
pascal@5859
|
400 EOT
|
pascal@5859
|
401 i=$(( $i + 1 ))
|
pascal@5859
|
402 done
|
pascal@5859
|
403 toc="$(cat <<EOT
|
pascal@5859
|
404 $toc
|
pascal@5859
|
405 </div>
|
pascal@5859
|
406 EOT
|
pascal@5859
|
407 )"
|
pascal@5859
|
408 case "$hastoc" in
|
pascal@5859
|
409 TOC*) ;;
|
pascal@5859
|
410 *) toc='';;
|
pascal@5859
|
411 esac
|
pascal@5859
|
412 CONTENT="$(awk -v tmpdir=$tmpdir '{
|
pascal@5859
|
413 s=$0
|
pascal@5859
|
414 while (1) {
|
pascal@5859
|
415 if (match(s,/\{\{CODE[0-9]+\}\}/)) {
|
pascal@5859
|
416 printf "%s" substr(s,1,RSTART-1)
|
pascal@5859
|
417 system("cat " tmpdir "/" substr(s,RSTART+2,RLENGTH-4))
|
pascal@5859
|
418 s=substr(s,RSTART+RLENGTH)
|
pascal@5859
|
419 }
|
pascal@5859
|
420 else {
|
pascal@5859
|
421 print s
|
pascal@5859
|
422 break
|
pascal@5859
|
423 }
|
pascal@5859
|
424 }
|
pascal@5859
|
425 }' <<EOT
|
pascal@5859
|
426 $CONTENT
|
pascal@5859
|
427 EOT
|
pascal@5859
|
428 )"
|
pascal@5859
|
429 rm -rf $tmpdir
|
pascal@5859
|
430 plugin_call_method formatEnd
|
pascal@5859
|
431 fi
|
pascal@5859
|
432 fi
|
pascal@5859
|
433
|
pascal@5859
|
434 # Remplacement dans le template
|
pascal@5859
|
435 RECENT="<a href=\"$urlbase?action=recent\" accesskey=\"3\">$RECENT_CHANGES</a>"
|
pascal@5859
|
436 [ "$action" == "recent" ] && RECENT=$RECENT_CHANGES
|
pascal@5859
|
437 HOME="<a href=\"$urlbase?page=$START_PAGE\" accesskey=\"1\">$HOME_BUTTON</a>"
|
pascal@5859
|
438 [ "$PAGE_TITLE" == "$START_PAGE" -a "$action" != "search" ] && HOME=$HOME_BUTTON
|
pascal@5859
|
439 HELP="\1<a href=\"$urlbase?page=$HELP_BUTTON\" accesskey=\"2\" rel=\"nofollow\">$HELP_BUTTON</a>\2"
|
pascal@5859
|
440 [ "$action" != "edit" ] && HELP=""
|
pascal@5859
|
441
|
pascal@5859
|
442 [ -r "$template" ] || die "'$template' is missing!"
|
pascal@5859
|
443 html="$(sed -e "s#{\([^}]*\)RECENT_CHANGES\([^}]*\)}#\1$RECENT\2#" \
|
pascal@5859
|
444 -e "s#{\([^}]*\)HOME\([^}]*\)}#\1$HOME\2#" \
|
pascal@5859
|
445 -e "s#{\([^}]*\)HELP\([^}]*\)}#$HELP#" \
|
pascal@5859
|
446 -e "s#{SEARCH}#<form method=\"get\" action=\"$urlbase?page=$(urlencode "$PAGE_TITLE" | sed 's/#/\\#/g')\"><div><input type=\"hidden\" name=\"action\" value=\"search\" /><input type=\"text\" name=\"query\" value=\"$(htmlentities $(GET query) )\" tabindex=\"1\" /> <input type=\"submit\" value=\"$SEARCH_BUTTON\" accesskey=\"q\" /></div></form>#" \
|
pascal@5859
|
447 < $template )"
|
pascal@5859
|
448 [ "$action" != "" -a "$action" != "edit" -o ! -e "$PAGE_txt" ] && TIME="-"
|
pascal@5859
|
449 plugin_call_method template
|
pascal@5859
|
450 [ -n "$(GET error)" ] || ERROR=""
|
pascal@5859
|
451 [ -n "$HISTORY" ] && HISTORY="\1$HISTORY\2"
|
pascal@5859
|
452 PAGE_TITLE_str="$(htmlentities "$PAGE_TITLE")"
|
pascal@5859
|
453 $PAGE_TITLE_link &&
|
pascal@5859
|
454 PAGE_TITLE_str="<a href=\"$urlbase?page=$(urlencode "$PAGE_TITLE")\">$PAGE_TITLE_str</a>"
|
pascal@5859
|
455 EDIT="$EDIT_BUTTON"
|
pascal@5859
|
456 if $editable ; then
|
pascal@5859
|
457 EDIT="$PROTECTED_BUTTON"
|
pascal@5859
|
458 [ -w "$PAGE_txt" -o ! -e "$PAGE_txt" ] &&
|
pascal@5859
|
459 EDIT="<a href=\"$urlbase?page=$(urlencode "$PAGE_TITLE")\&action=edit\" accesskey=\"5\" rel=\"nofollow\">$EDIT_BUTTON</a>"
|
pascal@5859
|
460 fi
|
pascal@5859
|
461 [ -n "$toc" ] && toc="\1$toc\2"
|
pascal@5859
|
462 AUTH_GET=""
|
pascal@5859
|
463 AUTH_POST=""
|
pascal@5859
|
464 if authentified; then
|
pascal@5859
|
465 AUTH_GET="auth=$AUTH\&"
|
pascal@5859
|
466 AUTH_POST="\n<input type=\"hidden\" name=\"auth\" value=\"$AUTH\" />"
|
pascal@5859
|
467 fi
|
pascal@5859
|
468
|
pascal@5859
|
469 header "Content-type: text/html"
|
pascal@5859
|
470 sed -e "s#{ERROR}#$ERROR#" -e "s#{WIKI_TITLE}#$WIKI_TITLE#" \
|
pascal@5859
|
471 -e "s#{\([^}]*\)HISTORY\([^}]*\)}#$HISTORY#" \
|
pascal@5859
|
472 -e "s#{PAGE_TITLE}#$PAGE_TITLE_str#" \
|
pascal@5859
|
473 -e "s#{\([^}]*\)EDIT\([^}]*\)}#\1$EDIT\2#" \
|
pascal@5859
|
474 -e "s|{\([^}]*\)TOC\([^}]*\)}|$(awk '{ printf "%s\\n" $0 }' <<EOT | \
|
pascal@5859
|
475 sed -e 's/&/\\\&/g' -e 's/|/\\|/g'
|
pascal@5859
|
476 $toc
|
pascal@5859
|
477 EOT
|
pascal@5859
|
478 )|" \
|
pascal@5859
|
479 -e "s#{PAGE_TITLE_BRUT}#$(htmlentities "$PAGE_TITLE")#" \
|
pascal@5859
|
480 -e "s#{LAST_CHANGE}#$LAST_CHANGES :#" \
|
pascal@5859
|
481 -e "s#{CONTENT}#$(awk '{ printf "%s\\n" $0 }' <<EOT | \
|
pascal@5859
|
482 sed -e 's/&/\\\&/g' -e 's/#/\\#/g'
|
pascal@5859
|
483 $CONTENT
|
pascal@5859
|
484 EOT
|
pascal@5859
|
485 )#" \
|
pascal@5859
|
486 -e "s#{LANG}#$LANG#" -e "s#href=\"?#href=\"$urlbase?#g" \
|
pascal@5859
|
487 -e "s#$urlbase?#&$AUTH_GET#g" -e "s#action=\"$urlbase\">#&$AUTH_POST#g" \
|
pascal@5859
|
488 -e "s#{WIKI_VERSION}#$WIKI_VERSION#" \
|
pascal@5859
|
489 -e "s#{TIME}#$TIME#" -e "s#{DATE}#$datew#" \
|
pascal@5859
|
490 -e "s#{IP}#$REMOTE_ADDR#" -e "s#{COOKIE}##" <<EOT
|
pascal@5859
|
491 $html
|
pascal@5859
|
492 EOT
|