Merge branch 'master' into notify

This commit is contained in:
friendica 2012-02-22 22:36:07 -08:00
commit 808b886a3e
23 changed files with 1382 additions and 709 deletions

3
README Normal file
View file

@ -0,0 +1,3 @@
This is my personal fork of https://github.com/friendica/friendica
If you want to have a stable version of friendica please look there.

View file

@ -9,7 +9,7 @@ require_once('include/nav.php');
require_once('include/cache.php'); require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '2.3.1259' ); define ( 'FRIENDICA_VERSION', '2.3.1260' );
define ( 'DFRN_PROTOCOL_VERSION', '2.22' ); define ( 'DFRN_PROTOCOL_VERSION', '2.22' );
define ( 'DB_UPDATE_VERSION', 1123 ); define ( 'DB_UPDATE_VERSION', 1123 );
@ -309,8 +309,12 @@ class App {
. 'library/phpsec' . PATH_SEPARATOR . 'library/phpsec' . PATH_SEPARATOR
. '.' ); . '.' );
if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
$this->query_string = substr($_SERVER['QUERY_STRING'],2); $this->query_string = substr($_SERVER['QUERY_STRING'],2);
// removing trailing / - maybe a nginx problem
if (substr($this->query_string, 0, 1) == "/")
$this->query_string = substr($this->query_string, 1);
}
if(x($_GET,'q')) if(x($_GET,'q'))
$this->cmd = trim($_GET['q'],'/\\'); $this->cmd = trim($_GET['q'],'/\\');

2
doc/Groups-and-Privacy.md Executable file → Normal file
View file

@ -22,7 +22,7 @@ But wait, there's more...
If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles. If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.
These private conversations work best when your friends are Freindika members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others. These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others.
This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends. This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends.

View file

@ -99,6 +99,10 @@
**************************/ **************************/
function api_call(&$a){ function api_call(&$a){
GLOBAL $API, $called_api; GLOBAL $API, $called_api;
// preset
$type="json";
foreach ($API as $p=>$info){ foreach ($API as $p=>$info){
if (strpos($a->query_string, $p)===0){ if (strpos($a->query_string, $p)===0){
$called_api= explode("/",$p); $called_api= explode("/",$p);
@ -109,14 +113,14 @@
load_contact_links(local_user()); load_contact_links(local_user());
logger('API call for ' . $a->user['username'] . ': ' . $a->query_string); logger('API call for ' . $a->user['username'] . ': ' . $a->query_string);
logger('API parameters: ' . print_r($_REQUEST,true)); logger('API parameters: ' . print_r($_REQUEST,true));
$type="json"; $type="json";
if (strpos($a->query_string, ".xml")>0) $type="xml"; if (strpos($a->query_string, ".xml")>0) $type="xml";
if (strpos($a->query_string, ".json")>0) $type="json"; if (strpos($a->query_string, ".json")>0) $type="json";
if (strpos($a->query_string, ".rss")>0) $type="rss"; if (strpos($a->query_string, ".rss")>0) $type="rss";
if (strpos($a->query_string, ".atom")>0) $type="atom"; if (strpos($a->query_string, ".atom")>0) $type="atom";
$r = call_user_func($info['func'], $a, $type); $r = call_user_func($info['func'], $a, $type);
if ($r===false) return; if ($r===false) return;
@ -126,8 +130,8 @@
header ("Content-Type: text/xml"); header ("Content-Type: text/xml");
return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r; return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
break; break;
case "json": case "json":
//header ("Content-Type: application/json"); //header ("Content-Type: application/json");
foreach($r as $rr) foreach($r as $rr)
return json_encode($rr); return json_encode($rr);
break; break;
@ -139,19 +143,20 @@
header ("Content-Type: application/atom+xml"); header ("Content-Type: application/atom+xml");
return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r; return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
break; break;
} }
//echo "<pre>"; var_dump($r); die(); //echo "<pre>"; var_dump($r); die();
} }
} }
logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
$r = '<status><error>not implemented</error></status>'; $r = '<status><error>not implemented</error></status>';
switch($type){ switch($type){
case "xml": case "xml":
header ("Content-Type: text/xml"); header ("Content-Type: text/xml");
return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r; return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
break; break;
case "json": case "json":
header ("Content-Type: application/json"); header ("Content-Type: application/json");
return json_encode(array('error' => 'not implemented')); return json_encode(array('error' => 'not implemented'));
break; break;
case "rss": case "rss":
@ -162,7 +167,6 @@
header ("Content-Type: application/atom+xml"); header ("Content-Type: application/atom+xml");
return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r; return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
break; break;
} }
} }
@ -453,7 +457,49 @@
return null; return null;
} }
// TODO - media uploads /*Waitman Gobble Mod*/
function api_statuses_mediap(&$a, $type) {
if (local_user()===false) {
logger('api_statuses_update: no user');
return false;
}
$user_info = api_get_user($a);
$_REQUEST['type'] = 'wall';
$_REQUEST['profile_uid'] = local_user();
$_REQUEST['api_source'] = true;
$txt = urldecode(requestdata('status'));
require_once('library/HTMLPurifier.auto.php');
require_once('include/html2bbcode.php');
if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
$txt = html2bb_video($txt);
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
$txt = $purifier->purify($txt);
}
$txt = html2bbcode($txt);
$a->argv[1]=$user_info['screen_name']; //should be set to username?
$_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo
require_once('mod/wall_upload.php');
$bebop = wall_upload_post($a);
//now that we have the img url in bbcode we can add it to the status and insert the wall item.
$_REQUEST['body']=$txt."\n\n".$bebop;
require_once('mod/item.php');
item_post($a);
// this should output the last post (the one we just posted).
return api_status_show($a,$type);
}
api_register_func('api/statuses/mediap','api_statuses_mediap', true);
/*Waitman Gobble Mod*/
function api_statuses_update(&$a, $type) { function api_statuses_update(&$a, $type) {
if (local_user()===false) { if (local_user()===false) {
logger('api_statuses_update: no user'); logger('api_statuses_update: no user');

View file

@ -8,35 +8,54 @@ require_once('include/html2bbcode.php');
// we don't want to support a bbcode specific markdown interpreter // we don't want to support a bbcode specific markdown interpreter
// and the markdown library we have is pretty good, but provides HTML output. // and the markdown library we have is pretty good, but provides HTML output.
// So we'll use that to convert to HTML, then convert the HTML back to bbcode, // So we'll use that to convert to HTML, then convert the HTML back to bbcode,
// and then clean up a few Diaspora specific constructs. // and then clean up a few Diaspora specific constructs.
function diaspora2bb($s) { function diaspora2bb($s) {
// for testing purposes: Collect raw markdown articles
$file = tempnam("/tmp/friendica/", "markdown");
file_put_contents($file, $s);
$s = html_entity_decode($s,ENT_COMPAT,'UTF-8'); $s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
$s = str_replace("\r","\n",$s);
// Too many new lines. So deactivated the following line
// $s = str_replace("\r","\n",$s);
// Simply remove cr.
$s = str_replace("\r","",$s);
// <br/> is invalid. Replace it with the valid expression
$s = str_replace("<br/>","<br />",$s);
$s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s); $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
$s = preg_replace('/\#([^\s\#])/','\\#$1',$s); // Escaping the hash tags - doesn't always seem to work
// $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
// This seems to work
$s = preg_replace('/\#([^\s\#])/','&#35;$1',$s);
$s = Markdown($s); $s = Markdown($s);
$s = str_replace('&#35;','#',$s); $s = str_replace('&#35;','#',$s);
$s = str_replace("\n",'<br />',$s);
$s = str_replace("\n",'<br />',$s);
$s = html2bbcode($s); $s = html2bbcode($s);
// $s = str_replace('&#42;','*',$s); // $s = str_replace('&#42;','*',$s);
// Convert everything that looks like a link to a link
$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
$s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s); //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
$s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s); $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s);
$s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s); $s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s);
$s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s); $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s);
$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2$3$4[/url]',$s); $s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s);
// remove duplicate adjacent code tags // remove duplicate adjacent code tags
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s); $s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
$s = scale_diaspora_images($s);
// Don't show link to full picture (until it is fixed)
$s = scale_diaspora_images($s, false);
return $s; return $s;
} }

