diff options
| author | 2021-08-30 10:58:06 +0200 | |
|---|---|---|
| committer | 2021-08-30 10:58:06 +0200 | |
| commit | 50ba6bbe07b0bb86eb07e3212ba2e22cb2878cf2 (patch) | |
| tree | 3e54faf8e06be88468d0be1e9df808f88691194e /app/Models | |
| parent | 812eda1fa05e370c4c1645b5b82f09f9da2c7bf7 (diff) | |
UI: Add optional thumbnail and summary on feed items (#3805)
* UI: Add optional thumbnail and summary on feed items
Implements #561
* UI: Thumbnail: Own column, Custom size, Lazy load
* UI: Thumbnail: Remove unnecessary CSS rule
Remove rule already defined in base theme, no override needed
* CSS lint + RTL
* Improve thumbail and summary generation
* Support img alt
* Missing htmlspecialchars
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Diffstat (limited to 'app/Models')
| -rw-r--r-- | app/Models/ConfigurationSetter.php | 10 | ||||
| -rw-r--r-- | app/Models/Entry.php | 36 |
2 files changed, 43 insertions, 3 deletions
diff --git a/app/Models/ConfigurationSetter.php b/app/Models/ConfigurationSetter.php index 6fc056eb2..ee58ebe5b 100644 --- a/app/Models/ConfigurationSetter.php +++ b/app/Models/ConfigurationSetter.php @@ -254,6 +254,16 @@ class FreshRSS_ConfigurationSetter { private function _topline_read(&$data, $value) { $data['topline_read'] = $this->handleBool($value); } + private function _topline_thumbnail(&$data, $value) { + $value = strtolower($value); + if (!in_array($value, array('none', 'portrait', 'square', 'landscape'))) { + $value = 'none'; + } + $data['topline_thumbnail'] = $value; + } + private function _topline_summary(&$data, $value) { + $data['topline_summary'] = $this->handleBool($value); + } private function _topline_display_authors(&$data, $value) { $data['topline_display_authors'] = $this->handleBool($value); } diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 9057cecf8..66e554e22 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -59,13 +59,19 @@ class FreshRSS_Entry extends Minz_Model { public function content() { return $this->content; } - public function enclosures() { + + public function enclosures($searchBodyImages = false) { $results = []; try { - if (strpos($this->content, '<p class="enclosure-content') !== false) { + $searchEnclosures = strpos($this->content, '<p class="enclosure-content') !== false; + $searchBodyImages &= (stripos($this->content, '<img') !== false); + $xpath = null; + if ($searchEnclosures || $searchBodyImages) { $dom = new DOMDocument(); - $dom->loadHTML($this->content, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING); + $dom->loadHTML('<?xml version="1.0" encoding="UTF-8" ?>' . $this->content, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING); $xpath = new DOMXpath($dom); + } + if ($searchEnclosures) { $enclosures = $xpath->query('//div[@class="enclosure"]/p[@class="enclosure-content"]/*[@src]'); foreach ($enclosures as $enclosure) { $results[] = [ @@ -75,12 +81,36 @@ class FreshRSS_Entry extends Minz_Model { ]; } } + if ($searchBodyImages) { + $images = $xpath->query('//img'); + foreach ($images as $img) { + $src = $img->getAttribute('src'); + if ($src == null) { + $src = $img->getAttribute('data-src'); + } + if ($src != null) { + $results[] = [ + 'url' => $src, + 'alt' => $img->getAttribute('alt'), + ]; + } + } + } return $results; } catch (Exception $ex) { return $results; } } + public function thumbnail() { + foreach ($this->enclosures(true) as $enclosure) { + if (!empty($enclosure['url']) && empty($enclosure['type'])) { + return $enclosure; + } + } + return null; + } + public function link() { return $this->link; } |
