aboutsummaryrefslogtreecommitdiffstats
path: root/parser/src/conversion/block.rs
diff options
context:
space:
mode:
Diffstat (limited to 'parser/src/conversion/block.rs')
-rw-r--r--parser/src/conversion/block.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/parser/src/conversion/block.rs b/parser/src/conversion/block.rs
index ab18c48..64aa33e 100644
--- a/parser/src/conversion/block.rs
+++ b/parser/src/conversion/block.rs
@@ -53,6 +53,7 @@ fn convert_body_elem(pair: Pair<Rule>) -> Result<c::BodyElement, Error> {
Rule::admonition_gen => convert_admonition_gen(pair)?.into(),
Rule::image => convert_image::<e::Image>(pair)?.into(),
Rule::bullet_list => convert_bullet_list(pair)?.into(),
+ Rule::code_directive => convert_code_directive(pair)?.into(),
rule => unimplemented!("unhandled rule {:?}", rule),
})
}
@@ -200,3 +201,21 @@ fn convert_bullet_item(pair: Pair<Rule>) -> Result<e::ListItem, Error> {
}
Ok(e::ListItem::with_children(children))
}
+
+fn convert_code_directive(pair: Pair<Rule>) -> Result<e::LiteralBlock, Error> {
+ let mut iter = pair.into_inner();
+ let (lang, code) = match (iter.next().unwrap(), iter.next()) {
+ (lang, Some(code)) => (Some(lang), code),
+ (code, None) => (None, code),
+ };
+ let children = code.into_inner().map(|l| match l.as_rule() {
+ Rule::code_line => l.as_str(),
+ Rule::code_line_blank => "\n",
+ _ => unreachable!(),
+ }.into()).collect();
+ let mut code_block = e::LiteralBlock::with_children(children);
+ if let Some(lang) = lang {
+ code_block.classes_mut().push(lang.as_str().to_owned());
+ };
+ Ok(code_block)
+}