View file

@ -12,20 +12,20 @@ function stripcode_br_cb($s) {
function tryoembed($match){ function tryoembed($match){
$url = ((count($match)==2)?$match[1]:$match[2]); $url = ((count($match)==2)?$match[1]:$match[2]);
// logger("tryoembed: $url"); // logger("tryoembed: $url");
$o = oembed_fetch_url($url); $o = oembed_fetch_url($url);
//echo "<pre>"; var_dump($match, $url, $o); killme(); //echo "<pre>"; var_dump($match, $url, $o); killme();
if ($o->type=="error") return $match[0]; if ($o->type=="error") return $match[0];
$html = oembed_format_object($o); $html = oembed_format_object($o);
return $html; //oembed_iframe($html,$o->width,$o->height); return $html; //oembed_iframe($html,$o->width,$o->height);
} }
// [noparse][i]italic[/i][/noparse] turns into // [noparse][i]italic[/i][/noparse] turns into
// [noparse][ i ]italic[ /i ][/noparse], // [noparse][ i ]italic[ /i ][/noparse],
// to hide them from parser. // to hide them from parser.
function bb_spacefy($st) { function bb_spacefy($st) {
@ -36,7 +36,7 @@ function bb_spacefy($st) {
return $new_str; return $new_str;
} }
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse], // The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
// now turns back and the [noparse] tags are trimed // now turns back and the [noparse] tags are trimed
// returning [i]italic[/i] // returning [i]italic[/i]
@ -59,8 +59,8 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text); $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
// Extract a single private image which uses data url's since preg has issues with // Extract a single private image which uses data url's since preg has issues with
// large data sizes. Stash it away while we do bbcode conversion, and then put it back // large data sizes. Stash it away while we do bbcode conversion, and then put it back
// in after we've done all the regex matching. We cannot use any preg functions to do this. // in after we've done all the regex matching. We cannot use any preg functions to do this.
$saved_image = ''; $saved_image = '';
@ -71,13 +71,13 @@ function bbcode($Text,$preserve_nl = false) {
$start_fragment = substr($Text,0,$img_start); $start_fragment = substr($Text,0,$img_start);
$img_start += strlen('[img]'); $img_start += strlen('[img]');
$saved_image = substr($Text,$img_start,$img_end - $img_start); $saved_image = substr($Text,$img_start,$img_end - $img_start);
$end_fragment = substr($Text,$img_end + strlen('[/img]')); $end_fragment = substr($Text,$img_end + strlen('[/img]'));
// logger('saved_image: ' . $saved_image,LOGGER_DEBUG); // logger('saved_image: ' . $saved_image,LOGGER_DEBUG);
$Text = $start_fragment . '[$#saved_image#$]' . $end_fragment; $Text = $start_fragment . '[$#saved_image#$]' . $end_fragment;
} }
// If we find any event code, turn it into an event. // If we find any event code, turn it into an event.
// After we're finished processing the bbcode we'll // After we're finished processing the bbcode we'll
// replace all of the event code with a reformatted version. // replace all of the event code with a reformatted version.
$ev = bbtoevent($Text); $ev = bbtoevent($Text);
@ -105,7 +105,7 @@ function bbcode($Text,$preserve_nl = false) {
// Perform URL Search // Perform URL Search
$Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="external-link">$2</a>', $Text); $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="external-link">$2</a>', $Text);
$Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text); $Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text);
$Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text); $Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text);
@ -118,7 +118,7 @@ function bbcode($Text,$preserve_nl = false) {
// Perform MAIL Search // Perform MAIL Search
$Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text); $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
$Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text); $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);
// Check for bold text // Check for bold text
$Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text); $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text);
@ -149,21 +149,20 @@ function bbcode($Text,$preserve_nl = false) {
$Text = str_replace("[*]", "<li>", $Text); $Text = str_replace("[*]", "<li>", $Text);
$Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text); $Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text);
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text); // handle nested lists
$Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' $endlessloop = 0;
,$Text); while (strpos($Text, "[/list]") and strpos($Text, "[list") and (++$endlessloop < 20)) {
$Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text); $Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text); $Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
$Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
,$Text); $Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type: lower-roman;">$2</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type: $Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type: upper-roman;">$2</ul>' ,$Text);
lower-roman;">$2</ul>' ,$Text); $Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$2</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type: $Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$2</ul>' ,$Text);
upper-roman;">$2</ul>' ,$Text); }
$Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type:
lower-alpha;">$2</ul>' ,$Text); $Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type: $Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
upper-alpha;">$2</ul>' ,$Text);
$Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text); $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
$Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text); $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
@ -190,21 +189,24 @@ upper-alpha;">$2</ul>' ,$Text);
// Check for [code] text // Check for [code] text
$Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text); $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text);
// Declare the format for [quote] layout // Declare the format for [quote] layout
$QuoteLayout = '<blockquote>$1</blockquote>'; $QuoteLayout = '<blockquote>$1</blockquote>';
// Check for [quote] text // Check for [quote] text
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); // handle nested quotes
$endlessloop = 0;
while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote]") !== false and (++$endlessloop < 20))
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text);
// Check for [quote=Author] text // Check for [quote=Author] text
$t_wrote = t('$1 wrote:'); $t_wrote = t('$1 wrote:');
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", // handle nested quotes
"<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>", $endlessloop = 0;
$Text); while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote=") !== false and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
"<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>",
$Text);
// [img=widthxheight]image source[/img] // [img=widthxheight]image source[/img]
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text); $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);

