mirror of
https://github.com/standardebooks/web.git
synced 2025-07-13 18:11:52 -04:00
Implement OpenSearch feed search with FilterEbooks
This commit is contained in:
parent
e06fd910ed
commit
6c8e819316
7 changed files with 15 additions and 71 deletions
|
@ -1152,51 +1152,6 @@ class Ebook{
|
|||
return null;
|
||||
}
|
||||
|
||||
public function Contains(string $query): bool{
|
||||
// When searching an ebook, we search the title, alternate title, author(s), SE tags, series data, and LoC tags.
|
||||
// Also, if the ebook is shorts or poetry, search the ToC as well.
|
||||
|
||||
$searchString = $this->FullTitle ?? $this->Title;
|
||||
|
||||
$searchString .= ' ' . $this->AlternateTitle;
|
||||
|
||||
foreach($this->CollectionMemberships as $collectionMembership){
|
||||
$searchString .= ' ' . $collectionMembership->Collection->Name;
|
||||
}
|
||||
|
||||
foreach($this->Authors as $author){
|
||||
$searchString .= ' ' . $author->Name;
|
||||
}
|
||||
|
||||
foreach($this->Tags as $tag){
|
||||
$searchString .= ' ' . $tag->Name;
|
||||
}
|
||||
|
||||
foreach($this->LocSubjects as $subject){
|
||||
$searchString .= ' ' . $subject->Name;
|
||||
}
|
||||
|
||||
if($this->TocEntries !== null){
|
||||
foreach($this->TocEntries as $item){
|
||||
$searchString .= ' ' . $item;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove diacritics and non-alphanumeric characters
|
||||
$searchString = trim(preg_replace('|[^a-zA-Z0-9 ]|ius', ' ', Formatter::RemoveDiacritics($searchString)));
|
||||
$query = trim(preg_replace('|[^a-zA-Z0-9 ]|ius', ' ', Formatter::RemoveDiacritics($query)));
|
||||
|
||||
if($query == ''){
|
||||
return false;
|
||||
}
|
||||
|
||||
if(mb_stripos($searchString, $query) !== false){
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function GenerateJsonLd(): string{
|
||||
$output = new stdClass();
|
||||
$output->{'@context'} = 'https://schema.org';
|
||||
|
|
|
@ -429,23 +429,6 @@ class Library{
|
|||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<Ebook>
|
||||
* @throws Exceptions\AppException
|
||||
*/
|
||||
public static function Search(string $query): array{
|
||||
$ebooks = Library::GetEbooks();
|
||||
$matches = [];
|
||||
|
||||
foreach($ebooks as $ebook){
|
||||
if($ebook->Contains($query)){
|
||||
$matches[] = $ebook;
|
||||
}
|
||||
}
|
||||
|
||||
return $matches;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<Ebook>
|
||||
*/
|
||||
|
|
|
@ -11,8 +11,8 @@ print('<?xml version="1.0" encoding="utf-8"?>');
|
|||
<OutputEncoding>UTF-8</OutputEncoding>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Url type="application/xhtml+xml" template="<?= SITE_URL ?>/ebooks?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/rss+xml" template="<?= SITE_URL ?>/feeds/rss/all?query={searchTerms}"/>
|
||||
<Url type="application/atom+xml" template="<?= SITE_URL ?>/feeds/atom/all?query={searchTerms}"/>
|
||||
<Url type="application/atom+xml;profile=opds-catalog;kind=acquisition" template="<?= SITE_URL ?>/feeds/opds/all?query={searchTerms}"/>
|
||||
<Url type="application/rss+xml" template="<?= SITE_URL ?>/feeds/rss/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/atom+xml" template="<?= SITE_URL ?>/feeds/atom/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/atom+xml;profile=opds-catalog;kind=acquisition" template="<?= SITE_URL ?>/feeds/opds/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Query role="example" searchTerms="fiction" startPage="1" count="12"/>
|
||||
</OpenSearchDescription>
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<OutputEncoding>UTF-8</OutputEncoding>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Url type="application/xhtml+xml" template="https://standardebooks.org/ebooks?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/rss+xml" template="https://standardebooks.org/feeds/rss/all?query={searchTerms}"/>
|
||||
<Url type="application/atom+xml" template="https://standardebooks.org/feeds/atom/all?query={searchTerms}"/>
|
||||
<Url type="application/atom+xml;profile=opds-catalog;kind=acquisition" template="https://standardebooks.org/feeds/opds/all?query={searchTerms}"/>
|
||||
<Url type="application/rss+xml" template="https://standardebooks.org/feeds/rss/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/atom+xml" template="https://standardebooks.org/feeds/atom/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Url type="application/atom+xml;profile=opds-catalog;kind=acquisition" template="https://standardebooks.org/feeds/opds/all?query={searchTerms}&per-page={count}&page={startPage}"/>
|
||||
<Query role="example" searchTerms="fiction" startPage="1" count="12"/>
|
||||
</OpenSearchDescription>
|
||||
|
|
|
@ -5,9 +5,11 @@ $ebooks = [];
|
|||
|
||||
try{
|
||||
$query = HttpInput::Str(GET, 'query') ?? '';
|
||||
$startPage = HttpInput::Int(GET, 'page') ?? 1;
|
||||
$count = HttpInput::Int(GET, 'per-page') ?? EBOOKS_PER_PAGE;
|
||||
|
||||
if($query !== ''){
|
||||
$ebooks = Library::Search($query);
|
||||
$ebooks = Library::FilterEbooks($query, [], EbookSortType::Newest, $startPage, $count)['ebooks'];
|
||||
}
|
||||
}
|
||||
catch(\Exception){
|
||||
|
|
|
@ -5,9 +5,11 @@ $ebooks = [];
|
|||
|
||||
try{
|
||||
$query = HttpInput::Str(GET, 'query') ?? '';
|
||||
$startPage = HttpInput::Int(GET, 'page') ?? 1;
|
||||
$count = HttpInput::Int(GET, 'per-page') ?? EBOOKS_PER_PAGE;
|
||||
|
||||
if($query !== ''){
|
||||
$ebooks = Library::Search($query);
|
||||
$ebooks = Library::FilterEbooks($query, [], EbookSortType::Newest, $startPage, $count)['ebooks'];
|
||||
}
|
||||
}
|
||||
catch(\Exception){
|
||||
|
|
|
@ -5,9 +5,11 @@ $ebooks = [];
|
|||
|
||||
try{
|
||||
$query = HttpInput::Str(GET, 'query') ?? '';
|
||||
$startPage = HttpInput::Int(GET, 'page') ?? 1;
|
||||
$count = HttpInput::Int(GET, 'per-page') ?? EBOOKS_PER_PAGE;
|
||||
|
||||
if($query !== ''){
|
||||
$ebooks = Library::Search($query);
|
||||
$ebooks = Library::FilterEbooks($query, [], EbookSortType::Newest, $startPage, $count)['ebooks'];
|
||||
}
|
||||
}
|
||||
catch(\Exception){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue