Support pages in snippet views

Change-Id: Idd538e06ab55358c102b9caa4dbb902323cd4b22
diff --git a/Changes b/Changes
index de33e83..0fdac7b 100644
--- a/Changes
+++ b/Changes
@@ -1,4 +1,4 @@
-0.55 2024-06-9
+0.55 2024-06-26
         - Removed deprecated doc_link_to helper. (diewald)
         - Removed deprecated doc_ext_link_to helper. (diewald)
         - Removed deprecated doc_uc helper. (diewald)
@@ -8,6 +8,7 @@
         - Remove corpusQuery from statistics
           (as per Kudstvakt #758). (diewald)
         - Improve test suite for slim images. (diewald)
+        - Add pages to references in snippet view. (diewald)
 
 0.54 2024-06-10
         - Remove deprecated 'matchInfo' API path. (diewald, margaretha)
diff --git a/kalamar.dict b/kalamar.dict
index 70c8d76..41df1eb 100644
--- a/kalamar.dict
+++ b/kalamar.dict
@@ -39,6 +39,10 @@
     news => 'Neuigkeiten',
     in => 'in',
     by => 'von',
+    page => {
+      -sg => 'S.',
+      pl => 'S.'
+    },
     pwd => 'Passwort',
     email => 'Email',
     username => 'Benutzername',
@@ -158,6 +162,10 @@
     searchplaceholder => 'Find ...',
     in => 'in',
     by => 'by',
+    page => {
+      -sg => 'p.',
+      pl  => 'pp.',
+    },
     pwd => 'Password',
     email => 'Email',
     username => 'Username',
diff --git a/t/fixtures/response_query_baum_o0_c25.json b/t/fixtures/response_query_baum_o0_c25.json
index a1727e3..9882f36 100644
--- a/t/fixtures/response_query_baum_o0_c25.json
+++ b/t/fixtures/response_query_baum_o0_c25.json
@@ -52,7 +52,8 @@
         "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
         "matchID" : "match-GOE/AGI/00000-p2030-2031",
         "UID" : 0,
-        "pubDate" : "1982"
+        "pubDate" : "1982",
+        "pages":[109]
       },
       {
         "field" : "tokens",
@@ -69,7 +70,7 @@
         "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
         "matchID" : "match-GOE/AGI/00000-p2068-2069",
         "UID" : 0,
-        "pubDate" : "1982"
+        "pages":[109,204]
       }
     ]
   }
diff --git a/t/query.t b/t/query.t
index 54f2a8f..5e6869e 100644
--- a/t/query.t
+++ b/t/query.t
@@ -78,8 +78,15 @@
   ->text_like('li:nth-of-type(1) div.snippet span.context-right',qr!es war!)
   ->text_is('li:nth-of-type(1) p.ref strong', 'Italienische Reise')
   ->text_like('li:nth-of-type(1) p.ref', qr!by Goethe, Johann Wolfgang!)
-  ->text_is('li:nth-of-type(1) p.ref time[datetime=1982]', 1982)
   ->text_is('li:nth-of-type(1) p.ref span.sigle', '[GOE/AGI/00000]')
+  ->text_is('li:nth-of-type(1) p.ref time[datetime=1982]', 1982)
+  ->text_like('li:nth-of-type(1) p.ref ', qr!von \(, \)!)
+  ->text_is('li:nth-of-type(1) p.ref span.pages', 'p. 109')
+
+  ->element_exists_not('li:nth-of-type(2) p.ref time')
+  ->text_like('li:nth-of-type(2) p.ref ', qr!von \(\)!)
+  ->text_is('li:nth-of-type(2) p.ref span.pages', 'pp. 109–204')
+
   ->header_isnt('X-Kalamar-Cache', 'true')
   ->attr_is('#pagination','data-page','1')
   ->attr_is('#pagination','data-total','3')
diff --git a/templates/match.html.ep b/templates/match.html.ep
index 038a730..775008c 100644
--- a/templates/match.html.ep
+++ b/templates/match.html.ep
@@ -30,9 +30,23 @@
   <p class="ref">\
 <% if ($match->{title}) { %><strong><%= $match->{title} %></strong><% }; %>\
 <%= $match->{author} ? ' ' . loc('by') . ' ' . $match->{author}  : '' %>\
-% if ($match->{pubDate}) {
- (<time datetime="<%= $match->{pubDate} %>"><%= $match->{pubDate} %></time>)\
+% if ($match->{pubDate} || ($match->{pages} && ref $match->{pages} eq 'ARRAY')) {
+ (\
+%   if ($match->{pubDate}) {
+<time datetime="<%= $match->{pubDate} %>"><%= $match->{pubDate} %></time>\
+%   };
+%   if ($match->{pages}) {
+%     if ($match->{pubDate}) {
+, \
+%     };
+%     if (@{$match->{pages}} == 1) {
+<span class="pages"><%=loc 'page_sg' %> <%= $match->{pages}->[0] %></span>\
+%     } else {
+<span class="pages"><%=loc 'page_pl' %> <%= $match->{pages}->[0] %>&ndash;<%= $match->{pages}->[-1] %></span>\
+%     };
+%   };
+) \
 % };
-  <span class="sigle">[<%= $text_sigle %>]</span> \
+<span class="sigle">[<%= $text_sigle %>]</span> \
 </p>
 </li>