@@ -72,16 +72,40 @@ type blockcodefn = extern "C" fn(*mut hoedown_buffer, *const hoedown_buffer,
72
72
type headerfn = extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
73
73
libc:: c_int , * mut libc:: c_void ) ;
74
74
75
+ type linkfn = extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
76
+ * const hoedown_buffer , * const hoedown_buffer ,
77
+ * mut libc:: c_void ) -> libc:: c_int ;
78
+
79
+ type normaltextfn = extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
80
+ * mut libc:: c_void ) ;
81
+
75
82
#[ repr( C ) ]
76
83
struct hoedown_renderer {
77
- opaque : * mut hoedown_html_renderer_state ,
84
+ opaque : * mut libc:: c_void ,
85
+
78
86
blockcode : Option < blockcodefn > ,
79
87
blockquote : Option < extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
80
88
* mut libc:: c_void ) > ,
81
89
blockhtml : Option < extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
82
90
* mut libc:: c_void ) > ,
83
91
header : Option < headerfn > ,
84
- other : [ libc:: size_t ; 28 ] ,
92
+
93
+ other_block_level_callbacks : [ libc:: size_t ; 9 ] ,
94
+
95
+ /* span level callbacks - NULL or return 0 prints the span verbatim */
96
+ other_span_level_callbacks_1 : [ libc:: size_t ; 9 ] ,
97
+ link : Option < linkfn > ,
98
+ other_span_level_callbacks_2 : [ libc:: size_t ; 5 ] ,
99
+ // hoedown will add `math` callback here, but we use an old version of it.
100
+
101
+ /* low level callbacks - NULL copies input directly into the output */
102
+ entity : Option < extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
103
+ * mut libc:: c_void ) > ,
104
+ normal_text : Option < normaltextfn > ,
105
+
106
+ /* header and footer */
107
+ doc_header : Option < extern "C" fn ( * mut hoedown_buffer , * mut libc:: c_void ) > ,
108
+ doc_footer : Option < extern "C" fn ( * mut hoedown_buffer , * mut libc:: c_void ) > ,
85
109
}
86
110
87
111
#[ repr( C ) ]
@@ -134,6 +158,8 @@ extern {
134
158
fn hoedown_document_free ( md : * mut hoedown_document ) ;
135
159
136
160
fn hoedown_buffer_new ( unit : libc:: size_t ) -> * mut hoedown_buffer ;
161
+ fn hoedown_buffer_put ( b : * mut hoedown_buffer , c : * const libc:: c_char ,
162
+ n : libc:: size_t ) ;
137
163
fn hoedown_buffer_puts ( b : * mut hoedown_buffer , c : * const libc:: c_char ) ;
138
164
fn hoedown_buffer_free ( b : * mut hoedown_buffer ) ;
139
165
@@ -279,7 +305,8 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
279
305
dfltblk : ( * renderer) . blockcode . unwrap ( ) ,
280
306
toc_builder : if print_toc { Some ( TocBuilder :: new ( ) ) } else { None }
281
307
} ;
282
- ( * ( * renderer) . opaque ) . opaque = & mut opaque as * mut _ as * mut libc:: c_void ;
308
+ ( * ( ( * renderer) . opaque as * mut hoedown_html_renderer_state ) ) . opaque
309
+ = & mut opaque as * mut _ as * mut libc:: c_void ;
283
310
( * renderer) . blockcode = Some ( block as blockcodefn ) ;
284
311
( * renderer) . header = Some ( header as headerfn ) ;
285
312
@@ -355,7 +382,8 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
355
382
let renderer = hoedown_html_renderer_new ( 0 , 0 ) ;
356
383
( * renderer) . blockcode = Some ( block as blockcodefn ) ;
357
384
( * renderer) . header = Some ( header as headerfn ) ;
358
- ( * ( * renderer) . opaque ) . opaque = tests as * mut _ as * mut libc:: c_void ;
385
+ ( * ( ( * renderer) . opaque as * mut hoedown_html_renderer_state ) ) . opaque
386
+ = tests as * mut _ as * mut libc:: c_void ;
359
387
360
388
let document = hoedown_document_new ( renderer, HOEDOWN_EXTENSIONS , 16 ) ;
361
389
hoedown_document_render ( document, ob, doc. as_ptr ( ) ,
@@ -442,9 +470,60 @@ impl<'a> fmt::Display for MarkdownWithToc<'a> {
442
470
}
443
471
}
444
472
473
+ pub fn plain_summary_line ( md : & str ) -> String {
474
+ extern fn link ( _ob : * mut hoedown_buffer ,
475
+ _link : * const hoedown_buffer ,
476
+ _title : * const hoedown_buffer ,
477
+ content : * const hoedown_buffer ,
478
+ opaque : * mut libc:: c_void ) -> libc:: c_int
479
+ {
480
+ unsafe {
481
+ if !content. is_null ( ) && ( * content) . size > 0 {
482
+ let ob = opaque as * mut hoedown_buffer ;
483
+ hoedown_buffer_put ( ob, ( * content) . data as * const libc:: c_char ,
484
+ ( * content) . size ) ;
485
+ }
486
+ }
487
+ 1
488
+ }
489
+
490
+ extern fn normal_text ( _ob : * mut hoedown_buffer ,
491
+ text : * const hoedown_buffer ,
492
+ opaque : * mut libc:: c_void )
493
+ {
494
+ unsafe {
495
+ let ob = opaque as * mut hoedown_buffer ;
496
+ hoedown_buffer_put ( ob, ( * text) . data as * const libc:: c_char ,
497
+ ( * text) . size ) ;
498
+ }
499
+ }
500
+
501
+ unsafe {
502
+ let ob = hoedown_buffer_new ( DEF_OUNIT ) ;
503
+ let mut plain_renderer: hoedown_renderer = :: std:: mem:: zeroed ( ) ;
504
+ let renderer = & mut plain_renderer as * mut hoedown_renderer ;
505
+ ( * renderer) . opaque = ob as * mut libc:: c_void ;
506
+ ( * renderer) . link = Some ( link as linkfn ) ;
507
+ ( * renderer) . normal_text = Some ( normal_text as normaltextfn ) ;
508
+
509
+ let document = hoedown_document_new ( renderer, HOEDOWN_EXTENSIONS , 16 ) ;
510
+ hoedown_document_render ( document, ob, md. as_ptr ( ) ,
511
+ md. len ( ) as libc:: size_t ) ;
512
+ hoedown_document_free ( document) ;
513
+ let plain_slice = slice:: from_raw_buf ( & ( * ob) . data , ( * ob) . size as uint ) ;
514
+ let plain = match str:: from_utf8 ( plain_slice) {
515
+ Ok ( s) => s. to_string ( ) ,
516
+ Err ( _) => "" . to_string ( ) ,
517
+ } ;
518
+ hoedown_buffer_free ( ob) ;
519
+ plain
520
+ }
521
+ }
522
+
445
523
#[ cfg( test) ]
446
524
mod tests {
447
525
use super :: { LangString , Markdown } ;
526
+ use super :: plain_summary_line;
448
527
449
528
#[ test]
450
529
fn test_lang_string_parse ( ) {
@@ -478,4 +557,18 @@ mod tests {
478
557
let markdown = "# title" ;
479
558
format ! ( "{}" , Markdown ( markdown. as_slice( ) ) ) ;
480
559
}
560
+
561
+ #[ test]
562
+ fn test_plain_summary_line ( ) {
563
+ fn t ( input : & str , expect : & str ) {
564
+ let output = plain_summary_line ( input) ;
565
+ assert_eq ! ( output, expect) ;
566
+ }
567
+
568
+ t ( "hello [Rust](http://rust-lang.org) :)" , "hello Rust :)" ) ;
569
+ t ( "code `let x = i32;` ..." , "code `let x = i32;` ..." ) ;
570
+ t ( "type `Type<'static>` ..." , "type `Type<'static>` ..." ) ;
571
+ t ( "# top header" , "top header" ) ;
572
+ t ( "## header" , "header" ) ;
573
+ }
481
574
}
0 commit comments