@@ -105,6 +105,8 @@ struct MyOpaque {
105
105
dfltblk : extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
106
106
* const hoedown_buffer , * mut libc:: c_void ) ,
107
107
toc_builder : Option < TocBuilder > ,
108
+ math_enabled : bool ,
109
+ math_seen : bool ,
108
110
}
109
111
110
112
#[ repr( C ) ]
@@ -170,6 +172,7 @@ local_data_key!(test_idx: Cell<uint>)
170
172
// None == render an example, but there's no crate name
171
173
local_data_key ! ( pub playground_krate: Option <String >)
172
174
local_data_key ! ( pub use_mathjax: bool )
175
+ local_data_key ! ( pub math_seen: bool )
173
176
174
177
pub fn render ( w : & mut fmt:: Formatter , s : & str , print_toc : bool ) -> fmt:: Result {
175
178
extern fn block ( ob : * mut hoedown_buffer , text : * const hoedown_buffer ,
@@ -293,16 +296,48 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
293
296
text. with_c_str ( |p| unsafe { hoedown_buffer_puts ( ob, p) } ) ;
294
297
}
295
298
299
+ extern fn math ( ob : * mut hoedown_buffer , text : * const hoedown_buffer ,
300
+ display_mode : libc:: c_int , opaque : * mut libc:: c_void ) -> libc:: c_int {
301
+
302
+ let opaque = opaque as * mut hoedown_html_renderer_state ;
303
+ let opaque = unsafe { & mut * ( ( * opaque) . opaque as * mut MyOpaque ) } ;
304
+
305
+ opaque. math_seen = true ;
306
+
307
+ let ( open, close) = if !opaque. math_enabled {
308
+ ( "$$" , "$$" )
309
+ } else if displaymode == 1 {
310
+ ( "\\ [" , "\\ ]" )
311
+ } else {
312
+ ( "\\ (" , "\\ )" )
313
+ } ;
314
+
315
+ open. with_c_str ( |open| {
316
+ close. with_c_str ( |close| {
317
+ unsafe {
318
+ hoedown_buffer_puts ( ob, open, 2 ) ;
319
+ escape_html ( ob, ( * text) . data , ( * text) . size ) ;
320
+ hoedown_buffer_puts ( ob, close, 2 ) ;
321
+ }
322
+ } )
323
+ } ) ;
324
+
325
+ 1
326
+ }
327
+
296
328
unsafe {
297
329
let ob = hoedown_buffer_new ( DEF_OUNIT ) ;
298
330
let renderer = hoedown_html_renderer_new ( 0 , 0 ) ;
299
331
let mut opaque = MyOpaque {
300
332
dfltblk : ( * renderer) . blockcode . unwrap ( ) ,
301
- toc_builder : if print_toc { Some ( TocBuilder :: new ( ) ) } else { None }
333
+ toc_builder : if print_toc { Some ( TocBuilder :: new ( ) ) } else { None } ,
334
+ math_enabled : use_mathjax. get ( ) . map_or ( false , |x| * x) ,
335
+ math_seen : false ,
302
336
} ;
303
337
( * ( * renderer) . opaque ) . opaque = & mut opaque as * mut _ as * mut libc:: c_void ;
304
338
( * renderer) . blockcode = Some ( block) ;
305
339
( * renderer) . header = Some ( header) ;
340
+ ( * renderer) . math = Some ( math) ;
306
341
307
342
let document = hoedown_document_new ( renderer, hoedown_extensions ( ) , 16 ) ;
308
343
hoedown_document_render ( document, ob, s. as_ptr ( ) ,
@@ -322,6 +357,10 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
322
357
} ) ;
323
358
}
324
359
hoedown_buffer_free ( ob) ;
360
+
361
+ let old = math_seen. get ( ) . map_or ( false , |x| * x) ;
362
+ math_seen. replace ( Some ( old || opaque. math_seen ) ) ;
363
+
325
364
ret
326
365
}
327
366
}
0 commit comments