@@ -72,16 +72,40 @@ type blockcodefn = extern "C" fn(*mut hoedown_buffer, *const hoedown_buffer,
7272type headerfn = extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
7373 libc:: c_int , * mut libc:: c_void ) ;
7474
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+
7582#[ repr( C ) ]
7683struct hoedown_renderer {
77- opaque : * mut hoedown_html_renderer_state ,
84+ opaque : * mut libc:: c_void ,
85+
7886 blockcode : Option < blockcodefn > ,
7987 blockquote : Option < extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
8088 * mut libc:: c_void ) > ,
8189 blockhtml : Option < extern "C" fn ( * mut hoedown_buffer , * const hoedown_buffer ,
8290 * mut libc:: c_void ) > ,
8391 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 ) > ,
85109}
86110
87111#[ repr( C ) ]
@@ -134,6 +158,8 @@ extern {
134158 fn hoedown_document_free ( md : * mut hoedown_document ) ;
135159
136160 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 ) ;
137163 fn hoedown_buffer_puts ( b : * mut hoedown_buffer , c : * const libc:: c_char ) ;
138164 fn hoedown_buffer_free ( b : * mut hoedown_buffer ) ;
139165
@@ -279,7 +305,8 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
279305 dfltblk : ( * renderer) . blockcode . unwrap ( ) ,
280306 toc_builder : if print_toc { Some ( TocBuilder :: new ( ) ) } else { None }
281307 } ;
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 ;
283310 ( * renderer) . blockcode = Some ( block as blockcodefn ) ;
284311 ( * renderer) . header = Some ( header as headerfn ) ;
285312
@@ -355,7 +382,8 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
355382 let renderer = hoedown_html_renderer_new ( 0 , 0 ) ;
356383 ( * renderer) . blockcode = Some ( block as blockcodefn ) ;
357384 ( * 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 ;
359387
360388 let document = hoedown_document_new ( renderer, HOEDOWN_EXTENSIONS , 16 ) ;
361389 hoedown_document_render ( document, ob, doc. as_ptr ( ) ,
@@ -442,9 +470,60 @@ impl<'a> fmt::Display for MarkdownWithToc<'a> {
442470 }
443471}
444472
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+
445523#[ cfg( test) ]
446524mod tests {
447525 use super :: { LangString , Markdown } ;
526+ use super :: plain_summary_line;
448527
449528 #[ test]
450529 fn test_lang_string_parse ( ) {
@@ -478,4 +557,18 @@ mod tests {
478557 let markdown = "# title" ;
479558 format ! ( "{}" , Markdown ( markdown. as_slice( ) ) ) ;
480559 }
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+ }
481574}
0 commit comments