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->getURLFor("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->offline) { return; } if (($w->homeonly == 1 && $core->url->type != 'default') || ($w->homeonly == 2 && $core->url->type == 'default')) { return; } $links = self::getList($w->renderSubtitle('', false), '', '%1$s', $w->category); if (empty($links)) { return; } return $w->renderDiv($w->content_only, 'links ' . $w->class, '', ($w->title ? $w->renderTitle(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 ''; } }