diff --git a/doc/BBCode.md b/doc/BBCode.md
index c84308e5b..8bdf32e5f 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]
:
+[img]http://friendica.com/sites/default/files/friendika-32.png[/img]
:
-[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 1eac012c3..b47a51432 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 000000000..e2398b2fd
--- /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 a07507da1..deae34893 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 fd5ae0a2b..dcc730872 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 = '
';