Skip to content

Commit 0a01fcc

Browse files
Merge #981
981: Switch from `pulldown-cmark` to `comrak` r=carols10cents Fixes #978 ![2017-08-19-235915_693x247_scrot](https://user-images.githubusercontent.com/1484987/29491961-788634f6-853a-11e7-89b3-a11606c0af82.png) This only enables the task list feature. There are [other GFM features] that aren't enabled. [other GFM features]: https://docs.rs/comrak/0.1.7/comrak/struct.ComrakOptions.html
2 parents 608d884 + 7eedf1b commit 0a01fcc

File tree

4 files changed

+70
-50
lines changed

4 files changed

+70
-50
lines changed

Cargo.lock

+32-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ serde_derive = "1.0.0"
4848
serde = "1.0.0"
4949
clippy = { version = "=0.0.142", optional = true }
5050
chrono = "0.4.0"
51-
pulldown-cmark = { version = "0.0.15", default-features = false }
51+
comrak = { version = "0.1.8", default-features = false }
5252
ammonia = "0.5.0"
5353

5454
conduit = "0.8"

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern crate serde_json;
2222
extern crate serde_derive;
2323
extern crate ammonia;
2424
extern crate chrono;
25+
extern crate comrak;
2526
extern crate curl;
2627
extern crate diesel_full_text_search;
2728
extern crate dotenv;
@@ -31,7 +32,6 @@ extern crate hex;
3132
extern crate license_exprs;
3233
extern crate oauth2;
3334
extern crate openssl;
34-
extern crate pulldown_cmark;
3535
extern crate r2d2;
3636
extern crate r2d2_diesel;
3737
extern crate rand;

src/render.rs

+36-38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use ammonia::Ammonia;
2-
use pulldown_cmark::Parser;
3-
use pulldown_cmark::html;
2+
use comrak;
43

54
use util::CargoResult;
65

@@ -24,12 +23,13 @@ impl<'a> MarkdownRenderer<'a> {
2423
"dl",
2524
"dt",
2625
"em",
27-
"i",
2826
"h1",
2927
"h2",
3028
"h3",
3129
"hr",
30+
"i",
3231
"img",
32+
"input",
3333
"kbd",
3434
"li",
3535
"ol",
@@ -61,6 +61,10 @@ impl<'a> MarkdownRenderer<'a> {
6161
.cloned()
6262
.collect(),
6363
),
64+
(
65+
"input",
66+
["checked", "disabled", "type"].iter().cloned().collect(),
67+
),
6468
].iter()
6569
.cloned()
6670
.collect();
@@ -75,9 +79,15 @@ impl<'a> MarkdownRenderer<'a> {
7579

7680
/// Renders the given markdown to HTML using the current settings.
7781
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);
8191
Ok(self.html_sanitizer.clean(&rendered))
8292
}
8393
}
@@ -113,56 +123,44 @@ mod tests {
113123
#[test]
114124
fn empty_text() {
115125
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, "");
120128
}
121129

122130
#[test]
123131
fn text_with_script_tag() {
124132
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&lt;script&gt;alert(\'Hello World\')&lt;/script&gt;\n"
137+
);
131138
}
132139

133140
#[test]
134141
fn text_with_iframe_tag() {
135142
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&lt;iframe&gt;alert(\'Hello World\')&lt;/iframe&gt;\n"
147+
);
142148
}
143149

144150
#[test]
145-
fn text_with_unknwon_tag() {
151+
fn text_with_unknown_tag() {
146152
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");
153155
}
154156

155157
#[test]
156158
fn text_with_inline_javascript() {
157159
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+
);
167165
}
168166
}

0 commit comments

Comments
 (0)