* @copyright (cc) creative commons - attribution-shareAlike 3.0 unported
* @version 1.0
* @package app
* @subpackage controllers
*/
class feeds extends controller {
/**
* @var int $type the feed type (0 = rss, 1 = atom)
*/
private $type = 0;
/**
* @var string $section the feed section (e.g. blog, code)
*/
private $section = '';
/**
* @var string $action the feed type (e.g. category, tag)
*/
private $action = '';
/**
* @var string $object the feed object (e.g tag name, category name, git sha1 id)
*/
private $object = '';
/**
* index function
* mine the url and either throw and error or call a sub function
*/
function index() {
if(!isset(library::catalog()->url[1])) {
$this->map();
} else {
if(isset(library::catalog()->url[1])) {
switch (library::catalog()->url[1]) {
case 'rss':
$this->type = 0;
break;
case 'atom':
$this->type = 1;
break;
default:
throw new Exception("invalid feed type", statusCodes::HTTP_NOT_FOUND);
break;
}
}
if(!isset(library::catalog()->url[2])) {
$this->map();
} else {
switch (library::catalog()->url[2]) {
case 'blog':
$this->section = 'blog';
break;
case 'code':
$this->section = 'code';
break;
default:
throw new Exception("invalid feed section", statusCodes::HTTP_NOT_FOUND);
break;
}
if(!isset(library::catalog()->url[3])) {
$this->map();
} else {
switch ($this->section) {
case 'blog':
if(library::catalog()->url[3] == 'newest') {
$this->action = 'newest';
} else {
if(!isset(library::catalog()->url[4])) {
throw new Exception("missing feed object", statusCodes::HTTP_NOT_FOUND);
} else {
$this->object = library::catalog()->url[4];
switch (library::catalog()->url[3]) {
case 'category':
$this->action = 'category';
break;
case 'tag':
$this->action = 'tag';
break;
default:
throw new Exception("invalid feed action", statusCodes::HTTP_NOT_FOUND);
break;
}
}
}
break;
case 'code':
$this->object = library::catalog()->url[3];
if(!isset(library::catalog()->url[4])) {
$this->action = 'master';
} else {
$this->action = library::catalog()->url[4];
}
break;
}
$this->generate();
}
}
}
}
/**
* map function
* list all the possible feeds
*/
function map() {
$html = array();
$html["title"] = 'Feeds';
$html["meta"] = '';
$html["sidebar"] = $this->view("blog/sidebar_qr", array(), true);
$html["selected"] = '';
$html["script"] = '';
$url = QOOB_DOMAIN.'feeds/';
$map = '
This is a map of the feeds for '.QOOB_DOMAIN.', from the blog and code sections.
Blog by category:
';
$blog = $this->model('blogModel');
$cats = $blog->getBlogCategories();
foreach ($cats as $cat) {
if(strpos($cat['blog_cat_id'], '.') > 0) {
$map .= '
. '.$cat['name'].' ';
} else {
$map .= '
'.$cat['name'].' ';
}
}
$map .= '
Blog by tag:
';
$tags = $blog->getTags();
foreach ($tags as $tag) {
$map .= '
'.$tag['name'].' ';
}
$map .= '
Git Commit History:
';
$code = $this->model('codeModel');
$repos = $code->getRepos();
$this->library(qoob_types::utility, 'git');
foreach ($repos as $repo) {
$map .= '- '.$repo['name'].'
';
$this->git->init(QOOB_ROOT.'/repos/'.$repo["repo"]);
foreach ($this->git->branches as $branch) {
$map .= '
'.$branch.' ';
}
}
$map .= '
';
$post = array(
'mainCat' => '',
'url' => '',
'title' => 'Feeds',
'subtitle' => 'RSS/ATOM syndicaion',
'content' => $map,
'comments' => 0
);
$html["body"] = $this->view("post", $post, true);
$this->view("pixelgraff", $html);
}
/**
* generate function
* render the rss/atom feed
*/
function generate() {
switch ($this->section) {
case 'blog':
//feed description
$descrip = array(
'link' => QOOB_DOMAIN.'blog/',
'title' => 'the blog of xero harrison',
'description' => 'a blog about code, art, hacks, technology, video games, life and random stuff.',
'descriptionHtml' => false
);
//load blog db model
$blog = $this->model("blogModel");
switch ($this->action) {
case 'newest':
$result = $blog->getNewest(7);
$posts = array();
if(count($result) > 0) {
for($i = 0; $i < count($result); $i++) {
$posts[$i]['title'] = $result[$i]['title'];
$posts[$i]['link'] = QOOB_DOMAIN.'blog/'.$result[$i]['url'];
$posts[$i]['description'] = html_entity_decode($result[$i]['excerpt']);
$posts[$i]['descriptionHtml'] = true;
$posts[$i]['date'] = $result[$i]['date'];
$posts[$i]['author'] = 'x@xero.nu (xero harrison)';
}
}
$this->library(qoob_types::utility, "syndication");
die ($this->syndication->generate($this->type, $descrip, $posts));
break;
case 'tag':
$result = $blog->checkTag($this->object);
if(count($result) > 0) {
$id = $result[0]['tag_id'];
$result = $blog->getPostsByTag($id, 0, 7);
$posts = array();
for($i = 0; $i < count($result); $i++) {
$posts[$i]['title'] = $result[$i]['title'];
$posts[$i]['link'] = QOOB_DOMAIN.'blog/'.$result[$i]['url'];
$posts[$i]['description'] = html_entity_decode($result[$i]['excerpt']);
$posts[$i]['descriptionHtml'] = true;
$posts[$i]['date'] = $result[$i]['date'];
$posts[$i]['author'] = 'x@xero.nu (xero harrison)';
}
$this->library(qoob_types::utility, "syndication");
die ($this->syndication->generate($this->type, $descrip, $posts));
} else {
throw new Exception("unknown tag", statusCodes::HTTP_NOT_FOUND);
}
break;
case 'category':
$result = $blog->checkCategory($this->object);
if(count($result) > 0) {
$id = $result[0]['blog_cat_id'];
$result = (strpos($id, ".") > 0) ? $blog->getPostsBySubCat($id, 0, 7) : $blog->getPostsByCat($id, 0, 7);
$posts = array();
for($i = 0; $i < count($result); $i++) {
$posts[$i]['title'] = $result[$i]['title'];
$posts[$i]['link'] = QOOB_DOMAIN.'blog/'.$result[$i]['url'];
$posts[$i]['description'] = html_entity_decode($result[$i]['excerpt']);
$posts[$i]['descriptionHtml'] = true;
$posts[$i]['date'] = $result[$i]['date'];
$posts[$i]['author'] = 'x@xero.nu (xero harrison)';
}
$this->library(qoob_types::utility, "syndication");
die ($this->syndication->generate($this->type, $descrip, $posts));
} else {
throw new Exception("unknown category", statusCodes::HTTP_NOT_FOUND);
}
break;
default:
throw new Exception("invalid feed action", statusCodes::HTTP_NOT_FOUND);
break;
}
break;
case 'code':
//feed description
$descrip = array(
'link' => QOOB_DOMAIN.'code/',
'title' => 'public git repository of xero harrison',
'description' => 'commit history for ',
'descriptionHtml' => false
);
//load blog db model
$code = $this->model("codeModel");
$result = $code->getRepo($this->object);
if(count($result) > 0) {
//---load GLiP
$this->library(qoob_types::utility, 'git');
$this->git->init(QOOB_ROOT.'/repos/'.$result[0]["repo"]);
//---check branch name
if(!in_array($this->action, $this->git->branches)) {
throw new Exception("unknown branch", statusCodes::HTTP_NOT_FOUND);
}
$descrip['description'] .= $this->object.' '.$this->action.' branch';
$gitcommit = $this->git->getTip($this->action);
$obj = $this->git->getObject($gitcommit);
$hist = $obj->getHistory();
$hist = array_reverse($hist);
$posts = array();
$i = 0;
foreach ($hist as $event) {
$posts[$i]['title'] = $this->object.' commit: '.sha1_hex($event->name);
$posts[$i]['link'] = QOOB_DOMAIN.'code/'.$this->object.'/'.$this->action.'/'.sha1_hex($event->name);
$posts[$i]['description'] = $event->summary;
$posts[$i]['descriptionHtml'] = false;
$posts[$i]['date'] = $event->committer->time;
$posts[$i]['author'] = $event->committer->email.' ('.$event->committer->name.')';
$i++;
}
$this->library(qoob_types::utility, "syndication");
die ($this->syndication->generate($this->type, $descrip, $posts));
} else {
throw new Exception("unknown repo", statusCodes::HTTP_NOT_FOUND);
}
break;
default:
throw new Exception("invalid feed", statusCodes::HTTP_NOT_FOUND);
break;
}
}
}
?>