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);
@ -144,6 +148,7 @@
//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":
@ -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

@ -13,30 +13,49 @@ require_once('include/html2bbcode.php');
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("/([^\]\=]|^)(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]$2[/youtube]',$s); $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$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]$1[/youtube]',$s);
$s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s); $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$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]$1[/vimeo]',$s);
$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2$3$4[/url]',$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

@ -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);
// handle nested lists
$endlessloop = 0;
while (strpos($Text, "[/list]") and strpos($Text, "[list") and (++$endlessloop < 20)) {
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text); $Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>'
,$Text);
$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="listnone" style="list-style-type: none;">$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=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
$Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' $Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type: lower-roman;">$2</ul>' ,$Text);
,$Text); $Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type: upper-roman;">$2</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type: $Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$2</ul>' ,$Text);
lower-roman;">$2</ul>' ,$Text); $Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$2</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type: }
upper-roman;">$2</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type: $Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
lower-alpha;">$2</ul>' ,$Text); $Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type:
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,18 +189,21 @@ 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
// 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); $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:');
// handle nested quotes
$endlessloop = 0;
while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote=") !== false and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
"<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>", "<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>",
$Text); $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
* html2bbcode 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)
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);
}
function node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb)
{ {
return str_replace("\n","", $string); $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 there is a <pre>, we have to split by line if ($replace) {
// and manually replace the linebreaks $StartCode = $oldNode->ownerDocument->createTextNode($startbb);
$EndCode = $oldNode->ownerDocument->createTextNode($endbb);
$strArr=explode("\n", $string); $oldNode->parentNode->insertBefore($StartCode, $oldNode);
$output=""; if ($oldNode->hasChildNodes()) {
$preFound=false; foreach ($oldNode->childNodes as $child) {
$newNode = $child->cloneNode(true);
$oldNode->parentNode->insertBefore($newNode, $oldNode);
}
}
// Loop over each line $oldNode->parentNode->insertBefore($EndCode, $oldNode);
foreach($strArr as $line) $oldNode->parentNode->removeChild($oldNode);
{ // See if the line has a <pre>. If it does, set $preFound to true }
if(strpos($line, "<pre>") !== false) }
return($replace);
}
function deletenode(&$doc, $node)
{ {
$preFound=true; $xpath = new DomXPath($doc);
} $list = $xpath->query("//".$node);
elseif(strpos($line, "</pre>") !== false) foreach ($list as $child)
{ $child->parentNode->removeChild($child);
$preFound=false;
} }
// If we are in a pre tag, add line and also add \n, else add the line without \n function html2bbcode($message)
if($preFound)
{ {
$output .= $line . "\n";
}
else
{
$output .= $line ;
}
}
return $output; //$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,7 +1551,8 @@ 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')) {
if($contact['network'] === NETWORK_OSTATUS)
$force_parent = true; $force_parent = true;
if(strlen($datarray['title'])) if(strlen($datarray['title']))
unset($datarray['title']); unset($datarray['title']);

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,6 +446,7 @@ 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()),
@ -448,10 +459,14 @@ function poller_run($argv, $argc){
$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']);
logger("Mail: Importing ".$msg_uid);
// some mailing lists have the original author as 'from' - add this sender info to msg body. // 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

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'),

318
library/markdown.php Executable file → Normal file
View file

@ -3,8 +3,8 @@
# Markdown Extra - A text-to-HTML conversion tool for web writers # Markdown Extra - A text-to-HTML conversion tool for web writers
# #
# PHP Markdown & Extra # PHP Markdown & Extra
# Copyright (c) 2004-2008 Michel Fortin # Copyright (c) 2004-2012 Michel Fortin
# <http://www.michelf.com/projects/php-markdown/> # <http://michelf.com/projects/php-markdown/>
# #
# Original Markdown # Original Markdown
# Copyright (c) 2004-2006 John Gruber # Copyright (c) 2004-2006 John Gruber
@ -12,8 +12,8 @@
# #
define( 'MARKDOWN_VERSION', "1.0.1m" ); # Sat 21 Jun 2008 define( 'MARKDOWN_VERSION', "1.0.1o" ); # Sun 8 Jan 2012
define( 'MARKDOWNEXTRA_VERSION', "1.2.3" ); # Wed 31 Dec 2008 define( 'MARKDOWNEXTRA_VERSION', "1.2.5" ); # Sun 8 Jan 2012
# #
@ -34,17 +34,6 @@ define( 'MARKDOWNEXTRA_VERSION', "1.2.3" ); # Wed 31 Dec 2008
@define( 'MARKDOWN_FN_LINK_CLASS', "" ); @define( 'MARKDOWN_FN_LINK_CLASS', "" );
@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" ); @define( 'MARKDOWN_FN_BACKLINK_CLASS', "" );
# Enables special handling for links pointing outside of the current domain.
@define( 'MARKDOWN_EL_ENABLE', true); # Use this feature at all?
@define( 'MARKDOWN_EL_LOCAL_DOMAIN', null); # Leave as null to autodetect
@define( 'MARKDOWN_EL_NEW_WINDOW', true); # Open link in a new browser?
@define( 'MARKDOWN_EL_CSS_CLASS', 'external'); # Leave as null for no class
# Enables header auto-self-linking.
@define( 'MARKDOWN_HA_ENABLE', true ); # Use this feature at all?
@define( 'MARKDOWN_HA_CLASS', 'hidden-selflink' ); # Leave as null for no class
@define( 'MARKDOWN_HA_TEXT', '&larr;' ); # The text to use as the link
# #
# WordPress settings: # WordPress settings:
@ -80,16 +69,16 @@ function Markdown($text) {
/* /*
Plugin Name: Markdown Extra Plugin Name: Markdown Extra
Plugin URI: http://www.michelf.com/projects/php-markdown/ Plugin URI: http://michelf.com/projects/php-markdown/
Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a> Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>
Version: 1.2.2 Version: 1.2.5
Author: Michel Fortin Author: Michel Fortin
Author URI: http://www.michelf.com/ Author URI: http://michelf.com/
*/ */
if (isset($wp_version)) { if (isset($wp_version)) {
# More details about how it works here: # More details about how it works here:
# <http://www.michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/> # <http://michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/>
# Post content and excerpts # Post content and excerpts
# - Remove WordPress paragraph generator. # - Remove WordPress paragraph generator.
@ -182,7 +171,7 @@ function identify_modifier_markdown() {
'authors' => 'Michel Fortin and John Gruber', 'authors' => 'Michel Fortin and John Gruber',
'licence' => 'GPL', 'licence' => 'GPL',
'version' => MARKDOWNEXTRA_VERSION, 'version' => MARKDOWNEXTRA_VERSION,
'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>', 'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>',
); );
} }
@ -367,14 +356,18 @@ class Markdown_Parser {
[ ]* [ ]*
\n? # maybe *one* newline \n? # maybe *one* newline
[ ]* [ ]*
<?(\S+?)>? # url = $2 (?:
<(.+?)> # url = $2
|
(\S+?) # url = $3
)
[ ]* [ ]*
\n? # maybe one newline \n? # maybe one newline
[ ]* [ ]*
(?: (?:
(?<=\s) # lookbehind for whitespace (?<=\s) # lookbehind for whitespace
["(] ["(]
(.*?) # title = $3 (.*?) # title = $4
[")] [")]
[ ]* [ ]*
)? # title is optional )? # title is optional
@ -386,8 +379,9 @@ class Markdown_Parser {
} }
function _stripLinkDefinitions_callback($matches) { function _stripLinkDefinitions_callback($matches) {
$link_id = strtolower($matches[1]); $link_id = strtolower($matches[1]);
$this->urls[$link_id] = $matches[2]; $url = $matches[2] == '' ? $matches[3] : $matches[2];
$this->titles[$link_id] =& $matches[3]; $this->urls[$link_id] = $url;
$this->titles[$link_id] =& $matches[4];
return ''; # String that will replace the block return ''; # String that will replace the block
} }
@ -412,7 +406,7 @@ class Markdown_Parser {
# #
$block_tags_a_re = 'ins|del'; $block_tags_a_re = 'ins|del';
$block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
'script|noscript|form|fieldset|iframe|math|textarea'; 'script|noscript|form|fieldset|iframe|math';
# Regular expression for the content of a block tag. # Regular expression for the content of a block tag.
$nested_tags_level = 4; $nested_tags_level = 4;
@ -710,37 +704,37 @@ class Markdown_Parser {
('.$this->nested_brackets_re.') # link text = $2 ('.$this->nested_brackets_re.') # link text = $2
\] \]
\( # literal paren \( # literal paren
[ ]* [ \n]*
(?: (?:
<(\S*)> # href = $3 <(.+?)> # href = $3
| |
('.$this->nested_url_parenthesis_re.') # href = $4 ('.$this->nested_url_parenthesis_re.') # href = $4
) )
[ ]* [ \n]*
( # $5 ( # $5
([\'"]) # quote char = $6 ([\'"]) # quote char = $6
(.*?) # Title = $7 (.*?) # Title = $7
\6 # matching quote \6 # matching quote
[ ]* # ignore any spaces/tabs between closing quote and ) [ \n]* # ignore any spaces/tabs between closing quote and )
)? # title is optional )? # title is optional
\) \)
) )
}xs', }xs',
array(&$this, '_DoAnchors_inline_callback'), $text); array(&$this, '_doAnchors_inline_callback'), $text);
# #
# Last, handle reference-style shortcuts: [link text] # Last, handle reference-style shortcuts: [link text]
# These must come last in case you've also got [link test][1] # These must come last in case you've also got [link text][1]
# or [link test](/foo) # or [link text](/foo)
# #
// $text = preg_replace_callback('{ $text = preg_replace_callback('{
// ( # wrap whole match in $1 ( # wrap whole match in $1
// \[ \[
// ([^\[\]]+) # link text = $2; can\'t contain [ or ] ([^\[\]]+) # link text = $2; can\'t contain [ or ]
// \] \]
// ) )
// }xs', }xs',
// array(&$this, '_doAnchors_reference_callback'), $text); array(&$this, '_doAnchors_reference_callback'), $text);
$this->in_anchor = false; $this->in_anchor = false;
return $text; return $text;
@ -835,18 +829,18 @@ class Markdown_Parser {
\] \]
\s? # One optional whitespace character \s? # One optional whitespace character
\( # literal paren \( # literal paren
[ ]* [ \n]*
(?: (?:
<(\S*)> # src url = $3 <(\S*)> # src url = $3
| |
('.$this->nested_url_parenthesis_re.') # src url = $4 ('.$this->nested_url_parenthesis_re.') # src url = $4
) )
[ ]* [ \n]*
( # $5 ( # $5
([\'"]) # quote char = $6 ([\'"]) # quote char = $6
(.*?) # title = $7 (.*?) # title = $7
\6 # matching quote \6 # matching quote
[ ]* [ \n]*
)? # title is optional )? # title is optional
\) \)
) )
@ -956,22 +950,25 @@ class Markdown_Parser {
# Re-usable patterns to match list item bullets and number markers: # Re-usable patterns to match list item bullets and number markers:
$marker_ul_re = '[*+-]'; $marker_ul_re = '[*+-]';
$marker_ol_re = '\d+[.]'; $marker_ol_re = '\d+[\.]';
$marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
$markers_relist = array($marker_ul_re, $marker_ol_re); $markers_relist = array(
$marker_ul_re => $marker_ol_re,
$marker_ol_re => $marker_ul_re,
);
foreach ($markers_relist as $marker_re) { foreach ($markers_relist as $marker_re => $other_marker_re) {
# Re-usable pattern to match any entirel ul or ol list: # Re-usable pattern to match any entirel ul or ol list:
$whole_list_re = ' $whole_list_re = '
( # $1 = whole list ( # $1 = whole list
( # $2 ( # $2
[ ]{0,'.$less_than_tab.'} ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
('.$marker_re.') # $3 = first list item marker ('.$marker_re.') # $4 = first list item marker
[ ]+ [ ]+
) )
(?s:.+?) (?s:.+?)
( # $4 ( # $5
\z \z
| |
\n{2,} \n{2,}
@ -980,6 +977,12 @@ class Markdown_Parser {
[ ]* [ ]*
'.$marker_re.'[ ]+ '.$marker_re.'[ ]+
) )
|
(?= # Lookahead for another kind of list
\n
\3 # Must have the same indentation
'.$other_marker_re.'[ ]+
)
) )
) )
'; // mx '; // mx
@ -1008,11 +1011,11 @@ class Markdown_Parser {
function _doLists_callback($matches) { function _doLists_callback($matches) {
# Re-usable patterns to match list item bullets and number markers: # Re-usable patterns to match list item bullets and number markers:
$marker_ul_re = '[*+-]'; $marker_ul_re = '[*+-]';
$marker_ol_re = '\d+[.]'; $marker_ol_re = '\d+[\.]';
$marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
$list = $matches[1]; $list = $matches[1];
$list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol"; $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
$marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re ); $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
@ -1138,25 +1141,25 @@ class Markdown_Parser {
var $em_relist = array( var $em_relist = array(
'' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![\.,:;]\s)',
'*' => '(?<=\S)(?<!\*)\*(?!\*)', '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
'_' => '(?<=\S)(?<!_)_(?!_)', '_' => '(?<=\S|^)(?<!_)_(?!_)',
); );
var $strong_relist = array( var $strong_relist = array(
'' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![\.,:;]\s)',
'**' => '(?<=\S)(?<!\*)\*\*(?!\*)', '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
'__' => '(?<=\S)(?<!_)__(?!_)', '__' => '(?<=\S|^)(?<!_)__(?!_)',
); );
var $em_strong_relist = array( var $em_strong_relist = array(
'' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![\.,:;]\s)',
'***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)', '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
'___' => '(?<=\S)(?<!_)___(?!_)', '___' => '(?<=\S|^)(?<!_)___(?!_)',
); );
var $em_strong_prepared_relist; var $em_strong_prepared_relist;
function prepareItalicsAndBold() { function prepareItalicsAndBold() {
# #
# Prepare regular expressions for seraching emphasis tokens in any # Prepare regular expressions for searching emphasis tokens in any
# context. # context.
# #
foreach ($this->em_relist as $em => $em_re) { foreach ($this->em_relist as $em => $em_re) {
@ -1191,7 +1194,7 @@ class Markdown_Parser {
$token_re = $this->em_strong_prepared_relist["$em$strong"]; $token_re = $this->em_strong_prepared_relist["$em$strong"];
# #
# Each loop iteration seach for the next emphasis token. # Each loop iteration search for the next emphasis token.
# Each token is then passed to handleSpanToken. # Each token is then passed to handleSpanToken.
# #
$parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
@ -1324,7 +1327,7 @@ class Markdown_Parser {
# These leading spaces cause problem with <pre> content, # These leading spaces cause problem with <pre> content,
# so we need to fix that: # so we need to fix that:
$bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx', $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
array(&$this, '_DoBlockQuotes_callback2'), $bq); array(&$this, '_doBlockQuotes_callback2'), $bq);
return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n"; return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
} }
@ -1446,9 +1449,17 @@ class Markdown_Parser {
< <
(?:mailto:)? (?:mailto:)?
( (
[-.\w\x80-\xFF]+ (?:
[-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
|
".*?"
)
\@ \@
(?:
[-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+ [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
|
\[[\d.a-fA-F:]+\] # IPv4 & IPv6
)
) )
> >
}xi', }xi',
@ -1676,15 +1687,6 @@ class MarkdownExtra_Parser extends Markdown_Parser {
var $fn_link_class = MARKDOWN_FN_LINK_CLASS; var $fn_link_class = MARKDOWN_FN_LINK_CLASS;
var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS; var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;
var $el_enable = MARKDOWN_EL_ENABLE;
var $el_local_domain = MARKDOWN_EL_LOCAL_DOMAIN;
var $el_new_window = MARKDOWN_EL_NEW_WINDOW;
var $el_css_class = MARKDOWN_EL_CSS_CLASS;
var $ha_enable = MARKDOWN_HA_ENABLE;
var $ha_class = MARKDOWN_HA_CLASS;
var $ha_text = MARKDOWN_HA_TEXT;
# Predefined abbreviations. # Predefined abbreviations.
var $predef_abbr = array(); var $predef_abbr = array();
@ -1697,10 +1699,6 @@ class MarkdownExtra_Parser extends Markdown_Parser {
# initialize the table. # initialize the table.
$this->escape_chars .= ':|'; $this->escape_chars .= ':|';
if ($this->el_local_domain === null) {
$this->el_local_domain = $_SERVER['SERVER_NAME'];
}
# Insert extra document, block, and span transformations. # Insert extra document, block, and span transformations.
# Parent constructor will do the sorting. # Parent constructor will do the sorting.
$this->document_gamut += array( $this->document_gamut += array(
@ -1879,7 +1877,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
'. ( !$span ? ' # If not in span. '. ( !$span ? ' # If not in span.
| |
# Indented code block # Indented code block
(?> ^[ ]*\n? | \n[ ]*\n ) (?: ^[ ]*\n | ^ | \n[ ]*\n )
[ ]{'.($indent+4).'}[^\n]* \n [ ]{'.($indent+4).'}[^\n]* \n
(?> (?>
(?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
@ -1887,7 +1885,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
| |
# Fenced code block marker # Fenced code block marker
(?> ^ | \n ) (?> ^ | \n )
[ ]{'.($indent).'}~~~+[ ]*\n [ ]{0,'.($indent).'}~~~+[ ]*\n
' : '' ). ' # End (if not is span). ' : '' ). ' # End (if not is span).
) )
}xs'; }xs';
@ -1949,18 +1947,12 @@ class MarkdownExtra_Parser extends Markdown_Parser {
} }
} }
# #
# Check for: Indented code block or fenced code block marker. # Check for: Fenced code block marker.
# #
else if ($tag{0} == "\n" || $tag{0} == "~") { else if (preg_match('{^\n?[ ]{0,'.($indent+3).'}~}', $tag)) {
if ($tag{1} == "\n" || $tag{1} == " ") {
# Indented code block: pass it unchanged, will be handled
# later.
$parsed .= $tag;
}
else {
# Fenced code block marker: find matching end marker. # Fenced code block marker: find matching end marker.
$tag_re = preg_quote(trim($tag)); $tag_re = preg_quote(trim($tag));
if (preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}', $text, if (preg_match('{^(?>.*\n)+?[ ]{0,'.($indent).'}'.$tag_re.'[ ]*\n}', $text,
$matches)) $matches))
{ {
# End marker found: pass text unchanged until marker. # End marker found: pass text unchanged until marker.
@ -1972,6 +1964,13 @@ class MarkdownExtra_Parser extends Markdown_Parser {
$parsed .= $tag; $parsed .= $tag;
} }
} }
#
# Check for: Indented code block.
#
else if ($tag{0} == "\n" || $tag{0} == " ") {
# Indented code block: pass it unchanged, will be handled
# later.
$parsed .= $tag;
} }
# #
# Check for: Opening Block level tag or # Check for: Opening Block level tag or
@ -2220,81 +2219,6 @@ class MarkdownExtra_Parser extends Markdown_Parser {
return $this->hashPart($text, 'C'); return $this->hashPart($text, 'C');
} }
function _doAnchors_inline_callback($matches) {
// $whole_match = $matches[1];
$link_text = $this->runSpanGamut($matches[2]);
$url = $matches[3] == '' ? $matches[4] : $matches[3];
$title =& $matches[7];
$url = $this->encodeAttribute($url);
$result = "<a href=\"$url\"";
if (isset($title)) {
$title = $this->encodeAttribute($title);
$result .= " title=\"$title\"";
}
if ($this->el_enable && preg_match('/^https?\:\/\//', $url) && !preg_match('/^https?\:\/\/'.$this->el_local_domain.'/', $url)) {
if ($this->el_new_window) {
$result .= ' target="_blank"';
}
if ($this->el_css_class) {
$result .= ' class="'.$this->el_css_class.'"';
}
}
$link_text = $this->runSpanGamut($link_text);
$result .= ">$link_text</a>";
return $this->hashPart($result);
}
function _doAnchors_reference_callback($matches) {
$whole_match = $matches[1];
$link_text = $matches[2];
$link_id =& $matches[3];
$result = '';
if ($link_id == "") {
# for shortcut links like [this][] or [this].
$link_id = $link_text;
}
# lower-case and turn embedded newlines into spaces
$link_id = strtolower($link_id);
$link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
if (isset($this->urls[$link_id])) {
$url = $this->urls[$link_id];
$url = $this->encodeAttribute($url);
$result = "<a href=\"$url\"";
if ( isset( $this->titles[$link_id] ) ) {
$title = $this->titles[$link_id];
$title = $this->encodeAttribute($title);
$result .= " title=\"$title\"";
}
if ($this->el_enable && preg_match('/^https?\:\/\//', $url) && !preg_match('/^https?\:\/\/'.$this->el_local_domain.'/', $url)) {
if ($this->el_new_window) {
$result .= ' target="_blank"';
}
if ($this->el_css_class) {
$result .= ' class="'.$this->el_css_class.'"';
}
}
$link_text = $this->runSpanGamut($link_text);
$result .= ">$link_text</a>";
$result = $this->hashPart($result);
}
else {
$result = $whole_match;
}
return $result;
}
function doHeaders($text) { function doHeaders($text) {
# #
@ -2345,36 +2269,15 @@ class MarkdownExtra_Parser extends Markdown_Parser {
return $matches[0]; return $matches[0];
$level = $matches[3]{0} == '=' ? 1 : 2; $level = $matches[3]{0} == '=' ? 1 : 2;
$attr = $this->_doHeaders_attr($id =& $matches[2]); $attr = $this->_doHeaders_attr($id =& $matches[2]);
$body = $this->runSpanGamut($matches[1]); $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>";
$body = $this->_doHeaders_selflink($id, $body);
$block = "<h$level$attr>$body</h$level>";
return "\n" . $this->hashBlock($block) . "\n\n"; return "\n" . $this->hashBlock($block) . "\n\n";
} }
function _doHeaders_callback_atx($matches) { function _doHeaders_callback_atx($matches) {
$level = strlen($matches[1]); $level = strlen($matches[1]);
$attr = $this->_doHeaders_attr($id =& $matches[3]); $attr = $this->_doHeaders_attr($id =& $matches[3]);
$body = $this->runSpanGamut($matches[2]); $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>";
$body = $this->_doHeaders_selflink($id, $body);
$block = "<h$level$attr>$body</h$level>";
return "\n" . $this->hashBlock($block) . "\n\n"; return "\n" . $this->hashBlock($block) . "\n\n";
} }
function _doHeaders_selflink($id, $body) {
if (!empty($id)) {
$link = '<a href="#'.$id.'"';
if ($this->ha_class) {
$link .= ' class="'.$this->ha_class.'"';
}
$link .= '>'.$this->ha_text.'</a>';
$body .= $link;
}
return $body;
}
function doTables($text) { function doTables($text) {
@ -2596,7 +2499,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
(?= \n+ # stop at next definition mark, (?= \n+ # stop at next definition mark,
(?: # next term or end of text (?: # next term or end of text
[ ]{0,'.$less_than_tab.'} [:][ ] | [ ]{0,'.$less_than_tab.'} [:][ ] |
<dt | \z <dt> | \z
) )
) )
}xm', }xm',
@ -2605,24 +2508,11 @@ class MarkdownExtra_Parser extends Markdown_Parser {
return $list_str; return $list_str;
} }
function _processDefListItems_callback_dt($matches) { function _processDefListItems_callback_dt($matches) {
$anchor_regexp = '/\{\#([-_:a-zA-Z0-9]+)\}/';
$terms = explode("\n", trim($matches[1])); $terms = explode("\n", trim($matches[1]));
$text = ''; $text = '';
$id = array();
foreach ($terms as $term) { foreach ($terms as $term) {
$id = '';
if (preg_match($anchor_regexp, $term, $id) > 0) {
$term = preg_replace($anchor_regexp, '', $term);
$id = ' id="'.trim($id[1]).'"';
}
if (count($id) === 0) {
$id = '';
}
$term = $this->runSpanGamut(trim($term)); $term = $this->runSpanGamut(trim($term));
$text .= "\n<dt$id>" . $term . "</dt>"; $text .= "\n<dt>" . $term . "</dt>";
} }
return $text . "\n"; return $text . "\n";
} }
@ -2698,19 +2588,19 @@ class MarkdownExtra_Parser extends Markdown_Parser {
# work in the middle of a word. # work in the middle of a word.
# #
var $em_relist = array( var $em_relist = array(
'' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![\.,:;]\s)',
'*' => '(?<=\S)(?<!\*)\*(?!\*)', '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
'_' => '(?<=\S)(?<!_)_(?![a-zA-Z0-9_])', '_' => '(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])',
); );
var $strong_relist = array( var $strong_relist = array(
'' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![\.,:;]\s)',
'**' => '(?<=\S)(?<!\*)\*\*(?!\*)', '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
'__' => '(?<=\S)(?<!_)__(?![a-zA-Z0-9_])', '__' => '(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])',
); );
var $em_strong_relist = array( var $em_strong_relist = array(
'' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S)(?![.,:;]\s)', '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![\.,:;]\s)',
'***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)', '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
'___' => '(?<=\S)(?<!_)___(?![a-zA-Z0-9_])', '___' => '(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])',
); );
@ -2808,7 +2698,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
if (!empty($this->footnotes_ordered)) { if (!empty($this->footnotes_ordered)) {
$text .= "\n\n"; $text .= "\n\n";
$text .= "<div class=\"footnotes\">\n"; $text .= "<div class=\"footnotes\">\n";
$text .= "<hr". MARKDOWN_EMPTY_ELEMENT_SUFFIX ."\n"; $text .= "<hr". $this->empty_element_suffix ."\n";
$text .= "<ol>\n\n"; $text .= "<ol>\n\n";
$attr = " rev=\"footnote\""; $attr = " rev=\"footnote\"";
@ -3002,8 +2892,8 @@ Copyright and License
--------------------- ---------------------
PHP Markdown & Extra PHP Markdown & Extra
Copyright (c) 2004-2008 Michel Fortin Copyright (c) 2004-2009 Michel Fortin
<http://www.michelf.com/> <http://michelf.com/>
All rights reserved. All rights reserved.
Based on Markdown Based on Markdown

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);
/* mod Waitman Gobble NO WARRANTY */
//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'))) 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"; 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 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 />"; 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;
}