mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
Use enforced re to parse deck
Fix write_deck not recognising escaped deck name separators: \:\: -> ::
This commit is contained in:
parent
a6628709c5
commit
7c5cf6d18b
2 changed files with 13 additions and 13 deletions
|
@ -68,7 +68,7 @@ pub(super) enum SearchNode<'a> {
|
||||||
AddedInDays(u32),
|
AddedInDays(u32),
|
||||||
EditedInDays(u32),
|
EditedInDays(u32),
|
||||||
CardTemplate(TemplateKind<'a>),
|
CardTemplate(TemplateKind<'a>),
|
||||||
Deck(Cow<'a, str>),
|
Deck(String),
|
||||||
DeckID(DeckID),
|
DeckID(DeckID),
|
||||||
NoteTypeID(NoteTypeID),
|
NoteTypeID(NoteTypeID),
|
||||||
NoteType(OptionalRe<'a>),
|
NoteType(OptionalRe<'a>),
|
||||||
|
@ -279,7 +279,7 @@ fn search_node_for_text_with_argument<'a>(
|
||||||
Ok(match key.to_ascii_lowercase().as_str() {
|
Ok(match key.to_ascii_lowercase().as_str() {
|
||||||
"added" => SearchNode::AddedInDays(val.parse()?),
|
"added" => SearchNode::AddedInDays(val.parse()?),
|
||||||
"edited" => SearchNode::EditedInDays(val.parse()?),
|
"edited" => SearchNode::EditedInDays(val.parse()?),
|
||||||
"deck" => SearchNode::Deck(unescape_quotes(val)),
|
"deck" => SearchNode::Deck(unescape_to_enforced_re(val, ".")?),
|
||||||
"note" => SearchNode::NoteType(unescape_to_re(val)?),
|
"note" => SearchNode::NoteType(unescape_to_re(val)?),
|
||||||
"tag" => SearchNode::Tag(unescape_to_enforced_re(val, r"\S")?),
|
"tag" => SearchNode::Tag(unescape_to_enforced_re(val, r"\S")?),
|
||||||
"mid" => SearchNode::NoteTypeID(val.parse()?),
|
"mid" => SearchNode::NoteTypeID(val.parse()?),
|
||||||
|
@ -632,7 +632,7 @@ mod test {
|
||||||
assert_eq!(parse(r#""field:val:ue""#), parse(r"field:val\:ue"));
|
assert_eq!(parse(r#""field:val:ue""#), parse(r"field:val\:ue"));
|
||||||
assert_eq!(parse(r#"field:"val:ue""#), parse(r"field:val\:ue"));
|
assert_eq!(parse(r#"field:"val:ue""#), parse(r"field:val\:ue"));
|
||||||
|
|
||||||
// any character should be escapable on the right side of re:
|
// any character should be escapable on the right side of re:
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parse(r#""re:\btest\%""#)?,
|
parse(r#""re:\btest\%""#)?,
|
||||||
vec![Search(Regex(r"\btest\%".into()))]
|
vec![Search(Regex(r"\btest\%".into()))]
|
||||||
|
|
|
@ -9,7 +9,6 @@ use crate::{
|
||||||
err::Result,
|
err::Result,
|
||||||
notes::field_checksum,
|
notes::field_checksum,
|
||||||
notetype::NoteTypeID,
|
notetype::NoteTypeID,
|
||||||
text::text_to_re,
|
|
||||||
text::{normalize_to_nfc, strip_html_preserving_image_filenames, without_combining},
|
text::{normalize_to_nfc, strip_html_preserving_image_filenames, without_combining},
|
||||||
timestamp::TimestampSecs,
|
timestamp::TimestampSecs,
|
||||||
};
|
};
|
||||||
|
@ -295,25 +294,26 @@ impl SqlWriter<'_> {
|
||||||
|
|
||||||
fn write_deck(&mut self, deck: &str) -> Result<()> {
|
fn write_deck(&mut self, deck: &str) -> Result<()> {
|
||||||
match deck {
|
match deck {
|
||||||
"*" => write!(self.sql, "true").unwrap(),
|
".*" => write!(self.sql, "true").unwrap(),
|
||||||
"filtered" => write!(self.sql, "c.odid != 0").unwrap(),
|
"filtered" => write!(self.sql, "c.odid != 0").unwrap(),
|
||||||
deck => {
|
deck => {
|
||||||
// rewrite "current" to the current deck name
|
// rewrite "current" to the current deck name
|
||||||
let native_deck = if deck == "current" {
|
let native_deck = if deck == "current" {
|
||||||
let current_did = self.col.get_current_deck_id();
|
let current_did = self.col.get_current_deck_id();
|
||||||
self.col
|
regex::escape(
|
||||||
.storage
|
self.col
|
||||||
.get_deck(current_did)?
|
.storage
|
||||||
.map(|d| d.name)
|
.get_deck(current_did)?
|
||||||
.unwrap_or_else(|| "Default".into())
|
.map(|d| d.name)
|
||||||
|
.unwrap_or_else(|| "Default".into())
|
||||||
|
.as_str(),
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
human_deck_name_to_native(deck)
|
human_deck_name_to_native(deck)
|
||||||
};
|
};
|
||||||
|
|
||||||
// convert to a regex that includes child decks
|
// convert to a regex that includes child decks
|
||||||
// fixme: use unescape_to_enforced_re from parser.rs?
|
self.args.push(format!("(?i)^{}($|\x1f)", native_deck));
|
||||||
let re = text_to_re(&native_deck);
|
|
||||||
self.args.push(format!("(?i)^{}($|\x1f)", re));
|
|
||||||
let arg_idx = self.args.len();
|
let arg_idx = self.args.len();
|
||||||
self.sql.push_str(&format!(concat!(
|
self.sql.push_str(&format!(concat!(
|
||||||
"(c.did in (select id from decks where name regexp ?{n})",
|
"(c.did in (select id from decks where name regexp ?{n})",
|
||||||
|
|
Loading…
Reference in a new issue