From 44c801905ad771f5d628e034367e8505aea97c08 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 27 Apr 2021 12:29:54 +0000 Subject: [PATCH] Improve page load performance with attached links --- src/Content/Text/BBCode.php | 13 ++++++----- src/Model/Item.php | 45 +++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index bcc9f470a8..6da5b49058 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -605,16 +605,19 @@ class BBCode * @param string $text * @param integer $simplehtml * @param bool $tryoembed + * @param array $data * @return string * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private static function convertAttachment($text, $simplehtml = self::INTERNAL, $tryoembed = true) + public static function convertAttachment($text, $simplehtml = self::INTERNAL, $tryoembed = true, array $data = []) { - $data = self::getAttachmentData($text); + $data = $data ?: self::getAttachmentData($text); if (empty($data) || empty($data['url'])) { return $text; } + $stamp1 = microtime(true); + if (isset($data['title'])) { $data['title'] = strip_tags($data['title']); $data['title'] = str_replace(['http://', 'https://'], '', $data['title']); @@ -655,9 +658,8 @@ class BBCode } if (!empty($data['description']) && $data['description'] != $data['title']) { - // Sanitize the HTML by converting it to BBCode - $bbcode = HTML::toBBCode($data['description']); - $return .= sprintf('
%s
', trim(self::convert($bbcode))); + // Sanitize the HTML + $return .= sprintf('
%s
', trim(HTML::purify($data['description']))); } if (!empty($data['provider_url']) && !empty($data['provider_name'])) { @@ -673,6 +675,7 @@ class BBCode } } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); return trim(($data['text'] ?? '') . ' ' . $return . ' ' . ($data['after'] ?? '')); } diff --git a/src/Model/Item.php b/src/Model/Item.php index df6f83aec2..ae67f4854d 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -2734,6 +2734,7 @@ class Item */ private static function addVisualAttachments(array $attachments, array $item, string $content, bool $shared) { + $stamp1 = microtime(true); $leading = ''; $trailing = ''; @@ -2797,6 +2798,7 @@ class Item } } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); return $content; } @@ -2811,6 +2813,7 @@ class Item */ private static function addLinkAttachment(array $attachments, array $item, string $content, bool $shared, string $ignore_link) { + $stamp1 = microtime(true); // @ToDo Check only for audio and video $preview = empty($attachments['visual']); @@ -2823,31 +2826,37 @@ class Item } if (!empty($attachment)) { + $footer = ''; $data = [ - 'author_img' => $attachment['author-image'] ?? '', - 'author_name' => $attachment['author-name'] ?? '', - 'author_url' => $attachment['author-url'] ?? '', - 'publisher_img' => $attachment['publisher-image'] ?? '', - 'publisher_name' => $attachment['publisher-name'] ?? '', - 'publisher_url' => $attachment['publisher-url'] ?? '', - 'text' => $attachment['description'] ?? '', - 'title' => $attachment['name'] ?? '', - 'type' => 'link', - 'url' => $attachment['url'] ?? '', - ]; + 'after' => '', + 'author_name' => $attachment['author-name'] ?? '', + 'author_url' => $attachment['author-url'] ?? '', + 'description' => $attachment['description'] ?? '', + 'image' => '', + 'preview' => '', + 'provider_name' => $attachment['publisher-name'] ?? '', + 'provider_url' => $attachment['publisher-url'] ?? '', + 'text' => '', + 'title' => $attachment['name'] ?? '', + 'type' => 'link', + 'url' => $attachment['url']]; - if ($preview && !empty($attachment['preview']) && !empty($attachment['preview-height']) && !empty($attachment['preview-width'])) { - $data['images'][] = ['src' => $attachment['preview'], - 'width' => $attachment['preview-width'], 'height' => $attachment['preview-height']]; + if ($preview) { + if ($attachment['preview-width'] >= 500) { + $data['image'] = $attachment['preview'] ?? ''; + } else { + $data['preview'] = $attachment['preview'] ?? ''; + } } - $footer = PageInfo::getFooterFromData($data); } elseif (preg_match("/.*(\[attachment.*?\].*?\[\/attachment\]).*/ism", $item['body'], $match)) { $footer = $match[1]; + $data = []; } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); - if (!empty($footer)) { + if (!empty($footer) || !empty($data)) { // @todo Use a template - $rendered = BBCode::convert($footer); + $rendered = BBCode::convertAttachment($footer, BBCode::INTERNAL, false, $data); if ($shared) { return str_replace(BBCode::ANCHOR, BBCode::ANCHOR . $rendered, $content); } else { @@ -2867,6 +2876,7 @@ class Item */ private static function addNonVisualAttachments(array $attachments, array $item, string $content) { + $stamp1 = microtime(true); $trailing = ''; foreach ($attachments['additional'] as $attachment) { if (strpos($item['body'], $attachment['url'])) { @@ -2892,6 +2902,7 @@ class Item $content .= '
' . $trailing . '
'; } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); return $content; }