<?php namespace App\View; /** * Collapsible text box widget */ class CollapsibleTextBoxWidget { private $maxHeight; private $collapsing; private $text; private $srPrefix; private $srEscape; /** * Add a prefix inside the text box shown only to screen readers, Lynx etc. * * @param string $content * @param bool $escape - use html escape, default true * @return $this */ public function srPrefix($content, $escape=true) { $this->srEscape = $escape; $this->srPrefix = $content; return $this; } /** * @param string $text - text to show * @param int $thresholdLength - mb_character length that triggers the collapsible behavior; choose experimentally * @param string $maxHeight - max height CSS value (e.g. 8em) */ public function __construct($text, $thresholdLength, $maxHeight) { $this->text = $text; $this->collapsing = mb_strlen($text) > $thresholdLength; $this->maxHeight = $maxHeight; } private function processText($t) { $out = e($t); $out = str_replace("\r\n", "\n", $out); $out = '<p class="last-p-mb-0"> '.str_replace("\n\n", " </p>". '<p class="last-p-mb-0"> ', $out).' </p>'; $out = nl2br($out); $out = preg_replace_callback('#\b((https?://|ftp://|mailto:)[^\s]+)#i', function($m) { $href = $m[1]; $text = $href; if (strpos($text, 'mailto:') === 0) { $text = str_replace('mailto:', '', $text); } return "<a href=\"".e($href)."\">".e($text)."</a>"; }, $out); return $out; } public function render() { $content = $this->processText($this->text); $prefix = ''; if ($this->srPrefix) { $prefix = '<span class="sr-only">'. ($this->srEscape ? e($this->srPrefix) : $this->srPrefix). ' </span>'; } if ($this->collapsing) { return '<div class="block-collapse" title="Click to toggle" style="max-height:'.$this->maxHeight.'">' . $prefix . $content . '</div>'; } else { return $prefix.'<div>' . $prefix . $content . '</div>'; } } public function __toString() { return (string) $this->render(); } }