diff --git a/proto/backend.proto b/proto/backend.proto index 404635ba1..2fcf913a4 100644 --- a/proto/backend.proto +++ b/proto/backend.proto @@ -260,6 +260,7 @@ message TTSTag { message ExtractLatexIn { string text = 1; bool svg = 2; + bool expand_clozes = 3; } message ExtractLatexOut { diff --git a/pylib/anki/latex.py b/pylib/anki/latex.py index 4b92e5d2b..f0df41d4e 100644 --- a/pylib/anki/latex.py +++ b/pylib/anki/latex.py @@ -49,7 +49,7 @@ def render_latex(html: str, model: NoteType, col: anki.storage._Collection,) -> def render_latex_returning_errors( - html: str, model: NoteType, col: anki.storage._Collection + html: str, model: NoteType, col: anki.storage._Collection, expand_clozes=False ) -> Tuple[str, List[str]]: """Returns (text, errors). @@ -58,7 +58,7 @@ def render_latex_returning_errors( header = model["latexPre"] footer = model["latexPost"] - out = col.backend.extract_latex(html, svg) + out = col.backend.extract_latex(html, svg, expand_clozes) errors = [] html = out.html diff --git a/pylib/anki/media.py b/pylib/anki/media.py index b0e4bb224..1b947cd59 100644 --- a/pylib/anki/media.py +++ b/pylib/anki/media.py @@ -191,7 +191,9 @@ class MediaManager: ): model = self.col.models.get(mid) - _html, errors = render_latex_returning_errors(flds, model, self.col) + _html, errors = render_latex_returning_errors( + flds, model, self.col, expand_clozes=True + ) if errors: return (nid, "\n".join(errors)) diff --git a/pylib/anki/rsbackend.py b/pylib/anki/rsbackend.py index c28ae1ed6..62ee71bff 100644 --- a/pylib/anki/rsbackend.py +++ b/pylib/anki/rsbackend.py @@ -292,9 +292,15 @@ class RustBackend: return out.text, native_tags - def extract_latex(self, text: str, svg: bool) -> ExtractedLatexOutput: + def extract_latex( + self, text: str, svg: bool, expand_clozes: bool + ) -> ExtractedLatexOutput: out = self._run_command( - pb.BackendInput(extract_latex=pb.ExtractLatexIn(text=text, svg=svg)) + pb.BackendInput( + extract_latex=pb.ExtractLatexIn( + text=text, svg=svg, expand_clozes=expand_clozes + ) + ) ).extract_latex return ExtractedLatexOutput( diff --git a/rslib/src/backend.rs b/rslib/src/backend.rs index 7d0f278fe..493471b6c 100644 --- a/rslib/src/backend.rs +++ b/rslib/src/backend.rs @@ -6,7 +6,7 @@ use crate::backend_proto::backend_input::Value; use crate::backend_proto::{Empty, RenderedTemplateReplacement, SyncMediaIn}; use crate::err::{AnkiError, NetworkErrorKind, Result, SyncErrorKind}; use crate::i18n::{tr_args, FString, I18n}; -use crate::latex::{extract_latex, ExtractedLatex}; +use crate::latex::{extract_latex, extract_latex_expanding_clozes, ExtractedLatex}; use crate::media::check::MediaChecker; use crate::media::sync::MediaSyncProgress; use crate::media::MediaManager; @@ -340,7 +340,12 @@ impl Backend { } fn extract_latex(&self, input: pb::ExtractLatexIn) -> pb::ExtractLatexOut { - let (text, extracted) = extract_latex(&input.text, input.svg); + let func = if input.expand_clozes { + extract_latex_expanding_clozes + } else { + extract_latex + }; + let (text, extracted) = func(&input.text, input.svg); pb::ExtractLatexOut { text, diff --git a/rslib/src/latex.rs b/rslib/src/latex.rs index f2e5345ff..86800c8b8 100644 --- a/rslib/src/latex.rs +++ b/rslib/src/latex.rs @@ -1,6 +1,7 @@ // Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +use crate::cloze::expand_clozes_to_reveal_latex; use crate::media::files::sha1_of_data; use crate::text::strip_html; use lazy_static::lazy_static; @@ -38,6 +39,21 @@ pub struct ExtractedLatex { pub latex: String, } +/// Expand any cloze deletions, then extract LaTeX. +pub(crate) fn extract_latex_expanding_clozes( + text: &str, + svg: bool, +) -> (String, Vec) { + let text: Cow = if text.contains("{{c") { + expand_clozes_to_reveal_latex(text).into() + } else { + text.into() + }; + extract_latex(&text, svg) +} + +/// Extract LaTeX from the provided text. +/// Expects cloze deletions to already be expanded. pub(crate) fn extract_latex(text: &str, svg: bool) -> (String, Vec) { let mut extracted = vec![]; diff --git a/rslib/src/media/check.rs b/rslib/src/media/check.rs index d21bb6d45..caf64728b 100644 --- a/rslib/src/media/check.rs +++ b/rslib/src/media/check.rs @@ -1,10 +1,9 @@ // Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -use crate::cloze::expand_clozes_to_reveal_latex; use crate::err::{AnkiError, Result}; use crate::i18n::{tr_args, tr_strs, FString, I18n}; -use crate::latex::extract_latex; +use crate::latex::extract_latex_expanding_clozes; use crate::media::col::{ for_every_note, get_note_types, mark_collection_modified, open_or_create_collection_db, set_note, Note, @@ -429,12 +428,7 @@ fn find_unused_and_missing( fn extract_latex_refs(note: &Note, seen_files: &mut HashSet, svg: bool) { for field in note.fields() { - let field_text: Cow = if field.contains("{{c") { - expand_clozes_to_reveal_latex(field).into() - } else { - field.into() - }; - let (_, extracted) = extract_latex(field_text.as_ref(), svg); + let (_, extracted) = extract_latex_expanding_clozes(field, svg); for e in extracted { seen_files.insert(e.fname); }