View file

@ -451,7 +451,7 @@ function diaspora_request($importer,$xml) {
// perhaps we were already sharing with this person. Now they're sharing with us. // perhaps we were already sharing with this person. Now they're sharing with us.
// That makes us friends. // That makes us friends.
if($contact['rel'] == CONTACT_IS_FOLLOWER) { if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) {
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1", q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND), intval(CONTACT_IS_FRIEND),
intval($contact['id']), intval($contact['id']),
@ -619,6 +619,18 @@ function diaspora_request($importer,$xml) {
return; return;
} }
function diaspora_post_allow($importer,$contact) {
if(($contact['blocked']) || ($contact['readonly']))
return false;
if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND)
return true;
if($contact['rel'] == CONTACT_IS_FOLLOWER)
if($importer['page-flags'] == PAGE_COMMUNITY)
return true;
return false;
}
function diaspora_post($importer,$xml) { function diaspora_post($importer,$xml) {
$a = get_app(); $a = get_app();
@ -629,7 +641,7 @@ function diaspora_post($importer,$xml) {
if(! $contact) if(! $contact)
return; return;
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_post: Ignoring this author.'); logger('diaspora_post: Ignoring this author.');
return 202; return 202;
} }
@ -748,7 +760,7 @@ function diaspora_reshare($importer,$xml) {
if(! $contact) if(! $contact)
return; return;
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true)); logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true));
return 202; return 202;
} }
@ -900,7 +912,7 @@ function diaspora_asphoto($importer,$xml) {
if(! $contact) if(! $contact)
return; return;
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_asphoto: Ignoring this author.'); logger('diaspora_asphoto: Ignoring this author.');
return 202; return 202;
} }
@ -1001,7 +1013,7 @@ function diaspora_comment($importer,$xml,$msg) {
return; return;
} }
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_comment: Ignoring this author.'); logger('diaspora_comment: Ignoring this author.');
return 202; return 202;
} }
@ -1446,7 +1458,7 @@ function diaspora_photo($importer,$xml,$msg) {
return; return;
} }
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_photo: Ignoring this author.'); logger('diaspora_photo: Ignoring this author.');
return 202; return 202;
} }
@ -1503,7 +1515,7 @@ function diaspora_like($importer,$xml,$msg) {
return; return;
} }
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if(! diaspora_post_allow($importer,$contact)) {
logger('diaspora_like: Ignoring this author.'); logger('diaspora_like: Ignoring this author.');
return 202; return 202;
} }

View file

