tpl->addValue('Blogroll',array('tplBlogroll','blogroll'));
$core->tpl->addValue('BlogrollXbelLink',array('tplBlogroll','blogrollXbelLink'));
$core->url->register('xbel','xbel','^xbel(?:/?)$',array('urlBlogroll','xbel'));
class tplBlogroll
{
public static function blogroll($attr)
{
$category='
%s
';
$block='';
$item='%1$s';
if (isset($attr['category'])) {
$category = addslashes($attr['category']);
}
if (isset($attr['block'])) {
$block = addslashes($attr['block']);
}
if (isset($attr['item'])) {
$item = addslashes($attr['item']);
}
$only_cat = 'null';
if (!empty($attr['only_category'])) {
$only_cat = "'".addslashes($attr['only_category'])."'";
}
return
'';
}
public static function blogrollXbelLink($attr)
{
$f = $GLOBALS['core']->tpl->getFilters($attr);
return 'blog->url.$core->url->getBase("xbel")').'; ?>';
}
public static function getList($cat_title='%s
',$block='',$item='%s',$category=null)
{
$blogroll = new dcBlogroll($GLOBALS['core']->blog);
try {
$links = $blogroll->getLinks();
} catch (Exception $e) {
return false;
}
$res = '';
$hierarchy = $blogroll->getLinksHierarchy($links);
if ($category) {
if (!isset($hierarchy[$category])) {
return '';
}
$hierarchy = array($hierarchy[$category]);
}
foreach ($hierarchy as $k => $v)
{
if ($k != '') {
$res .= sprintf($cat_title,html::escapeHTML($k))."\n";
}
$res .= self::getLinksList($v,$block,$item);
}
return $res;
}
private static function getLinksList($links,$block='',$item='%1$s')
{
$list = '';
# Find current link item if any
$current = -1;
$current_size = 0;
$self_uri = http::getSelfURI();
foreach ($links as $k => $v)
{
if (!preg_match('$^([a-z][a-z0-9.+-]+://)$',$v['link_href'])) {
$url = http::concatURL($self_uri,$v['link_href']);
if (strlen($url) > $current_size && preg_match('/^'.preg_quote($url,'/').'/',$self_uri)) {
$current = $k;
$current_size = strlen($url);
}
}
}
foreach ($links as $k => $v)
{
$title = $v['link_title'];
$href = $v['link_href'];
$desc = $v['link_desc'];
$lang = $v['link_lang'];
$xfn = $v['link_xfn'];
$link =
''.
html::escapeHTML($title).
'';
$current_class = $current == $k ? ' class="active"' : '';
$list .= sprintf($item,$link,$current_class)."\n";
}
return sprintf($block,$list)."\n";
}
# Widget function
public static function linksWidget($w)
{
global $core;
if ($w->homeonly && $core->url->type != 'default') {
return;
}
$links = self::getList('%s
','','%1$s',$w->category);
if (empty($links)) {
return;
}
return
''.
($w->title ? '
'.html::escapeHTML($w->title).'
' : '').
$links.
'';
}
}
class urlBlogroll extends dcUrlHandlers
{
public static function xbel($args)
{
$blogroll = new dcBlogroll($GLOBALS['core']->blog);
try {
$links = $blogroll->getLinks();
} catch (Exception $e) {
self::p404();
return;
}
if ($args) {
self::p404();
return;
}
http::cache($GLOBALS['mod_files'],$GLOBALS['mod_ts']);
header('Content-Type: text/xml; charset=UTF-8');
echo
''."\n".
''."\n".
''."\n".
''.html::escapeHTML($GLOBALS['core']->blog->name)." blogroll\n";
$i = 1;
foreach ($blogroll->getLinksHierarchy($links) as $cat_title => $links)
{
if ($cat_title != '') {
echo
''."\n".
"".html::escapeHTML($cat_title)."\n";
}
foreach ($links as $k => $v)
{
$lang = $v['link_lang'] ? ' xml:lang="'.$v['link_lang'].'"' : '';
echo
''."\n".
''.html::escapeHTML($v['link_title'])."\n";
if ($v['link_desc']) {
echo ''.html::escapeHTML($v['link_desc'])."\n";
}
if ($v['link_xfn']) {
echo
"\n".
''.$v['link_xfn']."\n".
"\n";
}
echo
"\n";
}
if ($cat_title != '') {
echo "\n";
}
$i++;
}
echo
'';
}
}
?>