Fossil SCM

Share wiki rendering logic between HTML output helpers.

vor0nwe 2026-03-08 11:06 rss-content
Commit 07dadca733d6aa9db0ab3e85aa3af1c3ffa8b40e6fb8a1832bbd312e873bf360
1 file changed +47 -54
+47 -54
--- src/wiki.c
+++ src/wiki.c
@@ -188,73 +188,30 @@
188188
}
189189
return "text/x-fossil-wiki";
190190
}
191191
192192
/*
193
-** Render wiki text according to its mimetype.
194
-**
195
-** text/x-fossil-wiki Fossil wiki
196
-** text/x-markdown Markdown
197
-** text/x-pikchr Pikchr
198
-** anything else... Plain text
199
-**
200
-** If zMimetype is a null pointer, then use "text/x-fossil-wiki".
201
-*/
202
-void wiki_render_by_mimetype(Blob *pWiki, const char *zMimetype){
203
- if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){
204
- wiki_convert(pWiki, 0, 0);
205
- }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
206
- Blob tail = BLOB_INITIALIZER;
207
- markdown_to_html(pWiki, 0, &tail);
208
- safe_html(&tail);
209
- @ %s(blob_str(&tail))
210
- blob_reset(&tail);
211
- }else if( fossil_strcmp(zMimetype, "text/x-pikchr")==0 ){
212
- int isPopup = P("popup")!=0;
213
- const char *zPikchr = blob_str(pWiki);
214
- int w, h;
215
- char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
216
- if( w>0 ){
217
- if( isPopup ) cgi_set_content_type("image/svg+xml");
218
- else{
219
- @ <div class="pikchr-svg" style="max-width:%d(w)px">
220
- }
221
- @ %s(zOut)
222
- if( !isPopup){
223
- @ </div>
224
- }
225
- }else{
226
- @ <pre class='error'>
227
- @ %h(zOut)
228
- @ </pre>
229
- }
230
- free(zOut);
231
- }else{
232
- @ <pre class='textPlain'>
233
- @ %h(blob_str(pWiki))
234
- @ </pre>
235
- }
236
-}
237
-
238
-/*
239
-** Render wiki/markdown/plaintext content into an output blob as HTML.
240
-*/
241
-void wiki_convert_to_html(
193
+** Shared implementation for wiki_render_by_mimetype() and
194
+** wiki_convert_to_html(). Appends HTML to pOut.
195
+*/
196
+static void wiki_render_to_blob_by_mimetype(
242197
Blob *pOut,
243198
const char *zMimetype,
244199
const char *zContent,
245
- int eDocSrc
200
+ int bSetDocSrc,
201
+ int eDocSrc,
202
+ int bPikchrPopup
246203
){
247204
Blob in;
248205
if( pOut==0 ) return;
249206
if( zContent==0 || zContent[0]==0 ){
250207
blob_append_literal(pOut, "<i>Deleted</i>");
251208
return;
252209
}
253210
blob_init(&in, 0, 0);
254211
blob_append(&in, zContent, -1);
255
- safe_html_context(eDocSrc);
212
+ if( bSetDocSrc ) safe_html_context(eDocSrc);
256213
if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){
257214
wiki_convert(&in, pOut, 0);
258215
}else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
259216
markdown_to_html(&in, 0, pOut);
260217
safe_html(pOut);
@@ -262,14 +219,20 @@
262219
const char *zPikchr = blob_str(&in);
263220
int w = 0;
264221
int h = 0;
265222
char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
266223
if( w>0 ){
267
- blob_appendf(pOut,
268
- "<div class=\"pikchr-svg\" style=\"max-width:%dpx\">", w);
224
+ if( bPikchrPopup ){
225
+ cgi_set_content_type("image/svg+xml");
226
+ }else{
227
+ blob_appendf(pOut,
228
+ "<div class=\"pikchr-svg\" style=\"max-width:%dpx\">", w);
229
+ }
269230
blob_append(pOut, zOut, -1);
270
- blob_append_literal(pOut, "</div>");
231
+ if( !bPikchrPopup ){
232
+ blob_append_literal(pOut, "</div>");
233
+ }
271234
}else{
272235
blob_append_literal(pOut, "<pre class='error'>");
273236
htmlize_to_blob(pOut, zOut, -1);
274237
blob_append_literal(pOut, "</pre>");
275238
}
@@ -283,10 +246,40 @@
283246
htmlize_to_blob(pOut, blob_str(&in), blob_size(&in));
284247
blob_append_literal(pOut, "</pre>");
285248
}
286249
blob_reset(&in);
287250
}
251
+
252
+/*
253
+** Render wiki text according to its mimetype.
254
+**
255
+** text/x-fossil-wiki Fossil wiki
256
+** text/x-markdown Markdown
257
+** text/x-pikchr Pikchr
258
+** anything else... Plain text
259
+**
260
+** If zMimetype is a null pointer, then use "text/x-fossil-wiki".
261
+*/
262
+void wiki_render_by_mimetype(Blob *pWiki, const char *zMimetype){
263
+ Blob out = BLOB_INITIALIZER;
264
+ wiki_render_to_blob_by_mimetype(&out, zMimetype, blob_str(pWiki),
265
+ 0, 0, P("popup")!=0);
266
+ @ %s(blob_str(&out))
267
+ blob_reset(&out);
268
+}
269
+
270
+/*
271
+** Render wiki/markdown/plaintext content into an output blob as HTML.
272
+*/
273
+void wiki_convert_to_html(
274
+ Blob *pOut,
275
+ const char *zMimetype,
276
+ const char *zContent,
277
+ int eDocSrc
278
+){
279
+ wiki_render_to_blob_by_mimetype(pOut, zMimetype, zContent, 1, eDocSrc, 0);
280
+}
288281
289282
/*
290283
** WEBPAGE: md_rules
291284
**
292285
** Show a summary of the Markdown wiki formatting rules.
293286
--- src/wiki.c
+++ src/wiki.c
@@ -188,73 +188,30 @@
188 }
189 return "text/x-fossil-wiki";
190 }
191
192 /*
193 ** Render wiki text according to its mimetype.
194 **
195 ** text/x-fossil-wiki Fossil wiki
196 ** text/x-markdown Markdown
197 ** text/x-pikchr Pikchr
198 ** anything else... Plain text
199 **
200 ** If zMimetype is a null pointer, then use "text/x-fossil-wiki".
201 */
202 void wiki_render_by_mimetype(Blob *pWiki, const char *zMimetype){
203 if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){
204 wiki_convert(pWiki, 0, 0);
205 }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
206 Blob tail = BLOB_INITIALIZER;
207 markdown_to_html(pWiki, 0, &tail);
208 safe_html(&tail);
209 @ %s(blob_str(&tail))
210 blob_reset(&tail);
211 }else if( fossil_strcmp(zMimetype, "text/x-pikchr")==0 ){
212 int isPopup = P("popup")!=0;
213 const char *zPikchr = blob_str(pWiki);
214 int w, h;
215 char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
216 if( w>0 ){
217 if( isPopup ) cgi_set_content_type("image/svg+xml");
218 else{
219 @ <div class="pikchr-svg" style="max-width:%d(w)px">
220 }
221 @ %s(zOut)
222 if( !isPopup){
223 @ </div>
224 }
225 }else{
226 @ <pre class='error'>
227 @ %h(zOut)
228 @ </pre>
229 }
230 free(zOut);
231 }else{
232 @ <pre class='textPlain'>
233 @ %h(blob_str(pWiki))
234 @ </pre>
235 }
236 }
237
238 /*
239 ** Render wiki/markdown/plaintext content into an output blob as HTML.
240 */
241 void wiki_convert_to_html(
242 Blob *pOut,
243 const char *zMimetype,
244 const char *zContent,
245 int eDocSrc
 
 
246 ){
247 Blob in;
248 if( pOut==0 ) return;
249 if( zContent==0 || zContent[0]==0 ){
250 blob_append_literal(pOut, "<i>Deleted</i>");
251 return;
252 }
253 blob_init(&in, 0, 0);
254 blob_append(&in, zContent, -1);
255 safe_html_context(eDocSrc);
256 if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){
257 wiki_convert(&in, pOut, 0);
258 }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
259 markdown_to_html(&in, 0, pOut);
260 safe_html(pOut);
@@ -262,14 +219,20 @@
262 const char *zPikchr = blob_str(&in);
263 int w = 0;
264 int h = 0;
265 char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
266 if( w>0 ){
267 blob_appendf(pOut,
268 "<div class=\"pikchr-svg\" style=\"max-width:%dpx\">", w);
 
 
 
 
269 blob_append(pOut, zOut, -1);
270 blob_append_literal(pOut, "</div>");
 
 
271 }else{
272 blob_append_literal(pOut, "<pre class='error'>");
273 htmlize_to_blob(pOut, zOut, -1);
274 blob_append_literal(pOut, "</pre>");
275 }
@@ -283,10 +246,40 @@
283 htmlize_to_blob(pOut, blob_str(&in), blob_size(&in));
284 blob_append_literal(pOut, "</pre>");
285 }
286 blob_reset(&in);
287 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
289 /*
290 ** WEBPAGE: md_rules
291 **
292 ** Show a summary of the Markdown wiki formatting rules.
293
--- src/wiki.c
+++ src/wiki.c
@@ -188,73 +188,30 @@
188 }
189 return "text/x-fossil-wiki";
190 }
191
192 /*
193 ** Shared implementation for wiki_render_by_mimetype() and
194 ** wiki_convert_to_html(). Appends HTML to pOut.
195 */
196 static void wiki_render_to_blob_by_mimetype(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197 Blob *pOut,
198 const char *zMimetype,
199 const char *zContent,
200 int bSetDocSrc,
201 int eDocSrc,
202 int bPikchrPopup
203 ){
204 Blob in;
205 if( pOut==0 ) return;
206 if( zContent==0 || zContent[0]==0 ){
207 blob_append_literal(pOut, "<i>Deleted</i>");
208 return;
209 }
210 blob_init(&in, 0, 0);
211 blob_append(&in, zContent, -1);
212 if( bSetDocSrc ) safe_html_context(eDocSrc);
213 if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){
214 wiki_convert(&in, pOut, 0);
215 }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
216 markdown_to_html(&in, 0, pOut);
217 safe_html(pOut);
@@ -262,14 +219,20 @@
219 const char *zPikchr = blob_str(&in);
220 int w = 0;
221 int h = 0;
222 char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
223 if( w>0 ){
224 if( bPikchrPopup ){
225 cgi_set_content_type("image/svg+xml");
226 }else{
227 blob_appendf(pOut,
228 "<div class=\"pikchr-svg\" style=\"max-width:%dpx\">", w);
229 }
230 blob_append(pOut, zOut, -1);
231 if( !bPikchrPopup ){
232 blob_append_literal(pOut, "</div>");
233 }
234 }else{
235 blob_append_literal(pOut, "<pre class='error'>");
236 htmlize_to_blob(pOut, zOut, -1);
237 blob_append_literal(pOut, "</pre>");
238 }
@@ -283,10 +246,40 @@
246 htmlize_to_blob(pOut, blob_str(&in), blob_size(&in));
247 blob_append_literal(pOut, "</pre>");
248 }
249 blob_reset(&in);
250 }
251
252 /*
253 ** Render wiki text according to its mimetype.
254 **
255 ** text/x-fossil-wiki Fossil wiki
256 ** text/x-markdown Markdown
257 ** text/x-pikchr Pikchr
258 ** anything else... Plain text
259 **
260 ** If zMimetype is a null pointer, then use "text/x-fossil-wiki".
261 */
262 void wiki_render_by_mimetype(Blob *pWiki, const char *zMimetype){
263 Blob out = BLOB_INITIALIZER;
264 wiki_render_to_blob_by_mimetype(&out, zMimetype, blob_str(pWiki),
265 0, 0, P("popup")!=0);
266 @ %s(blob_str(&out))
267 blob_reset(&out);
268 }
269
270 /*
271 ** Render wiki/markdown/plaintext content into an output blob as HTML.
272 */
273 void wiki_convert_to_html(
274 Blob *pOut,
275 const char *zMimetype,
276 const char *zContent,
277 int eDocSrc
278 ){
279 wiki_render_to_blob_by_mimetype(pOut, zMimetype, zContent, 1, eDocSrc, 0);
280 }
281
282 /*
283 ** WEBPAGE: md_rules
284 **
285 ** Show a summary of the Markdown wiki formatting rules.
286

Keyboard Shortcuts

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