@ -1,127 +1,286 @@
<?php <?php
/*
html2bbcode.php
Converter for HTML to BBCode
Made by: ike@piratenpartei.de
Originally made for the syncom project: http://wiki.piratenpartei.de/Syncom
https://github.com/annando/Syncom
*/
/** function node2bbcode(&$doc, $oldnode, $attributes, $startbb, $endbb)
* html2bbcode
*/
function html2bbcode($s) {
// only keep newlines from source that are within pre tags
$s = stripnl_exceptinpre($s);
// Tags to Find
$htmltags = array(
'/\<pre\>(.*?)\<\/pre\>/is',
'/\<p(.*?)\>/is',
'/\<\/p\>/is',
'/\<b\>(.*?)\<\/b\>/is',
'/\<i\>(.*?)\<\/i\>/is',
'/\<u\>(.*?)\<\/u\>/is',
'/\<ul\>(.*?)\<\/ul\>/is',
'/\<li\>(.*?)\<\/li\>/is',
'/\<img(.*?)width: *([0-9]+)(.*?)height: *([0-9]+)(.*?)src=\"(.*?)\" (.*?)\>/is',
'/\<img(.*?)height: *([0-9]+)(.*?)width: *([0-9]+)(.*?)src=\"(.*?)\" (.*?)\>/is',
'/\<img(.*?)src=\"(.*?)\"(.*?)width: *([0-9]+)(.*?)height: *([0-9]+)(.*?)\>/is',
'/\<img(.*?)src=\"(.*?)\"(.*?)height: *([0-9]+)(.*?)width: *([0-9]+)(.*?)\>/is',
'/\<img(.*?) src=\"(.*?)\" (.*?)\>/is',
'/\<div(.*?)\>(.*?)\<\/div\>/is',
'/\<br(.*?)\>/is',
'/\<strong\>(.*?)\<\/strong\>/is',
'/\<a (.*?)href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is',
'/\<code\>(.*?)\<\/code\>/is',
'/\<span style=\"color:(.*?)\"\>(.*?)\<\/span\>/is',
'/\<span style=\"font-size:(.*?)\"\>(.*?)\<\/span\>/is',
'/\<blockquote\>(.*?)\<\/blockquote\>/is',
'/\<video(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/video\>/is',
'/\<audio(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/audio\>/is',
'/\<iframe(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/iframe\>/is',
);
// Replace with
$bbtags = array(
'[code]$1[/code]',
'',
"\n",
'[b]$1[/b]',
'[i]$1[/i]',
'[u]$1[/u]',
'[list]$1[/list]',
'[*]$1',
'[img=$2x$4]$6[/img]',
'[img=$4x$2]$6[/img]',
'[img=$4x$6]$2[/img]',
'[img=$6x$4]$2[/img]',
'[img]$2[/img]',
'$2',
"\n",
'[b]$1[/b]',
'[url=$2]$4[/url]',
'[code]$1[/code]',
'[color="$1"]$2[/color]',
'[size=$1]$2[/size]',
'[quote]$1[/quote]',
'[video]$1[/video]',
'[audio]$1[/audio]',
'[iframe]$1[/iframe]',
);
// Replace $htmltags in $text with $bbtags
$text = preg_replace ($htmltags, $bbtags, $s);
call_hooks('html2bbcode', $text);
// Strip all other HTML tags
$text = strip_tags($text);
return $text;
}
function stripnl_exceptinpre($string)
{ {
// First, check for <pre> tag do {
if(strpos($string, '<pre>') === false) $done = node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb);
{ } while ($done);
return str_replace("\n","", $string);
}
// If there is a <pre>, we have to split by line
// and manually replace the linebreaks
$strArr=explode("\n", $string);
$output="";
$preFound=false;
// Loop over each line
foreach($strArr as $line)
{ // See if the line has a <pre>. If it does, set $preFound to true
if(strpos($line, "<pre>") !== false)
{
$preFound=true;
}
elseif(strpos($line, "</pre>") !== false)
{
$preFound=false;
}
// If we are in a pre tag, add line and also add \n, else add the line without \n
if($preFound)
{
$output .= $line . "\n";
}
else
{
$output .= $line ;
}
}
return $output;
} }
function node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb)
{
$savestart = str_replace('$', '%', $startbb);
$replace = false;
$xpath = new DomXPath($doc);
$list = $xpath->query("//".$oldnode);
foreach ($list as $oldNode) {
$attr = array();
if ($oldNode->attributes->length)
foreach ($oldNode->attributes as $attribute)
$attr[$attribute->name] = $attribute->value;
$replace = true;
$startbb = $savestart;
$i = 0;
foreach ($attributes as $attribute => $value) {
$startbb = str_replace('%'.++$i, '$1', $startbb);
if (strpos('*'.$startbb, '$1') > 0) {
if ($replace and (@$attr[$attribute] != '')) {
$startbb = preg_replace($value, $startbb, $attr[$attribute], -1, $count);
// If nothing could be changed
if ($count == 0)
$replace = false;
} else
$replace = false;
} else {
if (@$attr[$attribute] != $value)
$replace = false;
}
}
if ($replace) {
$StartCode = $oldNode->ownerDocument->createTextNode($startbb);
$EndCode = $oldNode->ownerDocument->createTextNode($endbb);
$oldNode->parentNode->insertBefore($StartCode, $oldNode);
if ($oldNode->hasChildNodes()) {
foreach ($oldNode->childNodes as $child) {
$newNode = $child->cloneNode(true);
$oldNode->parentNode->insertBefore($newNode, $oldNode);
}
}
$oldNode->parentNode->insertBefore($EndCode, $oldNode);
$oldNode->parentNode->removeChild($oldNode);
}
}
return($replace);
}
function deletenode(&$doc, $node)
{
$xpath = new DomXPath($doc);
$list = $xpath->query("//".$node);
foreach ($list as $child)
$child->parentNode->removeChild($child);
}
function html2bbcode($message)
{
//$file = tempnam("/tmp/", "html");
//file_put_contents($file, $message);
$message = str_replace("\r", "", $message);
$message = str_replace(array(
"<li><p>",
"</p></li>"),
array(
"<li>",
"</li>"),
$message);
// remove namespaces
$message = preg_replace('=<(\w+):(.+?)>=', '<removeme>', $message);
$message = preg_replace('=</(\w+):(.+?)>=', '</removeme>', $message);
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8");
@$doc->loadHTML($message);
deletenode($doc, 'style');
deletenode($doc, 'head');
deletenode($doc, 'title');
deletenode($doc, 'meta');
deletenode($doc, 'xml');
deletenode($doc, 'removeme');
$xpath = new DomXPath($doc);
$list = $xpath->query("//pre");
foreach ($list as $node)
$node->nodeValue = str_replace("\n", "\r", $node->nodeValue);
$message = $doc->saveHTML();
$message = str_replace(array("\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"), array("<", ">", "<br>", " ", ""), $message);
$message = preg_replace('= [\s]*=i', " ", $message);
@$doc->loadHTML($message);
node2bbcode($doc, 'html', array(), "", "");
node2bbcode($doc, 'body', array(), "", "");
// Outlook-Quote - Variant 1
node2bbcode($doc, 'p', array('class'=>'MsoNormal', 'style'=>'margin-left:35.4pt'), '[quote]', '[/quote]');
// Outlook-Quote - Variant 2
node2bbcode($doc, 'div', array('style'=>'border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'), '[quote]', '[/quote]');
// MyBB-Stuff
node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '[u]', '[/u]');
node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '[i]', '[/i]');
node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '[b]', '[/b]');
node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'size'=>'/(\d+)/', 'color'=>'/(.+)/'), '[font=$1][size=$2][color=$3]', '[/color][/size][/font]');
node2bbcode($doc, 'font', array('size'=>'/(\d+)/', 'color'=>'/(.+)/'), '[size=$1][color=$2]', '[/color][/size]');
node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'size'=>'/(.+)/'), '[font=$1][size=$2]', '[/size][/font]');
node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'color'=>'/(.+)/'), '[font=$1][color=$3]', '[/color][/font]');
node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/'), '[font=$1]', '[/font]');
node2bbcode($doc, 'font', array('size'=>'/(\d+)/'), '[size=$1]', '[/size]');
node2bbcode($doc, 'font', array('color'=>'/(.+)/'), '[color=$1]', '[/color]');
node2bbcode($doc, 'span', array('style'=>'/.*color:\s*(.+?)[,;].*/'), '[color="$1"]', '[/color]');
node2bbcode($doc, 'span', array('style'=>'/.*font-size:\s*(\d+)/'), '[size=$1]', '[/size]');
//node2bbcode($doc, 'span', array('style'=>'/.*font-family:\s*(.+?)[,;].*/'), '[font=$1]', '[/font]');
//node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*font-size:\s*(\d+?)pt.*/'), '[font=$1][size=$2]', '[/size][/font]');
//node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*font-size:\s*(\d+?)px.*/'), '[font=$1][size=$2]', '[/size][/font]');
//node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*/'), '[font=$1]', '[/font]');
node2bbcode($doc, 'strong', array(), '[b]', '[/b]');
node2bbcode($doc, 'em', array(), '[i]', '[/i]');
node2bbcode($doc, 'b', array(), '[b]', '[/b]');
node2bbcode($doc, 'i', array(), '[i]', '[/i]');
node2bbcode($doc, 'u', array(), '[u]', '[/u]');
node2bbcode($doc, 'big', array(), "[size=large]", "[/size]");
node2bbcode($doc, 'small', array(), "[size=small]", "[/size]");
node2bbcode($doc, 'blockquote', array(), '[quote]', '[/quote]');
node2bbcode($doc, 'br', array(), "\n", '');
node2bbcode($doc, 'p', array('class'=>'MsoNormal'), "\n", "");
node2bbcode($doc, 'div', array('class'=>'MsoNormal'), "\r", "");
node2bbcode($doc, 'span', array(), "", "");
node2bbcode($doc, 'span', array(), "", "");
node2bbcode($doc, 'pre', array(), "", "");
node2bbcode($doc, 'div', array(), "\r", "\r");
node2bbcode($doc, 'p', array(), "\n", "\n");
node2bbcode($doc, 'ul', array(), "[list]", "[/list]");
node2bbcode($doc, 'ol', array(), "[list=1]", "[/list]");
node2bbcode($doc, 'li', array(), "[*]", "");
node2bbcode($doc, 'hr', array(), "[hr]", "");
//node2bbcode($doc, 'table', array(), "", "");
//node2bbcode($doc, 'tr', array(), "\n", "");
//node2bbcode($doc, 'td', array(), "\t", "");
node2bbcode($doc, 'table', array(), "[table]", "[/table]");
node2bbcode($doc, 'th', array(), "[th]", "[/th]");
node2bbcode($doc, 'tr', array(), "[tr]", "[/tr]");
node2bbcode($doc, 'td', array(), "[td]", "[/td]");
node2bbcode($doc, 'h1', array(), "\n\n[size=xx-large][b]", "[/b][/size]\n");
node2bbcode($doc, 'h2', array(), "\n\n[size=x-large][b]", "[/b][/size]\n");
node2bbcode($doc, 'h3', array(), "\n\n[size=large][b]", "[/b][/size]\n");
node2bbcode($doc, 'h4', array(), "\n\n[size=medium][b]", "[/b][/size]\n");
node2bbcode($doc, 'h5', array(), "\n\n[size=small][b]", "[/b][/size]\n");
node2bbcode($doc, 'h6', array(), "\n\n[size=x-small][b]", "[/b][/size]\n");
node2bbcode($doc, 'a', array('href'=>'/(.+)/'), '[url=$1]', '[/url]');
node2bbcode($doc, 'img', array('src'=>'/(.+)/', 'width'=>'/(\d+)/', 'height'=>'/(\d+)/'), '[img$2x$3]$1', '[/img]');
node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '[img]$1', '[/img]');
node2bbcode($doc, 'video', array('src'=>'/(.+)/'), '[video]$1', '[/video]');
node2bbcode($doc, 'audio', array('src'=>'/(.+)/'), '[audio]$1', '[/audio]');
node2bbcode($doc, 'iframe', array('src'=>'/(.+)/'), '[iframe]$1', '[/iframe]');
node2bbcode($doc, 'code', array(), '[code]$1', '[/code]');
$message = $doc->saveHTML();
// I'm removing something really disturbing
// Don't know exactly what it is
$message = str_replace(chr(194).chr(160), ' ', $message);
$message = str_replace("&nbsp;", " ", $message);
// removing multiple DIVs
$message = preg_replace('=\r *\r=i', "\n", $message);
$message = str_replace("\r", "\n", $message);
call_hooks('html2bbcode', $message);
$message = strip_tags($message);
$message = html_entity_decode($message, ENT_QUOTES, 'UTF-8');
$message = str_replace(array("<"), array("&lt;"), $message);
// remove quotes if they don't make sense
$message = preg_replace('=\[/quote\][\s]*\[quote\]=i', "\n", $message);
$message = preg_replace('=\[quote\]\s*=i', "[quote]", $message);
$message = preg_replace('=\s*\[/quote\]=i', "[/quote]", $message);
do {
$oldmessage = $message;
$message = str_replace("\n \n", "\n\n", $message);
} while ($oldmessage != $message);
do {
$oldmessage = $message;
$message = str_replace("\n\n\n", "\n\n", $message);
} while ($oldmessage != $message);
do {
$oldmessage = $message;
$message = str_replace(array(
"[/size]\n\n",
"\n[hr]",
"[hr]\n",
"\n[list",
"[/list]\n",
"\n[/list]",
"[list]\n",
"[list=1]\n",
"\n[*]"),
array(
"[/size]\n",
"[hr]",
"[hr]",
"[list",
"[/list]",
"[/list]",
"[list]",
"[list=1]",
"[*]"),
$message);
} while ($message != $oldmessage);
$message = str_replace(array('[b][b]', '[/b][/b]', '[i][i]', '[/i][/i]'),
array('[b]', '[/b]', '[i]', '[/i]'), $message);
// Handling Yahoo style of mails
$message = str_replace('[hr][b]From:[/b]', '[quote][b]From:[/b]', $message);
return(trim($message));
}
?>

