date == $b->date ? 0 : ( $a->date < $b->date ) ? 1 : -1;
}
// Return blog post
function get_posts($page = 1, $perpage = 0){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $k=>$v){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The archive per day
$post->archive = site_url(). 'archive/' . date('Y-m-d', $post->date) ;
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag url
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('', $content);
$post->title = str_replace('
','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
usort($tmp,'cmp');
return $tmp;
}
// Find post by year, month and name, previous, and next.
function find_post($year, $month, $name){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
if( strpos($v, "$year-$month") !== false && strpos($v, $name.'.md') !== false){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The archive per day
$post->archive = site_url(). 'archive/' . date('Y-m-d', $post->date) ;
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag url
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
usort($tmp,'cmp');
return $tmp;
}
// Return tag page
function get_tag($tag){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
if( strpos($v, "$tag") !== false){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Make sure the tag request available
if ($tag === $arr[1]) {
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag URL
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
else {
not_found();
}
}
}
usort($tmp,'cmp');
return $tmp;
}
// Return an archive page
function get_archive($req){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
if( strpos($v, "$req") !== false){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag URL
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
usort($tmp,'cmp');
return $tmp;
}
// Return an archive list, categorized by year and month
function archive_list() {
$posts = get_post_names();
$by_year = array();
$col = array();
foreach($posts as $index => $v){
$arr = explode('_', $v);
// Replaced string
$str = $arr[0];
$replaced = substr($str, 0,strrpos($str, '/')) . '/';
$date = str_replace($replaced,'',$arr[0]);
$data = explode('-', $date);
$col[] = $data;
}
foreach ($col as $row){
$y = $row['0'];
$m = $row['1'];
$by_year[$y][] = $m;
}
# Most recent year first
krsort($by_year);
# Iterate for display
echo 'Archive
';
foreach ($by_year as $year => $months){
echo '' . $year . ' ';
echo '(' . count($months) . ')';
echo '';
# Sort the months
ksort($months);
$by_month = array_count_values($months);
foreach ($by_month as $month => $count){
$name = date('F', mktime(0,0,0,$month,1,2010));
echo '- ' . $name . '';
echo ' (' . $count . ')
';
echo '';
}
echo '
';
}
}
// Return tag cloud
function tag_cloud() {
$posts = get_post_names();
$tags = array();
foreach($posts as $index => $v){
$arr = explode('_', $v);
$data = $arr[1];
$tags[] = $data;
}
$tag_collection = array_count_values($tags);
ksort($tag_collection);
echo 'Tags
';
echo '';
foreach ($tag_collection as $tag => $count){
echo '- ' . $tag . ' (' . $count . ')
';
}
echo '
';
}
// Return static page
function get_spage($posts, $spage){
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
if( strpos($v, "$spage") !== false && strpos($v, $spage.'.md') !== false){
$post = new stdClass;
// Extract the array
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// The static page URL
$url = str_replace($replaced,'',$arr[0]);
$post->url = site_url() . str_replace('.md','',$url);
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
return $tmp;
}
// Find static page
function find_spage($spage){
$posts = get_spage_names();
foreach($posts as $index => $v){
if( strpos($v, "$spage") !== false && strpos($v, $spage.'.md') !== false){
// Use the get_spage method to return
// a properly parsed object
$arr = get_spage($posts, $spage);
return $arr[0];
}
}
return false;
}
// Return profile page
function get_profile($profile){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
if( strpos($v, "$profile") !== false){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// Make sure the tag request available
if ($profile === $author) {
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag URL
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
}
usort($tmp,'cmp');
return $tmp;
}
// Return author bio
function get_bio($names, $author){
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($names as $index => $v){
$post = new stdClass;
// Extract the array
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$profile = $str[count($str)-2];
if($author === $profile){
// Profile URL
$url = str_replace($replaced,'',$arr[0]);
$post->url = site_url() . 'author/' . $profile;
// Get the contents and convert it to HTML
$content = $md->transformMarkdown(file_get_contents($v));
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
krsort($tmp);
return $tmp;
}
// Find author bio
function find_bio($author){
$names = get_author_names();
foreach($names as $index => $v){
if( strpos($v, $author) !== false && strpos($v, 'author.md') !== false){
// Use the get_spage method to return
// a properly parsed object
$arr = get_bio($names, $author);
if (isset($arr[0])) {
return $arr[0];
}
}
}
return false;
}
// Return search page
function get_keyword($keyword){
$posts = get_post_names();
$tmp = array();
// Create a new instance of the markdown parser
$md = new MarkdownParser();
foreach($posts as $index => $v){
$content = $md->transformMarkdown(file_get_contents($v));
if(strpos(strtolower(strip_tags($content)), strtolower($keyword)) !== false){
$post = new stdClass;
// Extract the date
$arr = explode('_', $v);
// Replaced string
$replaced = substr($arr[0], 0,strrpos($arr[0], '/')) . '/';
// Author string
$str = explode('/', $replaced);
$author = $str[count($str)-3];
// The post author + author url
$post->author = $author;
$post->authorurl = site_url() . 'author/' . $author;
// The post date
$post->date = strtotime(str_replace($replaced,'',$arr[0]));
// The post URL
$post->url = site_url().date('Y/m', $post->date).'/'.str_replace('.md','',$arr[2]);
// The post tag
$post->tag = str_replace($replaced,'',$arr[1]);
// The post tag URL
$post->tagurl = site_url(). 'tag/' . $arr[1];
// Extract the title and body
$arr = explode('
', $content);
$post->title = str_replace('','',$arr[0]);
$post->body = $arr[1];
$tmp[] = $post;
}
}
usort($tmp,'cmp');
return $tmp;
}
// Helper function to determine whether
// to show the previous buttons
function has_prev($prev){
if(!empty($prev)) {
return array(
'url'=> $prev->url,
'title'=> $prev->title
);
}
}
// Helper function to determine whether
// to show the next buttons
function has_next($next){
if(!empty($next)) {
return array(
'url'=> $next->url,
'title'=> $next->title
);
}
}
// Helper function to determine whether
// to show the pagination buttons
function has_pagination($total, $perpage, $page = 1){
if(!$total) {
$total = count(get_post_names());
}
return array(
'prev'=> $page > 1,
'next'=> $total > $page*$perpage
);
}
// Get the meta description
function get_description($text) {
$string = explode('', $text);
$string = preg_replace('@[\s]{2,}@',' ', strip_tags($string[0] . ''));
if (strlen($string) > 1) {
return $string;
}
else {
$string = preg_replace('@[\s]{2,}@',' ', strip_tags($text));
if (strlen($string) < config('description.char')) {
return $string;
}
else {
return $string = substr($string, 0, strpos($string, ' ', config('description.char')));
}
}
}
// Get the teaser
function get_teaser($text, $url) {
if (strlen(strip_tags($text)) < config('teaser.char')) {
$string = preg_replace('@[\s]{2,}@',' ', strip_tags($text));
$body = $string . '...' . ' more' ;
echo '
' . $body . '
';
}
else {
$string = preg_replace('@[\s]{2,}@',' ', strip_tags($text));
$string = substr($string, 0, strpos($string, ' ', config('teaser.char')));
$body = $string . '...' . ' more' ;
echo '' . $body . '
';
}
}
// Get thumbnail from image and Youtube.
function get_thumbnail($text) {
$default = config('default.thumbnail');
$dom = new DOMDocument();
$dom->loadHtml($text);
$imgTags = $dom->getElementsByTagName('img');
$vidTags = $dom->getElementsByTagName('iframe');
if ($imgTags->length > 0) {
$imgElement = $imgTags->item(0);
$imgSource = $imgElement->getAttribute('src');
return '';
}
elseif ($vidTags->length > 0) {
$vidElement = $vidTags->item(0);
$vidSource = $vidElement->getAttribute('src');
$fetch = explode("embed/", $vidSource);
if(isset($fetch[1])) {
$vidThumb = '//img.youtube.com/vi/' . $fetch[1] . '/default.jpg';
return '';
}
}
else {
if (!empty($default)) {
return '';
}
}
}
// Use base64 encode image to speed up page load time.
function base64_encode_image($filename=string,$filetype=string) {
if ($filename) {
$imgbinary = fread(fopen($filename, "r"), filesize($filename));
return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}
}
// Social links
function social(){
$twitter = config('social.twitter');
$facebook = config('social.facebook');
$google = config('social.google');
$tumblr = config('social.tumblr');
$rss = site_url() . 'feed/rss';
if (!empty($twitter)) {
echo '
';
}
if (!empty($facebook)) {
echo '
';
}
if (!empty($google)) {
echo '
';
}
if (!empty($tumblr)) {
echo '
';
}
echo '
';
}
// Copyright
function copyright(){
$blogcp = config('blog.copyright');
$credit = 'Proudly powered by HTMLy.';
if (!empty($blogcp)) {
return $copyright = '' . $blogcp . '
' . $credit . '
';
}
else {
return $credit = '' . $credit . '
';
}
}
// Disqus
function disqus($title, $url){
$disqus = config('disqus.shortname');
$script = <<
var disqus_shortname = '{$disqus}';
var disqus_title = '{$title}';
var disqus_url = '{$url}';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
EOF;
if (!empty($disqus)) {
return $script;
}
}
// Disqus
function disqus_count(){
$disqus = config('disqus.shortname');
$script = <<
var disqus_shortname = '{$disqus}';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
EOF;
if (!empty($disqus)) {
return $script;
}
}
// Google Publisher
function publisher(){
$publisher = config('google.publisher');
if (!empty($publisher)) {
return $publisher;
}
}
// Google Analytics
function analytics(){
$analytics = config('google.analytics.id');
$script = <<
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '{$analytics}']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
EOF;
if (!empty($analytics)) {
return $script;
}
}
// Menu
function menu(){
$menu = config('blog.menu');
if (!empty($menu)) {
return $menu;
}
}
// The not found error
function not_found(){
error(404, render('404', null, false));
}
// Turn an array of posts into an RSS feed
function generate_rss($posts){
$feed = new Feed();
$channel = new Channel();
$channel
->title(config('blog.title'))
->description(config('blog.description'))
->url(site_url())
->appendTo($feed);
foreach($posts as $p){
$item = new Item();
$item
->title($p->title)
->description($p->body)
->url($p->url)
->appendTo($channel);
}
echo $feed;
}
// Turn an array of posts into a JSON
function generate_json($posts){
return json_encode($posts);
}