datatable.directory codebase
				https://datatable.directory/
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							89 lines
						
					
					
						
							2.4 KiB
						
					
					
				| <?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();
 | |
|     }
 | |
| }
 | |
| 
 |