Skip to content

Commit

Permalink
v2: basic search support. #318
Browse files Browse the repository at this point in the history
  • Loading branch information
lemon24 committed Jan 25, 2025
1 parent 83b9348 commit 8ef1f0c
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
44 changes: 35 additions & 9 deletions src/reader/_app/v2/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import itertools
from functools import partial

from flask import abort
Expand All @@ -8,9 +9,13 @@
from flask import url_for
from jinja2_fragments.flask import render_block

from reader import InvalidSearchQueryError

from .. import EntryProxy
from .. import get_reader
from .. import stream_template
from .forms import EntryFilter
from .forms import SearchEntryFilter


blueprint = Blueprint(
Expand All @@ -22,30 +27,43 @@
def entries():
reader = get_reader()

# TODO: search
# TODO: search improvements
# TODO: search bug: first search uses recent
# TODO: paqgination
# TODO: read time

form = EntryFilter(request.args)
if request.args.get('q', '').strip():
form = SearchEntryFilter(request.args)
else:
form = EntryFilter(request.args)

if form.args != request.args.to_dict():
return redirect(url_for('.entries', **form.args))

kwargs = dict(form.data)
del kwargs['search']

feed = None
if form.feed.data:
feed = reader.get_feed(form.feed.data, None)
if not feed:
abort(404)

get_entries = reader.get_entries
kwargs = dict(form.data)
if query := kwargs.pop('search', None):

def get_entries(**kwargs):
for sr in reader.search_entries(query, **kwargs):
yield EntryProxy(sr, reader.get_entry(sr))

if form.validate():
entries = get_entries(**kwargs, limit=64)
else:
entries = []
get_entries = reader.get_entries

entries = []
if form.validate():
try:
entries = eager_iterator(get_entries(**kwargs, limit=64))
except StopIteration:
pass
except InvalidSearchQueryError as e:
form.search.errors.append(f"invalid query: {e}")

return stream_template(
'v2/entries.html',
Expand All @@ -55,6 +73,14 @@ def entries():
)


def eager_iterator(it):
it = iter(it)
try:
return itertools.chain([next(it)], it)
except StopIteration:
return it


@blueprint.route('/mark-as', methods=['POST'])
def mark_as():
reader = get_reader()
Expand Down
2 changes: 1 addition & 1 deletion src/reader/_app/v2/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class EntryFilter(PresetsMixin, Form):

class SearchEntryFilter(EntryFilter):
sort = RadioField(
"sort", choices=ENTRY_SORT_CHOICES + ['relevant'], default='relevant'
"sort", choices=['relevant'] + ENTRY_SORT_CHOICES, default='relevant'
)


Expand Down
2 changes: 2 additions & 0 deletions src/reader/_app/v2/templates/v2/entries.html
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@


<form>
{# TODO: if data or error #}
{% if form.search.data %}{{ macros.input(form.search, 'search') }}{% endif %}
{% if form.feed_tags.data %}{{ macros.input(form.feed_tags, 'tag') }}{% endif %}
<div class="collapse mb-3" id="nav-more">
Expand Down Expand Up @@ -107,6 +108,7 @@ <h2 class="h5 mb-1" style="font-size: 1.125rem">
{%- endif %}
</h2>

{# TODO: show marked search results; title too! #}
{% set summary = entry.get_content(prefer_summary=True).value | striptags | trim %}
{% if summary %}
<p class="small mb-2">
Expand Down

0 comments on commit 8ef1f0c

Please sign in to comment.