commonmarker 1.1.3 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.lock +186 -195
- data/README.md +33 -22
- data/ext/commonmarker/Cargo.toml +2 -2
- data/ext/commonmarker/src/lib.rs +31 -111
- data/ext/commonmarker/src/node.rs +72 -30
- data/ext/commonmarker/src/options.rs +51 -4
- data/ext/commonmarker/src/plugins/syntax_highlighting.rs +99 -7
- data/ext/commonmarker/src/plugins.rs +3 -0
- data/lib/commonmarker/config.rb +12 -1
- data/lib/commonmarker/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -151,11 +151,12 @@ Note that there is a distinction in comrak for "parse" options and "render" opti
|
|
151
151
|
|
152
152
|
### Parse options
|
153
153
|
|
154
|
-
| Name
|
155
|
-
|
|
156
|
-
| `smart`
|
157
|
-
| `default_info_string`
|
158
|
-
| `
|
154
|
+
| Name | Description | Default |
|
155
|
+
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
156
|
+
| `smart` | Punctuation (quotes, full-stops and hyphens) are converted into 'smart' punctuation. | `false` |
|
157
|
+
| `default_info_string` | The default info string for fenced code blocks. | `""` |
|
158
|
+
| `relaxed_tasklist_matching` | Enables relaxing of the tasklist extension matching, allowing any non-space to be used for the "checked" state instead of only `x` and `X`. | `false` |
|
159
|
+
| `relaxed_autolinks` | Enable relaxing of the autolink extension parsing, allowing links to be recognized when in brackets, as well as permitting any url scheme. | `false` |
|
159
160
|
|
160
161
|
### Render options
|
161
162
|
|
@@ -163,38 +164,48 @@ Note that there is a distinction in comrak for "parse" options and "render" opti
|
|
163
164
|
| -------------------- | ------------------------------------------------------------------------------------------------------ | ------- |
|
164
165
|
| `hardbreaks` | [Soft line breaks](http://spec.commonmark.org/0.27/#soft-line-breaks) translate into hard line breaks. | `true` |
|
165
166
|
| `github_pre_lang` | GitHub-style `<pre lang="xyz">` is used for fenced code blocks with info tags. | `true` |
|
167
|
+
| `full_info_string` | Gives info string data after a space in a `data-meta` attribute on code blocks. | `false` |
|
166
168
|
| `width` | The wrap column when outputting CommonMark. | `80` |
|
167
169
|
| `unsafe` | Allow rendering of raw HTML and potentially dangerous links. | `false` |
|
168
170
|
| `escape` | Escape raw HTML instead of clobbering it. | `false` |
|
169
171
|
| `sourcepos` | Include source position attribute in HTML and XML output. | `false` |
|
170
|
-
| `escaped_char_spans` | Wrap escaped characters in span tags
|
172
|
+
| `escaped_char_spans` | Wrap escaped characters in span tags. | `true` |
|
173
|
+
| `ignore_setext` | Ignores setext-style headings. | `false` |
|
174
|
+
| `ignore_empty_links` | Ignores empty links, leaving the Markdown text in place. | `false` |
|
175
|
+
| `gfm_quirks` | Outputs HTML with GFM-style quirks; namely, not nesting `<strong>` inlines. | `false` |
|
176
|
+
| `prefer_fenced` | Always output fenced code blocks, even where an indented one could be used. | `false` |
|
171
177
|
|
172
178
|
As well, there are several extensions which you can toggle in the same manner:
|
173
179
|
|
174
180
|
```ruby
|
175
181
|
Commonmarker.to_html('"Hi *there*"', options: {
|
176
182
|
extension: { footnotes: true, description_lists: true },
|
177
|
-
render: { hardbreaks: false}
|
183
|
+
render: { hardbreaks: false }
|
178
184
|
})
|
179
185
|
```
|
180
186
|
|
181
187
|
### Extension options
|
182
188
|
|
183
|
-
| Name
|
184
|
-
| ---------------------------
|
185
|
-
| `strikethrough`
|
186
|
-
| `tagfilter`
|
187
|
-
| `table`
|
188
|
-
| `autolink`
|
189
|
-
| `tasklist`
|
190
|
-
| `superscript`
|
191
|
-
| `header_ids`
|
192
|
-
| `footnotes`
|
193
|
-
| `description_lists`
|
194
|
-
| `front_matter_delimiter`
|
195
|
-
| `
|
196
|
-
| `
|
197
|
-
| `
|
189
|
+
| Name | Description | Default |
|
190
|
+
| --------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------- |
|
191
|
+
| `strikethrough` | Enables the [strikethrough extension](https://github.github.com/gfm/#strikethrough-extension-) from the GFM spec. | `true` |
|
192
|
+
| `tagfilter` | Enables the [tagfilter extension](https://github.github.com/gfm/#disallowed-raw-html-extension-) from the GFM spec. | `true` |
|
193
|
+
| `table` | Enables the [table extension](https://github.github.com/gfm/#tables-extension-) from the GFM spec. | `true` |
|
194
|
+
| `autolink` | Enables the [autolink extension](https://github.github.com/gfm/#autolinks-extension-) from the GFM spec. | `true` |
|
195
|
+
| `tasklist` | Enables the [task list extension](https://github.github.com/gfm/#task-list-items-extension-) from the GFM spec. | `true` |
|
196
|
+
| `superscript` | Enables the superscript Comrak extension. | `false` |
|
197
|
+
| `header_ids` | Enables the header IDs Comrak extension. from the GFM spec. | `""` |
|
198
|
+
| `footnotes` | Enables the footnotes extension per `cmark-gfm`. | `false` |
|
199
|
+
| `description_lists` | Enables the description lists extension. | `false` |
|
200
|
+
| `front_matter_delimiter` | Enables the front matter extension. | `""` |
|
201
|
+
| `multiline_block_quotes` | Enables the multiline block quotes extension. | `false` |
|
202
|
+
| `math_dollars`, `math_code` | Enables the math extension. | `false` |
|
203
|
+
| `shortcodes` | Enables the shortcodes extension. | `true` |
|
204
|
+
| `wikilinks_title_before_pipe` | Enables the wikilinks extension, placing the title before the dividing pipe. | `false` |
|
205
|
+
| `wikilinks_title_after_pipe` | Enables the shortcodes extension, placing the title after the dividing pipe. | `false` |
|
206
|
+
| `underline` | Enables the underline extension. | `false` |
|
207
|
+
| `spoiler` | Enables the spoiler extension. | `false` |
|
208
|
+
| `greentext` | Enables the greentext extension. | `false` |
|
198
209
|
|
199
210
|
For more information on these options, see [the comrak documentation](https://github.com/kivikakk/comrak#usage).
|
200
211
|
|
data/ext/commonmarker/Cargo.toml
CHANGED
@@ -6,11 +6,11 @@ rust-version = "1.75.0"
|
|
6
6
|
publish = false
|
7
7
|
|
8
8
|
[dependencies]
|
9
|
-
magnus = { version = "0.
|
9
|
+
magnus = { version = "0.7", features = ["rb-sys"] }
|
10
10
|
rb-sys = { version = "*", default-features = false, features = [
|
11
11
|
"stable-api-compiled-fallback",
|
12
12
|
] }
|
13
|
-
comrak = { version = "0.
|
13
|
+
comrak = { version = "0.26", features = ["shortcodes"] }
|
14
14
|
syntect = { version = "5.2", features = ["plist-load"] }
|
15
15
|
typed-arena = "2.0"
|
16
16
|
rctree = "0.6"
|
data/ext/commonmarker/src/lib.rs
CHANGED
@@ -1,27 +1,15 @@
|
|
1
1
|
extern crate core;
|
2
2
|
|
3
|
-
use
|
4
|
-
|
5
|
-
use ::syntect::highlighting::ThemeSet;
|
6
|
-
use comrak::{
|
7
|
-
adapters::SyntaxHighlighterAdapter,
|
8
|
-
markdown_to_html, markdown_to_html_with_plugins, parse_document,
|
9
|
-
plugins::syntect::{SyntectAdapter, SyntectAdapterBuilder},
|
10
|
-
ComrakOptions, ComrakPlugins,
|
11
|
-
};
|
12
|
-
use magnus::{
|
13
|
-
define_module, exception, function, r_hash::ForEach, scan_args, Error, RHash, Symbol, Value,
|
14
|
-
};
|
3
|
+
use comrak::{markdown_to_html_with_plugins, parse_document, ComrakOptions};
|
4
|
+
use magnus::{define_module, function, r_hash::ForEach, scan_args, Error, RHash, Symbol, Value};
|
15
5
|
use node::CommonmarkerNode;
|
6
|
+
use plugins::syntax_highlighting::construct_syntax_highlighter_from_plugin;
|
16
7
|
|
17
8
|
mod options;
|
18
9
|
use options::iterate_options_hash;
|
19
10
|
|
20
11
|
mod plugins;
|
21
|
-
|
22
|
-
syntax_highlighting::{fetch_syntax_highlighter_path, fetch_syntax_highlighter_theme},
|
23
|
-
SYNTAX_HIGHLIGHTER_PLUGIN,
|
24
|
-
};
|
12
|
+
|
25
13
|
use typed_arena::Arena;
|
26
14
|
|
27
15
|
mod node;
|
@@ -63,6 +51,32 @@ fn commonmark_to_html(args: &[Value]) -> Result<String, magnus::Error> {
|
|
63
51
|
)?;
|
64
52
|
let (rb_options, rb_plugins) = kwargs.optional;
|
65
53
|
|
54
|
+
let comrak_options = match format_options(rb_options) {
|
55
|
+
Ok(options) => options,
|
56
|
+
Err(err) => return Err(err),
|
57
|
+
};
|
58
|
+
|
59
|
+
let mut comrak_plugins = comrak::Plugins::default();
|
60
|
+
|
61
|
+
let syntect_adapter = match construct_syntax_highlighter_from_plugin(rb_plugins) {
|
62
|
+
Ok(Some(adapter)) => Some(adapter),
|
63
|
+
Ok(None) => None,
|
64
|
+
Err(err) => return Err(err),
|
65
|
+
};
|
66
|
+
|
67
|
+
match syntect_adapter {
|
68
|
+
Some(ref adapter) => comrak_plugins.render.codefence_syntax_highlighter = Some(adapter),
|
69
|
+
None => comrak_plugins.render.codefence_syntax_highlighter = None,
|
70
|
+
}
|
71
|
+
|
72
|
+
Ok(markdown_to_html_with_plugins(
|
73
|
+
&rb_commonmark,
|
74
|
+
&comrak_options,
|
75
|
+
&comrak_plugins,
|
76
|
+
))
|
77
|
+
}
|
78
|
+
|
79
|
+
fn format_options<'c>(rb_options: Option<RHash>) -> Result<comrak::Options<'c>, magnus::Error> {
|
66
80
|
let mut comrak_options = ComrakOptions::default();
|
67
81
|
|
68
82
|
if let Some(rb_options) = rb_options {
|
@@ -72,101 +86,7 @@ fn commonmark_to_html(args: &[Value]) -> Result<String, magnus::Error> {
|
|
72
86
|
})?;
|
73
87
|
}
|
74
88
|
|
75
|
-
|
76
|
-
let mut comrak_plugins = ComrakPlugins::default();
|
77
|
-
|
78
|
-
let syntax_highlighter: Option<&dyn SyntaxHighlighterAdapter>;
|
79
|
-
let adapter: SyntectAdapter;
|
80
|
-
|
81
|
-
let theme = match rb_plugins.get(Symbol::new(SYNTAX_HIGHLIGHTER_PLUGIN)) {
|
82
|
-
Some(syntax_highlighter_options) => {
|
83
|
-
match fetch_syntax_highlighter_theme(syntax_highlighter_options) {
|
84
|
-
Ok(theme) => theme,
|
85
|
-
Err(e) => {
|
86
|
-
return Err(e);
|
87
|
-
}
|
88
|
-
}
|
89
|
-
}
|
90
|
-
None => None, // no `syntax_highlighter:` defined
|
91
|
-
};
|
92
|
-
|
93
|
-
match theme {
|
94
|
-
None => syntax_highlighter = None,
|
95
|
-
Some(theme) => {
|
96
|
-
if theme.is_empty() {
|
97
|
-
// no theme? uss css classes
|
98
|
-
adapter = SyntectAdapter::new(None);
|
99
|
-
syntax_highlighter = Some(&adapter);
|
100
|
-
} else {
|
101
|
-
let path = match rb_plugins.get(Symbol::new(SYNTAX_HIGHLIGHTER_PLUGIN)) {
|
102
|
-
Some(syntax_highlighter_options) => {
|
103
|
-
fetch_syntax_highlighter_path(syntax_highlighter_options)?
|
104
|
-
}
|
105
|
-
None => PathBuf::from("".to_string()), // no `syntax_highlighter:` defined
|
106
|
-
};
|
107
|
-
|
108
|
-
if path.exists() {
|
109
|
-
if !path.is_dir() {
|
110
|
-
return Err(Error::new(
|
111
|
-
exception::arg_error(),
|
112
|
-
"`path` needs to be a directory",
|
113
|
-
));
|
114
|
-
}
|
115
|
-
|
116
|
-
let builder = SyntectAdapterBuilder::new();
|
117
|
-
let mut ts = ThemeSet::load_defaults();
|
118
|
-
|
119
|
-
match ts.add_from_folder(&path) {
|
120
|
-
Ok(_) => {}
|
121
|
-
Err(e) => {
|
122
|
-
return Err(Error::new(
|
123
|
-
exception::arg_error(),
|
124
|
-
format!("failed to load theme set from path: {e}"),
|
125
|
-
));
|
126
|
-
}
|
127
|
-
}
|
128
|
-
|
129
|
-
// check if the theme exists in the dir
|
130
|
-
match ts.themes.get(&theme) {
|
131
|
-
Some(theme) => theme,
|
132
|
-
None => {
|
133
|
-
return Err(Error::new(
|
134
|
-
exception::arg_error(),
|
135
|
-
format!("theme `{}` does not exist", theme),
|
136
|
-
));
|
137
|
-
}
|
138
|
-
};
|
139
|
-
|
140
|
-
adapter = builder.theme_set(ts).theme(&theme).build();
|
141
|
-
|
142
|
-
syntax_highlighter = Some(&adapter);
|
143
|
-
} else {
|
144
|
-
// no path? default theme lookup
|
145
|
-
ThemeSet::load_defaults()
|
146
|
-
.themes
|
147
|
-
.get(&theme)
|
148
|
-
.ok_or_else(|| {
|
149
|
-
Error::new(
|
150
|
-
exception::arg_error(),
|
151
|
-
format!("theme `{}` does not exist", theme),
|
152
|
-
)
|
153
|
-
})?;
|
154
|
-
adapter = SyntectAdapter::new(Some(&theme));
|
155
|
-
syntax_highlighter = Some(&adapter);
|
156
|
-
}
|
157
|
-
}
|
158
|
-
}
|
159
|
-
}
|
160
|
-
comrak_plugins.render.codefence_syntax_highlighter = syntax_highlighter;
|
161
|
-
|
162
|
-
Ok(markdown_to_html_with_plugins(
|
163
|
-
&rb_commonmark,
|
164
|
-
&comrak_options,
|
165
|
-
&comrak_plugins,
|
166
|
-
))
|
167
|
-
} else {
|
168
|
-
Ok(markdown_to_html(&rb_commonmark, &comrak_options))
|
169
|
-
}
|
89
|
+
Ok(comrak_options)
|
170
90
|
}
|
171
91
|
|
172
92
|
#[magnus::init]
|
@@ -1,20 +1,20 @@
|
|
1
|
+
use comrak::arena_tree::Node as ComrakNode;
|
1
2
|
use comrak::nodes::{
|
2
3
|
Ast as ComrakAst, AstNode as ComrakAstNode, ListDelimType, ListType, NodeCode, NodeCodeBlock,
|
3
4
|
NodeDescriptionItem, NodeFootnoteDefinition, NodeFootnoteReference, NodeHeading, NodeHtmlBlock,
|
4
5
|
NodeLink, NodeList, NodeMath, NodeMultilineBlockQuote, NodeShortCode, NodeTable,
|
5
|
-
NodeValue as ComrakNodeValue, TableAlignment,
|
6
|
+
NodeValue as ComrakNodeValue, NodeWikiLink, TableAlignment,
|
6
7
|
};
|
7
|
-
use comrak::{arena_tree::Node as ComrakNode, ComrakOptions};
|
8
8
|
use magnus::RArray;
|
9
|
-
use magnus::{
|
10
|
-
function, method, r_hash::ForEach, scan_args, Module, Object, RHash, RModule, Symbol, Value,
|
11
|
-
};
|
9
|
+
use magnus::{function, method, scan_args, Module, Object, RHash, RModule, Symbol, Value};
|
12
10
|
use rctree::Node;
|
13
11
|
use typed_arena::Arena;
|
14
12
|
|
15
13
|
use std::cell::RefCell;
|
16
14
|
|
17
|
-
use crate::
|
15
|
+
use crate::format_options;
|
16
|
+
|
17
|
+
use crate::plugins::syntax_highlighting::construct_syntax_highlighter_from_plugin;
|
18
18
|
|
19
19
|
#[derive(Debug, Clone)]
|
20
20
|
#[magnus::wrap(class = "Commonmarker::Node::Ast", size, mark)]
|
@@ -238,8 +238,9 @@ impl CommonmarkerNode {
|
|
238
238
|
let (alignments, num_columns, num_rows, num_nonempty_cells) = kwargs.required;
|
239
239
|
|
240
240
|
let mut comrak_alignments = vec![];
|
241
|
-
alignments
|
242
|
-
|
241
|
+
alignments
|
242
|
+
.into_iter()
|
243
|
+
.for_each(|alignment| match alignment.to_string().as_str() {
|
243
244
|
"left" => {
|
244
245
|
comrak_alignments.push(TableAlignment::Left);
|
245
246
|
}
|
@@ -252,8 +253,7 @@ impl CommonmarkerNode {
|
|
252
253
|
_ => {
|
253
254
|
comrak_alignments.push(TableAlignment::None);
|
254
255
|
}
|
255
|
-
}
|
256
|
-
});
|
256
|
+
});
|
257
257
|
ComrakNodeValue::Table(NodeTable {
|
258
258
|
// The table alignments
|
259
259
|
alignments: comrak_alignments,
|
@@ -401,12 +401,12 @@ impl CommonmarkerNode {
|
|
401
401
|
|
402
402
|
let (code,) = kwargs.required;
|
403
403
|
|
404
|
-
match NodeShortCode::
|
405
|
-
|
406
|
-
|
404
|
+
match NodeShortCode::resolve(code.as_str()) {
|
405
|
+
Some(shortcode) => ComrakNodeValue::ShortCode(shortcode),
|
406
|
+
None => {
|
407
407
|
return Err(magnus::Error::new(
|
408
408
|
magnus::exception::arg_error(),
|
409
|
-
"
|
409
|
+
"could not resolve shortcode",
|
410
410
|
));
|
411
411
|
}
|
412
412
|
}
|
@@ -453,6 +453,15 @@ impl CommonmarkerNode {
|
|
453
453
|
}
|
454
454
|
|
455
455
|
"escaped" => ComrakNodeValue::Escaped,
|
456
|
+
|
457
|
+
"wikilink" => {
|
458
|
+
let kwargs =
|
459
|
+
scan_args::get_kwargs::<_, (String,), (), ()>(args.keywords, &["url"], &[])?;
|
460
|
+
|
461
|
+
let (url,) = kwargs.required;
|
462
|
+
|
463
|
+
ComrakNodeValue::WikiLink(NodeWikiLink { url })
|
464
|
+
}
|
456
465
|
_ => panic!("unknown node type {}", node_type),
|
457
466
|
};
|
458
467
|
|
@@ -539,6 +548,10 @@ impl CommonmarkerNode {
|
|
539
548
|
ComrakNodeValue::MultilineBlockQuote(_) => Symbol::new("multiline_block_quote"),
|
540
549
|
ComrakNodeValue::Escaped => Symbol::new("escaped"),
|
541
550
|
ComrakNodeValue::Math(..) => Symbol::new("math"),
|
551
|
+
ComrakNodeValue::WikiLink(..) => Symbol::new("wikilink"),
|
552
|
+
ComrakNodeValue::Underline => Symbol::new("underline"),
|
553
|
+
ComrakNodeValue::SpoileredText => Symbol::new("spoilered_text"),
|
554
|
+
ComrakNodeValue::EscapedTag(_) => Symbol::new("escaped_tag"),
|
542
555
|
}
|
543
556
|
}
|
544
557
|
|
@@ -895,15 +908,24 @@ impl CommonmarkerNode {
|
|
895
908
|
&[],
|
896
909
|
&["options", "plugins"],
|
897
910
|
)?;
|
898
|
-
let (rb_options,
|
911
|
+
let (rb_options, rb_plugins) = kwargs.optional;
|
899
912
|
|
900
|
-
let
|
913
|
+
let comrak_options = match format_options(rb_options) {
|
914
|
+
Ok(options) => options,
|
915
|
+
Err(err) => return Err(err),
|
916
|
+
};
|
917
|
+
|
918
|
+
let mut comrak_plugins = comrak::Plugins::default();
|
919
|
+
|
920
|
+
let syntect_adapter = match construct_syntax_highlighter_from_plugin(rb_plugins) {
|
921
|
+
Ok(Some(adapter)) => Some(adapter),
|
922
|
+
Ok(None) => None,
|
923
|
+
Err(err) => return Err(err),
|
924
|
+
};
|
901
925
|
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
Ok(ForEach::Continue)
|
906
|
-
})?;
|
926
|
+
match syntect_adapter {
|
927
|
+
Some(ref adapter) => comrak_plugins.render.codefence_syntax_highlighter = Some(adapter),
|
928
|
+
None => comrak_plugins.render.codefence_syntax_highlighter = None,
|
907
929
|
}
|
908
930
|
|
909
931
|
let arena: Arena<ComrakAstNode> = Arena::new();
|
@@ -936,7 +958,12 @@ impl CommonmarkerNode {
|
|
936
958
|
}
|
937
959
|
|
938
960
|
let mut output = vec![];
|
939
|
-
match comrak::
|
961
|
+
match comrak::format_html_with_plugins(
|
962
|
+
&comrak_root_node,
|
963
|
+
&comrak_options,
|
964
|
+
&mut output,
|
965
|
+
&comrak_plugins,
|
966
|
+
) {
|
940
967
|
Ok(_) => {}
|
941
968
|
Err(e) => {
|
942
969
|
return Err(magnus::Error::new(
|
@@ -963,15 +990,25 @@ impl CommonmarkerNode {
|
|
963
990
|
&[],
|
964
991
|
&["options", "plugins"],
|
965
992
|
)?;
|
966
|
-
let (rb_options,
|
993
|
+
let (rb_options, rb_plugins) = kwargs.optional;
|
967
994
|
|
968
|
-
let
|
995
|
+
let _comrak_options = format_options(rb_options);
|
996
|
+
let comrak_options = match format_options(rb_options) {
|
997
|
+
Ok(options) => options,
|
998
|
+
Err(err) => return Err(err),
|
999
|
+
};
|
1000
|
+
|
1001
|
+
let mut comrak_plugins = comrak::Plugins::default();
|
1002
|
+
|
1003
|
+
let syntect_adapter = match construct_syntax_highlighter_from_plugin(rb_plugins) {
|
1004
|
+
Ok(Some(adapter)) => Some(adapter),
|
1005
|
+
Ok(None) => None,
|
1006
|
+
Err(err) => return Err(err),
|
1007
|
+
};
|
969
1008
|
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
Ok(ForEach::Continue)
|
974
|
-
})?;
|
1009
|
+
match syntect_adapter {
|
1010
|
+
Some(ref adapter) => comrak_plugins.render.codefence_syntax_highlighter = Some(adapter),
|
1011
|
+
None => comrak_plugins.render.codefence_syntax_highlighter = None,
|
975
1012
|
}
|
976
1013
|
|
977
1014
|
let arena: Arena<ComrakAstNode> = Arena::new();
|
@@ -1004,7 +1041,12 @@ impl CommonmarkerNode {
|
|
1004
1041
|
}
|
1005
1042
|
|
1006
1043
|
let mut output = vec![];
|
1007
|
-
match comrak::
|
1044
|
+
match comrak::format_commonmark_with_plugins(
|
1045
|
+
&comrak_root_node,
|
1046
|
+
&comrak_options,
|
1047
|
+
&mut output,
|
1048
|
+
&comrak_plugins,
|
1049
|
+
) {
|
1008
1050
|
Ok(_) => {}
|
1009
1051
|
Err(e) => {
|
1010
1052
|
return Err(magnus::Error::new(
|
@@ -10,6 +10,7 @@ use crate::utils::try_convert_string;
|
|
10
10
|
|
11
11
|
const PARSE_SMART: &str = "smart";
|
12
12
|
const PARSE_DEFAULT_INFO_STRING: &str = "default_info_string";
|
13
|
+
const PARSE_RELAXED_TASKLIST_MATCHING: &str = "relaxed_tasklist_matching";
|
13
14
|
const PARSE_RELAXED_AUTOLINKS: &str = "relaxed_autolinks";
|
14
15
|
|
15
16
|
fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
@@ -22,6 +23,10 @@ fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash
|
|
22
23
|
Ok(Cow::Borrowed(PARSE_DEFAULT_INFO_STRING)) => {
|
23
24
|
comrak_options.parse.default_info_string = try_convert_string(value);
|
24
25
|
}
|
26
|
+
Ok(Cow::Borrowed(PARSE_RELAXED_TASKLIST_MATCHING)) => {
|
27
|
+
comrak_options.parse.relaxed_tasklist_matching =
|
28
|
+
TryConvert::try_convert(value)?;
|
29
|
+
}
|
25
30
|
Ok(Cow::Borrowed(PARSE_RELAXED_AUTOLINKS)) => {
|
26
31
|
comrak_options.parse.relaxed_autolinks = TryConvert::try_convert(value)?;
|
27
32
|
}
|
@@ -34,11 +39,16 @@ fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash
|
|
34
39
|
|
35
40
|
const RENDER_HARDBREAKS: &str = "hardbreaks";
|
36
41
|
const RENDER_GITHUB_PRE_LANG: &str = "github_pre_lang";
|
42
|
+
const RENDER_FULL_INFO_STRING: &str = "full_info_string";
|
37
43
|
const RENDER_WIDTH: &str = "width";
|
38
44
|
const RENDER_UNSAFE: &str = "unsafe";
|
39
45
|
const RENDER_ESCAPE: &str = "escape";
|
40
46
|
const RENDER_SOURCEPOS: &str = "sourcepos";
|
41
47
|
const RENDER_ESCAPED_CHAR_SPANS: &str = "escaped_char_spans";
|
48
|
+
const RENDER_IGNORE_SETEXT: &str = "ignore_setext";
|
49
|
+
const RENDER_IGNORE_EMPTY_LINKS: &str = "ignore_empty_links";
|
50
|
+
const RENDER_GFM_QUIRKS: &str = "gfm_quirks";
|
51
|
+
const RENDER_PREFER_FENCED: &str = "prefer_fenced";
|
42
52
|
|
43
53
|
fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
44
54
|
options_hash
|
@@ -50,6 +60,9 @@ fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHas
|
|
50
60
|
Ok(Cow::Borrowed(RENDER_GITHUB_PRE_LANG)) => {
|
51
61
|
comrak_options.render.github_pre_lang = TryConvert::try_convert(value)?;
|
52
62
|
}
|
63
|
+
Ok(Cow::Borrowed(RENDER_FULL_INFO_STRING)) => {
|
64
|
+
comrak_options.render.full_info_string = TryConvert::try_convert(value)?;
|
65
|
+
}
|
53
66
|
Ok(Cow::Borrowed(RENDER_WIDTH)) => {
|
54
67
|
comrak_options.render.width = TryConvert::try_convert(value)?;
|
55
68
|
}
|
@@ -65,6 +78,18 @@ fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHas
|
|
65
78
|
Ok(Cow::Borrowed(RENDER_ESCAPED_CHAR_SPANS)) => {
|
66
79
|
comrak_options.render.escaped_char_spans = TryConvert::try_convert(value)?;
|
67
80
|
}
|
81
|
+
Ok(Cow::Borrowed(RENDER_IGNORE_SETEXT)) => {
|
82
|
+
comrak_options.render.ignore_setext = TryConvert::try_convert(value)?;
|
83
|
+
}
|
84
|
+
Ok(Cow::Borrowed(RENDER_IGNORE_EMPTY_LINKS)) => {
|
85
|
+
comrak_options.render.ignore_empty_links = TryConvert::try_convert(value)?;
|
86
|
+
}
|
87
|
+
Ok(Cow::Borrowed(RENDER_GFM_QUIRKS)) => {
|
88
|
+
comrak_options.render.gfm_quirks = TryConvert::try_convert(value)?;
|
89
|
+
}
|
90
|
+
Ok(Cow::Borrowed(RENDER_PREFER_FENCED)) => {
|
91
|
+
comrak_options.render.prefer_fenced = TryConvert::try_convert(value)?;
|
92
|
+
}
|
68
93
|
_ => {}
|
69
94
|
}
|
70
95
|
Ok(ForEach::Continue)
|
@@ -82,10 +107,15 @@ const EXTENSION_HEADER_IDS: &str = "header_ids";
|
|
82
107
|
const EXTENSION_FOOTNOTES: &str = "footnotes";
|
83
108
|
const EXTENSION_DESCRIPTION_LISTS: &str = "description_lists";
|
84
109
|
const EXTENSION_FRONT_MATTER_DELIMITER: &str = "front_matter_delimiter";
|
85
|
-
const EXTENSION_SHORTCODES: &str = "shortcodes";
|
86
110
|
const EXTENSION_MULTILINE_BLOCK_QUOTES: &str = "multiline_block_quotes";
|
87
111
|
const EXTENSION_MATH_DOLLARS: &str = "math_dollars";
|
88
112
|
const EXTENSION_MATH_CODE: &str = "math_code";
|
113
|
+
const EXTENSION_SHORTCODES: &str = "shortcodes";
|
114
|
+
const EXTENSION_WIKILINKS_TITLE_AFTER_PIPE: &str = "wikilinks_title_after_pipe";
|
115
|
+
const EXTENSION_WIKILINKS_TITLE_BEFORE_PIPE: &str = "wikilinks_title_before_pipe";
|
116
|
+
const EXTENSION_UNDERLINE: &str = "underline";
|
117
|
+
const EXTENSION_SPOILER: &str = "spoiler";
|
118
|
+
const EXTENSION_GREENTEXT: &str = "greentext";
|
89
119
|
|
90
120
|
fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
91
121
|
options_hash
|
@@ -125,9 +155,6 @@ fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: R
|
|
125
155
|
}
|
126
156
|
}
|
127
157
|
}
|
128
|
-
Ok(Cow::Borrowed(EXTENSION_SHORTCODES)) => {
|
129
|
-
comrak_options.extension.shortcodes = TryConvert::try_convert(value)?;
|
130
|
-
}
|
131
158
|
Ok(Cow::Borrowed(EXTENSION_MULTILINE_BLOCK_QUOTES)) => {
|
132
159
|
comrak_options.extension.multiline_block_quotes =
|
133
160
|
TryConvert::try_convert(value)?;
|
@@ -138,6 +165,26 @@ fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: R
|
|
138
165
|
Ok(Cow::Borrowed(EXTENSION_MATH_CODE)) => {
|
139
166
|
comrak_options.extension.math_code = TryConvert::try_convert(value)?;
|
140
167
|
}
|
168
|
+
Ok(Cow::Borrowed(EXTENSION_SHORTCODES)) => {
|
169
|
+
comrak_options.extension.shortcodes = TryConvert::try_convert(value)?;
|
170
|
+
}
|
171
|
+
Ok(Cow::Borrowed(EXTENSION_WIKILINKS_TITLE_AFTER_PIPE)) => {
|
172
|
+
comrak_options.extension.wikilinks_title_after_pipe =
|
173
|
+
TryConvert::try_convert(value)?;
|
174
|
+
}
|
175
|
+
Ok(Cow::Borrowed(EXTENSION_WIKILINKS_TITLE_BEFORE_PIPE)) => {
|
176
|
+
comrak_options.extension.wikilinks_title_before_pipe =
|
177
|
+
TryConvert::try_convert(value)?;
|
178
|
+
}
|
179
|
+
Ok(Cow::Borrowed(EXTENSION_UNDERLINE)) => {
|
180
|
+
comrak_options.extension.underline = TryConvert::try_convert(value)?;
|
181
|
+
}
|
182
|
+
Ok(Cow::Borrowed(EXTENSION_SPOILER)) => {
|
183
|
+
comrak_options.extension.spoiler = TryConvert::try_convert(value)?;
|
184
|
+
}
|
185
|
+
Ok(Cow::Borrowed(EXTENSION_GREENTEXT)) => {
|
186
|
+
comrak_options.extension.greentext = TryConvert::try_convert(value)?;
|
187
|
+
}
|
141
188
|
_ => {}
|
142
189
|
}
|
143
190
|
Ok(ForEach::Continue)
|