From 83bc3fd7620c161996f06480dbec7197ae2d95e6 Mon Sep 17 00:00:00 2001
From: User123698745
Date: Sun, 24 Nov 2024 03:57:28 +0100
Subject: [PATCH] [DRKBlutspendeBridge] add new bridge (#4324)
* [DRKBlutspendeBridge] add new bridge
* [DRKBlutspendeBridge] move explode_lines into DRKBlutspendeBridge class
---
bridges/DRKBlutspendeBridge.php | 107 ++++++++++++++++++++++++++++++++
1 file changed, 107 insertions(+)
create mode 100644 bridges/DRKBlutspendeBridge.php
diff --git a/bridges/DRKBlutspendeBridge.php b/bridges/DRKBlutspendeBridge.php
new file mode 100644
index 00000000000..1507589836c
--- /dev/null
+++ b/bridges/DRKBlutspendeBridge.php
@@ -0,0 +1,107 @@
+ [
+ 'term' => [
+ 'name' => 'PLZ / Ort',
+ 'required' => true,
+ 'exampleValue' => '12555',
+ ],
+ 'radius' => [
+ 'name' => 'Umkreis in km',
+ 'type' => 'number',
+ 'exampleValue' => 10,
+ ],
+ 'limit_days' => [
+ 'name' => 'Limit von Tagen',
+ 'title' => 'Nur Termine innerhalb der nächsten x Tagen',
+ 'type' => 'number',
+ 'exampleValue' => 28,
+ ],
+ 'limit_items' => [
+ 'name' => 'Limit von Terminen',
+ 'title' => 'Nicht mehr als x Termine',
+ 'type' => 'number',
+ 'required' => true,
+ 'defaultValue' => 20,
+ ]
+ ]
+ ];
+
+ public function collectData()
+ {
+ $limitItems = intval($this->getInput('limit_items'));
+ $this->collectExpandableDatas(self::buildAppointmentsURI(), $limitItems);
+ }
+
+ protected function parseItem(array $item)
+ {
+ $html = getSimpleHTMLDOM($item['uri']);
+
+ $detailsElement = $html->find('.details', 0);
+
+ $dateElement = $detailsElement->find('.datum', 0);
+ $dateLines = self::explodeLines($dateElement->plaintext);
+
+ $addressElement = $detailsElement->find('.adresse', 0);
+ $addressLines = self::explodeLines($addressElement->plaintext);
+
+ $infoElement = $detailsElement->find('.angebote > h4 + p', 0);
+ $info = $infoElement ? $infoElement->innertext : '';
+
+ $imageElements = $detailsElement->find('.fotos img');
+
+ $item['title'] = $dateLines[0] . ' ' . $dateLines[1] . ' ' . $addressLines[0] . ' - ' . $addressLines[1];
+
+ $item['content'] = <<{$dateLines[0]} {$dateLines[1]}
+ {$addressElement->innertext}
+ {$info}
+ HTML;
+
+ foreach ($imageElements as $imageElement) {
+ $src = $imageElement->getAttribute('src');
+ $item['content'] .= <<
+ HTML;
+ }
+
+ $item['description'] = null;
+
+ return $item;
+ }
+
+ public function getURI()
+ {
+ if ($this->queriedContext === self::CONTEXT_APPOINTMENTS) {
+ return str_replace('.rss?', '?', self::buildAppointmentsURI());
+ }
+ return parent::getURI();
+ }
+
+ private function buildAppointmentsURI()
+ {
+ $term = $this->getInput('term') ?? '';
+ $radius = $this->getInput('radius') ?? '';
+ $limitDays = intval($this->getInput('limit_days'));
+ $dateTo = $limitDays > 0 ? date('Y-m-d', time() + (60 * 60 * 24 * $limitDays)) : '';
+ return self::BASE_URI . '/blutspendetermine/termine.rss?date_to=' . $dateTo . '&radius=' . $radius . '&term=' . $term;
+ }
+
+ /**
+ * Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by line breaks.
+ */
+ private function explodeLines(string $text): array
+ {
+ return array_map('trim', preg_split('/(\s*(\r\n|\n|\r)\s*)+/', $text));
+ }
+}