X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FText%2FHTML.php;h=c127973b13b8493837844b770c8762694f28785f;hb=a947bd0889cfb2eb58692f92ab19a875019d3b79;hp=8c32498a3fd7785945b74503da238c26a9f830ed;hpb=3282ce53894b624893ee2989747a59866ab4b137;p=friendica.git diff --git a/src/Content/Text/HTML.php b/src/Content/Text/HTML.php index 8c32498a3f..c127973b13 100644 --- a/src/Content/Text/HTML.php +++ b/src/Content/Text/HTML.php @@ -7,13 +7,11 @@ namespace Friendica\Content\Text; use DOMDocument; use DOMXPath; +use Friendica\Content\Widget\ContactBlock; use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Config; -use Friendica\Core\PConfig; -use Friendica\Core\Protocol; use Friendica\Core\Renderer; -use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Util\Network; use Friendica\Util\Proxy as ProxyUtils; @@ -58,6 +56,7 @@ class HTML $xpath = new DOMXPath($doc); + /** @var \DOMNode[] $list */ $list = $xpath->query("//" . $tag); foreach ($list as $node) { $attr = []; @@ -100,9 +99,12 @@ class HTML $node->parentNode->insertBefore($StartCode, $node); if ($node->hasChildNodes()) { + /** @var \DOMNode $child */ foreach ($node->childNodes as $child) { - $newNode = $child->cloneNode(true); - $node->parentNode->insertBefore($newNode, $node); + if (trim($child->nodeValue)) { + $newNode = $child->cloneNode(true); + $node->parentNode->insertBefore($newNode, $node); + } } } @@ -292,6 +294,7 @@ class HTML self::tagToBBCode($doc, 'a', ['href' => '/mailto:(.+)/'], '[mail=$1]', '[/mail]'); self::tagToBBCode($doc, 'a', ['href' => '/(.+)/'], '[url=$1]', '[/url]'); + self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'alt' => '/(.+)/'], '[img=$1]$2', '[/img]'); self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'width' => '/(\d+)/', 'height' => '/(\d+)/'], '[img=$2x$3]$1', '[/img]'); self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], '[img]$1', '[/img]'); @@ -561,6 +564,8 @@ class HTML $ignore = false; } + $ignore = $ignore || strpos($treffer[1], '#') === 0; + if (!$ignore) { $urls[$treffer[1]] = $treffer[1]; } @@ -569,7 +574,13 @@ class HTML return $urls; } - public static function toPlaintext($html, $wraplength = 75, $compact = false) + /** + * @param string $html + * @param int $wraplength Ensures individual lines aren't longer than this many characters. Doesn't break words. + * @param bool $compact True: Completely strips image tags; False: Keeps image URLs + * @return string + */ + public static function toPlaintext(string $html, $wraplength = 75, $compact = false) { $message = str_replace("\r", "", $html); @@ -578,38 +589,20 @@ class HTML $message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8"); - @$doc->loadHTML($message); - - $xpath = new DOMXPath($doc); - $list = $xpath->query("//pre"); - foreach ($list as $node) { - $node->nodeValue = str_replace("\n", "\r", $node->nodeValue); - } + @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD); $message = $doc->saveHTML(); - $message = str_replace(["\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"], ["<", ">", "
", " ", ""], $message); - $message = preg_replace('= [\s]*=i', " ", $message); + // Remove eventual UTF-8 BOM + $message = str_replace("\xC3\x82\xC2\xA0", "", $message); // Collecting all links $urls = self::collectURLs($message); - @$doc->loadHTML($message); + @$doc->loadHTML($message, LIBXML_HTML_NODEFDTD); self::tagToBBCode($doc, 'html', [], '', ''); self::tagToBBCode($doc, 'body', [], '', ''); - // MyBB-Auszeichnungen - /* - self::node2BBCode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_'); - self::node2BBCode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/'); - self::node2BBCode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*'); - - self::node2BBCode($doc, 'strong', array(), '*', '*'); - self::node2BBCode($doc, 'b', array(), '*', '*'); - self::node2BBCode($doc, 'i', array(), '/', '/'); - self::node2BBCode($doc, 'u', array(), '_', '_'); - */ - if ($compact) { self::tagToBBCode($doc, 'blockquote', [], "»", "«"); } else { @@ -623,8 +616,6 @@ class HTML self::tagToBBCode($doc, 'div', [], "\r", "\r"); self::tagToBBCode($doc, 'p', [], "\n", "\n"); - //self::node2BBCode($doc, 'ul', array(), "\n[list]", "[/list]\n"); - //self::node2BBCode($doc, 'ol', array(), "\n[list=1]", "[/list]\n"); self::tagToBBCode($doc, 'li', [], "\n* ", "\n"); self::tagToBBCode($doc, 'hr', [], "\n" . str_repeat("-", 70) . "\n", ""); @@ -639,12 +630,6 @@ class HTML self::tagToBBCode($doc, 'h5', [], "\n\n*", "*\n"); self::tagToBBCode($doc, 'h6', [], "\n\n*", "*\n"); - // Problem: there is no reliable way to detect if it is a link to a tag or profile - //self::node2BBCode($doc, 'a', array('href'=>'/(.+)/'), ' $1 ', ' ', true); - //self::node2BBCode($doc, 'a', array('href'=>'/(.+)/', 'rel'=>'oembed'), ' $1 ', '', true); - //self::node2BBCode($doc, 'img', array('alt'=>'/(.+)/'), '$1', ''); - //self::node2BBCode($doc, 'img', array('title'=>'/(.+)/'), '$1', ''); - //self::node2BBCode($doc, 'img', array(), '', ''); if (!$compact) { self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], ' [img]$1', '[/img] '); } else { @@ -807,90 +792,17 @@ class HTML /** * Get html for contact block. * - * @template contact_block.tpl - * @hook contact_block_end (contacts=>array, output=>string) + * @deprecated since version 2019.03 + * @see ContactBlock::getHTML() * @return string * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ public static function contactBlock() { - $o = ''; $a = \get_app(); - $shown = PConfig::get($a->profile['uid'], 'system', 'display_friend_count', 24); - if ($shown == 0) { - return; - } - - if (!is_array($a->profile) || $a->profile['hide-friends']) { - return $o; - } - - $r = q("SELECT COUNT(*) AS `total` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `blocked` - AND NOT `pending` AND NOT `hidden` AND NOT `archive` - AND `network` IN ('%s', '%s', '%s')", - intval($a->profile['uid']), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::OSTATUS), - DBA::escape(Protocol::DIASPORA) - ); - - if (DBA::isResult($r)) { - $total = intval($r[0]['total']); - } - - if (!$total) { - $contacts = L10n::t('No contacts'); - $micropro = null; - } else { - // Splitting the query in two parts makes it much faster - $r = q("SELECT `id` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `blocked` - AND NOT `pending` AND NOT `hidden` AND NOT `archive` - AND `network` IN ('%s', '%s', '%s') - ORDER BY RAND() LIMIT %d", - intval($a->profile['uid']), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::OSTATUS), - DBA::escape(Protocol::DIASPORA), - intval($shown) - ); - - if (DBA::isResult($r)) { - $contacts = []; - foreach ($r as $contact) { - $contacts[] = $contact["id"]; - } - - $r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)", - DBA::escape(implode(",", $contacts)) - ); - - if (DBA::isResult($r)) { - $contacts = L10n::tt('%d Contact', '%d Contacts', $total); - $micropro = []; - foreach ($r as $rr) { - $micropro[] = self::micropro($rr, true, 'mpfriend'); - } - } - } - } - - $tpl = Renderer::getMarkupTemplate('contact_block.tpl'); - $o = Renderer::replaceMacros($tpl, [ - '$contacts' => $contacts, - '$nickname' => $a->profile['nickname'], - '$viewcontacts' => L10n::t('View Contacts'), - '$micropro' => $micropro, - ]); - - $arr = ['contacts' => $r, 'output' => $o]; - - Hook::callAll('contact_block_end', $arr); - - return $o; + return ContactBlock::getHTML($a->profile); } /**