1
1
use ammonia:: Ammonia ;
2
- use pulldown_cmark:: Parser ;
3
- use pulldown_cmark:: html;
2
+ use comrak;
4
3
5
4
use util:: CargoResult ;
6
5
@@ -24,12 +23,13 @@ impl<'a> MarkdownRenderer<'a> {
24
23
"dl" ,
25
24
"dt" ,
26
25
"em" ,
27
- "i" ,
28
26
"h1" ,
29
27
"h2" ,
30
28
"h3" ,
31
29
"hr" ,
30
+ "i" ,
32
31
"img" ,
32
+ "input" ,
33
33
"kbd" ,
34
34
"li" ,
35
35
"ol" ,
@@ -61,6 +61,10 @@ impl<'a> MarkdownRenderer<'a> {
61
61
. cloned ( )
62
62
. collect ( ) ,
63
63
) ,
64
+ (
65
+ "input" ,
66
+ [ "checked" , "disabled" , "type" ] . iter ( ) . cloned ( ) . collect ( ) ,
67
+ ) ,
64
68
] . iter ( )
65
69
. cloned ( )
66
70
. collect ( ) ;
@@ -75,9 +79,15 @@ impl<'a> MarkdownRenderer<'a> {
75
79
76
80
/// Renders the given markdown to HTML using the current settings.
77
81
pub fn to_html ( & self , text : & str ) -> CargoResult < String > {
78
- let mut rendered = String :: with_capacity ( text. len ( ) * 3 / 2 ) ;
79
- let parser = Parser :: new ( text) ;
80
- html:: push_html ( & mut rendered, parser) ;
82
+ let options = comrak:: ComrakOptions {
83
+ ext_autolink : true ,
84
+ ext_strikethrough : true ,
85
+ ext_table : true ,
86
+ ext_tagfilter : true ,
87
+ ext_tasklist : true ,
88
+ ..comrak:: ComrakOptions :: default ( )
89
+ } ;
90
+ let rendered = comrak:: markdown_to_html ( text, & options) ;
81
91
Ok ( self . html_sanitizer . clean ( & rendered) )
82
92
}
83
93
}
@@ -113,56 +123,44 @@ mod tests {
113
123
#[ test]
114
124
fn empty_text ( ) {
115
125
let text = "" ;
116
- let result = markdown_to_html ( text) ;
117
- assert_eq ! ( result. is_ok( ) , true ) ;
118
- let rendered = result. unwrap ( ) ;
119
- assert_eq ! ( rendered, "" ) ;
126
+ let result = markdown_to_html ( text) . unwrap ( ) ;
127
+ assert_eq ! ( result, "" ) ;
120
128
}
121
129
122
130
#[ test]
123
131
fn text_with_script_tag ( ) {
124
132
let text = "foo_readme\n \n <script>alert('Hello World')</script>" ;
125
- let result = markdown_to_html ( text) ;
126
- assert_eq ! ( result. is_ok( ) , true ) ;
127
- let rendered = result. unwrap ( ) ;
128
- assert_eq ! ( rendered. contains( "foo_readme" ) , true ) ;
129
- assert_eq ! ( rendered. contains( "script" ) , false ) ;
130
- assert_eq ! ( rendered. contains( "alert('Hello World')" ) , true ) ;
133
+ let result = markdown_to_html ( text) . unwrap ( ) ;
134
+ assert_eq ! (
135
+ result,
136
+ "<p>foo_readme</p>\n <script>alert(\' Hello World\' )</script>\n "
137
+ ) ;
131
138
}
132
139
133
140
#[ test]
134
141
fn text_with_iframe_tag ( ) {
135
142
let text = "foo_readme\n \n <iframe>alert('Hello World')</iframe>" ;
136
- let result = markdown_to_html ( text) ;
137
- assert_eq ! ( result. is_ok( ) , true ) ;
138
- let rendered = result. unwrap ( ) ;
139
- assert_eq ! ( rendered. contains( "foo_readme" ) , true ) ;
140
- assert_eq ! ( rendered. contains( "iframe" ) , false ) ;
141
- assert_eq ! ( rendered. contains( "alert('Hello World')" ) , true ) ;
143
+ let result = markdown_to_html ( text) . unwrap ( ) ;
144
+ assert_eq ! (
145
+ result,
146
+ "<p>foo_readme</p>\n <iframe>alert(\' Hello World\' )</iframe>\n "
147
+ ) ;
142
148
}
143
149
144
150
#[ test]
145
- fn text_with_unknwon_tag ( ) {
151
+ fn text_with_unknown_tag ( ) {
146
152
let text = "foo_readme\n \n <unknown>alert('Hello World')</unknown>" ;
147
- let result = markdown_to_html ( text) ;
148
- assert_eq ! ( result. is_ok( ) , true ) ;
149
- let rendered = result. unwrap ( ) ;
150
- assert_eq ! ( rendered. contains( "foo_readme" ) , true ) ;
151
- assert_eq ! ( rendered. contains( "unknown" ) , false ) ;
152
- assert_eq ! ( rendered. contains( "alert('Hello World')" ) , true ) ;
153
+ let result = markdown_to_html ( text) . unwrap ( ) ;
154
+ assert_eq ! ( result, "<p>foo_readme</p>\n <p>alert(\' Hello World\' )</p>\n " ) ;
153
155
}
154
156
155
157
#[ test]
156
158
fn text_with_inline_javascript ( ) {
157
159
let text = r#"foo_readme\n\n<a href="https://crates.io/crates/cargo-registry" onclick="window.alert('Got you')">Crate page</a>"# ;
158
- let result = markdown_to_html ( text) ;
159
- assert_eq ! ( result. is_ok( ) , true ) ;
160
- let rendered = result. unwrap ( ) ;
161
- assert_eq ! ( rendered. contains( "foo_readme" ) , true ) ;
162
- assert_eq ! ( rendered. contains( "<a" ) , true ) ;
163
- assert_eq ! ( rendered. contains( "href=" ) , true ) ;
164
- assert_eq ! ( rendered. contains( "onclick" ) , false ) ;
165
- assert_eq ! ( rendered. contains( "window.alert" ) , false ) ;
166
- assert_eq ! ( rendered. contains( "Crate page" ) , true ) ;
160
+ let result = markdown_to_html ( text) . unwrap ( ) ;
161
+ assert_eq ! (
162
+ result,
163
+ "<p>foo_readme\\ n\\ n<a href=\" https://crates.io/crates/cargo-registry\" >Crate page</a></p>\n "
164
+ ) ;
167
165
}
168
166
}
0 commit comments