Tolerate {{FrontSide}} on the front side

https://forums.ankiweb.net/t/display-the-template-for-the-front-has-a-problem/32035
This commit is contained in:
Damien Elmes 2023-07-13 21:39:16 +10:00
parent f076fa28af
commit a623dff0da

View file

@ -425,7 +425,7 @@ fn render_into(
append_str_to_nodes(rendered_nodes, text); append_str_to_nodes(rendered_nodes, text);
} }
Replacement { key, .. } if key == "FrontSide" => { Replacement { key, .. } if key == "FrontSide" => {
if let Some(frontside) = &context.frontside { let frontside = context.frontside.as_ref().copied().unwrap_or_default();
if context.partial_for_python { if context.partial_for_python {
// defer FrontSide rendering to Python, as extra // defer FrontSide rendering to Python, as extra
// filters may be required // filters may be required
@ -437,13 +437,6 @@ fn render_into(
} else { } else {
append_str_to_nodes(rendered_nodes, frontside); append_str_to_nodes(rendered_nodes, frontside);
} }
} else {
// Not valid on the question side
return Err(TemplateError::FieldNotFound {
field: "FrontSide".into(),
filters: "".into(),
});
}
} }
Replacement { key, filters } => { Replacement { key, filters } => {
if key.is_empty() && !filters.is_empty() { if key.is_empty() && !filters.is_empty() {
@ -589,6 +582,7 @@ where
// Rendering both sides // Rendering both sides
//---------------------------------------- //----------------------------------------
#[derive(Clone)]
pub struct RenderCardRequest<'a> { pub struct RenderCardRequest<'a> {
pub qfmt: &'a str, pub qfmt: &'a str,
pub afmt: &'a str, pub afmt: &'a str,
@ -1219,7 +1213,7 @@ mod test {
#[test] #[test]
fn render_card() { fn render_card() {
let map: HashMap<_, _> = vec![("E", "")] let map: HashMap<_, _> = vec![("E", ""), ("N", "N")]
.into_iter() .into_iter()
.map(|r| (r.0, r.1.into())) .map(|r| (r.0, r.1.into()))
.collect(); .collect();
@ -1227,7 +1221,7 @@ mod test {
let tr = I18n::template_only(); let tr = I18n::template_only();
use crate::template::RenderedNode as FN; use crate::template::RenderedNode as FN;
let qnodes = super::render_card(RenderCardRequest { let mut req = RenderCardRequest {
qfmt: "test{{E}}", qfmt: "test{{E}}",
afmt: "", afmt: "",
field_map: &map, field_map: &map,
@ -1236,9 +1230,8 @@ mod test {
browser: false, browser: false,
tr: &tr, tr: &tr,
partial_render: true, partial_render: true,
}) };
.unwrap() let qnodes = super::render_card(req.clone()).unwrap().0;
.0;
assert_eq!( assert_eq!(
qnodes[0], qnodes[0],
FN::Text { FN::Text {
@ -1250,5 +1243,24 @@ mod test {
} else { } else {
unreachable!(); unreachable!();
} }
// a popular card template expects {{FrontSide}} to resolve to an empty
// string on the front side :-(
req.qfmt = "{{FrontSide}}{{N}}";
let qnodes = super::render_card(req.clone()).unwrap().0;
assert_eq!(
&qnodes,
&[
FN::Replacement {
field_name: "FrontSide".into(),
current_text: "".into(),
filters: vec![]
},
FN::Text { text: "N".into() }
]
);
req.partial_render = false;
let qnodes = super::render_card(req.clone()).unwrap().0;
assert_eq!(&qnodes, &[FN::Text { text: "N".into() }]);
} }
} }