X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FContent%2FText%2FHTML.php;h=47463bdd091d1b665c07a116bcdaf042ffc843c4;hb=3cd654e76f32dbcf505aef6a60a3e42d318f8b61;hp=896db876f581bd5fa4eb0440f12e1bf49a3496d3;hpb=6d2d15a80d2fbf68ec2086bdcc9f911f8bef1077;p=friendica.git
diff --git a/src/Content/Text/HTML.php b/src/Content/Text/HTML.php
index 896db876f5..47463bdd09 100644
--- a/src/Content/Text/HTML.php
+++ b/src/Content/Text/HTML.php
@@ -1,5 +1,4 @@
(.*)
#iUs',
+ '#
(.*)
#iUs',
function ($matches) use (&$codeblocks) {
$return = '[codeblock-' . count($codeblocks) . ']';
@@ -131,7 +139,7 @@ class HTML
$prefix = '[code=' . $matches[1] . ']';
}
- $codeblocks[] = $prefix . trim($matches[2]) . '[/code]';
+ $codeblocks[] = $prefix . PHP_EOL . trim($matches[2]) . PHP_EOL . '[/code]';
return $return;
},
$message
@@ -139,12 +147,14 @@ class HTML
$message = str_replace(
[
- "",
- "
",
- ], [
- "",
- "",
- ], $message
+ "",
+ "
",
+ ],
+ [
+ "",
+ "",
+ ],
+ $message
);
// remove namespaces
@@ -168,7 +178,9 @@ class HTML
$xpath = new DomXPath($doc);
$list = $xpath->query("//pre");
foreach ($list as $node) {
- $node->nodeValue = str_replace("\n", "\r", $node->nodeValue);
+ // Ensure to escape unescaped & - they will otherwise raise a warning
+ $safe_value = preg_replace('/&(?!\w+;)/', '&', $node->nodeValue);
+ $node->nodeValue = str_replace("\n", "\r", $safe_value);
}
$message = $doc->saveHTML();
@@ -183,8 +195,13 @@ class HTML
self::tagToBBCode($doc, 'p', ['class' => 'MsoNormal', 'style' => 'margin-left:35.4pt'], '[quote]', '[/quote]');
// Outlook-Quote - Variant 2
- self::tagToBBCode($doc, 'div', ['style' => 'border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'],
- '[quote]', '[/quote]');
+ self::tagToBBCode(
+ $doc,
+ 'div',
+ ['style' => 'border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'],
+ '[quote]',
+ '[/quote]'
+ );
// MyBB-Stuff
self::tagToBBCode($doc, 'span', ['style' => 'text-decoration: underline;'], '[u]', '[/u]');
@@ -273,8 +290,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' => '/(.+)/', 'width' => '/(\d+)/', 'height' => '/(\d+)/'], '[img=$2x$3]$1',
- '[/img]');
+ self::tagToBBCode($doc, 'img', ['src' => '/(.+)/', 'width' => '/(\d+)/', 'height' => '/(\d+)/'], '[img=$2x$3]$1', '[/img]');
self::tagToBBCode($doc, 'img', ['src' => '/(.+)/'], '[img]$1', '[/img]');
@@ -297,7 +313,7 @@ class HTML
$message = preg_replace('=\r *\r=i', "\n", $message);
$message = str_replace("\r", "\n", $message);
- Addon::callHooks('html2bbcode', $message);
+ Hook::callAll('html2bbcode', $message);
$message = strip_tags($message);
@@ -343,12 +359,15 @@ class HTML
"[/",
"[list]",
"[list=1]",
- "[*]"], $message
+ "[*]"],
+ $message
);
} while ($message != $oldmessage);
$message = str_replace(
- ['[b][b]', '[/b][/b]', '[i][i]', '[/i][/i]'], ['[b]', '[/b]', '[i]', '[/i]'], $message
+ ['[b][b]', '[/b][/b]', '[i][i]', '[/i][/i]'],
+ ['[b]', '[/b]', '[i]', '[/i]'],
+ $message
);
// Handling Yahoo style of mails
@@ -423,7 +442,8 @@ class HTML
foreach ($matches as $match) {
$body = preg_replace_callback(
- $match, function ($match) use ($basepath) {
+ $match,
+ function ($match) use ($basepath) {
return self::qualifyURLsSub($match, $basepath);
},
$body
@@ -520,7 +540,7 @@ class HTML
// A list of some links that should be ignored
$list = ["/user/", "/tag/", "/group/", "/profile/", "/search?search=", "/search?tag=", "mailto:", "/u/", "/node/",
- "//facebook.com/profile.php?id=", "//plus.google.com/", "//twitter.com/"];
+ "//plus.google.com/", "//twitter.com/"];
foreach ($list as $listitem) {
if (strpos($treffer[1], $listitem) !== false) {
$ignore = true;
@@ -549,8 +569,6 @@ class HTML
public static function toPlaintext($html, $wraplength = 75, $compact = false)
{
- global $lang;
-
$message = str_replace("\r", "", $html);
$doc = new DOMDocument();
@@ -674,4 +692,277 @@ class HTML
return trim($message);
}
+
+ /**
+ * Converts provided HTML code to Markdown. The hardwrap parameter maximizes
+ * compatibility with Diaspora in spite of the Markdown standards.
+ *
+ * @param string $html
+ * @return string
+ */
+ public static function toMarkdown($html)
+ {
+ $converter = new HtmlConverter(['hard_break' => true]);
+ $markdown = $converter->convert($html);
+
+ return $markdown;
+ }
+
+ /**
+ * @brief Convert video HTML to BBCode tags
+ *
+ * @param string $s
+ * @return string
+ */
+ public static function toBBCodeVideo($s)
+ {
+ $s = preg_replace(
+ '##ism',
+ '[youtube]$2[/youtube]',
+ $s
+ );
+
+ $s = preg_replace(
+ '##ism',
+ '[youtube]$2[/youtube]',
+ $s
+ );
+
+ $s = preg_replace(
+ '##ism',
+ '[vimeo]$2[/vimeo]',
+ $s
+ );
+
+ return $s;
+ }
+
+ /**
+ * transform link href and img src from relative to absolute
+ *
+ * @param string $text
+ * @param string $base base url
+ * @return string
+ */
+ public static function relToAbs($text, $base)
+ {
+ if (empty($base)) {
+ return $text;
+ }
+
+ $base = rtrim($base, '/');
+
+ $base2 = $base . "/";
+
+ // Replace links
+ $pattern = "/]*) href=\"(?!http|https|\/)([^\"]*)\"/";
+ $replace = "]*) href=\"(?!http|https)([^\"]*)\"/";
+ $replace = "]*) src=\"(?!http|https|\/)([^\"]*)\"/";
+ $replace = "]*) src=\"(?!http|https)([^\"]*)\"/";
+ $replace = "';
+ }
+
+ /**
+ * Loader for infinite scrolling
+ *
+ * @return string html for loader
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function scrollLoader()
+ {
+ $tpl = Renderer::getMarkupTemplate("scroll_loader.tpl");
+ return Renderer::replaceMacros($tpl, [
+ 'wait' => L10n::t('Loading more entries...'),
+ 'end' => L10n::t('The end')
+ ]);
+ }
+
+ /**
+ * Get html for contact block.
+ *
+ * @deprecated since version 2019.03
+ * @see ContactBlock::getHTML()
+ * @return string
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function contactBlock()
+ {
+ $a = \get_app();
+
+ return ContactBlock::getHTML($a->profile);
+ }
+
+ /**
+ * @brief Format contacts as picture links or as text links
+ *
+ * @param array $contact Array with contacts which contains an array with
+ * int 'id' => The ID of the contact
+ * int 'uid' => The user ID of the user who owns this data
+ * string 'name' => The name of the contact
+ * string 'url' => The url to the profile page of the contact
+ * string 'addr' => The webbie of the contact (e.g.) username@friendica.com
+ * string 'network' => The network to which the contact belongs to
+ * string 'thumb' => The contact picture
+ * string 'click' => js code which is performed when clicking on the contact
+ * @param boolean $redirect If true try to use the redir url if it's possible
+ * @param string $class CSS class for the
+ * @param boolean $textmode If true display the contacts as text links
+ * if false display the contacts as picture links
+ * @return string Formatted html
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function micropro($contact, $redirect = false, $class = '', $textmode = false)
+ {
+ // Use the contact URL if no address is available
+ if (empty($contact['addr'])) {
+ $contact["addr"] = $contact["url"];
+ }
+
+ $url = $contact['url'];
+ $sparkle = '';
+ $redir = false;
+
+ if ($redirect) {
+ $url = Contact::magicLink($contact['url']);
+ if (strpos($url, 'redir/') === 0) {
+ $sparkle = ' sparkle';
+ }
+ }
+
+ // If there is some js available we don't need the url
+ if (!empty($contact['click'])) {
+ $url = '';
+ }
+
+ return Renderer::replaceMacros(Renderer::getMarkupTemplate(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'), [
+ '$click' => defaults($contact, 'click', ''),
+ '$class' => $class,
+ '$url' => $url,
+ '$photo' => ProxyUtils::proxifyUrl($contact['thumb'], false, ProxyUtils::SIZE_THUMB),
+ '$name' => $contact['name'],
+ 'title' => $contact['name'] . ' [' . $contact['addr'] . ']',
+ '$parkle' => $sparkle,
+ '$redir' => $redir
+ ]);
+ }
+
+ /**
+ * Search box.
+ *
+ * @param string $s Search query.
+ * @param string $id HTML id
+ * @param string $url Search url.
+ * @param bool $aside Display the search widgit aside.
+ *
+ * @return string Formatted HTML.
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function search($s, $id = 'search-box', $url = 'search', $aside = true)
+ {
+ $mode = 'text';
+
+ if (strpos($s, '#') === 0) {
+ $mode = 'tag';
+ }
+ $save_label = $mode === 'text' ? L10n::t('Save') : L10n::t('Follow');
+
+ $values = [
+ '$s' => $s,
+ '$id' => $id,
+ '$action_url' => $url,
+ '$search_label' => L10n::t('Search'),
+ '$save_label' => $save_label,
+ '$savedsearch' => 'savedsearch',
+ '$search_hint' => L10n::t('@name, !forum, #tags, content'),
+ '$mode' => $mode
+ ];
+
+ if (!$aside) {
+ $values['$searchoption'] = [
+ L10n::t("Full Text"),
+ L10n::t("Tags"),
+ L10n::t("Contacts")];
+
+ if (Config::get('system', 'poco_local_search')) {
+ $values['$searchoption'][] = L10n::t("Forums");
+ }
+ }
+
+ return Renderer::replaceMacros(Renderer::getMarkupTemplate('searchbox.tpl'), $values);
+ }
+
+ /**
+ * Replace naked text hyperlink with HTML formatted hyperlink
+ *
+ * @param string $s
+ * @return string
+ */
+ public static function toLink($s)
+ {
+ $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' $1', $s);
+ $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism", '<$1$2=$3&$4>', $s);
+ return $s;
+ }
+
+ /**
+ * Given a HTML text and a set of filtering reasons, adds a content hiding header with the provided reasons
+ *
+ * Reasons are expected to have been translated already.
+ *
+ * @param string $html
+ * @param array $reasons
+ * @return string
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ public static function applyContentFilter($html, array $reasons)
+ {
+ if (count($reasons)) {
+ $tpl = Renderer::getMarkupTemplate('wall/content_filter.tpl');
+ $html = Renderer::replaceMacros($tpl, [
+ '$reasons' => $reasons,
+ '$rnd' => Strings::getRandomHex(8),
+ '$openclose' => L10n::t('Click to open/close'),
+ '$html' => $html
+ ]);
+ }
+
+ return $html;
+ }
+
+ /**
+ * replace html amp entity with amp char
+ * @param string $s
+ * @return string
+ */
+ public static function unamp($s)
+ {
+ return str_replace('&', '&', $s);
+ }
}