diff --git a/proto/anki/card_rendering.proto b/proto/anki/card_rendering.proto index 7be401a1a..145e4b0db 100644 --- a/proto/anki/card_rendering.proto +++ b/proto/anki/card_rendering.proto @@ -26,6 +26,7 @@ service CardRenderingService { rpc EncodeIriPaths(generic.String) returns (generic.String); rpc DecodeIriPaths(generic.String) returns (generic.String); rpc StripHtml(StripHtmlRequest) returns (generic.String); + rpc HtmlToTextLine(HtmlToTextLineRequest) returns (generic.String); rpc CompareAnswer(CompareAnswerRequest) returns (generic.String); rpc ExtractClozeForTyping(ExtractClozeForTypingRequest) returns (generic.String); @@ -156,6 +157,11 @@ message StripHtmlRequest { Mode mode = 2; } +message HtmlToTextLineRequest { + string text = 1; + bool preserve_media_filenames = 2; +} + message CompareAnswerRequest { string expected = 1; string provided = 2; diff --git a/pylib/anki/utils.py b/pylib/anki/utils.py index 1604acbf9..5e74e702e 100644 --- a/pylib/anki/utils.py +++ b/pylib/anki/utils.py @@ -7,7 +7,6 @@ import json as _json import os import platform import random -import re import shutil import string import subprocess @@ -69,15 +68,11 @@ def strip_html_media(txt: str) -> str: def html_to_text_line(txt: str) -> str: - txt = txt.replace("
", " ") - txt = txt.replace("
", " ") - txt = txt.replace("
", " ") - txt = txt.replace("\n", " ") - txt = re.sub(r"\[sound:[^]]+\]", "", txt) - txt = re.sub(r"\[\[type:[^]]+\]\]", "", txt) - txt = strip_html_media(txt) - txt = txt.strip() - return txt + import anki.lang + + return anki.lang.current_i18n.html_to_text_line( + text=txt, preserve_media_filenames=True + ) # IDs diff --git a/rslib/src/card_rendering/service.rs b/rslib/src/card_rendering/service.rs index 4ee15f26c..7e0f9ba67 100644 --- a/rslib/src/card_rendering/service.rs +++ b/rslib/src/card_rendering/service.rs @@ -20,6 +20,7 @@ use crate::notetype::RenderCardOutput; use crate::template::RenderedNode; use crate::text::decode_iri_paths; use crate::text::encode_iri_paths; +use crate::text::html_to_text_line; use crate::text::sanitize_html_no_images; use crate::text::strip_html; use crate::text::strip_html_preserving_media_filenames; @@ -151,6 +152,17 @@ impl crate::services::CardRenderingService for Collection { strip_html_proto(input) } + fn html_to_text_line( + &mut self, + input: anki_proto::card_rendering::HtmlToTextLineRequest, + ) -> Result { + Ok( + html_to_text_line(&input.text, input.preserve_media_filenames) + .to_string() + .into(), + ) + } + fn compare_answer( &mut self, input: anki_proto::card_rendering::CompareAnswerRequest,