Skip to content

Commit 7baa12f

Browse files
authored
Merge pull request #222 from benwis/main
Add support for WASM compilation
2 parents 76f4b65 + 7a69109 commit 7baa12f

File tree

6 files changed

+84
-39
lines changed

6 files changed

+84
-39
lines changed

.github/workflows/rust.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ jobs:
2222
run: env SPEC=false script/cibuild
2323
- name: Run spec tests
2424
run: env SPEC=true script/cibuild
25+
build_wasm:
26+
runs-on: ubuntu-latest
27+
steps:
28+
- uses: actions/checkout@v1
29+
with:
30+
submodules: true
31+
- name: Obtain Rust
32+
run: rustup override set stable
33+
- name: Setup for wasm
34+
run: rustup target add wasm32-unknown-unknown
35+
- name: Build
36+
run: cargo build --verbose --target wasm32-unknown-unknown
37+
- name: Build examples
38+
run: cargo build --verbose --target wasm32-unknown-unknown --examples
2539
no_features_build_test:
2640
runs-on: ubuntu-latest
2741
strategy:

Cargo.lock

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ keywords = ["markdown", "commonmark"]
1111
license = "BSD-2-Clause"
1212
categories = ["text-processing", "parsing", "command-line-utilities"]
1313
exclude = ["/hooks/*", "/script/*", "/vendor/*", "/.travis.yml", "/Makefile", "/spec_out.txt"]
14+
resolver = "2"
1415

1516
[profile.release]
1617
lto = true
@@ -31,14 +32,19 @@ twoway = "0.2"
3132
pest = "2"
3233
pest_derive = "2"
3334
shell-words = "1.0"
34-
syntect = { version = "4.6", optional = true, default-features = false, features = ["assets", "dump-load", "html", "regex-onig"] }
3535

3636
[dev-dependencies]
3737
timebomb = "0.1.2"
38+
39+
[target.'cfg(not(target_arch="wasm32"))'.dev-dependencies]
3840
propfuzz = "0.0.1"
3941

4042
[features]
4143
default = ["clap", "syntect"]
4244

43-
[target.'cfg(not(windows))'.dependencies]
45+
[target.'cfg(all(not(windows), not(target_arch="wasm32")))'.dependencies]
4446
xdg = "^2.1"
47+
syntect = { version = "4.6", optional = true, default-features = false, features = ["assets", "dump-load", "html", "regex-onig"] }
48+
49+
[target.'cfg(target_arch="wasm32")'.dependencies]
50+
syntect = { version = "4.6", optional = true, default-features = false, features = ["default-fancy"] }

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ extern crate lazy_static;
7777
extern crate pest;
7878
#[macro_use]
7979
extern crate pest_derive;
80-
#[cfg(test)]
80+
#[cfg(all(test, not(target_arch = "wasm32")))]
8181
extern crate propfuzz;
8282
extern crate regex;
8383
#[cfg(feature = "syntect")]

src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ extern crate comrak;
66
extern crate clap;
77
extern crate shell_words;
88

9-
#[cfg(not(windows))]
9+
#[cfg(all(not(windows), not(target_arch = "wasm32")))]
1010
extern crate xdg;
1111

1212
use comrak::{
@@ -291,7 +291,7 @@ if the file does not exist.\
291291
process::exit(EXIT_SUCCESS);
292292
}
293293

