Fossil SCM

Initial implementation of the forum reply screen.

drh 2018-07-25 13:09 forum-v2
Commit c35fe945d2b3a2fe1572b8757d4fb01c58cfe62d16f6dfd2c8af3a41b9922f6e
+1
--- src/cgi.c
+++ src/cgi.c
@@ -343,10 +343,11 @@
343343
CGIDEBUG(("DONE\n"));
344344
345345
/* After the webpage has been sent, do any useful background
346346
** processing.
347347
*/
348
+ g.cgiOutput = 2;
348349
if( g.db!=0 && iReplyStatus==200 ){
349350
fclose(g.httpOut);
350351
g.httpOut = fossil_fopen("/dev/null", "wb");
351352
backoffice_run();
352353
}
353354
--- src/cgi.c
+++ src/cgi.c
@@ -343,10 +343,11 @@
343 CGIDEBUG(("DONE\n"));
344
345 /* After the webpage has been sent, do any useful background
346 ** processing.
347 */
 
348 if( g.db!=0 && iReplyStatus==200 ){
349 fclose(g.httpOut);
350 g.httpOut = fossil_fopen("/dev/null", "wb");
351 backoffice_run();
352 }
353
--- src/cgi.c
+++ src/cgi.c
@@ -343,10 +343,11 @@
343 CGIDEBUG(("DONE\n"));
344
345 /* After the webpage has been sent, do any useful background
346 ** processing.
347 */
348 g.cgiOutput = 2;
349 if( g.db!=0 && iReplyStatus==200 ){
350 fclose(g.httpOut);
351 g.httpOut = fossil_fopen("/dev/null", "wb");
352 backoffice_run();
353 }
354
+90 -25
--- src/forum.c
+++ src/forum.c
@@ -52,32 +52,44 @@
5252
if( pPost==0 ) continue;
5353
if( i>0 ){
5454
@ <hr>
5555
}
5656
i++;
57
- @ <p>%d(fpid) %h(zUuid)<br>
58
- @ By %h(pPost->zUser) on %h(zDate)
57
+ if( pPost->zThreadTitle ){
58
+ @ <h1>%h(pPost->zThreadTitle)</h1>
59
+ }
60
+ @ <p>By %h(pPost->zUser) on %h(zDate)
5961
if( fprev ){
6062
@ edit of %d(fprev) %h(pPost->azParent[0])
6163
}
6264
if( firt ){
6365
@ in reply to %d(firt) %h(pPost->zInReplyTo)
6466
}
65
- if( pPost->zThreadTitle ){
66
- @ <h1>%h(pPost->zThreadTitle)</h1>
67
- }
6867
forum_render(pPost->zMimetype, pPost->zWiki);
6968
if( g.perm.WrForum ){
69
+ int sameUser = login_is_individual()
70
+ && fossil_strcmp(pPost->zUser, g.zLogin)==0;
71
+ int isPrivate = content_is_private(fpid);
7072
@ <p><form action="%R/forumedit" method="POST">
7173
@ <input type="hidden" name="fpid" value="%s(zUuid)">
72
- @ <input type="submit" name="reply" value="Reply">
73
- if( g.perm.Admin || fossil_strcmp(pPost->zUser,g.zLogin)==0 ){
74
- @ <input type="submit" name="edit" value="Edit">
75
- }
76
- if( g.perm.ModForum && content_is_private(fpid) ){
74
+ if( !isPrivate ){
75
+ /* Reply and Edit are only available if the post has already
76
+ ** been approved */
77
+ @ <input type="submit" name="reply" value="Reply">
78
+ if( g.perm.Admin || sameUser ){
79
+ @ <input type="submit" name="edit" value="Edit">
80
+ @ <input type="submit" name="nullout" value="Delete">
81
+ }
82
+ }else if( g.perm.ModForum ){
83
+ /* Provide moderators with moderation buttons for posts that
84
+ ** are pending moderation */
7785
@ <input type="submit" name="approve" value="Approve">
7886
@ <input type="submit" name="reject" value="Reject">
87
+ }else if( sameUser ){
88
+ /* A post that is pending moderation can be deleted by the
89
+ ** person who originally submitted the post */
90
+ @ <input type="submit" name="reject" value="Delete">
7991
}
8092
@ </form></p>
8193
}
8294
manifest_destroy(pPost);
8395
}
@@ -200,10 +212,27 @@
200212
201213
forum_post_error:
202214
blob_reset(&x);
203215
return 0;
204216
}
217
+
218
+/*
219
+** Paint the form elements for entering a Forum post
220
+*/
221
+static void forum_entry_widget(
222
+ const char *zTitle,
223
+ const char *zMimetype,
224
+ const char *zContent
225
+){
226
+ if( zTitle ){
227
+ @ Title: <input type="input" name="title" value="%h(zTitle)" size="50"><br>
228
+ }
229
+ @ Markup style:
230
+ mimetype_option_menu(zMimetype);
231
+ @ <br><textarea name="content" class="wikiedit" cols="80" \
232
+ @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
233
+}
205234
206235
/*
207236
** WEBPAGE: forumnew
208237
** WEBPAGE: test-forumnew
209238
**
@@ -210,13 +239,13 @@
210239
** Start a new forum thread. The /test-forumnew works just like
211240
** /forumnew except that it provides additional controls for testing
212241
** and debugging.
213242
*/
214243
void forumnew_page(void){
215
- const char *zTitle = PDT("t","");
216
- const char *zMimetype = PD("mt","text/x-fossil-wiki");
217
- const char *zContent = PDT("x","");
244
+ const char *zTitle = PDT("title","");
245
+ const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
246
+ const char *zContent = PDT("content","");
218247
login_check_credentials();
219248
if( !g.perm.WrForum ){
220249
login_needed(g.anon.WrForum);
221250
return;
222251
}
@@ -228,15 +257,11 @@
228257
forum_render(zMimetype, zContent);
229258
@ <hr>
230259
}
231260
style_header("New Forum Thread");
232261
@ <form action="%R/%s(g.zPath)" method="POST">
233
- @ Title: <input type="input" name="t" value="%h(zTitle)" size="50"><br>
234
- @ Markup style:
235
- mimetype_option_menu(zMimetype);
236
- @ <br><textarea name="x" class="wikiedit" cols="80" \
237
- @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
262
+ forum_entry_widget(zTitle, zMimetype, zContent);
238263
@ <input type="submit" name="preview" value="Preview">
239264
if( P("preview") ){
240265
@ <input type="submit" name="submit" value="Submit">
241266
}else{
242267
@ <input type="submit" name="submit" value="Submit" disabled>
@@ -276,22 +301,29 @@
276301
*/
277302
void forumedit_page(void){
278303
int fpid;
279304
Manifest *pPost;
280305
281
- fpid = symbolic_name_to_rid(PD("fpid",""), "f");
282306
login_check_credentials();
283307
if( !g.perm.WrForum ){
284308
login_needed(g.anon.WrForum);
285309
return;
286310
}
311
+ fpid = symbolic_name_to_rid(PD("fpid",""), "f");
287312
if( fpid<=0 || (pPost = manifest_get(fpid, CFTYPE_FORUM, 0))==0 ){
288313
webpage_error("Missing or invalid fpid query parameter");
289314
return;
290315
}
291
-#if 0
292316
if( g.perm.ModForum ){
293317
if( P("approve") ){
318
+ webpage_not_yet_implemented();
319
+ return;
294320
}
295321
if( P("reject") ){
322
+ webpage_not_yet_implemented();
323
+ return;
296324
}
297325
}
326
+ if( P("submitdryrun") ){
327
+ cgi_set_parameter_nocopy("dryrun","1",1);
328
+ cgi_set_parameter_nocopy("submit","1",1);
329
+ }
@@ -298,10 +330,43 @@
298
- if( P("submit") ){
330
+ if( P("submit") && cgi_csrf_safe(1) ){
331
+ int done = 1;
332
+ const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
333
+ const char *zContent = PDT("content","");
334
+ if( P("reply") ){
335
+ done = forum_post(0, fpid, 0, 0, zMimetype, zContent);
336
+ }else if( P("edit") ){
337
+ done = forum_post(0, 0, fpid, 0, zMimetype, zContent);
338
+ }else{
339
+ webpage_error("Need one of 'edit' or 'reply' query parameters");
340
+ }
341
+ if( done ) return;
299342
}
300343
if( P("edit") ){
301
- }
302
- if( P("reply") ){
344
+ /* Provide an edit to the fpid post */
345
+ webpage_not_yet_implemented();
346
+ return;
347
+ }else{
348
+ const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
349
+ const char *zContent = PDT("content","");
350
+ style_header("Forum Reply");
351
+ @ <h1>Replying To:</h1>
352
+ forum_render(pPost->zMimetype, pPost->zWiki);
353
+ if( P("preview") ){
354
+ @ <h1>Preview:</h1>
355
+ forum_render(zMimetype,zContent);
356
+ }
357
+ @ <h1>Enter A Reply:</h1>
358
+ @ <form action="%R/forumedit" method="POST">
359
+ @ <input type="hidden" name="fpid" value="%h(P("fpid"))">
360
+ @ <input type="hidden" name="reply" value="1">
361
+ forum_entry_widget(0, zMimetype, zContent);
362
+ @ <input type="submit" name="preview" value="Preview">
363
+ if( P("preview") ){
364
+ @ <input type="submit" name="submit" value="Submit">
365
+ if( g.perm.Setup ){
366
+ @ <input type="submit" name="submitdryrun" value="Dry Run">
367
+ }
368
+ }
369
+ @ </form>
303370
}
304371
style_footer();
305
-#endif
306
- webpage_error("Not yet implemented");
307372
}
308373
--- src/forum.c
+++ src/forum.c
@@ -52,32 +52,44 @@
52 if( pPost==0 ) continue;
53 if( i>0 ){
54 @ <hr>
55 }
56 i++;
57 @ <p>%d(fpid) %h(zUuid)<br>
58 @ By %h(pPost->zUser) on %h(zDate)
 
 
59 if( fprev ){
60 @ edit of %d(fprev) %h(pPost->azParent[0])
61 }
62 if( firt ){
63 @ in reply to %d(firt) %h(pPost->zInReplyTo)
64 }
65 if( pPost->zThreadTitle ){
66 @ <h1>%h(pPost->zThreadTitle)</h1>
67 }
68 forum_render(pPost->zMimetype, pPost->zWiki);
69 if( g.perm.WrForum ){
 
 
 
70 @ <p><form action="%R/forumedit" method="POST">
71 @ <input type="hidden" name="fpid" value="%s(zUuid)">
72 @ <input type="submit" name="reply" value="Reply">
73 if( g.perm.Admin || fossil_strcmp(pPost->zUser,g.zLogin)==0 ){
74 @ <input type="submit" name="edit" value="Edit">
75 }
76 if( g.perm.ModForum && content_is_private(fpid) ){
 
 
 
 
 
 
77 @ <input type="submit" name="approve" value="Approve">
78 @ <input type="submit" name="reject" value="Reject">
 
 
 
 
79 }
80 @ </form></p>
81 }
82 manifest_destroy(pPost);
83 }
@@ -200,10 +212,27 @@
200
201 forum_post_error:
202 blob_reset(&x);
203 return 0;
204 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
206 /*
207 ** WEBPAGE: forumnew
208 ** WEBPAGE: test-forumnew
209 **
@@ -210,13 +239,13 @@
210 ** Start a new forum thread. The /test-forumnew works just like
211 ** /forumnew except that it provides additional controls for testing
212 ** and debugging.
213 */
214 void forumnew_page(void){
215 const char *zTitle = PDT("t","");
216 const char *zMimetype = PD("mt","text/x-fossil-wiki");
217 const char *zContent = PDT("x","");
218 login_check_credentials();
219 if( !g.perm.WrForum ){
220 login_needed(g.anon.WrForum);
221 return;
222 }
@@ -228,15 +257,11 @@
228 forum_render(zMimetype, zContent);
229 @ <hr>
230 }
231 style_header("New Forum Thread");
232 @ <form action="%R/%s(g.zPath)" method="POST">
233 @ Title: <input type="input" name="t" value="%h(zTitle)" size="50"><br>
234 @ Markup style:
235 mimetype_option_menu(zMimetype);
236 @ <br><textarea name="x" class="wikiedit" cols="80" \
237 @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
238 @ <input type="submit" name="preview" value="Preview">
239 if( P("preview") ){
240 @ <input type="submit" name="submit" value="Submit">
241 }else{
242 @ <input type="submit" name="submit" value="Submit" disabled>
@@ -276,22 +301,29 @@
276 */
277 void forumedit_page(void){
278 int fpid;
279 Manifest *pPost;
280
281 fpid = symbolic_name_to_rid(PD("fpid",""), "f");
282 login_check_credentials();
283 if( !g.perm.WrForum ){
284 login_needed(g.anon.WrForum);
285 return;
286 }
 
287 if( fpid<=0 || (pPost = manifest_get(fpid, CFTYPE_FORUM, 0))==0 ){
288 webpage_error("Missing or invalid fpid query parameter");
289 return;
290 }
291 #if 0
292 if( g.perm.ModForum ){
293 if( P("approve") ){
 
 
294 }
295 if( P("reject") ){
 
 
296 }
297 }
 
 
 
 
@@ -298,10 +330,43 @@
298 if( P("submit") ){
 
 
 
 
 
 
 
 
 
 
 
299 }
300 if( P("edit") ){
301 }
302 if( P("reply") ){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303 }
304 style_footer();
305 #endif
306 webpage_error("Not yet implemented");
307 }
308
--- src/forum.c
+++ src/forum.c
@@ -52,32 +52,44 @@
52 if( pPost==0 ) continue;
53 if( i>0 ){
54 @ <hr>
55 }
56 i++;
57 if( pPost->zThreadTitle ){
58 @ <h1>%h(pPost->zThreadTitle)</h1>
59 }
60 @ <p>By %h(pPost->zUser) on %h(zDate)
61 if( fprev ){
62 @ edit of %d(fprev) %h(pPost->azParent[0])
63 }
64 if( firt ){
65 @ in reply to %d(firt) %h(pPost->zInReplyTo)
66 }
 
 
 
67 forum_render(pPost->zMimetype, pPost->zWiki);
68 if( g.perm.WrForum ){
69 int sameUser = login_is_individual()
70 && fossil_strcmp(pPost->zUser, g.zLogin)==0;
71 int isPrivate = content_is_private(fpid);
72 @ <p><form action="%R/forumedit" method="POST">
73 @ <input type="hidden" name="fpid" value="%s(zUuid)">
74 if( !isPrivate ){
75 /* Reply and Edit are only available if the post has already
76 ** been approved */
77 @ <input type="submit" name="reply" value="Reply">
78 if( g.perm.Admin || sameUser ){
79 @ <input type="submit" name="edit" value="Edit">
80 @ <input type="submit" name="nullout" value="Delete">
81 }
82 }else if( g.perm.ModForum ){
83 /* Provide moderators with moderation buttons for posts that
84 ** are pending moderation */
85 @ <input type="submit" name="approve" value="Approve">
86 @ <input type="submit" name="reject" value="Reject">
87 }else if( sameUser ){
88 /* A post that is pending moderation can be deleted by the
89 ** person who originally submitted the post */
90 @ <input type="submit" name="reject" value="Delete">
91 }
92 @ </form></p>
93 }
94 manifest_destroy(pPost);
95 }
@@ -200,10 +212,27 @@
212
213 forum_post_error:
214 blob_reset(&x);
215 return 0;
216 }
217
218 /*
219 ** Paint the form elements for entering a Forum post
220 */
221 static void forum_entry_widget(
222 const char *zTitle,
223 const char *zMimetype,
224 const char *zContent
225 ){
226 if( zTitle ){
227 @ Title: <input type="input" name="title" value="%h(zTitle)" size="50"><br>
228 }
229 @ Markup style:
230 mimetype_option_menu(zMimetype);
231 @ <br><textarea name="content" class="wikiedit" cols="80" \
232 @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
233 }
234
235 /*
236 ** WEBPAGE: forumnew
237 ** WEBPAGE: test-forumnew
238 **
@@ -210,13 +239,13 @@
239 ** Start a new forum thread. The /test-forumnew works just like
240 ** /forumnew except that it provides additional controls for testing
241 ** and debugging.
242 */
243 void forumnew_page(void){
244 const char *zTitle = PDT("title","");
245 const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
246 const char *zContent = PDT("content","");
247 login_check_credentials();
248 if( !g.perm.WrForum ){
249 login_needed(g.anon.WrForum);
250 return;
251 }
@@ -228,15 +257,11 @@
257 forum_render(zMimetype, zContent);
258 @ <hr>
259 }
260 style_header("New Forum Thread");
261 @ <form action="%R/%s(g.zPath)" method="POST">
262 forum_entry_widget(zTitle, zMimetype, zContent);
 
 
 
 
263 @ <input type="submit" name="preview" value="Preview">
264 if( P("preview") ){
265 @ <input type="submit" name="submit" value="Submit">
266 }else{
267 @ <input type="submit" name="submit" value="Submit" disabled>
@@ -276,22 +301,29 @@
301 */
302 void forumedit_page(void){
303 int fpid;
304 Manifest *pPost;
305
 
306 login_check_credentials();
307 if( !g.perm.WrForum ){
308 login_needed(g.anon.WrForum);
309 return;
310 }
311 fpid = symbolic_name_to_rid(PD("fpid",""), "f");
312 if( fpid<=0 || (pPost = manifest_get(fpid, CFTYPE_FORUM, 0))==0 ){
313 webpage_error("Missing or invalid fpid query parameter");
314 return;
315 }
 
316 if( g.perm.ModForum ){
317 if( P("approve") ){
318 webpage_not_yet_implemented();
319 return;
320 }
321 if( P("reject") ){
322 webpage_not_yet_implemented();
323 return;
324 }
325 }
326 if( P("submitdryrun") ){
327 cgi_set_parameter_nocopy("dryrun","1",1);
328 cgi_set_parameter_nocopy("submit","1",1);
329 }
@@ -298,10 +330,43 @@
330 if( P("submit") && cgi_csrf_safe(1) ){
331 int done = 1;
332 const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
333 const char *zContent = PDT("content","");
334 if( P("reply") ){
335 done = forum_post(0, fpid, 0, 0, zMimetype, zContent);
336 }else if( P("edit") ){
337 done = forum_post(0, 0, fpid, 0, zMimetype, zContent);
338 }else{
339 webpage_error("Need one of 'edit' or 'reply' query parameters");
340 }
341 if( done ) return;
342 }
343 if( P("edit") ){
344 /* Provide an edit to the fpid post */
345 webpage_not_yet_implemented();
346 return;
347 }else{
348 const char *zMimetype = PD("mimetype","text/x-fossil-wiki");
349 const char *zContent = PDT("content","");
350 style_header("Forum Reply");
351 @ <h1>Replying To:</h1>
352 forum_render(pPost->zMimetype, pPost->zWiki);
353 if( P("preview") ){
354 @ <h1>Preview:</h1>
355 forum_render(zMimetype,zContent);
356 }
357 @ <h1>Enter A Reply:</h1>
358 @ <form action="%R/forumedit" method="POST">
359 @ <input type="hidden" name="fpid" value="%h(P("fpid"))">
360 @ <input type="hidden" name="reply" value="1">
361 forum_entry_widget(0, zMimetype, zContent);
362 @ <input type="submit" name="preview" value="Preview">
363 if( P("preview") ){
364 @ <input type="submit" name="submit" value="Submit">
365 if( g.perm.Setup ){
366 @ <input type="submit" name="submitdryrun" value="Dry Run">
367 }
368 }
369 @ </form>
370 }
371 style_footer();
 
 
372 }
373
+1 -1
--- src/main.c
+++ src/main.c
@@ -168,11 +168,11 @@
168168
const char *zContentType; /* The content type of the input HTTP request */
169169
int iErrPriority; /* Priority of current error message */
170170
char *zErrMsg; /* Text of an error message */
171171
int sslNotAvailable; /* SSL is not available. Do not redirect to https: */
172172
Blob cgiIn; /* Input to an xfer www method */
173
- int cgiOutput; /* 0: command-line 1: CGI. 2: CGI after an error */
173
+ int cgiOutput; /* 0: command-line 1: CGI. 2: after CGI */
174174
int xferPanic; /* Write error messages in XFER protocol */
175175
int fullHttpReply; /* True for full HTTP reply. False for CGI reply */
176176
Th_Interp *interp; /* The TH1 interpreter */
177177
char *th1Setup; /* The TH1 post-creation setup script, if any */
178178
int th1Flags; /* The TH1 integration state flags */
179179
--- src/main.c
+++ src/main.c
@@ -168,11 +168,11 @@
168 const char *zContentType; /* The content type of the input HTTP request */
169 int iErrPriority; /* Priority of current error message */
170 char *zErrMsg; /* Text of an error message */
171 int sslNotAvailable; /* SSL is not available. Do not redirect to https: */
172 Blob cgiIn; /* Input to an xfer www method */
173 int cgiOutput; /* 0: command-line 1: CGI. 2: CGI after an error */
174 int xferPanic; /* Write error messages in XFER protocol */
175 int fullHttpReply; /* True for full HTTP reply. False for CGI reply */
176 Th_Interp *interp; /* The TH1 interpreter */
177 char *th1Setup; /* The TH1 post-creation setup script, if any */
178 int th1Flags; /* The TH1 integration state flags */
179
--- src/main.c
+++ src/main.c
@@ -168,11 +168,11 @@
168 const char *zContentType; /* The content type of the input HTTP request */
169 int iErrPriority; /* Priority of current error message */
170 char *zErrMsg; /* Text of an error message */
171 int sslNotAvailable; /* SSL is not available. Do not redirect to https: */
172 Blob cgiIn; /* Input to an xfer www method */
173 int cgiOutput; /* 0: command-line 1: CGI. 2: after CGI */
174 int xferPanic; /* Write error messages in XFER protocol */
175 int fullHttpReply; /* True for full HTTP reply. False for CGI reply */
176 Th_Interp *interp; /* The TH1 interpreter */
177 char *th1Setup; /* The TH1 post-creation setup script, if any */
178 int th1Flags; /* The TH1 integration state flags */
179
+1 -1
--- src/printf.c
+++ src/printf.c
@@ -1148,11 +1148,11 @@
11481148
if(g.json.isJsonMode){
11491149
json_warn( FSL_JSON_W_UNKNOWN, "%s", z );
11501150
}else
11511151
#endif
11521152
{
1153
- if( g.cgiOutput ){
1153
+ if( g.cgiOutput==1 ){
11541154
cgi_printf("<p class=\"generalError\">\n%h\n</p>\n", z);
11551155
}else{
11561156
fossil_force_newline();
11571157
fossil_trace("%s\n", z);
11581158
}
11591159
--- src/printf.c
+++ src/printf.c
@@ -1148,11 +1148,11 @@
1148 if(g.json.isJsonMode){
1149 json_warn( FSL_JSON_W_UNKNOWN, "%s", z );
1150 }else
1151 #endif
1152 {
1153 if( g.cgiOutput ){
1154 cgi_printf("<p class=\"generalError\">\n%h\n</p>\n", z);
1155 }else{
1156 fossil_force_newline();
1157 fossil_trace("%s\n", z);
1158 }
1159
--- src/printf.c
+++ src/printf.c
@@ -1148,11 +1148,11 @@
1148 if(g.json.isJsonMode){
1149 json_warn( FSL_JSON_W_UNKNOWN, "%s", z );
1150 }else
1151 #endif
1152 {
1153 if( g.cgiOutput==1 ){
1154 cgi_printf("<p class=\"generalError\">\n%h\n</p>\n", z);
1155 }else{
1156 fossil_force_newline();
1157 fossil_trace("%s\n", z);
1158 }
1159
--- src/style.c
+++ src/style.c
@@ -1014,5 +1014,12 @@
10141014
@ %h(blob_str(&g.httpHeader))
10151015
@ </pre>
10161016
}
10171017
style_footer();
10181018
}
1019
+
1020
+/*
1021
+** Generate a Not Yet Implemented error page.
1022
+*/
1023
+void webpage_not_yet_implemented(void){
1024
+ webpage_error("Not yet implemented");
1025
+}
10191026
--- src/style.c
+++ src/style.c
@@ -1014,5 +1014,12 @@
1014 @ %h(blob_str(&g.httpHeader))
1015 @ </pre>
1016 }
1017 style_footer();
1018 }
 
 
 
 
 
 
 
1019
--- src/style.c
+++ src/style.c
@@ -1014,5 +1014,12 @@
1014 @ %h(blob_str(&g.httpHeader))
1015 @ </pre>
1016 }
1017 style_footer();
1018 }
1019
1020 /*
1021 ** Generate a Not Yet Implemented error page.
1022 */
1023 void webpage_not_yet_implemented(void){
1024 webpage_error("Not yet implemented");
1025 }
1026

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button