From 265466be6a3ea1d6437cda18fa75d617c6ed4f73 Mon Sep 17 00:00:00 2001 From: oberien Date: Thu, 13 Feb 2020 20:17:24 +0100 Subject: [PATCH] Forward all unknown attributes to latex lstlistings I used this for a presentation to specify fontsize (`basicstyle=\tiny`) for listings. Shouldn't be a long-term solution in general, so unsure if we actually want to merge this? --- src/backend/latex/complex/codeblock.rs | 7 ++++++- src/cskvp.rs | 6 +++++- src/frontend/event.rs | 2 ++ src/frontend/mod.rs | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/latex/complex/codeblock.rs b/src/backend/latex/complex/codeblock.rs index 1072af2..898569b 100644 --- a/src/backend/latex/complex/codeblock.rs +++ b/src/backend/latex/complex/codeblock.rs @@ -16,7 +16,7 @@ impl<'a> CodeGenUnit<'a, CodeBlock<'a>> for CodeBlockGen { _cfg: &'a Config, code_block: WithRange>, gen: &mut Generator<'a, impl Backend<'a>, impl Write>, ) -> Result { - let WithRange(CodeBlock { label, caption, language }, _range) = code_block; + let WithRange(CodeBlock { label, caption, language, attributes }, _range) = code_block; let mut out = gen.get_out(); write!(out, "\\begin{{lstlisting}}[")?; @@ -35,6 +35,11 @@ impl<'a> CodeGenUnit<'a, CodeBlock<'a>> for CodeBlockGen { }; joiner.join(format_args!("language={{{}}}", language))?; } + if !attributes.is_empty() { + for (k, v) in attributes { + joiner.join(format_args!("{}={{{}}}", k, v.0))?; + } + } writeln!(out, "]")?; Ok(CodeBlockGen) diff --git a/src/cskvp.rs b/src/cskvp.rs index 979e891..e710709 100644 --- a/src/cskvp.rs +++ b/src/cskvp.rs @@ -160,6 +160,10 @@ impl<'a> Cskvp<'a> { self.double.remove(key) } + pub fn take_all_double(&mut self) -> HashMap, WithRange>> { + self.double.drain().collect() + } + /// Removes all elements from `self`. /// /// This can be used before dropping `Cskvp` to omit all "unused attribute" warnings. @@ -179,7 +183,7 @@ impl<'a> Drop for Cskvp<'a> { let mut diag = self .diagnostics .as_mut() - .map(|d| d.warning("unknown attributes in element config") + .map(|d| d.warning("unused / unknown attributes in element config") .with_info_section(range, "in this element config")); if let Some(WithRange(label, range)) = self.label.take() { diag = diag.map(|d| { diff --git a/src/frontend/event.rs b/src/frontend/event.rs index 7ecce8c..5f3301b 100644 --- a/src/frontend/event.rs +++ b/src/frontend/event.rs @@ -6,6 +6,7 @@ use enum_kinds::EnumKind; use crate::frontend::range::WithRange; use crate::resolve::{Command, ResolveSecurity}; +use std::collections::HashMap; // extension of pulldown_cmark::Event with custom types #[derive(Debug, EnumKind)] @@ -111,6 +112,7 @@ pub struct CodeBlock<'a> { pub label: Option>>, pub caption: Option>>, pub language: Option>>, + pub attributes: HashMap, WithRange>>, } #[derive(Debug, Clone)] diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index 44d34c0..5e040fa 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -460,6 +460,7 @@ impl<'a> Frontend<'a> { } else { Some(WithRange(language, language_range)) }, + attributes: cskvp.take_all_double(), }), };