View file

@ -1551,8 +1551,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
} }
$force_parent = false; $force_parent = false;
if($contact['network'] === NETWORK_OSTATUS) { if($contact['network'] === NETWORK_OSTATUS || stristr($contact['url'],'twitter.com')) {
$force_parent = true; if($contact['network'] === NETWORK_OSTATUS)
$force_parent = true;
if(strlen($datarray['title'])) if(strlen($datarray['title']))
unset($datarray['title']); unset($datarray['title']);
$r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d", $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",

View file

@ -371,10 +371,14 @@ function poller_run($argv, $argc){
} }
elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) { elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
logger("Mail: Fetching");
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
if($mail_disabled) if($mail_disabled)
continue; continue;
logger("Mail: Enabled");
$mbox = null; $mbox = null;
$x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1", $x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
intval($importer_uid) intval($importer_uid)
@ -388,6 +392,7 @@ function poller_run($argv, $argc){
openssl_private_decrypt(hex2bin($mailconf[0]['pass']),$password,$x[0]['prvkey']); openssl_private_decrypt(hex2bin($mailconf[0]['pass']),$password,$x[0]['prvkey']);
$mbox = email_connect($mailbox,$mailconf[0]['user'],$password); $mbox = email_connect($mailbox,$mailconf[0]['user'],$password);
unset($password); unset($password);
logger("Mail: Connect");
if($mbox) { if($mbox) {
q("UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1", q("UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc(datetime_convert()), dbesc(datetime_convert()),
@ -397,11 +402,16 @@ function poller_run($argv, $argc){
} }
} }
if($mbox) { if($mbox) {
logger("Mail: mbox");
$msgs = email_poll($mbox,$contact['addr']); $msgs = email_poll($mbox,$contact['addr']);
if(count($msgs)) { if(count($msgs)) {
logger("Mail: Parsing ".count($msgs)." mails.");
foreach($msgs as $msg_uid) { foreach($msgs as $msg_uid) {
logger("Mail: Parsing mail ".$msg_uid);
$datarray = array(); $datarray = array();
$meta = email_msg_meta($mbox,$msg_uid); $meta = email_msg_meta($mbox,$msg_uid);
$headers = email_msg_headers($mbox,$msg_uid); $headers = email_msg_headers($mbox,$msg_uid);
@ -436,23 +446,28 @@ function poller_run($argv, $argc){
); );
if(count($r)) { if(count($r)) {
logger("Mail: Seen before ".$msg_uid);
if($meta->deleted && ! $r[0]['deleted']) { if($meta->deleted && ! $r[0]['deleted']) {
q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1", q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($r[0]['id']) intval($r[0]['id'])
); );
} }
continue; continue;
} }
$datarray['title'] = notags(trim($meta->subject)); $datarray['title'] = notags(trim($meta->subject));
$datarray['created'] = datetime_convert('UTC','UTC',$meta->date); $datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
$r = email_get_msg($mbox,$msg_uid); $r = email_get_msg($mbox,$msg_uid);
if(! $r) if(! $r) {
logger("Mail: can't fetch msg ".$msg_uid);
continue; continue;
}
$datarray['body'] = escape_tags($r['body']); $datarray['body'] = escape_tags($r['body']);
// some mailing lists have the original author as 'from' - add this sender info to msg body. logger("Mail: Importing ".$msg_uid);
// some mailing lists have the original author as 'from' - add this sender info to msg body.
// todo: adding a gravatar for the original author would be cool // todo: adding a gravatar for the original author would be cool
if(! stristr($meta->from,$contact['addr'])) if(! stristr($meta->from,$contact['addr']))
@ -469,7 +484,7 @@ function poller_run($argv, $argc){
$datarray['author-name'] = $contact['name']; $datarray['author-name'] = $contact['name'];
$datarray['author-link'] = 'mailbox'; $datarray['author-link'] = 'mailbox';
$datarray['author-avatar'] = $contact['photo']; $datarray['author-avatar'] = $contact['photo'];
$stored_item = item_store($datarray); $stored_item = item_store($datarray);
q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d", q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d",
dbesc($datarray['parent-uri']), dbesc($datarray['parent-uri']),

View file

@ -675,12 +675,24 @@ function linkify($s) {
* @Parameter: string $s * @Parameter: string $s
* *
* Returns string * Returns string
*
* It is expected that this function will be called using HTML text.
* We will escape text between HTML pre and code blocks from being
* processed.
*
* At a higher level, the bbcode [nosmile] tag can be used to prevent this
* function from being executed by the prepare_text() routine when preparing
* bbcode source for HTML display
*
*/ */
if(! function_exists('smilies')) { if(! function_exists('smilies')) {
function smilies($s, $sample = false) { function smilies($s, $sample = false) {
$a = get_app(); $a = get_app();
$s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_encode',$s);
$s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_encode',$s);
$texts = array( $texts = array(
'&lt;3', '&lt;3',
'&lt;/3', '&lt;/3',
@ -777,10 +789,24 @@ function smilies($s, $sample = false) {
$s = str_replace($params['texts'],$params['icons'],$params['string']); $s = str_replace($params['texts'],$params['icons'],$params['string']);
} }
$s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_decode',$s);
$s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_decode',$s);
return $s; return $s;
}} }}
function smile_encode($m) {
return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
}
function smile_decode($m) {
return(str_replace($m[1],base64url_decode($m[1]),$m[0]));
}
if(! function_exists('day_translate')) { if(! function_exists('day_translate')) {
function day_translate($s) { function day_translate($s) {
$ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'), $ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),

884
library/markdown.php Executable file → Normal file

File diff suppressed because it is too large Load diff

View file

@ -68,7 +68,7 @@ function group_content(&$a) {
return; return;
} }
// Switch to text mod interface if we have more than 'n' contacts or group members // Switch to text mode interface if we have more than 'n' contacts or group members
$switchtotext = get_pconfig(local_user(),'system','groupedit_image_limit'); $switchtotext = get_pconfig(local_user(),'system','groupedit_image_limit');
if($switchtotext === false) if($switchtotext === false)

View file

@ -20,6 +20,16 @@ function notify_init(&$a) {
goaway($a->get_baseurl()); goaway($a->get_baseurl());
} }
if($a->argc > 2 && $a->argv[1] === 'mark' && $a->argv[2] === 'all' ) {
$r = q("update notify set seen = 1 where uid = %d",
intval(local_user())
);
$j = json_encode(array('result' => ($r) ? 'success' : 'fail'));
echo $j;
killme();
}
} }

View file

@ -101,10 +101,24 @@ function wall_upload_post(&$a) {
$basename = basename($filename); $basename = basename($filename);
if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n"; /* mod Waitman Gobble NO WARRANTY */
else
echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />"; //if we get the signal then return the image url info in BBCODE, otherwise this outputs the info and bails (for the ajax image uploader on wall post)
if ($_REQUEST['hush']!='yeah') {
/*existing code*/
if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n";
else
echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />";
/*existing code*/
} else {
$m = '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]";
return($m);
}
/* mod Waitman Gobble NO WARRANTY */
killme(); killme();
// NOTREACHED // NOTREACHED

View file

@ -1,5 +1,5 @@
Lieber $username, Liebe/r $username,
großartige Neuigkeiten... '$fn' von '$dfrn_url' hat deine Kontaktaufnahme auf großartige Neuigkeiten... '$fn' von '$dfrn_url' hat deine Kontaktaufnahme auf
'$sitename' bestätigt. '$sitename' bestätigt.

View file

@ -1,5 +1,5 @@
Lieber $username, Liebe/r $username,
'$fn' von '$dfrn_url' hat deine Kontaktanfrage auf '$sitename' bestätigt. '$fn' von '$dfrn_url' hat deine Kontaktanfrage auf '$sitename' bestätigt.

View file

@ -1,5 +1,5 @@
Lieber $username, Liebe/r $username,
wir haben gerade eine Anfrage erhalten dein Passwort auf $sitename zu ändern. wir haben gerade eine Anfrage erhalten dein Passwort auf $sitename zu ändern.
Um diese Anfrage zu bestätigen folge bitte dem Bestätigungslink oder kopiere Um diese Anfrage zu bestätigen folge bitte dem Bestätigungslink oder kopiere
ihn in die Adresszeile deines Browsers. ihn in die Adresszeile deines Browsers.

View file

@ -1,5 +1,5 @@
Lieber $username, Liebe/r $username,
dein Passwort wurde wie gewünscht geändert. Bitte hebe diese Informationen dein Passwort wurde wie gewünscht geändert. Bitte hebe diese Informationen
für deine Unterlagen auf (oder ändere das Passwort augenblicklich in etwas für deine Unterlagen auf (oder ändere das Passwort augenblicklich in etwas
das du dir merken kannst). das du dir merken kannst).

View file

@ -1,5 +1,5 @@
Lieber $username, Liebe/r $username,
danke für die Registrierung bei $sitename. Dein neuer Account wurde angelegt. danke für die Registrierung bei $sitename. Dein neuer Account wurde angelegt.
Die Anmeldedetails sind die Folgenden. Die Anmeldedetails sind die Folgenden.

View file

@ -1,5 +1,5 @@
Lieber $myname, Liebe/r $myname,
du hast gerade eine Kontaktanfrage von '$requestor' auf $sitename erhalten. du hast gerade eine Kontaktanfrage von '$requestor' auf $sitename erhalten.

BIN
view/theme/vier/calendar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -122,6 +122,17 @@
.next { background-position: -110px -60px;} .next { background-position: -110px -60px;}
.tagged { background-position: -130px -60px;} .tagged { background-position: -130px -60px;}
.attachtype {
display: block; width: 20px; height: 23px;
background-image: url('../../../images/content-types.png');
}
.type-video { background-position: 0px 0px; }
.type-image { background-position: -20px 0px; }
.type-audio { background-position: -40px 0px; }
.type-text { background-position: -60px 0px; }
.type-unkn { background-position: -80px 0px; }
.icon.drop, .icon.drophide { .icon.drop, .icon.drophide {
float: left; float: left;
} }
@ -200,9 +211,9 @@
.icon.s16.delete { .icon.s16.delete {
background-image: url("../../../images/icons/16/delete.png"); background-image: url("../../../images/icons/16/delete.png");
} }
.icon.s16.edit { /*.icon.s16.edit {
background-image: url("../../../images/icons/16/edit.png"); background-image: url("../../../images/icons/16/edit.png");
} }*/
.icon.s16.star { .icon.s16.star {
background-image: url("../../../images/icons/16/star.png"); background-image: url("../../../images/icons/16/star.png");
} }
@ -913,7 +924,7 @@ section {
} }
.wall-item-container .wall-item-actions-tools { .wall-item-container .wall-item-actions-tools {
float: right; float: right;
width: 60px; width: 80px;
} }
.wall-item-container .wall-item-actions-tools a { .wall-item-container .wall-item-actions-tools a {
float: right; float: right;
@ -1028,7 +1039,13 @@ section {
/* contacts menu */ /* contacts menu */
.contact-photo-wrapper { .contact-photo-wrapper {
position: relative; position: relative;
width: 80px;
} }
.contact-photo-wrapper.wwto {
width: 25px;
}
.contact-photo { .contact-photo {
width: 48px; width: 48px;
height: 48px; height: 48px;
@ -1390,9 +1407,34 @@ ul.tabs li .active {
.field.radio .field_help { .field.radio .field_help {
margin-left: 0px; margin-left: 0px;
} }
#profile-edit-links li {
list-style: none; #profile-edit-links-end {
clear: both;
margin-bottom: 15px;
} }
#profile-edit-links ul { margin: 20px; padding-bottom: 20px; list-style: none; }
#profile-edit-links li {
float: left;
list-style: none;
margin-left: 10px;
}
.profile-edit-side-div {
display: none;
}
#register-form label,
#profile-edit-form label {
width: 300px; float: left;
}
.required {
display: inline;
color: #B20202;
}
/* oauth */ /* oauth */
.oauthapp { .oauthapp {
height: auto; height: auto;
@ -1449,3 +1491,433 @@ footer {
height: 100px; height: 100px;
display: table-row; display: table-row;
} }
blockquote {
border-left: 1px solid #D2D2D2;
padding-left: 9px;
margin: 0 0 0 .8ex;
}
/* ================== */
/* = Contacts Block = */
/* ================== */
.contact-block-img {
width: 42px;
height: 42px;
padding-right: 2px;
}
.contact-block-div {
float: left;
}
.contact-block-textdiv { width: 150px; height: 34px; float: left; }
#contact-block-end { clear: both; }
#group-edit-wrapper {
margin-bottom: 10px;
}
#group-members-end {
clear: both;
}
/*
#group-separator,
#prof-separator { display: none;}
*/
#prvmail-wrapper, .mail-conv-detail, .mail-list-detail {
position: relative;
width: 500px;
padding: 50px;
margin: 20px auto;
background-color: #fff;
-webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
}
#prvmail-wrapper:before, #prvmail-wrapper:after, .mail-conv-detail:before, .mail-conv-detail:after, .mail-list-detail:before, .mail-list-detail:after {
position: absolute;
width: 40%;
height: 10px;
content: ' ';
left: 12px;
bottom: 12px;
background: transparent;
-webkit-transform: skew(-5deg) rotate(-5deg);
-moz-transform: skew(-5deg) rotate(-5deg);
-ms-transform: skew(-5deg) rotate(-5deg);
-o-transform: skew(-5deg) rotate(-5deg);
transform: skew(-5deg) rotate(-5deg);
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
z-index: -1;
}
#prvmail-wrapper:after, .mail-conv-detail:after, .mail-list-detail:after {
left: auto;
right: 12px;
-webkit-transform: skew(5deg) rotate(5deg);
-moz-transform: skew(5deg) rotate(5deg);
-ms-transform: skew(5deg) rotate(5deg);
-o-transform: skew(5deg) rotate(5deg);
transform: skew(5deg) rotate(5deg);
}
.prvmail-text {
width: 100%;
}
.mail-list-outside-wrapper {
margin-top: 20px;
}
.mail-list-sender {
float: left;
padding: 5px;
background-color: #efefef;
border: 2px dotted #eeeeee;
-moz-box-shadow: 3px 3px 4px #959494;
-webkit-box-shadow: 3px 3px 4px #959494;
box-shadow: 3px 3px 4px #959494;
}
.mail-list-detail {
margin-left: 100px;
width: 300px;
min-height: 70px;
padding: 20px;
padding-top:10px;
border: 1px solid #dddddd;
}
.mail-list-sender-name {
font-size: 1.1em;
display: inline;
font-variant:small-caps;
}
.mail-list-date {
float: right;
clear: block;
display: inline;
font-size: 0.9em;
padding-left: 10px;
font-stretch:ultra-condensed;
font-variant:small-caps;
}
.mail-list-subject {
clear: block;
font-size: 1.2em;
padding-top: 20px;
padding-right: 50px;
}
.mail-list-subject a {
color: #626262;
}
.mail-list-delete-wrapper { float: right;}
.mail-list-outside-wrapper-end {
clear: both;
}
.mail-conv-outside-wrapper {
margin-bottom: 10px;
}
.mail-conv-sender {float: left; margin: 0px 5px 5px 0px; }
.mail-conv-sender-photo {
width: 64px;
height: 64px;
}
.mail-conv-sender-name { float: left; font-variant:small-caps; font-style: bold; }
.mail-conv-date { float: right; font-variant:small-caps; }
.mail-conv-subject { clear: right; font-weight: bold; font-size: 1.2em }
.mail-conv-body {
clear: both;
}
.mail-conv-detail {
width: 500px;
padding: 30px;
padding-bottom: 10px;
margin-left: 20px;
margin-bottom: 0px;
vertical-align: middle;
margin: auto;
border: 1px solid #dddddd;
}
.mail-conv-break { display: none; border: none;}
.mail-conv-delete-wrapper { padding-top: 10px; width: 510px; text-align: right; }
/* ========== */
/* = Events = */
/* ========== */
.clear { clear: both; }
.eventcal {
float: left;
font-size: 20px;
padding: 20px;
}
.vevent {
position: relative;
width: 400px;
padding: 20px;
padding-top: 10px;
margin: 0 0px;
margin-bottom: 10px;
background-color: #fff;
-webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
}
.vevent:before, .vevent:after {
position: absolute;
width: 40%;
height: 10px;
content: ' ';
left: 12px;
bottom: 12px;
background: transparent;
-webkit-transform: skew(-5deg) rotate(-5deg);
-moz-transform: skew(-5deg) rotate(-5deg);
-ms-transform: skew(-5deg) rotate(-5deg);
-o-transform: skew(-5deg) rotate(-5deg);
transform: skew(-5deg) rotate(-5deg);
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
z-index: -1;
}
.vevent:after {
left: auto;
right: 12px;
-webkit-transform: skew(5deg) rotate(5deg);
-moz-transform: skew(5deg) rotate(5deg);
-ms-transform: skew(5deg) rotate(5deg);
-o-transform: skew(5deg) rotate(5deg);
transform: skew(5deg) rotate(5deg);
}
.vevent .event-description {
margin-left: 10px;
margin-right: 10px;
text-align:center;
font-size: 1.2em;
font-weight:bolder;
}
.vevent .event-location{
margin-left: 10px;
margin-right: 10px;
font-size: 1em;
font-style: oblique;
text-align: center;
}
.vevent .event-start, .vevent .event-end {
margin-left: 20px;
margin-right: 20px;
margin-bottom: 2px;
margin-top: 2px;
font-size: 0.9em;
font-variant: small-caps;
text-align: left;
}
#new-event-link{
width: 130px;
padding: 7px;
margin-bottom: 10px;
margin-left: 170px; ;
-moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
-webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
box-shadow:inset 0px 1px 0px 0px #cfcfcf;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
background-color:#bdbdbd;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
color: #efefef;
}
#new-event-link:hover {
color: #efefef;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
background-color:#b20202;
}
#new-event-link:active {
background-color: #b20202;
position:relative;
top:1px;
}
#new-event-link a {
color: #efefef;
text-align: center;
}
.edit-event-link, .plink-event-link {
float: left;
margin-top: 4px;
margin-right: 4px;
margin-bottom: 15px;
}
.event-description:before {
content: url('calendar.png');
margin-right: 15px;
vertical-align: middle;
}
.event-start, .event-end {
margin-left: 10px;
width: 330px;
}
.event-start .dtstart, .event-end .dtend {
float: right;
}
.event-list-date {
color: #626262;
margin-bottom: 10px;
font-variant:small-caps;
font-stretch:condensed;
}
.prevcal, .nextcal {
float: left;
margin-left: 32px;
margin-right: 32px;
margin-top: 64px;
}
.event-calendar-end {
clear: both;
}
.calendar {
width: 300px;
font-family: Helvetica, Arial, sans-serif;
background-color: #f1f1f1;
border: 1px solid #dedede;
margin-bottom: 10px;
-moz-box-shadow: 5px 5px 8px #959494;
-webkit-box-shadow: 5px 5px 8px #959494;
box-shadow: 5px 5px 8px #959494;
}
.calendar caption{
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
background-color: #b20202;
padding: 10px 0px 10px 0px;
width: 300px;
color: #ffffff;
font-weight: bold;
text-align:center;
font-variant:small-caps;
-moz-box-shadow: 5px 2px 8px #959494;
-webkit-box-shadow: 5px 2px 8px #959494;
box-shadow: 5px 2px 8px #959494;
}
tr {
border: 1px solid #eeeeee;
}
.calendar td {
font-size: 14px;
text-align: center;
padding: 3px 0px;
}
.calendar td > a {
background-color: #cdcdcd;
padding: 2px;
color: #000;
}
.calendar th {
font-size: 16px;
}
.today {
font-weight: bold;
text-align: center;
background-color: #b20202;
color: #fff;
}
#event-start-text,
#event-finish-text {
margin-top: 10px;
margin-bottom: 5px;
}
#event-nofinish-checkbox,
#event-nofinish-text,
#event-adjust-checkbox,
#event-adjust-text,
#event-share-checkbox {
float: left;
}
#event-datetime-break {
margin-bottom: 10px;
}
#event-nofinish-break,
#event-adjust-break,
#event-share-break {
clear: both;
}
#event-desc-text,
#event-location-text {
margin-top: 10px;
margin-bottom: 5px;
}
#event-submit {
margin-top: 10px;
}
/* ============= */
/* = Directory = */
/* ============= */
.directory-item {
float: left;
margin: 50px 50px 0px 0px;
}
.directory-details {
font-size: 0.9em;
font-variant: small-caps;
width: 160px;
}
.directory-name {
font-size: 1em;
font-variant: small-caps;
width: 150px;
}