diff --git a/Changes b/Changes index 025c6192b..65177a503 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,4 @@ -0.53 2024-03-15 +0.53 2024-05-14 - Add openapi url to documentation. (hebasta) - Solve a potential timing issue in VC rendering. (diewald) - Update DeReKo link in corpus specific localization. (hebasta) @@ -7,6 +7,8 @@ - Fix: The content of blockquote is displayed. (hebasta) - Upgrade dependency and remove deprecated method. (diewald) + - Add configuration option for defaults: items_per_page, context. + (diewald) 0.52 2023-11-29 - Update Piwik dependency to point to matomo.js. (diewald) diff --git a/kalamar.conf b/kalamar.conf index 4a4e0e2ff..56a6358ab 100644 --- a/kalamar.conf +++ b/kalamar.conf @@ -65,5 +65,11 @@ ## Set proxy timeouts # proxy_inactivity_timeout => 120, # proxy_connect_timeout => 120, + + ## Adjust defaults + # defaults => { + # items_per_page => 20, + # context => '20-t,20-t' + # } } } diff --git a/lib/Kalamar.pm b/lib/Kalamar.pm index c93042f68..e37b0d8ee 100644 --- a/lib/Kalamar.pm +++ b/lib/Kalamar.pm @@ -319,6 +319,18 @@ sub startup { }; }; + # Set defaults per config + $self->defaults( + items_per_page => 25, + context => '40-t,40-t', # Before: 'base/s:p'/'paragraph' + ); + + if (exists $conf->{defaults}) { + my $def = $conf->{defaults}; + $self->defaults(items_per_page => $def->{items_per_page}) if $def->{items_per_page}; + $self->defaults(context => $def->{context}) if $def->{context}; + }; + # Configure documentation navigation my $doc_navi = Mojo::File->new($self->home->child('templates','doc','navigation.json'))->slurp; $doc_navi = $doc_navi ? decode_json($doc_navi) : []; diff --git a/lib/Kalamar/Controller/Search.pm b/lib/Kalamar/Controller/Search.pm index 54d1dc422..a14cadcc7 100644 --- a/lib/Kalamar/Controller/Search.pm +++ b/lib/Kalamar/Controller/Search.pm @@ -6,8 +6,6 @@ use Mojo::Util qw/quote/; use Mojo::JSON; use POSIX 'ceil'; -has items_per_page => 25; - # TODO: # Support server timing API # @@ -90,21 +88,19 @@ sub query { ); }; + my $items_per_page = $c->stash('items_per_page'); - $query{count} = $v->param('count') // $c->items_per_page; + $query{count} = $v->param('count') // $items_per_page; $query{cq} = $cq; $query{cutoff} = $cutoff; - # Before: 'base/s:p'/'paragraph' - $query{context} = $v->param('context') // '40-t,40-t'; + $query{context} = $v->param('context') // $c->stash('context'); # Start page my $page = $v->param('p') // 1; - my $items_per_page = $c->items_per_page; - # Set count - if ($query{count} && $query{count} <= $c->items_per_page ) { + if ($query{count} && $query{count} <= $items_per_page ) { $items_per_page = delete $query{count}; $query{count} = $items_per_page; }; diff --git a/t/fixtures/response_query_baum_o0_c20_cotrue.json b/t/fixtures/response_query_baum_o0_c20_cotrue.json new file mode 100644 index 000000000..ec5e44eb6 --- /dev/null +++ b/t/fixtures/response_query_baum_o0_c20_cotrue.json @@ -0,0 +1,77 @@ +{ + "status" : 200, + "json" : { + "@context" : "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld", + "meta" : { + "count" : 20, + "startIndex" : 0, + "cutOff": true, + "authorized" : null, + "timeout" : 120000, + "context" : { + "left" : ["token",40], + "right" : ["token",40] + }, + "fields" : ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"], + "version" : "0.55.7", + "benchmark" : "0.120577834 s", + "totalResults" : -1, + "serialQuery" : "tokens:s:Baum", + "itemsPerPage" : 20 + }, + "query" : { + "@type" : "koral:token", + "wrap" : { + "@type" : "koral:term", + "layer" : "orth", + "key" : "Baum", + "match" : "match:eq", + "foundry" : "opennlp", + "rewrites" : [ + { + "@type" : "koral:rewrite", + "src" : "Kustvakt", + "operation" : "operation:injection", + "scope" : "foundry" + } + ] + } + }, + "matches" : [ + { + "field" : "tokens", + "pubPlace" : "München", + "textSigle" : "GOE/AGI/00000", + "docSigle" : "GOE/AGI", + "corpusSigle" : "GOE", + "title" : "Italienische Reise", + "subTitle" : "Auch ich in Arkadien!", + "author" : "Goethe, Johann Wolfgang von", + "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans", + "startMore" : true, + "endMore" : true, + "snippet" : "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 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 Baum unterscheiden könne", + "matchID" : "match-GOE/AGI/00000-p2030-2031", + "UID" : 0, + "pubDate" : "1982" + }, + { + "field" : "tokens", + "pubPlace" : "München", + "textSigle" : "GOE/AGI/00001", + "docSigle" : "GOE/AGI", + "corpusSigle" : "GOE", + "title" : "Italienische Reise", + "subTitle" : "Auch ich in Arkadien!", + "author" : "Goethe, Johann Wolfgang von", + "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans", + "startMore" : true, + "endMore" : true, + "snippet" : "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 Baum 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", + "matchID" : "match-GOE/AGI/00000-p2068-2069", + "UID" : 0, + "pubDate" : "1982" + } + ] + } +} diff --git a/t/query.t b/t/query.t index 376a8795f..54f2a8f07 100644 --- a/t/query.t +++ b/t/query.t @@ -86,8 +86,22 @@ my $err = $t->get_ok('/?q=baum') ->attr_is('#pagination','data-count','25') ->tx->res->dom->at('#error') ; + is(defined $err ? $err->text : '', ''); +# Query passed +$t->app->defaults(items_per_page => 20); + +$t->get_ok('/?q=baum') + ->status_is(200) + ->content_type_is('text/html;charset=UTF-8') + ->element_count_is('#pagination > a', 5) + ->attr_is('#pagination','data-page','1') + ->attr_is('#pagination','data-total','3') + ->attr_is('#pagination','data-count','20') +; + +$t->app->defaults(items_per_page => 25); $t->get_ok('/?q=[orth=das') ->status_is(400)