feat: v0.13.0 pre (#122)

Signed-off-by: phernandez <paul@basicmachines.co>
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Paul Hernandez
2025-06-03 01:00:40 -05:00
committed by GitHub
parent 5ec4087f7c
commit 634486107b
116 changed files with 13122 additions and 2147 deletions
@@ -130,26 +130,35 @@ class SearchRepository:
For FTS5:
- Special characters and phrases need to be quoted
- Terms with spaces or special chars need quotes
- Boolean operators (AND, OR, NOT) and parentheses are preserved
- Boolean operators (AND, OR, NOT) are preserved for complex queries
"""
if "*" in term:
return term
# Check for boolean operators - if present, return the term as is
boolean_operators = [" AND ", " OR ", " NOT ", "(", ")"]
# Check for explicit boolean operators - if present, return the term as is
boolean_operators = [" AND ", " OR ", " NOT "]
if any(op in f" {term} " for op in boolean_operators):
return term
# List of special characters that need quoting (excluding *)
# List of FTS5 special characters that need escaping/quoting
special_chars = ["/", "-", ".", " ", "(", ")", "[", "]", '"', "'"]
# Check if term contains any special characters
needs_quotes = any(c in term for c in special_chars)
if needs_quotes:
# If the term already contains quotes, escape them and add a wildcard
term = term.replace('"', '""')
term = f'"{term}"*'
# Escape any existing quotes by doubling them
escaped_term = term.replace('"', '""')
# Quote the entire term to handle special characters safely
if is_prefix and not ("/" in term and term.endswith(".md")):
# For search terms (not file paths), add prefix matching
term = f'"{escaped_term}"*'
else:
# For file paths, use exact matching
term = f'"{escaped_term}"'
elif is_prefix:
# Only add wildcard for simple terms without special characters
term = f"{term}*"
return term
@@ -172,9 +181,8 @@ class SearchRepository:
# Handle text search for title and content
if search_text:
has_boolean = any(
op in f" {search_text} " for op in [" AND ", " OR ", " NOT ", "(", ")"]
)
# Check for explicit boolean operators - only detect them in proper boolean contexts
has_boolean = any(op in f" {search_text} " for op in [" AND ", " OR ", " NOT "])
if has_boolean:
# If boolean operators are present, use the raw query
@@ -189,9 +197,9 @@ class SearchRepository:
# Handle title match search
if title:
title_text = self._prepare_search_term(title.strip())
params["text"] = title_text
conditions.append("title MATCH :text")
title_text = self._prepare_search_term(title.strip(), is_prefix=False)
params["title_text"] = title_text
conditions.append("title MATCH :title_text")
# Handle permalink exact search
if permalink: