'', 'alder' => '', 'ragweed' => '', 'mugwort' => '', 'grass' => '', 'ash' => '', 'hazel' => '', 'rye' => '', ]; /* -------------------- SVG Hilfsfunktionen -------------------- */ function fallbackSVG($size = 36, $color = '#FFFFFF', $label = '?') { $labelEsc = htmlspecialchars($label, ENT_QUOTES); return '' . '' . ''.$labelEsc.'' . ''; } function sanitizeSVGWrapper($svg, $size = 38, $color = '#FFFFFF') { if (!is_string($svg) || trim($svg) === '') { return '
' . fallbackSVG($size, $color, '?') . '
'; } $svg = str_replace('var(--content-color)', 'currentColor', $svg); $svg = preg_replace_callback('/]*)>/i', function($m) use ($color) { $attrs = preg_replace('/\b(width|height|preserveAspectRatio|style)=("|\')[^"\']*("|\')/i', '', $m[1]); if (!preg_match('/\bfill\s*=\s*([\'"])[^\'"]+\1/i', $attrs)) $attrs .= ' fill="currentColor"'; else $attrs = preg_replace('/\bfill\s*=\s*([\'"])none\1/i', 'fill="currentColor"', $attrs); return ''; }, $svg, 1); return '
'.$svg.'
'; } function getPollenSVG($name) { global $pollenIcons; $map =['ambrosia' => 'ragweed', 'beifuss' => 'mugwort', 'birke' => 'birch', 'erle' => 'alder', 'esche' => 'ash', 'graeser' => 'grass', 'gräser' => 'grass', 'hasel' => 'hazel', 'roggen' => 'rye']; $key = strtolower($name); if (isset($map[$key])) $key = $map[$key]; if (!isset($pollenIcons[$key])) $key = 'birch'; return sanitizeSVGWrapper($pollenIcons[$key]); } /* -------------------- Vorbereitungen -------------------- */ $pollenKeys = array_keys($data['index']); $tage =['SONNTAG', 'MONTAG', 'DIENSTAG', 'MITTWOCH', 'DONNERSTAG', 'FREITAG', 'SAMSTAG']; $monate =['', 'JANUAR', 'FEBRUAR', 'MÄRZ', 'APRIL', 'MAI', 'JUNI', 'JULI', 'AUGUST', 'SEPTEMBER', 'OKTOBER', 'NOVEMBER', 'DEZEMBER']; $palette =['#4CAF50', '#8BC34A', '#FFEB3B', '#FFC107', '#FF9800', '#F44336']; /* -------------------- CSS & HTML Aufbau -------------------- */ $html = ' '; $html .= '
'; $html .= '
'; // --------------------------------------------------------------------------------- // GRUPPE 0: KOPFZEILE (Leere Ecke + Alle Pollenarten) // --------------------------------------------------------------------------------- $html .= '
'; $html .= '
'; // Oben Links bleibt leer foreach ($pollenKeys as $pName) { $html .= '
'; $html .= '
' . getPollenSVG($pName) . '
'; $html .= '
' . htmlspecialchars($pName) . '
'; $html .= '
'; } $html .= '
'; // --------------------------------------------------------------------------------- // GRUPPEN 1-X: TAGE (Tag-Header + Messwerte der jeweiligen Pollen) // --------------------------------------------------------------------------------- for ($i = 0; $i < $numDays; $i++) { $ts = strtotime("+$i days"); $tagStr = ($i == 0) ? "HEUTE" : (($i == 1) ? "MORGEN" : $tage[date('w', $ts)]); $html .= '
'; // Tag Anzeige (erste Zelle der Gruppe) $html .= '
'; $html .= '
'.$tagStr.'
'; $html .= '
'.date('j', $ts).'
'; $html .= '
'.$monate[date('n', $ts)].'
'; $html .= '
'; // Werte für jede Pollenart an diesem Tag foreach ($pollenKeys as $pName) { $levels = $data['index'][$pName]; $lvl = isset($levels[$i]) ? (int)$levels[$i] : 0; $tooltip = isset($data['legend']["#$lvl"]) ? $data['legend']["#$lvl"] : "Keine Pollen"; if (strtolower($tooltip) == "keine") $tooltip = "Keine Pollen"; // Segmente für den runden Verlauf generieren $seg =[]; for($s=0; $s<6; $s++) { $seg[] = ($lvl > 0 && $s < $lvl) ? $palette[min($s, 5)] : 'rgba(255,255,255,0.08)'; } $conic = "conic-gradient({$seg[0]} 0deg 55deg, transparent 55deg 60deg, {$seg[1]} 60deg 115deg, transparent 115deg 120deg, {$seg[2]} 120deg 175deg, transparent 175deg 180deg, {$seg[3]} 180deg 235deg, transparent 235deg 240deg, {$seg[4]} 240deg 295deg, transparent 295deg 300deg, {$seg[5]} 300deg 355deg, transparent 355deg 360deg)"; $html .= '
'; $html .= '
'; $html .= '
'; $html .= '
'.$lvl.'
'; $html .= '
'; $html .= '
'.htmlspecialchars($tooltip).'
'; $html .= '
'; } $html .= '
'; } $html .= '
'; // Ende pw-container $html .= '
'; // Ende pw-widget /* -------------------- Ergebnis in IPS setzen -------------------- */ if (isset($_IPS['SENDER']) && $_IPS['SENDER'] == 'Execute') { echo "Erzeugtes HTML (Vorschau):\n\n"; echo $html; } if ($htmlBoxVarID > 0 && IPS_VariableExists($htmlBoxVarID)) { SetValue($htmlBoxVarID, $html); }