commonmarker 0.23.10 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +1220 -0
- data/Cargo.toml +7 -0
- data/README.md +217 -170
- data/ext/commonmarker/Cargo.toml +20 -0
- data/ext/commonmarker/extconf.rb +3 -6
- data/ext/commonmarker/src/lib.rs +183 -0
- data/ext/commonmarker/src/node.rs +1095 -0
- data/ext/commonmarker/src/options.rs +165 -0
- data/ext/commonmarker/src/plugins/syntax_highlighting.rs +74 -0
- data/ext/commonmarker/src/plugins.rs +3 -0
- data/ext/commonmarker/src/utils.rs +8 -0
- data/lib/commonmarker/config.rb +90 -40
- data/lib/commonmarker/constants.rb +7 -0
- data/lib/commonmarker/extension.rb +14 -0
- data/lib/commonmarker/node/ast.rb +8 -0
- data/lib/commonmarker/node/inspect.rb +14 -4
- data/lib/commonmarker/node.rb +29 -47
- data/lib/commonmarker/renderer.rb +1 -127
- data/lib/commonmarker/utils.rb +22 -0
- data/lib/commonmarker/version.rb +2 -2
- data/lib/commonmarker.rb +27 -25
- metadata +38 -186
- data/Rakefile +0 -109
- data/bin/commonmarker +0 -118
- data/commonmarker.gemspec +0 -38
- data/ext/commonmarker/arena.c +0 -104
- data/ext/commonmarker/autolink.c +0 -508
- data/ext/commonmarker/autolink.h +0 -8
- data/ext/commonmarker/blocks.c +0 -1622
- data/ext/commonmarker/buffer.c +0 -278
- data/ext/commonmarker/buffer.h +0 -116
- data/ext/commonmarker/case_fold_switch.inc +0 -4327
- data/ext/commonmarker/chunk.h +0 -135
- data/ext/commonmarker/cmark-gfm-core-extensions.h +0 -54
- data/ext/commonmarker/cmark-gfm-extension_api.h +0 -737
- data/ext/commonmarker/cmark-gfm-extensions_export.h +0 -42
- data/ext/commonmarker/cmark-gfm.h +0 -833
- data/ext/commonmarker/cmark-gfm_export.h +0 -42
- data/ext/commonmarker/cmark-gfm_version.h +0 -7
- data/ext/commonmarker/cmark.c +0 -55
- data/ext/commonmarker/cmark_ctype.c +0 -44
- data/ext/commonmarker/cmark_ctype.h +0 -33
- data/ext/commonmarker/commonmark.c +0 -514
- data/ext/commonmarker/commonmarker.c +0 -1308
- data/ext/commonmarker/commonmarker.h +0 -16
- data/ext/commonmarker/config.h +0 -76
- data/ext/commonmarker/core-extensions.c +0 -27
- data/ext/commonmarker/entities.inc +0 -2138
- data/ext/commonmarker/ext_scanners.c +0 -879
- data/ext/commonmarker/ext_scanners.h +0 -24
- data/ext/commonmarker/footnotes.c +0 -63
- data/ext/commonmarker/footnotes.h +0 -27
- data/ext/commonmarker/houdini.h +0 -57
- data/ext/commonmarker/houdini_href_e.c +0 -100
- data/ext/commonmarker/houdini_html_e.c +0 -66
- data/ext/commonmarker/houdini_html_u.c +0 -149
- data/ext/commonmarker/html.c +0 -502
- data/ext/commonmarker/html.h +0 -27
- data/ext/commonmarker/inlines.c +0 -1788
- data/ext/commonmarker/inlines.h +0 -29
- data/ext/commonmarker/iterator.c +0 -159
- data/ext/commonmarker/iterator.h +0 -26
- data/ext/commonmarker/latex.c +0 -468
- data/ext/commonmarker/linked_list.c +0 -37
- data/ext/commonmarker/man.c +0 -274
- data/ext/commonmarker/map.c +0 -129
- data/ext/commonmarker/map.h +0 -44
- data/ext/commonmarker/node.c +0 -1045
- data/ext/commonmarker/node.h +0 -167
- data/ext/commonmarker/parser.h +0 -59
- data/ext/commonmarker/plaintext.c +0 -218
- data/ext/commonmarker/plugin.c +0 -36
- data/ext/commonmarker/plugin.h +0 -34
- data/ext/commonmarker/references.c +0 -43
- data/ext/commonmarker/references.h +0 -26
- data/ext/commonmarker/registry.c +0 -63
- data/ext/commonmarker/registry.h +0 -24
- data/ext/commonmarker/render.c +0 -213
- data/ext/commonmarker/render.h +0 -62
- data/ext/commonmarker/scanners.c +0 -14056
- data/ext/commonmarker/scanners.h +0 -70
- data/ext/commonmarker/scanners.re +0 -341
- data/ext/commonmarker/strikethrough.c +0 -167
- data/ext/commonmarker/strikethrough.h +0 -9
- data/ext/commonmarker/syntax_extension.c +0 -149
- data/ext/commonmarker/syntax_extension.h +0 -34
- data/ext/commonmarker/table.c +0 -917
- data/ext/commonmarker/table.h +0 -12
- data/ext/commonmarker/tagfilter.c +0 -60
- data/ext/commonmarker/tagfilter.h +0 -8
- data/ext/commonmarker/tasklist.c +0 -156
- data/ext/commonmarker/tasklist.h +0 -8
- data/ext/commonmarker/utf8.c +0 -317
- data/ext/commonmarker/utf8.h +0 -35
- data/ext/commonmarker/xml.c +0 -182
- data/lib/commonmarker/renderer/html_renderer.rb +0 -256
@@ -0,0 +1,183 @@
|
|
1
|
+
extern crate core;
|
2
|
+
|
3
|
+
use std::path::PathBuf;
|
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
|
+
};
|
15
|
+
use node::CommonmarkerNode;
|
16
|
+
|
17
|
+
mod options;
|
18
|
+
use options::iterate_options_hash;
|
19
|
+
|
20
|
+
mod plugins;
|
21
|
+
use plugins::{
|
22
|
+
syntax_highlighting::{fetch_syntax_highlighter_path, fetch_syntax_highlighter_theme},
|
23
|
+
SYNTAX_HIGHLIGHTER_PLUGIN,
|
24
|
+
};
|
25
|
+
use typed_arena::Arena;
|
26
|
+
|
27
|
+
mod node;
|
28
|
+
mod utils;
|
29
|
+
|
30
|
+
pub const EMPTY_STR: &str = "";
|
31
|
+
|
32
|
+
fn commonmark_parse(args: &[Value]) -> Result<CommonmarkerNode, magnus::Error> {
|
33
|
+
let args = scan_args::scan_args::<_, (), (), (), _, ()>(args)?;
|
34
|
+
let (rb_commonmark,): (String,) = args.required;
|
35
|
+
|
36
|
+
let kwargs =
|
37
|
+
scan_args::get_kwargs::<_, (), (Option<RHash>,), ()>(args.keywords, &[], &["options"])?;
|
38
|
+
let (rb_options,) = kwargs.optional;
|
39
|
+
|
40
|
+
let mut comrak_options = ComrakOptions::default();
|
41
|
+
|
42
|
+
if let Some(rb_options) = rb_options {
|
43
|
+
rb_options.foreach(|key: Symbol, value: RHash| {
|
44
|
+
iterate_options_hash(&mut comrak_options, key, value)?;
|
45
|
+
Ok(ForEach::Continue)
|
46
|
+
})?;
|
47
|
+
}
|
48
|
+
|
49
|
+
let arena = Arena::new();
|
50
|
+
let root = parse_document(&arena, &rb_commonmark, &comrak_options);
|
51
|
+
|
52
|
+
CommonmarkerNode::new_from_comrak_node(root)
|
53
|
+
}
|
54
|
+
|
55
|
+
fn commonmark_to_html(args: &[Value]) -> Result<String, magnus::Error> {
|
56
|
+
let args = scan_args::scan_args::<_, (), (), (), _, ()>(args)?;
|
57
|
+
let (rb_commonmark,): (String,) = args.required;
|
58
|
+
|
59
|
+
let kwargs = scan_args::get_kwargs::<_, (), (Option<RHash>, Option<RHash>), ()>(
|
60
|
+
args.keywords,
|
61
|
+
&[],
|
62
|
+
&["options", "plugins"],
|
63
|
+
)?;
|
64
|
+
let (rb_options, rb_plugins) = kwargs.optional;
|
65
|
+
|
66
|
+
let mut comrak_options = ComrakOptions::default();
|
67
|
+
|
68
|
+
if let Some(rb_options) = rb_options {
|
69
|
+
rb_options.foreach(|key: Symbol, value: RHash| {
|
70
|
+
iterate_options_hash(&mut comrak_options, key, value)?;
|
71
|
+
Ok(ForEach::Continue)
|
72
|
+
})?;
|
73
|
+
}
|
74
|
+
|
75
|
+
if let Some(rb_plugins) = rb_plugins {
|
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
|
+
}
|
170
|
+
}
|
171
|
+
|
172
|
+
#[magnus::init]
|
173
|
+
fn init() -> Result<(), Error> {
|
174
|
+
let m_commonmarker = define_module("Commonmarker")?;
|
175
|
+
|
176
|
+
m_commonmarker.define_module_function("commonmark_parse", function!(commonmark_parse, -1))?;
|
177
|
+
m_commonmarker
|
178
|
+
.define_module_function("commonmark_to_html", function!(commonmark_to_html, -1))?;
|
179
|
+
|
180
|
+
node::init(m_commonmarker).expect("cannot define Commonmarker::Node class");
|
181
|
+
|
182
|
+
Ok(())
|
183
|
+
}
|