Fossil SCM
Share wiki rendering logic between HTML output helpers.
Commit
07dadca733d6aa9db0ab3e85aa3af1c3ffa8b40e6fb8a1832bbd312e873bf360
Parent
b78b4665b1cb727…
1 file changed
+47
-54
+47
-54
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -188,73 +188,30 @@ | ||
| 188 | 188 | } |
| 189 | 189 | return "text/x-fossil-wiki"; |
| 190 | 190 | } |
| 191 | 191 | |
| 192 | 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( | |
| 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( | |
| 242 | 197 | Blob *pOut, |
| 243 | 198 | const char *zMimetype, |
| 244 | 199 | const char *zContent, |
| 245 | - int eDocSrc | |
| 200 | + int bSetDocSrc, | |
| 201 | + int eDocSrc, | |
| 202 | + int bPikchrPopup | |
| 246 | 203 | ){ |
| 247 | 204 | Blob in; |
| 248 | 205 | if( pOut==0 ) return; |
| 249 | 206 | if( zContent==0 || zContent[0]==0 ){ |
| 250 | 207 | blob_append_literal(pOut, "<i>Deleted</i>"); |
| 251 | 208 | return; |
| 252 | 209 | } |
| 253 | 210 | blob_init(&in, 0, 0); |
| 254 | 211 | blob_append(&in, zContent, -1); |
| 255 | - safe_html_context(eDocSrc); | |
| 212 | + if( bSetDocSrc ) safe_html_context(eDocSrc); | |
| 256 | 213 | if( zMimetype==0 || fossil_strcmp(zMimetype, "text/x-fossil-wiki")==0 ){ |
| 257 | 214 | wiki_convert(&in, pOut, 0); |
| 258 | 215 | }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){ |
| 259 | 216 | markdown_to_html(&in, 0, pOut); |
| 260 | 217 | safe_html(pOut); |
| @@ -262,14 +219,20 @@ | ||
| 262 | 219 | const char *zPikchr = blob_str(&in); |
| 263 | 220 | int w = 0; |
| 264 | 221 | int h = 0; |
| 265 | 222 | char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h); |
| 266 | 223 | 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 | + } | |
| 269 | 230 | blob_append(pOut, zOut, -1); |
| 270 | - blob_append_literal(pOut, "</div>"); | |
| 231 | + if( !bPikchrPopup ){ | |
| 232 | + blob_append_literal(pOut, "</div>"); | |
| 233 | + } | |
| 271 | 234 | }else{ |
| 272 | 235 | blob_append_literal(pOut, "<pre class='error'>"); |
| 273 | 236 | htmlize_to_blob(pOut, zOut, -1); |
| 274 | 237 | blob_append_literal(pOut, "</pre>"); |
| 275 | 238 | } |
| @@ -283,10 +246,40 @@ | ||
| 283 | 246 | htmlize_to_blob(pOut, blob_str(&in), blob_size(&in)); |
| 284 | 247 | blob_append_literal(pOut, "</pre>"); |
| 285 | 248 | } |
| 286 | 249 | blob_reset(&in); |
| 287 | 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 | +} | |
| 288 | 281 | |
| 289 | 282 | /* |
| 290 | 283 | ** WEBPAGE: md_rules |
| 291 | 284 | ** |
| 292 | 285 | ** Show a summary of the Markdown wiki formatting rules. |
| 293 | 286 |
| --- 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 |