From f54401ef0553e9d83addcd4facf44d5d624e99b9 Mon Sep 17 00:00:00 2001
From: Edward Betts <edward@4angle.com>
Date: Sat, 25 Nov 2023 20:59:10 +0000
Subject: [PATCH] Show list of hits on article page

---
 templates/article2.html | 15 +++++++++++----
 web_view.py             | 35 ++++++++++++++++++++++-------------
 2 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/templates/article2.html b/templates/article2.html
index e6ef74c..55d05b0 100644
--- a/templates/article2.html
+++ b/templates/article2.html
@@ -1,6 +1,6 @@
 {% extends "base.html" %}
 
-{% block title %}Link '{{ title }}' in '{{ hit.title }}'{% endblock %}
+{% block title %}Link '{{ title }}' in '{{ hit_title }}'{% endblock %}
 
 {% block style %}
 <link href="{{ url_for("static", filename="css/diff.css") }}" rel="stylesheet"/>
@@ -8,7 +8,7 @@
 
 {% block content %}
   <div class="container">
-    <h1>Link '{{ title }}' in '{{ hit.title }}'</h1>
+    <h1>Link '{{ title }}' in '{{ hit_title }}'</h1>
     <form action="{{ url_for("index") }}">
       <input name="q">
       <input type="submit" value="search">
@@ -30,12 +30,19 @@
       {{ diff | safe }}
     </table>
     <form method="POST">
-      <input type="hidden" name="hit" value="{{ hit.title }}">
+      <input type="hidden" name="hit" value="{{ hit_title }}">
       <div class="my-3">
         <input type="submit" class="btn btn-primary" value="save"/>
-        <a href="{{url_for("article_page", url_title=url_title, after=hit["title"])}}" class="btn btn-primary">skip</a>
+        <a href="{{url_for("article_page", url_title=url_title, after=hit_title)}}" class="btn btn-primary">skip</a>
       </div>
     </form>
+
+    <ol>
+    {% for hit in hits %}
+      {% set url = url_for("article_page", url_title=url_title, title=hit.title) %}
+      <li><a href="{{ url }}">{{ hit.title }}</a> &ndash; {{ hit.snippet | safe }}</li>
+    {% endfor %}
+    </ol>
   </div>
 {% endblock %}
 
diff --git a/web_view.py b/web_view.py
index 5e1e507..a8804cc 100755
--- a/web_view.py
+++ b/web_view.py
@@ -236,7 +236,7 @@ def match_type(q: str, snippet: str) -> str | None:
 
 
 class NoGoodHit(Exception):
-    pass
+    """No good hit."""
 
 
 def get_best_hit(title: str, hits: list[Hit]) -> tuple[Hit, dict[str, typing.Any]]:
@@ -271,30 +271,39 @@ def article_page(url_title: str) -> str | Response:
             flask.url_for("article_page", url_title=url_title, after=hit_title)
         )
 
+    article_title = flask.request.args.get("title")
+
     total = search_count(from_title)
     with_link = search_count_with_link(from_title)
 
     no_link_count, hits = search_no_link(from_title)
 
-    after = flask.request.args.get("after")
-    if after:
-        print(after)
-        hits_iter = itertools.dropwhile(lambda hit: hit["title"] != after, hits)
-        skip = next(hits_iter, None)
-        if skip:
-            hits = list(hits_iter)
+    by_title = {hit["title"]: hit for hit in hits}
 
-    try:
-        hit, found = get_best_hit(from_title, hits)
-    except NoGoodHit:
-        return flask.render_template("all_done.html")
+    if article_title in by_title:
+        hit = by_title[article_title]
+        found = get_diff(from_title, hit["title"], None)
+    else:
+        after = flask.request.args.get("after")
+        if after:
+            print(after)
+            hits_iter = itertools.dropwhile(lambda hit: hit["title"] != after, hits)
+            skip = next(hits_iter, None)
+            if skip:
+                hits = list(hits_iter)
+
+        try:
+            hit, found = get_best_hit(from_title, hits)
+        except NoGoodHit:
+            return flask.render_template("all_done.html")
 
     return flask.render_template(
         "article2.html",
         title=from_title,
         total=total,
         with_link=with_link,
-        hit=hit,
+        hit_title=hit["title"],
+        hits=hits,
         replacement=found["replacement"],
         diff=found["diff"],
         found=found,