Complete incomplete URL during feed import

This commit is contained in:
Michael 2017-10-16 20:31:13 +00:00
parent a0530d1066
commit 2a28591415
3 changed files with 103 additions and 10 deletions

View file

@ -27,6 +27,14 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
return;
}
if (!empty($contact['poll'])) {
$basepath = $contact['poll'];
} elseif (!empty($contact['url'])) {
$basepath = $contact['url'];
} else {
$basepath = '';
}
$doc = new DOMDocument();
@$doc->loadXML(trim($xml));
$xpath = new DomXPath($doc);
@ -344,7 +352,7 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
if (title_is_body($item["title"], $body)) {
$item["title"] = "";
}
$item["body"] = html2bbcode($body);
$item["body"] = html2bbcode($body, $basepath);
if (($item["body"] == '') && ($item["title"] != '')) {
$item["body"] = $item["title"];

View file

@ -79,7 +79,7 @@ function node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb)
return($replace);
}
function html2bbcode($message)
function html2bbcode($message, $basepath = '')
{
$message = str_replace("\r", "", $message);
@ -323,5 +323,59 @@ function html2bbcode($message)
$message = trim($message);
if ($basepath != '') {
$message = AddHostname($message, $basepath);
}
return $message;
}
/**
* @brief Sub function to complete incomplete URL
*
* @param array $matches Result of preg_replace_callback
* @param string $basepath Basepath that is used to complete the URL
*
* @return string The expanded URL
*/
function AddHostnameSub($matches, $basepath) {
$base = parse_url($basepath);
$link = $matches[0];
$url = $matches[1];
$parts = array_merge($base, parse_url($url));
$url2 = unParseUrl($parts);
return str_replace($url, $url2, $link);
}
/**
* @brief Complete incomplete URLs in BBCode
*
* @param string $body Body with URLs
* @param string $basepath Basepath that is used to complete the URL
*
* @return string Body with expanded URLs
*/
function AddHostname($body, $basepath) {
$URLSearchString = "^\[\]";
$matches = array("/\[url\=([$URLSearchString]*)\].*?\[\/url\]/ism",
"/\[url\]([$URLSearchString]*)\[\/url\]/ism",
"/\[img\=[0-9]*x[0-9]*\](.*?)\[\/img\]/ism",
"/\[img\](.*?)\[\/img\]/ism",
"/\[zmg\=[0-9]*x[0-9]*\](.*?)\[\/img\]/ism",
"/\[zmg\](.*?)\[\/zmg\]/ism",
"/\[video\](.*?)\[\/video\]/ism",
"/\[audio\](.*?)\[\/audio\]/ism",
);
foreach ($matches AS $match) {
$body = preg_replace_callback($match,
function ($match) use ($basepath) {
return AddHostnameSub($match, $basepath);
}, $body);
}
return $body;
}

View file

@ -1003,3 +1003,34 @@ function matching_url($url1, $url2) {
return normalise_link($match);
}
/**
* @brief Glue url parts together
*
* @param array $parsed URL parts
*
* @return string The glued URL
*/
function unParseUrl($parsed) {
$get = function ($key) use ($parsed) {
return isset($parsed[$key]) ? $parsed[$key] : null;
};
$pass = $get('pass');
$user = $get('user');
$userinfo = $pass !== null ? "$user:$pass" : $user;
$port = $get('port');
$scheme = $get('scheme');
$query = $get('query');
$fragment = $get('fragment');
$authority =
($userinfo !== null ? $userinfo."@" : '') .
$get('host') .
($port ? ":$port" : '');
return (strlen($scheme) ? $scheme.":" : '') .
(strlen($authority) ? "//".$authority : '') .
$get('path') .
(strlen($query) ? "?".$query : '') .
(strlen($fragment) ? "#".$fragment : '');
}