Merge pull request #45 from annando/master

New HTML to BBCode converter, changes to BBCode, nginx support, ...
This commit is contained in:
friendica 2012-02-22 20:21:05 -08:00
commit 58a9c652de
16 changed files with 1262 additions and 694 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

@ -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'],'/\\');

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;
} }
} }

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]") and strpos($Text, "[quote]") 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]") and strpos($Text, "[quote=") 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

@ -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

@ -194,8 +194,8 @@ function poller_run($argv, $argc){
$update = true; $update = true;
break; break;
} }
if((! $update) && (! $force)) // if((! $update) && (! $force))
continue; // continue;
} }
// Check to see if we are running out of memory - if so spawn a new process and kill this one // Check to see if we are running out of memory - if so spawn a new process and kill this one
@ -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

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

@ -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;
}