From d1cd819df6ea58048918ceaf13cb39719cb4dc89 Mon Sep 17 00:00:00 2001 From: Aaron Schlitt Date: Mon, 10 Jun 2024 18:31:21 +0200 Subject: [PATCH 1/5] Order search results by date --- myhpi/search/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/myhpi/search/views.py b/myhpi/search/views.py index 50977dff..1abe1c48 100644 --- a/myhpi/search/views.py +++ b/myhpi/search/views.py @@ -19,6 +19,7 @@ def search(request): BasePage.objects.live() .filter(Q(visible_for__in=user_groups) | Q(is_public=True)) .distinct() + .order_by("-last_published_at") ) search_results = allowed_pages.search(search_query) query = Query.get(search_query) From f76fe7782d0a38a1a8a807f2182cdd6e6dd4b005 Mon Sep 17 00:00:00 2001 From: Aaron Schlitt Date: Tue, 11 Jun 2024 10:25:32 +0200 Subject: [PATCH 2/5] add a better preview for results --- .../templates/search/search_result.html | 5 ++- myhpi/search/templatetags/search.py | 38 +++++++++++++++++++ myhpi/static/scss/myHPI.scss | 8 ++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 myhpi/search/templatetags/search.py diff --git a/myhpi/search/templates/search/search_result.html b/myhpi/search/templates/search/search_result.html index a5641f2f..0d9a8ec6 100644 --- a/myhpi/search/templates/search/search_result.html +++ b/myhpi/search/templates/search/search_result.html @@ -1,5 +1,6 @@ {% load static wagtailcore_tags %} {% load bootstrap_icons %} +{% load search %}
@@ -9,11 +10,11 @@
{{ result.title }}
{{ result.specific.date|date:"SHORT_DATE_FORMAT" }} - + {% if result.search_description %} {{ result.search_description }} {% else %} - {{ result.specific.body|truncatewords:20 }} + {{ result.specific.body|highlight_query:search_query }} {% endif %}
diff --git a/myhpi/search/templatetags/search.py b/myhpi/search/templatetags/search.py new file mode 100644 index 00000000..995ef3bf --- /dev/null +++ b/myhpi/search/templatetags/search.py @@ -0,0 +1,38 @@ +import re +from django import template +from myhpi.core.markdown.utils import render_markdown +from django.utils.safestring import mark_safe + +register = template.Library() + +@register.filter(name="highlight_query") +# select 3 lines around first match and highlight query match +def highlight_query(content, search_query): + lines = content.split("\n") + for i, line in enumerate(lines): + if search_query.lower() in line.lower(): + lines[i] = line + # try finding the last leading heading to include it in the snippet + trailing_heading = None + # skip if the current line already is a heading + if not line.startswith("#"): + for j in range(i - 1, -1, -1): + if lines[j].startswith("#"): + trailing_heading = lines[j] + break + # take 3 lines around match + start = max(0, i - 1) + end = min(len(lines), i + 2) + lines = lines[start:end] + if trailing_heading: + lines.insert(0, trailing_heading) + break + markdown = "\n".join(lines) + # Replace search query with bold version but preserve case from markdown + markdown = re.sub( + re.compile(f"({search_query})", re.IGNORECASE), + r"**\1**", + markdown, + ) + rendered_markdown = render_markdown(markdown, None, False)[0] + return rendered_markdown diff --git a/myhpi/static/scss/myHPI.scss b/myhpi/static/scss/myHPI.scss index 6f71feeb..44800809 100644 --- a/myhpi/static/scss/myHPI.scss +++ b/myhpi/static/scss/myHPI.scss @@ -186,6 +186,12 @@ h1.side-panel-title::after { padding: 0; margin: -0.5rem -0.8rem; + .search-preview { + h1, h2, h3, h4, h5, h6{ + font-size: 1rem; + } + } + .search-result { h5 { hyphens: auto; @@ -251,6 +257,8 @@ img { margin: 0 5px; } + + @import "./navbar.scss"; @import "./footer.scss"; From 975c1efdc20330205771c504e217994f64abc312 Mon Sep 17 00:00:00 2001 From: Aaron Schlitt Date: Tue, 11 Jun 2024 10:33:40 +0200 Subject: [PATCH 3/5] Highlight matches in title as well --- myhpi/search/templates/search/search_result.html | 2 +- myhpi/search/templatetags/search.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/myhpi/search/templates/search/search_result.html b/myhpi/search/templates/search/search_result.html index 0d9a8ec6..7db5fd9b 100644 --- a/myhpi/search/templates/search/search_result.html +++ b/myhpi/search/templates/search/search_result.html @@ -5,7 +5,7 @@
-
{{ result.title }}
+
{{ result.title|highlight_title:search_query }}
diff --git a/myhpi/search/templatetags/search.py b/myhpi/search/templatetags/search.py index 995ef3bf..1d011f4b 100644 --- a/myhpi/search/templatetags/search.py +++ b/myhpi/search/templatetags/search.py @@ -2,6 +2,7 @@ from django import template from myhpi.core.markdown.utils import render_markdown from django.utils.safestring import mark_safe +from django.utils.html import escape register = template.Library() @@ -36,3 +37,12 @@ def highlight_query(content, search_query): ) rendered_markdown = render_markdown(markdown, None, False)[0] return rendered_markdown + +@register.filter(name="highlight_title") +def highlight_title(title, search_query): + title = escape(title) + return mark_safe(re.sub( + re.compile(f"({search_query})", re.IGNORECASE), + r"\1", + title, + )) From bb13b079850e459a3b1da1196ca032cc61e83f94 Mon Sep 17 00:00:00 2001 From: Aaron Schlitt Date: Tue, 11 Jun 2024 10:35:48 +0200 Subject: [PATCH 4/5] Fix formatting --- myhpi/search/templatetags/search.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/myhpi/search/templatetags/search.py b/myhpi/search/templatetags/search.py index 1d011f4b..c9a1272e 100644 --- a/myhpi/search/templatetags/search.py +++ b/myhpi/search/templatetags/search.py @@ -6,6 +6,7 @@ register = template.Library() + @register.filter(name="highlight_query") # select 3 lines around first match and highlight query match def highlight_query(content, search_query): @@ -17,10 +18,10 @@ def highlight_query(content, search_query): trailing_heading = None # skip if the current line already is a heading if not line.startswith("#"): - for j in range(i - 1, -1, -1): - if lines[j].startswith("#"): - trailing_heading = lines[j] - break + for j in range(i - 1, -1, -1): + if lines[j].startswith("#"): + trailing_heading = lines[j] + break # take 3 lines around match start = max(0, i - 1) end = min(len(lines), i + 2) @@ -38,11 +39,14 @@ def highlight_query(content, search_query): rendered_markdown = render_markdown(markdown, None, False)[0] return rendered_markdown + @register.filter(name="highlight_title") def highlight_title(title, search_query): title = escape(title) - return mark_safe(re.sub( - re.compile(f"({search_query})", re.IGNORECASE), - r"\1", - title, - )) + return mark_safe( + re.sub( + re.compile(f"({search_query})", re.IGNORECASE), + r"\1", + title, + ) + ) From 9c60878b0ce685ce88a9d53cbc6e4e4894dc8bad Mon Sep 17 00:00:00 2001 From: Aaron Schlitt Date: Tue, 11 Jun 2024 10:59:24 +0200 Subject: [PATCH 5/5] Limit maximum number of lines if query is not in markdown --- myhpi/search/templates/search/search_result.html | 2 +- myhpi/search/templatetags/search.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/myhpi/search/templates/search/search_result.html b/myhpi/search/templates/search/search_result.html index 7db5fd9b..7d886553 100644 --- a/myhpi/search/templates/search/search_result.html +++ b/myhpi/search/templates/search/search_result.html @@ -14,7 +14,7 @@
{{ result.title|highlight_title:search_query }}
{% if result.search_description %} {{ result.search_description }} {% else %} - {{ result.specific.body|highlight_query:search_query }} + {{ result.specific.body|highlight_query_markdown:search_query }} {% endif %}
diff --git a/myhpi/search/templatetags/search.py b/myhpi/search/templatetags/search.py index c9a1272e..a74d699b 100644 --- a/myhpi/search/templatetags/search.py +++ b/myhpi/search/templatetags/search.py @@ -1,15 +1,17 @@ import re + from django import template -from myhpi.core.markdown.utils import render_markdown -from django.utils.safestring import mark_safe from django.utils.html import escape +from django.utils.safestring import mark_safe + +from myhpi.core.markdown.utils import render_markdown register = template.Library() -@register.filter(name="highlight_query") +@register.filter(name="highlight_query_markdown") # select 3 lines around first match and highlight query match -def highlight_query(content, search_query): +def highlight_query(content, search_query, surrounding_lines=1): lines = content.split("\n") for i, line in enumerate(lines): if search_query.lower() in line.lower(): @@ -29,6 +31,9 @@ def highlight_query(content, search_query): if trailing_heading: lines.insert(0, trailing_heading) break + excerpt_max_length = surrounding_lines * 2 + 1 + if len(lines) > excerpt_max_length: + lines = lines[:excerpt_max_length] markdown = "\n".join(lines) # Replace search query with bold version but preserve case from markdown markdown = re.sub(