From 6258a21434a83d840b1af5962219a2924d40ba42 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 15 May 2015 20:41:10 +0200 Subject: [PATCH] map bbcode tag from Red --- doc/BBCode.md | 29 +++++++++------ include/bbcode.php | 24 +++++++++++++ include/map.php | 18 ++++++++++ include/network.php | 87 ++++++++++++++++++++++++++++++++++++++++----- include/text.php | 10 ++++++ 5 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 include/map.php diff --git a/doc/BBCode.md b/doc/BBCode.md index c84308e5b7..8bdf32e5f4 100644 --- a/doc/BBCode.md +++ b/doc/BBCode.md @@ -7,25 +7,25 @@ Inline ----- -
[b]bold[/b]
: bold +
[b]bold[/b]
: bold -
[i]italic[/i]
: italic +
[i]italic[/i]
: italic -
[u]underlined[/u]
: underlined +
[u]underlined[/u]
: underlined -
[s]strike[/s]
: strike +
[s]strike[/s]
: strike -
[color=red]red[/color]
: red +
[color=red]red[/color]
: red -
[url=http://www.friendica.com]Friendica[/url]
: Friendica +
[url=http://www.friendica.com]Friendica[/url]
: Friendica -
[img]http://friendica.com/sites/default/files/friendika-32.png[/img]
: Immagine/foto +
[img]http://friendica.com/sites/default/files/friendika-32.png[/img]
: Immagine/foto -
[size=xx-small]small text[/size]
: small text +
[size=xx-small]small text[/size]
: small text -
[size=xx-large]big text[/size]
: big text +
[size=xx-large]big text[/size]
: big text -
[size=20]exact size[/size] (size can be any number, in pixel)
: exact size +
[size=20]exact size[/size] (size can be any number, in pixel)
: exact size @@ -126,6 +126,15 @@ Where *url* can be an url to youtube, vimeo, soundcloud, or other sites wich sup If *url* supports oembed or opengraph specifications the embedded object will be shown (eg, documents from scribd). Page title with a link to *url* will be shown. +Map +--- + +
[map]address[/map]
+
[map=lat,long]
+ +You can embed maps from coordinates or addresses. +Nominatim will be used to convert address to coordinates. +This require "openstreetmap" addon version 1.3 or newer. Special diff --git a/include/bbcode.php b/include/bbcode.php index 1eac012c3e..b47a514320 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -1,6 +1,17 @@ ' . generate_map(str_replace('/',' ',$match[1])) . '', $match[0]); +} +function bb_map_location($match) { + // the extra space in the following line is intentional + return str_replace($match[0],'
' . generate_named_map($match[1]) . '
', $match[0]); +} function bb_attachment($Text, $plaintext = false, $tryoembed = true) { $Text = preg_replace_callback("/(.*?)\[attachment(.*?)\](.*?)\[\/attachment\]/ism", @@ -932,7 +943,20 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal // Perform MAIL Search $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '$1', $Text); $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $Text); + + // leave open the posibility of [map=something] + // this is replaced in prepare_body() which has knowledge of the item location + if (strpos($Text,'[/map]') !== false) { + $Text = preg_replace_callback("/\[map\](.*?)\[\/map\]/ism", 'bb_map_location', $Text); + } + if (strpos($Text,'[map=') !== false) { + $Text = preg_replace_callback("/\[map=(.*?)\]/ism", 'bb_map_coords', $Text); + } + if (strpos($Text,'[map]') !== false) { + $Text = preg_replace("/\[map\]/", '
', $Text); + } + // Check for headers $Text = preg_replace("(\[h1\](.*?)\[\/h1\])ism",'

$1

',$Text); $Text = preg_replace("(\[h2\](.*?)\[\/h2\])ism",'

$1

',$Text); diff --git a/include/map.php b/include/map.php new file mode 100644 index 0000000000..e2398b2fd1 --- /dev/null +++ b/include/map.php @@ -0,0 +1,18 @@ + trim(substr($coord,0,strpos($coord,' '))), 'lon' => trim(substr($coord,strpos($coord,' ')+1)), 'html' => ''); + call_hooks('generate_map',$arr); + return (($arr['html']) ? $arr['html'] : $coord); +} +function generate_named_map($location) { + $arr = array('location' => $location, 'html' => ''); + call_hooks('generate_named_map',$arr); + return (($arr['html']) ? $arr['html'] : $location); +} diff --git a/include/network.php b/include/network.php index a07507da1f..deae348934 100644 --- a/include/network.php +++ b/include/network.php @@ -9,6 +9,49 @@ if(! function_exists('fetch_url')) { function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null, $cookiejar = 0) { + $ret = z_fetch_url( + $url, + $binary, + $redirects, + array('timeout'=>$timeout, + 'accept_content'=>$accept_content, + 'cookiejar'=>$cookiejar + )); + + + + return($ret['body']); +}} + +if(!function_exists('z_fetch_url')){ +/** + * @brief fetches an URL. + * + * @param string $url + * URL to fetch + * @param boolean $binary default false + * TRUE if asked to return binary results (file download) + * @param int $redirects default 0 + * internal use, recursion counter + * @param array $opts (optional parameters) assoziative array with: + * * \b accept_content => supply Accept: header with 'accept_content' as the value + * * \b timeout => int seconds, default system config value or 60 seconds + * * \b http_auth => username:password + * * \b novalidate => do not validate SSL certs, default is to validate using our CA list + * * \b nobody => only return the header + * * \b cookiejar => path to cookie jar file + * + * @return array an assoziative array with: + * * \e int \b return_code => HTTP return code or 0 if timeout or failure + * * \e boolean \b success => boolean true (if HTTP 2xx result) or false + * * \e string \b header => HTTP headers + * * \e string \b body => fetched content + */ +function z_fetch_url($url,$binary = false, &$redirects = 0, $opts=array()) { + + $ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => ""); + + $stamp1 = microtime(true); $a = get_app(); @@ -19,18 +62,18 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_ @curl_setopt($ch, CURLOPT_HEADER, true); - if($cookiejar) { - curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar); - curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar); + if(x($opts,"cookiejar")) { + curl_setopt($ch, CURLOPT_COOKIEJAR, $opts["cookiejar"]); + curl_setopt($ch, CURLOPT_COOKIEFILE, $opts["cookiejar"]); } // These settings aren't needed. We're following the location already. // @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // @curl_setopt($ch, CURLOPT_MAXREDIRS, 5); - if (!is_null($accept_content)){ + if (x($opts,'accept_content')){ curl_setopt($ch,CURLOPT_HTTPHEADER, array ( - "Accept: " . $accept_content + "Accept: " . $opts['accept_content'] )); } @@ -38,6 +81,13 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_ @curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent()); + + if(x($opts,'headers')){ + @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']); + } + if(x($opts,'nobody')){ + @curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']); + } if(intval($timeout)) { @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); } @@ -72,7 +122,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_ $base = $s; $curl_info = @curl_getinfo($ch); - @curl_close($ch); + $http_code = $curl_info['http_code']; logger('fetch_url '.$url.': '.$http_code." ".$s, LOGGER_DATA); $header = ''; @@ -103,19 +153,40 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_ $newurl = $old_location_info["scheme"]."://".$old_location_info["host"].$newurl; if (filter_var($newurl, FILTER_VALIDATE_URL)) { $redirects++; + @curl_close($ch); return fetch_url($newurl,$binary,$redirects,$timeout,$accept_content,$cookiejar); } } + $a->set_curl_code($http_code); $a->set_curl_content_type($curl_info['content_type']); $body = substr($s,strlen($header)); $a->set_curl_headers($header); - $a->save_timestamp($stamp1, "network"); - return($body); + + $rc = intval($http_code); + $ret['return_code'] = $rc; + $ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false); + if(! $ret['success']) { + $ret['error'] = curl_error($ch); + $ret['debug'] = $curl_info; + logger('z_fetch_url: error: ' . $url . ': ' . $ret['error'], LOGGER_DEBUG); + logger('z_fetch_url: debug: ' . print_r($curl_info,true), LOGGER_DATA); + } + $ret['body'] = substr($s,strlen($header)); + $ret['header'] = $header; + if(x($opts,'debug')) { + $ret['debug'] = $curl_info; + } + @curl_close($ch); + + $a->save_timestamp($stamp1, "network"); + + return($ret); + }} // post request to $url. $params is an array of post variables. diff --git a/include/text.php b/include/text.php index fd5ae0a2b6..dcc7308723 100644 --- a/include/text.php +++ b/include/text.php @@ -2,8 +2,10 @@ require_once("include/template_processor.php"); require_once("include/friendica_smarty.php"); +require_once("include/map.php"); require_once("mod/proxy.php"); + if(! function_exists('replace_macros')) { /** * This is our template processor @@ -1461,6 +1463,14 @@ function prepare_body(&$item,$attach = false, $preview = false) { } $s = $s . $as; + // map + if(strpos($s,'
') !== false && $item['coord']) { + $x = generate_map(trim($item['coord'])); + if($x) { + $s = preg_replace('/\
/','$0' . $x,$s); + } + } + // Look for spoiler $spoilersearch = '
';