From a94042b49133b13a8f07d2e35180554e555ccccc Mon Sep 17 00:00:00 2001 From: RumovZ Date: Thu, 16 Dec 2021 21:55:28 +0100 Subject: [PATCH] Accept String in av tag routines ... and avoid redundant writes if no changes need to be made. --- rslib/src/backend/cardrendering.rs | 4 ++-- rslib/src/browser_table.rs | 4 ++-- rslib/src/card_rendering/mod.rs | 32 ++++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/rslib/src/backend/cardrendering.rs b/rslib/src/backend/cardrendering.rs index 0f24ab8a1..3e0de964c 100644 --- a/rslib/src/backend/cardrendering.rs +++ b/rslib/src/backend/cardrendering.rs @@ -22,7 +22,7 @@ impl CardRenderingService for Backend { &self, input: pb::ExtractAvTagsRequest, ) -> Result { - let out = extract_av_tags(&input.text, input.question_side, self.i18n()); + let out = extract_av_tags(input.text, input.question_side, self.i18n()); Ok(pb::ExtractAvTagsResponse { text: out.0, av_tags: out.1, @@ -117,7 +117,7 @@ impl CardRenderingService for Backend { } fn strip_av_tags(&self, input: pb::String) -> Result { - Ok(strip_av_tags(&input.val).into()) + Ok(strip_av_tags(input.val).into()) } fn render_markdown(&self, input: pb::RenderMarkdownRequest) -> Result { diff --git a/rslib/src/browser_table.rs b/rslib/src/browser_table.rs index fe1ca8693..9fefe4bf3 100644 --- a/rslib/src/browser_table.rs +++ b/rslib/src/browser_table.rs @@ -271,7 +271,7 @@ impl RenderContext { } => current_text, }) .join(""); - let question = prettify_av_tags(&qnodes_text); + let question = prettify_av_tags(qnodes_text); Ok(RenderContext { question, @@ -411,7 +411,7 @@ impl RowContext { } => current_text, }) .join(""); - let answer = prettify_av_tags(&answer); + let answer = prettify_av_tags(answer); html_to_text_line( if let Some(stripped) = answer.strip_prefix(&render_context.question) { stripped diff --git a/rslib/src/card_rendering/mod.rs b/rslib/src/card_rendering/mod.rs index 5cf5430ae..b875f40e0 100644 --- a/rslib/src/card_rendering/mod.rs +++ b/rslib/src/card_rendering/mod.rs @@ -9,16 +9,36 @@ use crate::prelude::*; mod parser; mod writer; -pub fn strip_av_tags(txt: &str) -> String { - CardNodes::parse(txt).write_without_av_tags() +pub fn strip_av_tags + AsRef>(txt: S) -> String { + nodes_or_text_only(txt.as_ref()) + .map(|nodes| nodes.write_without_av_tags()) + .unwrap_or_else(|| txt.into()) } -pub fn extract_av_tags(txt: &str, question_side: bool, tr: &I18n) -> (String, Vec) { - CardNodes::parse(txt).write_and_extract_av_tags(question_side, tr) +pub fn extract_av_tags + AsRef>( + txt: S, + question_side: bool, + tr: &I18n, +) -> (String, Vec) { + nodes_or_text_only(txt.as_ref()) + .map(|nodes| nodes.write_and_extract_av_tags(question_side, tr)) + .unwrap_or_else(|| (txt.into(), vec![])) } -pub fn prettify_av_tags(txt: &str) -> String { - CardNodes::parse(txt).write_with_pretty_av_tags() +pub fn prettify_av_tags + AsRef>(txt: S) -> String { + nodes_or_text_only(txt.as_ref()) + .map(|nodes| nodes.write_with_pretty_av_tags()) + .unwrap_or_else(|| txt.into()) +} + +/// Parse `txt` into [CardNodes] and return the result, +/// or [None] if it is only a text node. +fn nodes_or_text_only(txt: &str) -> Option { + let nodes = CardNodes::parse(txt); + match nodes.0[..] { + [Node::Text(_)] => None, + _ => Some(nodes), + } } #[derive(Debug, PartialEq)]