294-
#[cfg(not(windows))]
294+
#[cfg(all(not(windows), not(target_arch = "wasm32")))]
295295
fn get_default_config_path() -> String {
296296
if let Ok(xdg_dirs) = xdg::BaseDirectories::with_prefix("comrak") {
297297
if let Ok(path) = xdg_dirs.place_config_file("config") {
@@ -303,8 +303,8 @@ fn get_default_config_path() -> String {
303303

304304
"comrak.config".into()
305305
}
306-
307-
#[cfg(windows)]
306+
// If on Windows or compiling to wasm, disable default config file check
307+
#[cfg(any(windows, target_arch = "wasm32"))]
308308
fn get_default_config_path() -> String {
309309
"none".into()
310310
}

src/tests.rs

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ use cm;
44
use html;
55
#[cfg(feature = "syntect")]
66
use plugins::syntect::SyntectAdapter;
7-
use propfuzz::prelude::*;
87
use std::collections::HashMap;
9-
use std::fmt::Debug;
108
use strings::build_opening_tag;
119
use timebomb::timeout_ms;
12-
use {
13-
parse_document, Arena, ComrakExtensionOptions, ComrakOptions, ComrakParseOptions,
14-
ComrakPlugins, ComrakRenderOptions,
15-
};
1610

11+
#[cfg(not(target_arch = "wasm32"))]
12+
use propfuzz::prelude::*;
13+
14+
#[cfg(not(target_arch = "wasm32"))]
1715
#[propfuzz]
1816
fn fuzz_doesnt_crash(md: String) {
19-
let options = ComrakOptions {
20-
extension: ComrakExtensionOptions {
17+
let options = ::ComrakOptions {
18+
extension: ::ComrakExtensionOptions {
2119
strikethrough: true,
2220
tagfilter: true,
2321
table: true,
@@ -29,11 +27,11 @@ fn fuzz_doesnt_crash(md: String) {
2927
description_lists: true,
3028
front_matter_delimiter: None,
3129
},
32-
parse: ComrakParseOptions {
30+
parse: ::ComrakParseOptions {
3331
smart: true,
3432
default_info_string: Some("Rust".to_string()),
3533
},
36-
render: ComrakRenderOptions {
34+
render: ::ComrakRenderOptions {
3735
hardbreaks: true,
3836
github_pre_lang: true,
3937
width: 80,
@@ -42,7 +40,7 @@ fn fuzz_doesnt_crash(md: String) {
4240
},
4341
};
4442

45-
parse_document(&Arena::new(), &md, &options);
43+
::parse_document(&::Arena::new(), &md, &options);
4644
}
4745

4846
#[track_caller]
@@ -71,20 +69,20 @@ fn html(input: &str, expected: &str) {
7169
#[track_caller]
7270
fn html_opts<F>(input: &str, expected: &str, opts: F)
7371
where
74-
F: Fn(&mut ComrakOptions),
72+
F: Fn(&mut ::ComrakOptions),
7573
{
76-
let arena = Arena::new();
77-
let mut options = ComrakOptions::default();
74+
let arena = ::Arena::new();
75+
let mut options = ::ComrakOptions::default();
7876
opts(&mut options);
7977

80-
let root = parse_document(&arena, input, &options);
78+
let root = ::parse_document(&arena, input, &options);
8179
let mut output = vec![];
8280
html::format_document(root, &options, &mut output).unwrap();
8381
compare_strs(&String::from_utf8(output).unwrap(), expected, "regular");
8482

8583
let mut md = vec![];
8684
cm::format_document(root, &options, &mut md).unwrap();
87-
let root = parse_document(&arena, &String::from_utf8(md).unwrap(), &options);
85+
let root = ::parse_document(&arena, &String::from_utf8(md).unwrap(), &options);
8886
let mut output_from_rt = vec![];
8987
html::format_document(root, &options, &mut output_from_rt).unwrap();
9088
compare_strs(
@@ -105,18 +103,18 @@ macro_rules! html_opts {
105103
};
106104
}
107105

108-
fn html_plugins(input: &str, expected: &str, plugins: &ComrakPlugins) {
109-
let arena = Arena::new();
110-
let options = ComrakOptions::default();
106+
fn html_plugins(input: &str, expected: &str, plugins: &::ComrakPlugins) {
107+
let arena = ::Arena::new();
108+
let options = ::ComrakOptions::default();
111109

112-
let root = parse_document(&arena, input, &options);
110+
let root = ::parse_document(&arena, input, &options);
113111
let mut output = vec![];
114112
html::format_document_with_plugins(root, &options, &mut output, &plugins).unwrap();
115113
compare_strs(&String::from_utf8(output).unwrap(), expected, "regular");
116114

117115
let mut md = vec![];
118116
cm::format_document(root, &options, &mut md).unwrap();
119-
let root = parse_document(&arena, &String::from_utf8(md).unwrap(), &options);
117+
let root = ::parse_document(&arena, &String::from_utf8(md).unwrap(), &options);
120118
let mut output_from_rt = vec![];
121119
html::format_document_with_plugins(root, &options, &mut output_from_rt, &plugins).unwrap();
122120
compare_strs(
@@ -199,7 +197,7 @@ fn syntax_highlighter_plugin() {
199197
"</code></pre>\n"
200198
);
201199

202-
let mut plugins = ComrakPlugins::default();
200+
let mut plugins = ::ComrakPlugins::default();
203201
let adapter = MockAdapter {};
204202
plugins.render.codefence_syntax_highlighter = Some(&adapter);
205203

@@ -219,7 +217,7 @@ fn syntect_plugin() {
219217
"</code></pre>\n"
220218
);
221219

222-
let mut plugins = ComrakPlugins::default();
220+
let mut plugins = ::ComrakPlugins::default();
223221
plugins.render.codefence_syntax_highlighter = Some(&adapter);
224222

225223
html_plugins(input, expected, &plugins);
@@ -425,9 +423,9 @@ fn blockquote_hard_linebreak_nonlazy_space() {
425423
fn backticks_num() {
426424
let input = "Some `code1`. More ``` code2 ```.\n";
427425

428-
let arena = Arena::new();
429-
let options = ComrakOptions::default();
430-
let root = parse_document(&arena, input, &options);
426+
let arena = ::Arena::new();
427+
let options = ::ComrakOptions::default();
428+
let root = ::parse_document(&arena, input, &options);
431429

432430
let code1 = NodeValue::Code(NodeCode {
433431
num_backticks: 1,
@@ -1043,19 +1041,19 @@ fn nested_tables_3() {
10431041
#[test]
10441042
fn no_stack_smash_html() {
10451043
let s: String = ::std::iter::repeat('>').take(150_000).collect();
1046-
let arena = Arena::new();
1047-
let root = parse_document(&arena, &s, &ComrakOptions::default());
1044+
let arena = ::Arena::new();
1045+
let root = ::parse_document(&arena, &s, &::ComrakOptions::default());
10481046
let mut output = vec![];
1049-
html::format_document(root, &ComrakOptions::default(), &mut output).unwrap()
1047+
html::format_document(root, &::ComrakOptions::default(), &mut output).unwrap()
10501048
}
10511049

10521050
#[test]
10531051
fn no_stack_smash_cm() {
10541052
let s: String = ::std::iter::repeat('>').take(150_000).collect();
1055-
let arena = Arena::new();
1056-
let root = parse_document(&arena, &s, &ComrakOptions::default());
1053+
let arena = ::Arena::new();
1054+
let root = ::parse_document(&arena, &s, &::ComrakOptions::default());
10571055
let mut output = vec![];
1058-
cm::format_document(root, &ComrakOptions::default(), &mut output).unwrap()
1056+
cm::format_document(root, &::ComrakOptions::default(), &mut output).unwrap()
10591057
}
10601058

10611059
#[test]

0 commit comments

Comments
 (0)