1<?php 2/** 3 * @copyright Copyright (c) 2014 Carsten Brandt 4 * @license https://github.com/cebe/markdown/blob/master/LICENSE 5 * @link https://github.com/cebe/markdown#readme 6 */ 7 8namespace cebe\markdown\inline; 9 10// work around https://github.com/facebook/hhvm/issues/1120 11defined('ENT_HTML401') || define('ENT_HTML401', 0); 12 13/** 14 * Adds auto linking for URLs 15 */ 16trait UrlLinkTrait 17{ 18 /** 19 * Parses urls and adds auto linking feature. 20 * @marker http 21 * @marker ftp 22 */ 23 protected function parseUrl($markdown) 24 { 25 $pattern = <<<REGEXP 26 /(?(R) # in case of recursion match parentheses 27 \(((?>[^\s()]+)|(?R))*\) 28 | # else match a link with title 29 ^(https?|ftp):\/\/(([^\s<>()]+)|(?R))+(?<![\.,:;\'"!\?\s]) 30 )/x 31REGEXP; 32 33 if (!in_array('parseLink', $this->context) && preg_match($pattern, $markdown, $matches)) { 34 return [ 35 ['autoUrl', $matches[0]], 36 strlen($matches[0]) 37 ]; 38 } 39 return [['text', substr($markdown, 0, 4)], 4]; 40 } 41 42 protected function renderAutoUrl($block) 43 { 44 $href = htmlspecialchars($block[1], ENT_COMPAT | ENT_HTML401, 'UTF-8'); 45 $decodedUrl = urldecode($block[1]); 46 $secureUrlText = preg_match('//u', $decodedUrl) ? $decodedUrl : $block[1]; 47 $text = htmlspecialchars($secureUrlText, ENT_NOQUOTES | ENT_SUBSTITUTE, 'UTF-8'); 48 return "<a href=\"$href\">$text</a>"; 49 } 50} 51