mirror of
https://github.com/danpros/htmly.git
synced 2026-04-18 03:26:20 +05:30
Gives the admin the config option to choose to replace the RSS description value with Meta Description instead of Body (default is the current setting of body, if nothing is selected defaults to body).
4108 lines
130 KiB
PHP
4108 lines
130 KiB
PHP
<?php
|
|
if (!defined('HTMLY')) die('HTMLy');
|
|
|
|
use \Michelf\MarkdownExtra;
|
|
use \Suin\RSSWriter\Feed;
|
|
use \Suin\RSSWriter\Channel;
|
|
use \Suin\RSSWriter\Item;
|
|
|
|
// Get blog post with more info about the path. Sorted by filename.
|
|
function get_blog_posts()
|
|
{
|
|
static $_posts = array();
|
|
|
|
if (empty($_posts)) {
|
|
$url = 'cache/index/index-posts.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_posts = unserialize(file_get_contents($url));
|
|
}
|
|
return $_posts;
|
|
}
|
|
|
|
// Get static page path.
|
|
function get_static_pages()
|
|
{
|
|
static $_page = array();
|
|
|
|
if (empty($_page)) {
|
|
$url = 'cache/index/index-pages.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_page = unserialize(file_get_contents($url));
|
|
}
|
|
return $_page;
|
|
}
|
|
|
|
// Get static subpage path.
|
|
function get_static_subpages($static = null)
|
|
{
|
|
static $_sub_page = array();
|
|
|
|
if (empty($_sub_page)) {
|
|
$url = 'cache/index/index-subpages.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_sub_page = unserialize(file_get_contents($url));
|
|
}
|
|
if ($static != null) {
|
|
$stringLen = strlen($static);
|
|
return array_filter($_sub_page, function ($sub_page) use ($static, $stringLen) {
|
|
$x = str_replace('content/static/', '', $sub_page['dirname']);
|
|
$y = explode('.', $x);
|
|
if (isset($y[1])) {
|
|
$z = $y[1];
|
|
} else {
|
|
$z = $x;
|
|
}
|
|
if ($z == $static) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
return $_sub_page;
|
|
}
|
|
|
|
// Get author name.
|
|
function get_author_name()
|
|
{
|
|
static $_author = array();
|
|
|
|
if (empty($_author)) {
|
|
$url = 'cache/index/index-author.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_author = unserialize(file_get_contents($url));
|
|
}
|
|
|
|
return $_author;
|
|
}
|
|
|
|
// Get posts draft.
|
|
function get_draft_posts()
|
|
{
|
|
static $_draft = array();
|
|
if (empty($_draft)) {
|
|
$url = 'cache/index/index-draft.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_draft = unserialize(file_get_contents($url));
|
|
}
|
|
return $_draft;
|
|
}
|
|
|
|
// Get static page draft.
|
|
function get_draft_pages()
|
|
{
|
|
static $_draftPage = array();
|
|
if (empty($_draftPage)) {
|
|
$tmp = array();
|
|
$tmp = glob('content/static/draft/*.md', GLOB_NOSORT);
|
|
if (is_array($tmp)) {
|
|
foreach ($tmp as $file) {
|
|
$_draftPage[] = pathinfo($file);
|
|
}
|
|
}
|
|
usort($_draftPage, "sortfile_a");
|
|
}
|
|
return $_draftPage;
|
|
}
|
|
|
|
// Get static subpage draft.
|
|
function get_draft_subpages($static = null)
|
|
{
|
|
static $_draftSubpage = array();
|
|
if (empty($_draftSubpage)) {
|
|
$tmp = array();
|
|
$tmp = glob('content/static/*/draft/*.md', GLOB_NOSORT);
|
|
if (is_array($tmp)) {
|
|
foreach ($tmp as $file) {
|
|
$_draftSubpage[] = pathinfo($file);
|
|
}
|
|
}
|
|
usort($_draftSubpage, "sortfile_a");
|
|
}
|
|
if ($static != null) {
|
|
$stringLen = strlen($static);
|
|
return array_filter($_draftSubpage, function ($sub_page) use ($static, $stringLen) {
|
|
$x = explode('/', $sub_page['dirname']);
|
|
$y = explode('.', $x[2]);
|
|
if (isset($y[1])) {
|
|
$z = $y[1];
|
|
} else {
|
|
$z = $y[0];
|
|
}
|
|
if ($z == $static) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
return $_draftSubpage;
|
|
}
|
|
|
|
// Get scheduled posts.
|
|
function get_scheduled_posts()
|
|
{
|
|
static $_scheduled = array();
|
|
if (empty($_scheduled)) {
|
|
$url = 'cache/index/index-scheduled.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_scheduled = unserialize(file_get_contents($url));
|
|
}
|
|
return $_scheduled;
|
|
}
|
|
|
|
// Get category info files.
|
|
function get_category_files()
|
|
{
|
|
static $_desc = array();
|
|
if (empty($_desc)) {
|
|
$url = 'cache/index/index-category-files.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_desc = unserialize(file_get_contents($url));
|
|
}
|
|
return $_desc;
|
|
}
|
|
|
|
// Get category folder.
|
|
function get_category_folder()
|
|
{
|
|
static $_dfolder = array();
|
|
if (empty($_dfolder)) {
|
|
$tmp = array();
|
|
$tmp = glob('content/*/blog/*/', GLOB_ONLYDIR);
|
|
if (is_array($tmp)) {
|
|
foreach ($tmp as $dir) {
|
|
$_dfolder[] = $dir;
|
|
}
|
|
}
|
|
}
|
|
return $_dfolder;
|
|
}
|
|
|
|
// Get category slug.
|
|
function get_category_slug()
|
|
{
|
|
static $_cslug = array();
|
|
if (empty($_cslug)) {
|
|
$url = 'cache/index/index-category.txt';
|
|
if (!file_exists($url)) {
|
|
rebuilt_cache('all');
|
|
}
|
|
$_cslug = unserialize(file_get_contents($url));
|
|
}
|
|
return $_cslug;
|
|
}
|
|
|
|
// Get backup file.
|
|
function get_zip_files()
|
|
{
|
|
static $_zip = array();
|
|
|
|
if (empty($_zip)) {
|
|
|
|
// Get the names of all the
|
|
// zip files.
|
|
|
|
$_zip = glob('backup/*.zip');
|
|
}
|
|
|
|
return $_zip;
|
|
}
|
|
|
|
// Get images in content/images folder
|
|
function scan_images() {
|
|
static $_images = array();
|
|
if (empty($_images)) {
|
|
$tmp = array();
|
|
$tmp = array_filter(glob('content/images/*', GLOB_NOSORT), 'is_file');
|
|
if (is_array($tmp)) {
|
|
foreach ($tmp as $file) {
|
|
$_images[] = pathinfo($file);
|
|
}
|
|
}
|
|
usort($_images, "sortfile_d");
|
|
}
|
|
return $_images;
|
|
}
|
|
|
|
// usort function. Sort by filename.
|
|
function sortfile_a($a, $b)
|
|
{
|
|
return $a['basename'] == $b['basename'] ? 0 : (($a['basename'] > $b['basename']) ? 1 : -1);
|
|
}
|
|
|
|
// usort function.
|
|
function sortfile_d($a, $b)
|
|
{
|
|
return $a['basename'] == $b['basename'] ? 0 : (($a['basename'] < $b['basename']) ? 1 : -1);
|
|
}
|
|
|
|
// usort function. Sort by date.
|
|
function sortdate($a, $b)
|
|
{
|
|
return $a->date == $b->date ? 0 : (($a->date < $b->date) ? 1 : -1);
|
|
}
|
|
|
|
// Rebuilt cache index
|
|
function rebuilt_cache($type = null)
|
|
{
|
|
$dir = 'cache/index';
|
|
$posts_cache = array();
|
|
$page_cache = array();
|
|
$subpage_cache = array();
|
|
$author_cache = array();
|
|
$scheduled_cache = array();
|
|
$category_cache = array();
|
|
$draft_cache = array();
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
// Rebuilt posts index
|
|
$tmp = array();
|
|
$ctmp = array();
|
|
$tmp = glob('content/*/blog/*/*/*.md', GLOB_NOSORT);
|
|
if (is_array($tmp)) {
|
|
foreach ($tmp as $file) {
|
|
if(strpos($file, '/draft/') === false) {
|
|
$posts_cache[] = pathinfo($file);
|
|
$pc = explode('/', $file);
|
|
$ctmp[] = $pc[3];
|
|
}
|
|
}
|
|
}
|
|
usort($posts_cache, "sortfile_d");
|
|
$posts_string = serialize($posts_cache);
|
|
file_put_contents('cache/index/index-posts.txt', print_r($posts_string, true), LOCK_EX);
|
|
|
|
// Rebuilt scheduled posts index
|
|
$stmp = array();
|
|
$stmp = glob('content/*/*/*/*/scheduled/*.md', GLOB_NOSORT);
|
|
if (is_array($stmp)) {
|
|
foreach ($stmp as $file) {
|
|
$scheduled_cache[] = pathinfo($file);
|
|
$ss = explode('/', $file);
|
|
$ctmp[] = $ss[3];
|
|
}
|
|
}
|
|
usort($scheduled_cache, "sortfile_d");
|
|
$scheduled_string = serialize($scheduled_cache);
|
|
file_put_contents('cache/index/index-scheduled.txt', print_r($scheduled_string, true), LOCK_EX);
|
|
|
|
// Rebuilt draft posts index
|
|
$drf = array();
|
|
$drf = glob('content/*/*/*/draft/*.md', GLOB_NOSORT);
|
|
if (is_array($drf)) {
|
|
foreach ($drf as $file) {
|
|
$draft_cache[] = pathinfo($file);
|
|
$dd = explode('/', $file);
|
|
$ctmp[] = $dd[3];
|
|
}
|
|
}
|
|
usort($draft_cache, "sortfile_d");
|
|
$draft_string = serialize($draft_cache);
|
|
file_put_contents('cache/index/index-draft.txt', print_r($draft_string, true), LOCK_EX);
|
|
|
|
// Rebuilt category files index
|
|
$ftmp = array();
|
|
$ftmp = glob('content/data/category/*.md', GLOB_NOSORT);
|
|
if (is_array($ftmp)) {
|
|
foreach ($ftmp as $file) {
|
|
$category_cache[] = pathinfo($file);
|
|
$ctmp[] = pathinfo($file, PATHINFO_FILENAME);
|
|
}
|
|
}
|
|
usort($category_cache, "sortfile_a");
|
|
$category_string = serialize($category_cache);
|
|
file_put_contents('cache/index/index-category-files.txt', print_r($category_string, true), LOCK_EX);
|
|
|
|
// Rebuilt category slug index
|
|
$dirc = array();
|
|
$dirc = array_push($ctmp, 'uncategorized');
|
|
$dirc = array_unique($ctmp, SORT_REGULAR);
|
|
file_put_contents('cache/index/index-category.txt', print_r(serialize($dirc), true), LOCK_EX);
|
|
|
|
// Rebuilt static page index
|
|
$ptmp = array();
|
|
$ptmp = glob('content/static/*.md', GLOB_NOSORT);
|
|
if (is_array($ptmp)) {
|
|
foreach ($ptmp as $file) {
|
|
if(strpos($file, '/draft/') === false) {
|
|
$page_cache[] = pathinfo($file);
|
|
}
|
|
}
|
|
}
|
|
usort($page_cache, "sortfile_a");
|
|
$page_string = serialize($page_cache);
|
|
file_put_contents('cache/index/index-pages.txt', print_r($page_string, true), LOCK_EX);
|
|
|
|
// Rebuilt subpage index
|
|
$sptmp = array();
|
|
$sptmp = glob('content/static/*/*.md', GLOB_NOSORT);
|
|
if (is_array($sptmp)) {
|
|
foreach ($sptmp as $file) {
|
|
if(strpos($file, '/draft/') === false) {
|
|
$subpage_cache[] = pathinfo($file);
|
|
}
|
|
}
|
|
}
|
|
usort($subpage_cache, "sortfile_a");
|
|
$subpage_string = serialize($subpage_cache);
|
|
file_put_contents('cache/index/index-subpages.txt', print_r($subpage_string, true), LOCK_EX);
|
|
|
|
// Rebuilt user profile index
|
|
$atmp = array();
|
|
$atmp = glob('content/*/author.md', GLOB_NOSORT);
|
|
if (is_array($atmp)) {
|
|
foreach ($atmp as $file) {
|
|
$author_cache[] = pathinfo($file);
|
|
}
|
|
}
|
|
usort($author_cache, "sortfile_a");
|
|
$author_string = serialize($author_cache);
|
|
file_put_contents('cache/index/index-author.txt', print_r($author_string, true), LOCK_EX);
|
|
|
|
// Remove the widget cache
|
|
foreach (glob('cache/widget/*.cache', GLOB_NOSORT) as $file) {
|
|
unlink($file);
|
|
}
|
|
|
|
}
|
|
|
|
// Return blog posts.
|
|
function get_posts($posts, $page = 1, $perpage = 0)
|
|
{
|
|
if (empty($posts)) {
|
|
$posts = get_blog_posts();
|
|
}
|
|
|
|
$tmp = array();
|
|
|
|
// Extract a specific page with results
|
|
$posts = array_slice($posts, ($page - 1) * $perpage, $perpage);
|
|
|
|
$cList = category_list(true);
|
|
|
|
$auto = config('toc.automatic');
|
|
$counter = config('views.counter');
|
|
$caption = config('fig.captions');
|
|
|
|
if ($counter == 'true') {
|
|
$viewsFile = "content/data/views.json";
|
|
if (file_exists($viewsFile)) {
|
|
$views = json_decode(file_get_contents($viewsFile), true);
|
|
}
|
|
}
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$post = new stdClass;
|
|
|
|
$filepath = $v['dirname'] . '/' . $v['basename'];
|
|
|
|
// Extract the date
|
|
$arr = explode('_', $v['basename']);
|
|
|
|
// dirname string
|
|
$dirname = $v['dirname'];
|
|
|
|
// Author string
|
|
$str = explode('/', $dirname);
|
|
$author = $str[1];
|
|
|
|
foreach ($cList as $a => $t) {
|
|
if ($t['0'] === $str[3]) {
|
|
$post->category = '<a href="' . site_url() . 'category/' . $t['0'] . '">' . $t['1'] . '</a>';
|
|
$post->categoryUrl = site_url() . 'category/' . $t['0'];
|
|
$post->categoryCount = $t['2'];
|
|
$post->categorySlug = $t['0'];
|
|
$post->categoryMd = $t['0'] . '.md';
|
|
$post->categoryTitle = $t['1'];
|
|
$post->categoryb = '<a itemprop="item" href="' . site_url() . 'category/' . $t['0'] . '"><span itemprop="name">' . $t['1'] . '</span></a>';
|
|
}
|
|
}
|
|
|
|
$type = $str[4];
|
|
$post->ct = $str[3];
|
|
|
|
// The post author + author url
|
|
$post->author = $author;
|
|
$post->authorUrl = site_url() . 'author/' . $author;
|
|
|
|
$profile = get_author($author);
|
|
if (isset($profile[0])) {
|
|
$post->authorName = $profile[0]->name;
|
|
$post->authorDescription = $profile[0]->description;
|
|
$post->authorAbout = $profile[0]->about;
|
|
$post->authorAvatar = $profile[0]->avatar;
|
|
} else {
|
|
$post->authorName = $author;
|
|
$post->authorDescription = i18n('Author_Description');
|
|
$post->authorAbout = i18n('Author_Description');
|
|
$post->authorAvatar = site_url() . 'system/resources/images/logo-small.png';
|
|
}
|
|
|
|
$post->type = $type;
|
|
$dt = str_replace($dirname, '', $arr[0]);
|
|
$t = str_replace('-', '', $dt);
|
|
$time = new DateTime($t);
|
|
$timestamp = $time->format("Y-m-d H:i:s");
|
|
|
|
// The post date
|
|
$post->date = strtotime($timestamp);
|
|
$post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($filepath)));
|
|
|
|
// The archive per day
|
|
$post->archive = site_url() . 'archive/' . date('Y-m', $post->date);
|
|
|
|
if (permalink_type() == 'default') {
|
|
$post->url = site_url() . date('Y/m', $post->date) . '/' . str_replace('.md', '', $arr[2]);
|
|
} else {
|
|
$post->url = site_url() . permalink_type() . '/' . str_replace('.md', '', $arr[2]);
|
|
}
|
|
|
|
$post->slug = str_replace('.md', '', $arr[2]);
|
|
|
|
$post->file = $filepath;
|
|
|
|
$content = file_get_contents($filepath);
|
|
|
|
// Extract the title and body
|
|
$post->title = get_content_tag('t', $content, 'Untitled post: ' . format_date($post->lastMod, 'l, j F Y, H:i'));
|
|
$post->image = get_content_tag('image', $content);
|
|
$post->video = get_content_tag('video', $content);
|
|
$post->link = get_content_tag('link', $content);
|
|
$post->quote = get_content_tag('quote', $content);
|
|
$post->audio = get_content_tag('audio', $content);
|
|
|
|
$tag = array();
|
|
$url = array();
|
|
$bc = array();
|
|
$rel = array();
|
|
|
|
$tagt = get_content_tag('tag', $content);
|
|
$t = explode(',', rtrim($arr[1], ','));
|
|
|
|
if(!empty($tagt)) {
|
|
$tl = explode(',', rtrim($tagt, ','));
|
|
if (count($tl) == count($t)) {
|
|
$tCom = array_combine($t, $tl);
|
|
} else {
|
|
$tCom = array_combine($t, $t);
|
|
}
|
|
foreach ($tCom as $key => $val) {
|
|
if(!empty($val)) {
|
|
$tag[] = array($val, site_url() . 'tag/' . strtolower($key));
|
|
} else {
|
|
$tag[] = array($key, site_url() . 'tag/' . strtolower($key));
|
|
}
|
|
}
|
|
} else {
|
|
foreach ($t as $tt) {
|
|
$tag[] = array($tt, site_url() . 'tag/' . strtolower($tt));
|
|
}
|
|
}
|
|
|
|
foreach ($tag as $a) {
|
|
$url[] = '<a rel="tag" href="' . $a[1] . '">' . $a[0] . '</a>';
|
|
$bc[] = '<span><a href="' . $a[1] . '">' . $a[0] . '</a></span>';
|
|
}
|
|
|
|
$post->tag = implode(' ', $url);
|
|
|
|
$post->tagb = implode(' » ', $bc);
|
|
|
|
$post->related = $post->categorySlug. ',' .$post->url;
|
|
|
|
$more = explode('<!--more-->', $content);
|
|
if (isset($more['1'])) {
|
|
$content = $more['0'] . '<!--more--><div class="more-wrapper"><a id="more"></a></div>' . $more['1'];
|
|
}
|
|
|
|
// Get the contents and convert it to HTML
|
|
$post->body = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
|
|
$post->description = get_content_tag("d", $content, get_description($post->body));
|
|
|
|
$word_count = str_word_count(strip_tags($post->body));
|
|
$post->readTime = ceil($word_count / 200);
|
|
|
|
$toc = explode('<!--toc-->', $post->body);
|
|
if (isset($toc['1'])) {
|
|
$post->body = insert_toc('post-' . $post->date, $toc['0'], $toc['1']);
|
|
} else {
|
|
if ($auto === 'true') {
|
|
$post->body = automatic_toc($post->body, 'post-' . $post->date);
|
|
}
|
|
}
|
|
|
|
// Convert image tags to figures
|
|
if ($caption == 'true') {
|
|
$post->body = preg_replace( '/<p>(<img .*?alt="(.*?)"\s*\/>)<\/p>/', '<figure>$1<figcaption>$2</figcaption></figure>', $post->body );
|
|
}
|
|
|
|
if ($counter == 'true') {
|
|
$post->views = get_views('post_' . $post->slug, $post->file, $views);
|
|
} else {
|
|
$post->views = null;
|
|
}
|
|
|
|
$tmp[] = $post;
|
|
}
|
|
|
|
return $tmp;
|
|
}
|
|
|
|
function get_pages($pages, $page = 1, $perpage = 0)
|
|
{
|
|
if (empty($pages)) {
|
|
$pages = get_static_pages();
|
|
}
|
|
|
|
$tmp = array();
|
|
|
|
$auto = config('toc.automatic');
|
|
$counter = config('views.counter');
|
|
|
|
if ($counter == 'true') {
|
|
$viewsFile = "content/data/views.json";
|
|
if (file_exists($viewsFile)) {
|
|
$views = json_decode(file_get_contents($viewsFile), true);
|
|
}
|
|
}
|
|
|
|
// Extract a specific page with results
|
|
$pages = array_slice($pages, ($page - 1) * $perpage, $perpage);
|
|
|
|
foreach ($pages as $index => $v) {
|
|
$post = new stdClass;
|
|
|
|
// The static page URL
|
|
$fn = explode('.', $v['filename']);
|
|
|
|
if (isset($fn[1])) {
|
|
$url = $fn[1];
|
|
} else {
|
|
$url= $v['filename'];
|
|
}
|
|
|
|
$post->url = site_url() . $url;
|
|
|
|
$post->file = $v['dirname'] . '/' . $v['basename'];
|
|
$post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file)));
|
|
|
|
$post->md = $v['basename'];
|
|
$post->slug = $url;
|
|
$post->parent = null;
|
|
$post->parentSlug = null;
|
|
|
|
// Get the contents and convert it to HTML
|
|
$content = file_get_contents($post->file);
|
|
|
|
// Extract the title and body
|
|
$post->title = get_content_tag('t', $content, 'Untitled static page: ' . format_date($post->lastMod, 'l, j F Y, H:i'));
|
|
|
|
// Get the contents and convert it to HTML
|
|
$post->body = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
|
|
$post->description = get_content_tag("d", $content, get_description($post->body));
|
|
|
|
$word_count = str_word_count(strip_tags($post->body));
|
|
$post->readTime = ceil($word_count / 200);
|
|
|
|
$toc = explode('<!--toc-->', $post->body);
|
|
if (isset($toc['1'])) {
|
|
$post->body = insert_toc('page-' . $post->slug, $toc['0'], $toc['1']);
|
|
} else {
|
|
if ($auto === 'true') {
|
|
$post->body = automatic_toc($post->body, 'page-' . $post->slug);
|
|
}
|
|
}
|
|
|
|
if ($counter == 'true') {
|
|
$post->views = get_views('page_' . $post->slug, $post->file, $views);
|
|
} else {
|
|
$post->views = null;
|
|
}
|
|
|
|
$tmp[] = $post;
|
|
}
|
|
|
|
return $tmp;
|
|
|
|
}
|
|
|
|
function get_subpages($sub_pages, $page = 1, $perpage = 0)
|
|
{
|
|
if (empty($sub_pages)) {
|
|
$sub_pages = get_static_subpages();
|
|
}
|
|
|
|
$tmp = array();
|
|
|
|
$auto = config('toc.automatic');
|
|
$counter = config('views.counter');
|
|
|
|
if ($counter == 'true') {
|
|
$viewsFile = "content/data/views.json";
|
|
if (file_exists($viewsFile)) {
|
|
$views = json_decode(file_get_contents($viewsFile), true);
|
|
}
|
|
}
|
|
|
|
// Extract a specific page with results
|
|
$sub_pages = array_slice($sub_pages, ($page - 1) * $perpage, $perpage);
|
|
|
|
foreach ($sub_pages as $index => $v) {
|
|
|
|
$post = new stdClass;
|
|
|
|
$fd = str_replace(dirname($v['dirname']) . '/', '', $v['dirname']);
|
|
|
|
$st = explode('.', $fd);
|
|
if (isset($st[1])) {
|
|
$static = $st[1];
|
|
} else {
|
|
$static = $fd;
|
|
}
|
|
|
|
// The static page URL
|
|
$fn = explode('.', $v['filename']);
|
|
|
|
if (isset($fn[1])) {
|
|
$url = $fn[1];
|
|
} else {
|
|
$url= $v['filename'];
|
|
}
|
|
|
|
$post->url = site_url() . $static . "/" . $url;
|
|
|
|
$post->file = $v['dirname'] . '/' . $v['basename'];
|
|
$post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($post->file)));
|
|
|
|
$post->md = $v['basename'];
|
|
$post->slug = $url;
|
|
$post->parent = $fd;
|
|
$post->parentSlug = $static;
|
|
|
|
// Get the contents and convert it to HTML
|
|
$content = file_get_contents($post->file);
|
|
|
|
// Extract the title and body
|
|
$post->title = get_content_tag('t', $content, 'Untitled static subpage: ' . format_date($post->lastMod, 'l, j F Y, H:i'));
|
|
|
|
// Get the contents and convert it to HTML
|
|
$post->body = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
|
|
$post->description = get_content_tag("d", $content, get_description($post->body));
|
|
|
|
$word_count = str_word_count(strip_tags($post->body));
|
|
$post->readTime = ceil($word_count / 200);
|
|
|
|
$toc = explode('<!--toc-->', $post->body);
|
|
if (isset($toc['1'])) {
|
|
$post->body = insert_toc('subpage-' . $post->slug, $toc['0'], $toc['1']);
|
|
} else {
|
|
if ($auto === 'true') {
|
|
$post->body = automatic_toc($post->body, 'subpage-' . $post->slug);
|
|
}
|
|
}
|
|
|
|
if ($counter == 'true') {
|
|
$post->views = get_views('subpage_' . $post->parentSlug .'.'. $post->slug, $post->file, $views);
|
|
} else {
|
|
$post->views = null;
|
|
}
|
|
|
|
$tmp[] = $post;
|
|
}
|
|
|
|
return $tmp;
|
|
|
|
}
|
|
|
|
// Find post by year, month and name, previous, and next.
|
|
function find_post($year, $month, $name)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$arr = explode('_', $v['basename']);
|
|
if ((strpos($arr[0], "$year-$month") !== false && strtolower($arr[2]) === strtolower($name . '.md')) || ($year === NULL && strtolower($arr[2]) === strtolower($name . '.md'))) {
|
|
|
|
// Use the get_posts method to return
|
|
// a properly parsed object
|
|
|
|
$ar = get_posts($posts, $index + 1, 1);
|
|
$nx = get_posts($posts, $index, 1);
|
|
$pr = get_posts($posts, $index + 2, 1);
|
|
|
|
if ($index == 0) {
|
|
if (isset($pr[0])) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => null
|
|
);
|
|
}
|
|
} elseif (count($posts) == $index + 1) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return static page.
|
|
function find_page($static = null)
|
|
{
|
|
$pages = get_static_pages();
|
|
|
|
$tmp = array();
|
|
|
|
if (!empty($pages)) {
|
|
|
|
foreach ($pages as $index => $v) {
|
|
if (is_null($static)) {
|
|
|
|
return get_pages($pages, 1, null);
|
|
|
|
} elseif (stripos($v['basename'], $static . '.md') !== false) {
|
|
|
|
// Use the get_posts method to return
|
|
// a properly parsed object
|
|
|
|
$ar = get_pages($pages, $index + 1, 1);
|
|
$nx = get_pages($pages, $index, 1);
|
|
$pr = get_pages($pages, $index + 2, 1);
|
|
|
|
if ($index == 0) {
|
|
if (isset($pr[0])) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => null
|
|
);
|
|
}
|
|
} elseif (count($pages) == $index + 1) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $tmp;
|
|
}
|
|
|
|
// Return static subpage.
|
|
function find_subpage($static, $sub_static = null)
|
|
{
|
|
$sub_pages = array_values(get_static_subpages($static));
|
|
|
|
$tmp = array();
|
|
|
|
if (!empty($sub_pages)) {
|
|
|
|
foreach ($sub_pages as $index => $v) {
|
|
|
|
if (is_null($sub_static)) {
|
|
|
|
return get_subpages($sub_pages, 1, null);
|
|
|
|
} elseif (stripos($v['basename'], $sub_static . '.md') !== false) {
|
|
|
|
// Use the get_posts method to return
|
|
// a properly parsed object
|
|
|
|
$ar = get_subpages($sub_pages, $index + 1, 1);
|
|
$nx = get_subpages($sub_pages, $index, 1);
|
|
$pr = get_subpages($sub_pages, $index + 2, 1);
|
|
|
|
if ($index == 0) {
|
|
if (isset($pr[0])) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'prev' => null
|
|
);
|
|
}
|
|
} elseif (count($sub_pages) == $index + 1) {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0]
|
|
);
|
|
} else {
|
|
return array(
|
|
'current' => $ar[0],
|
|
'next' => $nx[0],
|
|
'prev' => $pr[0]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $tmp;
|
|
}
|
|
|
|
// Return category page.
|
|
function get_category($category, $page, $perpage, $random = null)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
if ($random === true) {
|
|
shuffle($posts);
|
|
}
|
|
|
|
$tmp = array();
|
|
|
|
if (empty($perpage)) {
|
|
$perpage = 10;
|
|
}
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
// dirname string
|
|
$dirname = $v['dirname'];
|
|
|
|
$str = explode('/', $dirname);
|
|
|
|
if (strtolower($category) === strtolower($str[3])) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return false;
|
|
}
|
|
|
|
$tmp = array_unique($tmp, SORT_REGULAR);
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
}
|
|
|
|
// Return category info.
|
|
function get_category_info($category = null)
|
|
{
|
|
|
|
$tmp = array();
|
|
$cslug= get_category_slug();
|
|
if (!empty($cslug)) {
|
|
asort($cslug);
|
|
if (is_null($category)) {
|
|
foreach ($cslug as $key => $c){
|
|
$ctmp = read_category_info($c);
|
|
if (!empty($ctmp[0])) {
|
|
$tmp[] = $ctmp[0];
|
|
} else {
|
|
$tmp[] = default_category($c);
|
|
}
|
|
}
|
|
} else {
|
|
foreach ($cslug as $key => $c){
|
|
if ($c === $category) {
|
|
$ctmp = read_category_info($category);
|
|
if (!empty($ctmp[0])) {
|
|
$tmp[] = $ctmp[0];
|
|
} else {
|
|
$tmp[] = default_category($category);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$tmp[] = default_category($category);
|
|
}
|
|
return $tmp;
|
|
}
|
|
|
|
function read_category_info($category)
|
|
{
|
|
$tmp = array();
|
|
$cFiles = get_category_files();
|
|
|
|
if (!empty($cFiles)) {
|
|
foreach ($cFiles as $index => $v) {
|
|
if (stripos($v['basename'], $category . '.md') !== false) {
|
|
|
|
$desc = new stdClass;
|
|
|
|
// The filename
|
|
$filename = $v['dirname'] . '/' . $v['basename'];
|
|
|
|
$url= $v['filename'];
|
|
|
|
$desc->url = site_url() . 'category/' . $url;
|
|
|
|
$desc->md = $v['basename'];
|
|
|
|
$desc->slug = $url;
|
|
|
|
$desc->count = get_categorycount($url);
|
|
|
|
$desc->file = $filename;
|
|
|
|
// Get the contents and convert it to HTML
|
|
$content = file_get_contents($desc->file);
|
|
|
|
// Extract the title and body
|
|
$desc->title = get_content_tag('t', $content, $category);
|
|
|
|
// Get the contents and convert it to HTML
|
|
$desc->body = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
|
|
$desc->description = get_content_tag("d", $content, get_description($desc->body));
|
|
|
|
$toc = explode('<!--toc-->', $desc->body);
|
|
if (isset($toc['1'])) {
|
|
$desc->body = insert_toc('taxonomy-' . $desc->slug, $toc['0'], $toc['1']);
|
|
}
|
|
|
|
$tmp[] = $desc;
|
|
}
|
|
}
|
|
}
|
|
return $tmp;
|
|
}
|
|
|
|
// Return default category
|
|
function default_category($category = null)
|
|
{
|
|
$tmp = array();
|
|
$desc = new stdClass;
|
|
|
|
if (is_null($category) || $category == 'uncategorized') {
|
|
$desc->title = i18n("Uncategorized");
|
|
$desc->url = site_url() . 'category/uncategorized';
|
|
$desc->slug = 'uncategorized';
|
|
$desc->body = '<p>' . i18n('Uncategorized_comment') . '</p>';
|
|
$desc->md = 'uncategorized.md';
|
|
$desc->description = i18n('Uncategorized_comment');
|
|
$desc->file = '';
|
|
$desc->count = get_categorycount($desc->slug);
|
|
} else{
|
|
$desc->title = $category;
|
|
$desc->url = site_url() . 'category/' . $category;
|
|
$desc->slug = $category;
|
|
$desc->body = '<p>' . i18n('All_blog_posts') . ': ' . $category . '</p>';
|
|
$desc->md = $category . '.md';
|
|
$desc->description = i18n('All_blog_posts') . ': ' . $category;
|
|
$desc->file = '';
|
|
$desc->count = get_categorycount($category);
|
|
}
|
|
|
|
return $tmp[] = $desc;
|
|
}
|
|
|
|
// Return category list
|
|
function category_list($custom = null)
|
|
{
|
|
$dir = "cache/widget";
|
|
$filename = "cache/widget/category.list.cache";
|
|
$tmp = array();
|
|
$cat = array();
|
|
$list = array();
|
|
$cList = '';
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
if (file_exists($filename)) {
|
|
$cat = unserialize(file_get_contents($filename));
|
|
} else {
|
|
$arr = get_category_info(null);
|
|
foreach ($arr as $i => $a) {
|
|
$cat[] = array($a->slug, $a->title, $a->count, $a->description);
|
|
}
|
|
|
|
$tmp = serialize($cat);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
|
|
if(!empty($custom)) {
|
|
return $cat;
|
|
}
|
|
|
|
$cList .= '<ul>';
|
|
|
|
foreach ($cat as $k => $v) {
|
|
if ($v['2'] !== 0) {
|
|
$cList .= '<li><a href="' . site_url() . 'category/' . $v['0'] . '">' . $v['1'] . '</a> <span>('. $v['2'] .')</span></li>';
|
|
}
|
|
}
|
|
|
|
$cList .= '</ul>';
|
|
return $cList;
|
|
|
|
}
|
|
|
|
// Return type page.
|
|
function get_type($type, $page, $perpage)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
if (empty($perpage)) {
|
|
$perpage = 10;
|
|
}
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
// dirname string
|
|
$dirname = $v['dirname'];
|
|
|
|
if (strpos($dirname, '/' . strtolower($type)) !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return $tmp;
|
|
}
|
|
|
|
$tmp = array_unique($tmp, SORT_REGULAR);
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
}
|
|
|
|
// Return tag page.
|
|
function get_tag($tag, $page, $perpage, $random = null)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
if ($random === true) {
|
|
shuffle($posts);
|
|
}
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$str = explode('_', $v['basename']);
|
|
$mtag = explode(',', rtrim($str[1], ','));
|
|
$etag = explode(',', $tag);
|
|
foreach ($mtag as $t) {
|
|
foreach ($etag as $e) {
|
|
$e = trim($e);
|
|
if (strtolower($t) === strtolower($e)) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return $tmp;
|
|
}
|
|
|
|
$tmp = array_unique($tmp, SORT_REGULAR);
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
}
|
|
|
|
// Return archive page.
|
|
function get_archive($req, $page, $perpage)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$str = explode('_', $v['basename']);
|
|
if (strpos($str[0], "$req") !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return false;
|
|
}
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
}
|
|
|
|
// Return posts list on profile.
|
|
function get_profile_posts($name, $page, $perpage)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$str = explode('/', $v['dirname']);
|
|
if (strtolower($name) === strtolower($str[1])) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return false;
|
|
}
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
}
|
|
|
|
// Return author info.
|
|
function get_author($name)
|
|
{
|
|
$names = get_author_name();
|
|
|
|
$tmp = array();
|
|
|
|
if (!empty($names)) {
|
|
|
|
foreach ($names as $index => $v) {
|
|
|
|
$author = new stdClass;
|
|
|
|
// dirname string
|
|
$dirname = $v['dirname'];
|
|
|
|
// Author string
|
|
$str = explode('/', $dirname);
|
|
$profile = $str[1];
|
|
|
|
if ($name === $profile) {
|
|
// Profile URL
|
|
$filename = $v['dirname'] . '/' . $v['basename'];
|
|
|
|
$author->file = $filename;
|
|
|
|
$author->url = site_url() . 'author/' . $profile;
|
|
$author->slug = $profile;
|
|
|
|
// Get the contents and convert it to HTML
|
|
$content = file_get_contents($author->file);
|
|
|
|
// Extract the title and body
|
|
$author->name = get_content_tag('t', $content, $author);
|
|
|
|
// Get the contents and convert it to HTML
|
|
$author->about = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
|
|
$author->description = get_content_tag("d", $content, get_description($author->about));
|
|
|
|
$author->avatar = get_content_tag("image", $content, site_url() . 'system/resources/images/logo-small.png');
|
|
|
|
$toc = explode('<!--toc-->', $author->about);
|
|
if (isset($toc['1'])) {
|
|
$author->about = insert_toc('profile-' . $author->slug, $toc['0'], $toc['1']);
|
|
}
|
|
|
|
$author->body = $author->about;
|
|
$author->title = $author->name;
|
|
|
|
$tmp[] = $author;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($tmp)) {
|
|
return $tmp;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Return default profile
|
|
function default_profile($name)
|
|
{
|
|
$tmp = array();
|
|
$author = new stdClass;
|
|
|
|
$author->name = $name;
|
|
$author->title = $name;
|
|
$author->about = '<p>' . i18n('Author_Description') . '</p>';
|
|
$author->body = '<p>' . i18n('Author_Description') . '</p>';
|
|
$author->description = i18n('Author_Description');
|
|
$author->avatar = site_url() . 'system/resources/images/logo-small.png';
|
|
$author->url = site_url(). 'author/' . $name;
|
|
$author->slug = $name;
|
|
$author->file = '';
|
|
|
|
return $tmp[] = $author;
|
|
}
|
|
|
|
// Return frontpage content
|
|
function get_frontpage()
|
|
{
|
|
$front = new stdClass;
|
|
|
|
$filename = 'content/data/frontpage/frontpage.md';
|
|
|
|
if (file_exists($filename)) {
|
|
$content = file_get_contents($filename);
|
|
$front->file = $filename;
|
|
$front->title = get_content_tag('t', $content, 'Welcome');
|
|
$front->url = site_url() . 'front';
|
|
$front->slug = 'front';
|
|
$front->parent = null;
|
|
$front->parentSlug = null;
|
|
// Get the contents and convert it to HTML
|
|
$front->body = MarkdownExtra::defaultTransform(remove_html_comments($content));
|
|
$front->description = get_content_tag("d", $content, get_description($front->body));
|
|
$word_count = str_word_count(strip_tags($front->body));
|
|
$front->readTime = ceil($word_count / 200);
|
|
$front->views = null;
|
|
$toc = explode('<!--toc-->', $front->body);
|
|
if (isset($toc['1'])) {
|
|
$front->body = insert_toc('page-front', $toc['0'], $toc['1']);
|
|
}
|
|
} else {
|
|
$front->title = 'Welcome';
|
|
$front->url = site_url() . 'front';
|
|
$front->body = 'Welcome to our website.';
|
|
$front->file = null;
|
|
$front->slug = 'front';
|
|
$front->parent = null;
|
|
$front->parentSlug = null;
|
|
$front->description = $front->body;
|
|
$word_count = str_word_count(strip_tags($front->body));
|
|
$front->readTime = ceil($word_count / 200);
|
|
$front->views = null;
|
|
}
|
|
|
|
return $front;
|
|
}
|
|
|
|
// Return search page.
|
|
function get_keyword($keyword, $page, $perpage)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
$words = explode(' ', $keyword);
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$arr = explode('_', $v['basename']);
|
|
$filter = $arr[1] . ' ' . $arr[2];
|
|
foreach ($words as $word) {
|
|
if (stripos($filter, $word) !== false) {
|
|
if (!in_array($v, $tmp)) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (empty($tmp)) {
|
|
return false;
|
|
}
|
|
|
|
return $tmp = get_posts($tmp, $page, $perpage);
|
|
|
|
}
|
|
|
|
// Get related posts base on post category.
|
|
function get_related($tag, $custom = null, $count = null)
|
|
{
|
|
if (empty($count)) {
|
|
$count = config('related.count');
|
|
if (empty($count)) {
|
|
$count = 3;
|
|
}
|
|
}
|
|
|
|
$tmp = array();
|
|
$exp = explode(',', $tag);
|
|
$posts = get_category($exp[0], 1, $count + 1, true);
|
|
$related = '';
|
|
|
|
foreach ($posts as $post) {
|
|
if ($post->url !== $exp[1]) {
|
|
$tmp[] = $post;
|
|
}
|
|
}
|
|
|
|
if (empty($custom)) {
|
|
if (!empty($tmp)) {
|
|
$i = 1;
|
|
$related .= '<ul>';
|
|
foreach ($tmp as $post) {
|
|
$related .= '<li><a href="' . $post->url . '">' . $post->title . '</a></li>';
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
$related .= '</ul>';
|
|
return $related;
|
|
} else {
|
|
$related .= '<ul><li>' . i18n('No_related_post_found') . '</li></ul>';
|
|
return $related;
|
|
}
|
|
|
|
} else {
|
|
return $tmp;
|
|
}
|
|
|
|
}
|
|
|
|
// Return post count. Matching $var and $str provided.
|
|
function get_count($var, $str)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
if ($str === 'basename') {
|
|
$arr = explode('_', $v[$str]);
|
|
$url = $arr[0];
|
|
if (stripos($url, "$var") !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
} else {
|
|
if (stripos($v[$str], $var) !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
}
|
|
|
|
return count($tmp);
|
|
}
|
|
|
|
// Return category count. Matching $var
|
|
function get_categorycount($var)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
if (stripos($v['dirname'], '/' . $var . '/') !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
|
|
}
|
|
|
|
return count($tmp);
|
|
}
|
|
|
|
// Return type count. Matching $var
|
|
function get_typecount($var)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
if (stripos($v['dirname'], '/' . $var) !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
|
|
}
|
|
|
|
return count($tmp);
|
|
}
|
|
|
|
|
|
// Return draft count. Matching $var
|
|
function get_draftcount($var)
|
|
{
|
|
$posts = get_draft_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
if (stripos($v['dirname'], '/' . $var . '/') !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
|
|
}
|
|
return count($tmp);
|
|
}
|
|
|
|
// Return scheduled post count. Matching $var
|
|
function get_scheduledcount($var)
|
|
{
|
|
$posts = get_scheduled_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
if (stripos($v['dirname'], '/' . $var . '/') !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
|
|
}
|
|
|
|
return count($tmp);
|
|
|
|
}
|
|
|
|
// Return tag count. Matching $var
|
|
function get_tagcount($var)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$arr = explode('_', $v['basename']);
|
|
$mtag = explode(',', rtrim($arr[1], ','));
|
|
foreach ($mtag as $t) {
|
|
if (strtolower($t) === strtolower($var)) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
}
|
|
|
|
return count($tmp);
|
|
}
|
|
|
|
// Return search result count
|
|
function keyword_count($keyword)
|
|
{
|
|
$posts = get_blog_posts();
|
|
|
|
$tmp = array();
|
|
|
|
$words = explode(' ', $keyword);
|
|
|
|
foreach ($posts as $index => $v) {
|
|
$arr = explode('_', $v['basename']);
|
|
$filter = $arr[1] . ' ' . $arr[2];
|
|
foreach ($words as $word) {
|
|
if (stripos($filter, $word) !== false) {
|
|
$tmp[] = $v;
|
|
}
|
|
}
|
|
}
|
|
|
|
$tmp = array_unique($tmp, SORT_REGULAR);
|
|
|
|
return count($tmp);
|
|
}
|
|
|
|
// Return recent posts lists
|
|
function recent_posts($custom = null, $count = null)
|
|
{
|
|
if (empty($count)) {
|
|
$count = config('recent.count');
|
|
if (empty($count)) {
|
|
$count = 5;
|
|
}
|
|
}
|
|
|
|
$dir = "cache/widget";
|
|
$filename = "cache/widget/recent.cache";
|
|
$tmp = array();
|
|
$posts = array();
|
|
$recent = '';
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
if (file_exists($filename)) {
|
|
$posts = unserialize(file_get_contents($filename));
|
|
if (count($posts) < $count) {
|
|
$posts = get_posts(null, 1, $count);
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
} else {
|
|
$posts = get_posts(null, 1, $count);
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
|
|
if (!empty($custom)) {
|
|
$arr = array();
|
|
$i = 1;
|
|
foreach ($posts as $post) {
|
|
$arr[] = $post;
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
return $arr;
|
|
} else {
|
|
$i = 1;
|
|
$recent .= '<ul>';
|
|
foreach ($posts as $post) {
|
|
$recent .= '<li><a href="' . $post->url . '">' . $post->title . '</a></li>';
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
if (empty($posts)) {
|
|
$recent .= '<li>' . i18n('No_posts_found') . '</li>';
|
|
}
|
|
$recent .= '</ul>';
|
|
return $recent;
|
|
}
|
|
}
|
|
|
|
// Return recent type lists
|
|
function recent_type($type, $count = null, $custom = null)
|
|
{
|
|
if (empty($count)) {
|
|
$count = config('recent.count');
|
|
if (empty($count)) {
|
|
$count = 5;
|
|
}
|
|
}
|
|
|
|
$dir = 'cache/widget';
|
|
$filename = 'cache/widget/recent.' . $type . '.cache';
|
|
$tmp = array();
|
|
$posts = array();
|
|
$recent = '';
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
if (file_exists($filename)) {
|
|
$posts = unserialize(file_get_contents($filename));
|
|
if (count($posts) < $count) {
|
|
$posts = get_type($type, 1, $count);
|
|
if (!empty($posts)) {
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
}
|
|
} else {
|
|
$posts = get_type($type, 1, $count);
|
|
if (!empty($posts)) {
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
}
|
|
|
|
if (!empty($custom)) {
|
|
$arr = array();
|
|
$i = 1;
|
|
foreach ($posts as $post) {
|
|
$arr[] = $post;
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
return $arr;
|
|
} else {
|
|
$i = 1;
|
|
$recent .= '<ul>';
|
|
foreach ($posts as $post) {
|
|
$recent .= '<li><a href="' . $post->url . '">' . $post->title . '</a></li>';
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
if (empty($posts)) {
|
|
$recent .= '<li>No recent ' . $type . ' found</li>';
|
|
}
|
|
$recent .= '</ul>';
|
|
return $recent;
|
|
}
|
|
}
|
|
|
|
// Return recent tag posts list
|
|
function recent_tag($tag, $count = null, $custom = null)
|
|
{
|
|
if (empty($count)) {
|
|
$count = config('recent.count');
|
|
if (empty($count)) {
|
|
$count = 5;
|
|
}
|
|
}
|
|
|
|
$dir = 'cache/widget';
|
|
$filename = 'cache/widget/recent.tag.' . $tag . '.cache';
|
|
$tmp = array();
|
|
$posts = array();
|
|
$recent = '';
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
if (file_exists($filename)) {
|
|
$posts = unserialize(file_get_contents($filename));
|
|
if (count($posts) < $count) {
|
|
$posts = get_tag($tag, 1, $count);
|
|
if (!empty($posts)) {
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
}
|
|
} else {
|
|
$posts = get_tag($tag, 1, $count);
|
|
if (!empty($posts)) {
|
|
$tmp = serialize($posts);
|
|
file_put_contents($filename, print_r($tmp, true), LOCK_EX);
|
|
}
|
|
}
|
|
|
|
if (!empty($custom)) {
|
|
$arr = array();
|
|
$i = 1;
|
|
foreach ($posts as $post) {
|
|
$arr[] = $post;
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
return $arr;
|
|
} else {
|
|
$i = 1;
|
|
$recent .= '<ul>';
|
|
foreach ($posts as $post) {
|
|
$recent .= '<li><a href="' . $post->url . '">' . $post->title . '</a></li>';
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
if (empty($posts)) {
|
|
$recent .= '<li>No recent ' . $tag . ' found</li>';
|
|
}
|
|
$recent .= '</ul>';
|
|
return $recent;
|
|
}
|
|
}
|
|
|
|
// Return popular posts lists
|
|
function popular_posts($custom = null, $count = null)
|
|
{
|
|
static $_views = array();
|
|
$tmp = array();
|
|
$posts_list = get_blog_posts();
|
|
$pop = '';
|
|
|
|
if (empty($count)) {
|
|
$count = config('popular.count');
|
|
if (empty($count)) {
|
|
$count = 5;
|
|
}
|
|
}
|
|
|
|
if (config('views.counter') == 'true') {
|
|
if (empty($_views)) {
|
|
$filename = 'content/data/views.json';
|
|
if (file_exists($filename)) {
|
|
$_views = json_decode(file_get_contents($filename), true);
|
|
if(is_array($_views)) {
|
|
arsort($_views);
|
|
$i = 1;
|
|
foreach ($_views as $key => $val) {
|
|
$arr = explode('post_', $key);
|
|
if (isset($arr[1])) {
|
|
foreach($posts_list as $in => $f) {
|
|
if (strpos($f['basename'], $arr[1] . '.md') !== false ) {
|
|
$tmp[] = $f;
|
|
if ($i++ >= $count)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
$dir = "cache/widget";
|
|
$filecache = "cache/widget/popular.cache";
|
|
$ar = array();
|
|
$posts = array();
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
if (file_exists($filecache)) {
|
|
$posts = unserialize(file_get_contents($filecache));
|
|
if (count($posts) < $count) {
|
|
$posts = get_posts($tmp, 1, $count);
|
|
$ar = serialize($posts);
|
|
file_put_contents($filecache, print_r($ar, true), LOCK_EX);
|
|
}
|
|
} else {
|
|
$posts = get_posts($tmp, 1, $count);
|
|
$ar = serialize($posts);
|
|
file_put_contents($filecache, print_r($ar, true), LOCK_EX);
|
|
}
|
|
|
|
if (empty($custom)) {
|
|
$ix = 1;
|
|
$pop .= '<ul>';
|
|
foreach ($posts as $post) {
|
|
$pop .= '<li><a href="' . $post->url . '">' . $post->title . '</a></li>';
|
|
if ($ix++ >= $count)
|
|
break;
|
|
}
|
|
$pop .= '</ul>';
|
|
return $pop;
|
|
} else {
|
|
$arp = array();
|
|
$ix = 1;
|
|
foreach ($posts as $post) {
|
|
$arp[] = $post;
|
|
if ($ix++ >= $count)
|
|
break;
|
|
}
|
|
return $arp;
|
|
}
|
|
} else {
|
|
if(empty($custom)) {
|
|
$pop .= '<ul><li>No popular posts found</li></ul>';
|
|
return $pop;
|
|
} else {
|
|
return $tmp;
|
|
}
|
|
}
|
|
} else {
|
|
if (empty($custom)) {
|
|
$pop .= '<ul><li>No popular posts found</li></ul>';
|
|
return $pop;
|
|
} else {
|
|
return $tmp;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (empty($custom)) {
|
|
$pop .= '<ul><li>No popular posts found</li></ul>';
|
|
return $pop;
|
|
} else {
|
|
return $tmp;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return an archive list, categorized by year and month.
|
|
function archive_list($custom = null)
|
|
{
|
|
$dir = "cache/widget";
|
|
$filename = "cache/widget/archive.cache";
|
|
$ar = array();
|
|
$arch = '';
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
$posts = get_blog_posts();
|
|
$by_year = array();
|
|
$col = array();
|
|
|
|
if (!empty($posts)) {
|
|
|
|
if (!file_exists($filename)) {
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$arr = explode('_', $v['filename']);
|
|
|
|
$date = $arr[0];
|
|
$data = explode('-', $date);
|
|
$col[] = $data;
|
|
}
|
|
|
|
foreach ($col as $row) {
|
|
|
|
$y = $row['0'];
|
|
$m = $row['1'];
|
|
$by_year[$y][] = $m;
|
|
}
|
|
|
|
$ar = serialize($by_year);
|
|
file_put_contents($filename, print_r($ar, true), LOCK_EX);
|
|
|
|
} else {
|
|
$by_year = unserialize(file_get_contents($filename));
|
|
}
|
|
|
|
# Most recent year first
|
|
krsort($by_year);
|
|
|
|
# Iterate for display
|
|
$i = 0;
|
|
$len = count($by_year);
|
|
|
|
if (empty($custom)) {
|
|
$cache_d = "cache/widget/archive.default.cache";
|
|
if (file_exists($cache_d)) {
|
|
$arch = unserialize(file_get_contents($cache_d));
|
|
return $arch;
|
|
} else {
|
|
foreach ($by_year as $year => $months) {
|
|
if ($i == 0) {
|
|
$class = 'expanded';
|
|
$arrow = '▼';
|
|
} else {
|
|
$class = 'collapsed';
|
|
$arrow = '►';
|
|
}
|
|
$i++;
|
|
|
|
$by_month = array_count_values($months);
|
|
# Sort the months
|
|
krsort($by_month);
|
|
|
|
$script = <<<EOF
|
|
if (this.parentNode.className.indexOf('expanded') > -1){this.parentNode.className = 'collapsed';this.innerHTML = '►';} else {this.parentNode.className = 'expanded';this.innerHTML = '▼';}
|
|
EOF;
|
|
$arch .= '<ul class="archivegroup">';
|
|
$arch .= '<li class="' . $class . '">';
|
|
$arch .= '<a href="javascript:void(0)" class="toggle" onclick="' . $script . '">' . $arrow . '</a> ';
|
|
$arch .= '<a href="' . site_url() . 'archive/' . $year . '">' . $year . '</a> ';
|
|
$arch .= '<span class="count">(' . count($months) . ')</span>';
|
|
$arch .= '<ul class="month">';
|
|
|
|
foreach ($by_month as $month => $count) {
|
|
$name = format_date(mktime(0, 0, 0, $month, 1, 2010), 'F');
|
|
$arch .= '<li class="item"><a href="' . site_url() . 'archive/' . $year . '-' . $month . '">' . $name . '</a>';
|
|
$arch .= ' <span class="count">(' . $count . ')</span></li>';
|
|
}
|
|
|
|
$arch .= '</ul>';
|
|
$arch .= '</li>';
|
|
$arch .= '</ul>';
|
|
}
|
|
|
|
$ar = serialize($arch);
|
|
file_put_contents($cache_d, $ar, LOCK_EX);
|
|
return $arch;
|
|
}
|
|
} elseif ($custom === 'month-year') {
|
|
$cache_my = "cache/widget/archive.month-year.cache";
|
|
if (file_exists($cache_my)) {
|
|
$arch = unserialize(file_get_contents($cache_my));
|
|
return $arch;
|
|
} else {
|
|
foreach ($by_year as $year => $months) {
|
|
$by_month = array_count_values($months);
|
|
# Sort the months
|
|
krsort($by_month);
|
|
foreach ($by_month as $month => $count) {
|
|
$name = format_date(mktime(0, 0, 0, $month, 1, 2010), 'F');
|
|
$arch .= '<li class="item"><a href="' . site_url() . 'archive/' . $year . '-' . $month . '">' . $name . ' ' . $year .'</a> ('.$count.')</li>';
|
|
}
|
|
}
|
|
$ar = serialize($arch);
|
|
file_put_contents($cache_my, $ar, LOCK_EX);
|
|
return $arch;
|
|
}
|
|
} elseif ($custom === 'year') {
|
|
$cache_y = "cache/widget/archive.year.cache";
|
|
if (file_exists($cache_y)) {
|
|
$arch = unserialize(file_get_contents($cache_y));
|
|
return $arch;
|
|
} else {
|
|
foreach ($by_year as $year => $months) {
|
|
$by_month = array_count_values($months);
|
|
# Sort the months
|
|
krsort($by_month);
|
|
$arch .= '<li class="item"><a href="' . site_url() . 'archive/' . $year . '">' . $year .'</a> ('. count($months) .')</li>';
|
|
}
|
|
$ar = serialize($arch);
|
|
file_put_contents($cache_y, $ar, LOCK_EX);
|
|
return $arch;
|
|
}
|
|
} else {
|
|
return $by_year;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return tag cloud.
|
|
function tag_cloud($custom = null)
|
|
{
|
|
$dir = "cache/widget";
|
|
$filename = "cache/widget/tags.cache";
|
|
$tg = array();
|
|
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
$posts = get_blog_posts();
|
|
$tags = array();
|
|
|
|
$tagcloud_count = config('tagcloud.count');
|
|
if(empty($tagcloud_count)) {
|
|
$tagcloud_count = 40;
|
|
}
|
|
|
|
if (!empty($posts)) {
|
|
|
|
if (!file_exists($filename)) {
|
|
foreach ($posts as $index => $v) {
|
|
$arr = explode('_', $v['filename']);
|
|
$data = rtrim($arr[1], ',');
|
|
$mtag = explode(',', $data);
|
|
foreach ($mtag as $etag) {
|
|
$tags[] = strtolower($etag);
|
|
}
|
|
}
|
|
$tag_collection = array_count_values($tags);
|
|
ksort($tag_collection);
|
|
$tg = serialize($tag_collection);
|
|
file_put_contents($filename, print_r($tg, true), LOCK_EX);
|
|
} else {
|
|
$tag_collection = unserialize(file_get_contents($filename));
|
|
}
|
|
|
|
if(empty($custom)) {
|
|
$wrapper = '';
|
|
$cache_t = "cache/widget/tags.default.cache";
|
|
if (file_exists($cache_t)) {
|
|
$wrapper = unserialize(file_get_contents($cache_t));
|
|
return $wrapper;
|
|
} else {
|
|
// Font sizes
|
|
$max_size = 22; // max font size in %
|
|
$min_size = 8; // min font size in %
|
|
|
|
// Get the largest and smallest array values
|
|
$max_qty = max(array_values($tag_collection));
|
|
$min_qty = min(array_values($tag_collection));
|
|
|
|
// Find the range of values
|
|
$spread = $max_qty - $min_qty;
|
|
if (0 == $spread) { // we don't want to divide by zero
|
|
$spread = 1;
|
|
}
|
|
|
|
// Font-size increment
|
|
// this is the increase per tag quantity (times used)
|
|
$step = ($max_size - $min_size)/($spread);
|
|
|
|
arsort($tag_collection);
|
|
$sliced_tags = array_slice($tag_collection, 0, $tagcloud_count, true);
|
|
ksort($sliced_tags);
|
|
foreach ($sliced_tags as $tag => $count) {
|
|
$size = $min_size + (($count - $min_qty) * $step);
|
|
$wrapper .= ' <a class="tag-cloud-link" href="'. site_url(). 'tag/'. $tag .'" style="font-size:'. $size .'pt;">'.tag_i18n($tag).'</a> ';
|
|
}
|
|
$ar = serialize($wrapper);
|
|
file_put_contents($cache_t, $ar, LOCK_EX);
|
|
return $wrapper;
|
|
}
|
|
|
|
} else {
|
|
return $tag_collection;
|
|
}
|
|
} else {
|
|
if(empty($custom)) return;
|
|
return $tags;
|
|
}
|
|
}
|
|
|
|
// 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,
|
|
'date' => $prev->date,
|
|
'body' => $prev->body,
|
|
'description' => $prev->description,
|
|
'tag' => $prev->tag,
|
|
'author' => $prev->author,
|
|
'authorName' => $prev->authorName,
|
|
'authorAbout' => $prev->authorAbout,
|
|
'authorUrl' => $prev->authorUrl,
|
|
'authorAvatar' => $prev->authorAvatar,
|
|
'related' => $prev->related,
|
|
'views' => $prev->views,
|
|
'type' => $prev->type,
|
|
'file' => $prev->file,
|
|
'image' => $prev->image,
|
|
'video' => $prev->video,
|
|
'audio' => $prev->audio,
|
|
'quote' => $prev->quote,
|
|
'link' => $prev->link,
|
|
'slug' => $prev->slug,
|
|
'category' => $prev->category,
|
|
'categoryUrl' => $prev->categoryUrl,
|
|
'categoryCount' => $prev->categoryCount,
|
|
'categorySlug' => $prev->categorySlug,
|
|
'categoryMd' => $prev->categoryMd,
|
|
'categoryTitle' => $prev->categoryTitle,
|
|
'readTime' => $prev->readTime,
|
|
'lastMod' => $prev->lastMod
|
|
);
|
|
}
|
|
}
|
|
|
|
// 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,
|
|
'date' => $next->date,
|
|
'body' => $next->body,
|
|
'description' => $next->description,
|
|
'tag' => $next->tag,
|
|
'author' => $next->author,
|
|
'authorName' => $next->authorName,
|
|
'authorAbout' => $next->authorAbout,
|
|
'authorUrl' => $next->authorUrl,
|
|
'authorAvatar' => $next->authorAvatar,
|
|
'related' => $next->related,
|
|
'views' => $next->views,
|
|
'type' => $next->type,
|
|
'file' => $next->file,
|
|
'image' => $next->image,
|
|
'video' => $next->video,
|
|
'audio' => $next->audio,
|
|
'quote' => $next->quote,
|
|
'link' => $next->link,
|
|
'slug' => $next->slug,
|
|
'category' => $next->category,
|
|
'categoryUrl' => $next->categoryUrl,
|
|
'categoryCount' => $next->categoryCount,
|
|
'categorySlug' => $next->categorySlug,
|
|
'categoryMd' => $next->categoryMd,
|
|
'categoryTitle' => $next->categoryTitle,
|
|
'readTime' => $next->readTime,
|
|
'lastMod' => $next->lastMod
|
|
);
|
|
}
|
|
}
|
|
|
|
function static_prev($prev)
|
|
{
|
|
if (!empty($prev)) {
|
|
return array(
|
|
'url' => $prev->url,
|
|
'title' => $prev->title,
|
|
'body' => $prev->body,
|
|
'description' => $prev->description,
|
|
'views' => $prev->views,
|
|
'md' => $prev->md,
|
|
'slug' => $prev->slug,
|
|
'parent' => $prev->parent,
|
|
'parentSlug' => $prev->parentSlug,
|
|
'file' => $prev->file,
|
|
'readTime' => $prev->readTime,
|
|
'lastMod' => $prev->lastMod
|
|
);
|
|
}
|
|
}
|
|
|
|
function static_next($next)
|
|
{
|
|
if (!empty($next)) {
|
|
return array(
|
|
'url' => $next->url,
|
|
'title' => $next->title,
|
|
'body' => $next->body,
|
|
'description' => $next->description,
|
|
'views' => $next->views,
|
|
'md' => $next->md,
|
|
'slug' => $next->slug,
|
|
'parent' => $next->parent,
|
|
'parentSlug' => $next->parentSlug,
|
|
'file' => $next->file,
|
|
'readTime' => $next->readTime,
|
|
'lastMod' => $next->lastMod
|
|
);
|
|
}
|
|
}
|
|
|
|
// Helper function to determine whether
|
|
// to show the pagination buttons
|
|
function has_pagination($total, $perpage, $page = 1)
|
|
{
|
|
if (!$total) {
|
|
$total = count(get_blog_posts());
|
|
}
|
|
$totalPage = ceil($total / $perpage);
|
|
$number = i18n('Page') . ' ' . $page . ' ' . i18n('of') . ' ' . $totalPage;
|
|
$pager = get_pagination($total, $page, $perpage, 2);
|
|
return array(
|
|
'prev' => $page > 1,
|
|
'next' => $total > $page * $perpage,
|
|
'pagenum' => $number,
|
|
'html' => $pager,
|
|
'items' => $total,
|
|
'perpage' => $perpage
|
|
);
|
|
}
|
|
|
|
//function to return the pagination string
|
|
function get_pagination($totalitems, $page = 1, $perpage = 10, $adjacents = 1, $pagestring = '?page=')
|
|
{
|
|
//defaults
|
|
if(!$adjacents) $adjacents = 1;
|
|
if(!$perpage) $perpage = 10;
|
|
if(!$page) $page = 1;
|
|
|
|
//other vars
|
|
$prev = $page - 1; //previous page is page - 1
|
|
$next = $page + 1; //next page is page + 1
|
|
$lastpage = ceil($totalitems / $perpage); //lastpage is = total items / items per page, rounded up.
|
|
$lpm1 = $lastpage - 1; //last page minus 1
|
|
|
|
/*
|
|
Now we apply our rules and draw the pagination object.
|
|
We're actually saving the code to a variable in case we want to draw it more than once.
|
|
*/
|
|
$pagination = '';
|
|
if($lastpage > 1)
|
|
{
|
|
$pagination .= '<ul class="pagination">';
|
|
|
|
//newer button
|
|
if ($page > 1)
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $prev .'">« '. i18n('Newer') .'</a></li>';
|
|
else
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">« '. i18n('Newer') . '</span></li>';
|
|
|
|
//pages
|
|
if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
|
|
{
|
|
for ($counter = 1; $counter <= $lastpage; $counter++)
|
|
{
|
|
if ($counter == $page)
|
|
$pagination .= '<li class="page-item active"><span class="page-link">'. $counter.'</span></li>';
|
|
else
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $counter .'">'. $counter .'</a></li>';
|
|
}
|
|
}
|
|
elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
|
|
{
|
|
//close to beginning; only hide later pages
|
|
if($page < 1 + ($adjacents * 3))
|
|
{
|
|
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
|
|
{
|
|
if ($counter == $page)
|
|
$pagination .= '<li class="page-item active"><span class="page-link">'. $counter .'</span></li>';
|
|
else
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $counter .'">'. $counter .'</a></li>';
|
|
}
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $lpm1 .'">'. $lpm1 .'</a></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $lastpage .'">'. $lastpage .'</a></li>';
|
|
}
|
|
//in middle; hide some front and some back
|
|
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
|
|
{
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="' . $pagestring .'1">1</a></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring .'2">2</a></li>';
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
|
|
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
|
|
{
|
|
if ($counter == $page)
|
|
$pagination .= '<li class="page-item active"><span class="page-link">'. $counter .'</span></li>';
|
|
else
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $counter .'">'. $counter .'</a></li>';
|
|
}
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $lpm1 .'">'. $lpm1 .'</a></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $lastpage . '">'. $lastpage .'</a></li>';
|
|
}
|
|
//close to end; only hide early pages
|
|
else
|
|
{
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring .'1">1</a></li>';
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring .'2">2</a></li>';
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
|
|
for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
|
|
{
|
|
if ($counter == $page)
|
|
$pagination .= '<li class="page-item active"><span class="page-link">'. $counter .'</span></li>';
|
|
else
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $counter .'">'. $counter .'</a></li>';
|
|
}
|
|
}
|
|
}
|
|
|
|
//older button
|
|
if ($page < $counter - 1)
|
|
$pagination .= '<li class="page-item"><a class="page-link" href="'. $pagestring . $next .'">'. i18n('Older') .' »</a></li>';
|
|
else
|
|
$pagination .= '<li class="page-item disabled"><span class="page-link">'. i18n('Older') .' »</span></li>';
|
|
$pagination .= '</ul>';
|
|
}
|
|
|
|
return $pagination;
|
|
|
|
}
|
|
|
|
// Get the meta description
|
|
function get_description($string, $char = null)
|
|
{
|
|
if(empty($char)) {
|
|
$char = config('description.char');
|
|
if(empty($char)) {
|
|
$char = 150;
|
|
}
|
|
}
|
|
if (strlen(strip_tags($string)) < $char) {
|
|
return safe_html(strip_tags($string));
|
|
} else {
|
|
$string = safe_html(strip_tags($string));
|
|
$string = substr($string, 0, $char);
|
|
$string = substr($string, 0, strrpos($string, ' '));
|
|
return $string;
|
|
}
|
|
|
|
}
|
|
|
|
// Get the teaser
|
|
function get_teaser($string, $url = null, $char = null)
|
|
{
|
|
$teaserType = config('teaser.type');
|
|
$more = config('read.more');
|
|
$behave = config('teaser.behave');
|
|
|
|
if(empty($more)) {
|
|
$more = 'Read more';
|
|
}
|
|
|
|
if(empty($char)) {
|
|
$char = config('teaser.char');
|
|
if(empty($char)) {
|
|
$char = 200;
|
|
}
|
|
}
|
|
|
|
if ($teaserType === 'full') {
|
|
$readMore = explode('<!--more-->', $string);
|
|
if (isset($readMore['1'])) {
|
|
$string = replace_href($readMore['0'], 'a', 'footnote-ref', $url);
|
|
return $string . '<div class="jump-link"><a class="read-more btn btn-cta-secondary" href="'. $url .'#more">' . $more . '</a></div>';
|
|
} else {
|
|
return $string;
|
|
}
|
|
} else {
|
|
if ($behave === 'check') {
|
|
$readMore = explode('<!--more-->', $string);
|
|
if (isset($readMore['1'])) {
|
|
$string = shorten($readMore[0]);
|
|
return $string;
|
|
} else {
|
|
$string = shorten($string, $char);
|
|
return $string;
|
|
}
|
|
} else {
|
|
$string = shorten($string, $char);
|
|
return $string;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Shorten the string
|
|
function shorten($string = null, $char = null)
|
|
{
|
|
if(empty($string)) {
|
|
return;
|
|
}
|
|
$string = str_replace('<span class="details">'. config('toc.label') .'</span>', '', $string);
|
|
libxml_use_internal_errors(true);
|
|
$dom = new DOMDocument();
|
|
$dom->loadHTML('<span class="dom-charset"><meta charset="utf8"></span>' . $string);
|
|
$tags_to_remove = array('script', 'style');
|
|
foreach($tags_to_remove as $tag){
|
|
$element = $dom->getElementsByTagName($tag);
|
|
foreach($element as $item){
|
|
$item->parentNode->removeChild($item);
|
|
}
|
|
}
|
|
$string = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', mb_convert_encoding($dom->saveHTML($dom->documentElement), 'UTF-8'));
|
|
$string = preg_replace('/\s\s+/', ' ', strip_tags($string));
|
|
$string = ltrim(rtrim($string));
|
|
$string = str_replace('<span class="dom-charset"><meta charset="utf8"></span>', '', $string);
|
|
if (!empty($char)) {
|
|
if (strlen($string) > $char) {
|
|
$string = substr($string, 0, $char);
|
|
$string = substr($string, 0, strrpos($string, ' '));
|
|
}
|
|
}
|
|
return $string;
|
|
|
|
}
|
|
|
|
// Get thumbnail from image and Youtube.
|
|
function get_thumbnail($text, $url = null)
|
|
{
|
|
if (config('img.thumbnail') == 'true') {
|
|
|
|
$teaserType = config('teaser.type');
|
|
|
|
if (strlen(strip_tags($text)) > config('teaser.char') && $teaserType === 'trimmed') {
|
|
|
|
libxml_use_internal_errors(true);
|
|
$default = config('default.thumbnail');
|
|
$dom = new DOMDocument();
|
|
$dom->loadHtml('<meta charset="utf8">' . $text);
|
|
$imgTags = $dom->getElementsByTagName('img');
|
|
$vidTags = $dom->getElementsByTagName('iframe');
|
|
if ($imgTags->length > 0) {
|
|
$imgElement = $imgTags->item(0);
|
|
$imgSource = $imgElement->getAttribute('src');
|
|
if (!empty($url)) {
|
|
return $imgSource;
|
|
} else {
|
|
return '<div class="thumbnail" style="background-image:url(' . $imgSource . ');"></div>';
|
|
}
|
|
} 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';
|
|
if (!empty($url)) {
|
|
return $vidThumb;
|
|
} else {
|
|
return '<div class="thumbnail" style="background-image:url(' . $vidThumb . ');"></div>';
|
|
}
|
|
}
|
|
} else {
|
|
if (!empty($default)) {
|
|
if (!empty($url)) {
|
|
return $default;
|
|
} else {
|
|
return '<div class="thumbnail" style="background-image:url(' . $default . ');"></div>';
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// Ignore
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get image from post and Youtube thumbnail.
|
|
function get_image($text, $width = null, $height = null)
|
|
{
|
|
libxml_use_internal_errors(true);
|
|
$dom = new DOMDocument();
|
|
$dom->loadHtml('<meta charset="utf8">' . $text);
|
|
$imgTags = $dom->getElementsByTagName('img');
|
|
$vidTags = $dom->getElementsByTagName('iframe');
|
|
if ($imgTags->length > 0) {
|
|
$imgElement = $imgTags->item(0);
|
|
$imgSource = $imgElement->getAttribute('src');
|
|
if(is_null($width)) {
|
|
return $imgSource;
|
|
} else {
|
|
return create_thumb($imgSource, $width, $height);
|
|
}
|
|
} 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] . '/sddefault.jpg';
|
|
return $vidThumb;
|
|
}
|
|
} else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Return edit tab on post
|
|
function tab($p)
|
|
{
|
|
$user = $_SESSION[site_url()]['user'];
|
|
$role = user('role', $user);
|
|
$tab = '';
|
|
if (isset($p->author)) {
|
|
if ($user === $p->author || $role === 'editor' || $role === 'admin') {
|
|
$tab = '<div class="tab"><ul class="nav nav-tabs"><li role="presentation" class="active"><a href="' . $p->url . '">' . i18n('View') .'</a></li><li><a href="' . $p->url . '/edit?destination=post">'. i18n('Edit') .'</a></li></ul></div>';
|
|
}
|
|
} else {
|
|
if ($p->url) {
|
|
if ($role === 'editor' || $role === 'admin') {
|
|
$tab = '<div class="tab"><ul class="nav nav-tabs"><li role="presentation" class="active"><a href="' . $p->url . '">' . i18n('View') .'</a></li><li><a href="' . $p->url . '/edit?destination=post">'. i18n('Edit') .'</a></li></ul></div>';
|
|
}
|
|
}
|
|
}
|
|
return $tab;
|
|
}
|
|
|
|
// Social links
|
|
function social($class = null)
|
|
{
|
|
$twitter = config('social.twitter');
|
|
$facebook = config('social.facebook');
|
|
$instagram = config('social.instagram');
|
|
$linkedin = config('social.linkedin');
|
|
$github = config('social.github');
|
|
$youtube = config('social.youtube');
|
|
$mastodon = config('social.mastodon');
|
|
$tiktok = config('social.tiktok');
|
|
$rss = site_url() . 'feed/rss';
|
|
$social = '';
|
|
|
|
$social .= '<div class="social-logo ' . $class . '">';
|
|
$social .= '<link rel="stylesheet" id="social-logo-style" href="'. site_url() .'system/resources/css/social-logos.css" type="text/css" media="all">';
|
|
if (!empty($twitter)) {
|
|
$social .= '<a class="social-logo-x" href="' . $twitter . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Twitter</span></a>';
|
|
}
|
|
|
|
if (!empty($facebook)) {
|
|
$social .= '<a class="social-logo-facebook" href="' . $facebook . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Facebook</span></a>';
|
|
}
|
|
|
|
if (!empty($instagram)) {
|
|
$social .= '<a class="social-logo-instagram" href="' . $instagram . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Instagram</span></a>';
|
|
}
|
|
|
|
if (!empty($linkedin)) {
|
|
$social .= '<a class="social-logo-linkedin" href="' . $linkedin . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Linkedin</span></a>';
|
|
}
|
|
|
|
if (!empty($github)) {
|
|
$social .= '<a class="social-logo-github" href="' . $github . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Github</span></a>';
|
|
}
|
|
|
|
if (!empty($youtube)) {
|
|
$social .= '<a class="social-logo-youtube" href="' . $youtube . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Youtube</span></a>';
|
|
}
|
|
|
|
if (!empty($mastodon)) {
|
|
$social .= '<a class="social-logo-mastodon" href="' . $mastodon . '" target="_blank" rel="nofollow"><span class="screen-reader-text">Mastodon</span></a>';
|
|
}
|
|
|
|
if (!empty($tiktok)) {
|
|
$social .= '<a class="social-logo-tiktok" href="' . $tiktok . '" target="_blank" rel="nofollow"><span class="screen-reader-text">TikTok</span></a>';
|
|
}
|
|
|
|
$social .= '<a class="social-logo-feed" href="' . $rss . '" target="_blank"><span class="screen-reader-text">RSS</span></a>';
|
|
$social .= '</div>';
|
|
return $social;
|
|
}
|
|
|
|
// Copyright
|
|
function copyright()
|
|
{
|
|
$blogcp = blog_copyright();
|
|
$credit = 'Powered by <a href="http://www.htmly.com" target="_blank" rel="nofollow">HTMLy</a>';
|
|
|
|
if (!empty($blogcp)) {
|
|
return $copyright = '<span class="copyright">' . $blogcp . '</span> <span class="credit">' . $credit . '</span>';
|
|
} else {
|
|
return $credit = '<span class="credit">' . $credit . '</span>';
|
|
}
|
|
}
|
|
|
|
// Disqus on post.
|
|
function disqus($title = null, $url = null)
|
|
{
|
|
$comment = config('comment.system');
|
|
$disqus = config('disqus.shortname');
|
|
$script = <<<EOF
|
|
<script type="text/javascript">
|
|
var getAbsolutePath = function(href) {
|
|
var link = document.createElement('a');
|
|
link.href = href;
|
|
return link.href;
|
|
};
|
|
var disqus_shortname = '{$disqus}';
|
|
var disqus_title = '{$title}';
|
|
var disqus_url = getAbsolutePath('{$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);
|
|
})();
|
|
</script>
|
|
EOF;
|
|
if (!empty($disqus) && $comment == 'disqus') {
|
|
return $script;
|
|
}
|
|
}
|
|
|
|
// Disqus comment count on teaser
|
|
function disqus_count()
|
|
{
|
|
$comment = config('comment.system');
|
|
$disqus = config('disqus.shortname');
|
|
$script = <<<EOF
|
|
<script type="text/javascript">
|
|
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);
|
|
})();
|
|
</script>
|
|
EOF;
|
|
if (!empty($disqus) && $comment == 'disqus') {
|
|
return $script;
|
|
}
|
|
}
|
|
|
|
// Disqus recent comments
|
|
function recent_comments()
|
|
{
|
|
$comment = config('comment.system');
|
|
$disqus = config('disqus.shortname');
|
|
$script = <<<EOF
|
|
<script type="text/javascript" src="//{$disqus}.disqus.com/recent_comments_widget.js?num_items=5&hide_avatars=0&avatar_size=48&excerpt_length=200&hide_mods=0"></script>
|
|
EOF;
|
|
if (!empty($disqus) && $comment == 'disqus') {
|
|
return $script;
|
|
}
|
|
}
|
|
|
|
// Facebook comments
|
|
function facebook()
|
|
{
|
|
$comment = config('comment.system');
|
|
$appid = config('fb.appid');
|
|
$lang = locale_language();
|
|
$script = <<<EOF
|
|
<div id="fb-root"></div>
|
|
<script>(function (d, s, id) {
|
|
var js, fjs = d.getElementsByTagName(s)[0];
|
|
if (d.getElementById(id)) return;
|
|
js = d.createElement(s);
|
|
js.id = id;
|
|
js.src = "//connect.facebook.net/{$lang}/all.js#xfbml=1&appId={$appid}";
|
|
fjs.parentNode.insertBefore(js, fjs);
|
|
}(document, 'script', 'facebook-jssdk'));
|
|
</script>
|
|
<style>.fb-comments, .fb_iframe_widget span, .fb-comments iframe {width: 100%!important;}</style>
|
|
EOF;
|
|
|
|
if (!empty($appid) && $comment == 'facebook') {
|
|
return $script;
|
|
}
|
|
}
|
|
|
|
// Google Publisher (Google+ page).
|
|
function publisher()
|
|
{
|
|
$publisher = config('google.publisher');
|
|
if (!empty($publisher)) {
|
|
return $publisher;
|
|
}
|
|
}
|
|
|
|
// Google Analytics
|
|
function analytics()
|
|
{
|
|
$analytics = config('google.analytics.id');
|
|
$gtag = config('google.gtag.id');
|
|
$script = <<<EOF
|
|
<script>
|
|
(function (i,s,o,g,r,a,m) {i['GoogleAnalyticsObject']=r;i[r]=i[r]||function () {
|
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
|
ga('create', '{$analytics}', 'auto');
|
|
ga('send', 'pageview');
|
|
</script>
|
|
EOF;
|
|
$gtagScript = <<<EOF
|
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
<script async src="https://www.googletagmanager.com/gtag/js?id={$gtag}"></script>
|
|
<script>
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('js', new Date());
|
|
gtag('config', '{$gtag}');
|
|
</script>
|
|
EOF;
|
|
if (!empty($gtag)) {
|
|
return $gtagScript;
|
|
} elseif (!empty($analytics)) {
|
|
return $script;
|
|
}
|
|
}
|
|
|
|
function slashUrl($url)
|
|
{
|
|
return rtrim($url, '/') . '/';
|
|
}
|
|
|
|
function parseNodes($nodes, $child = null, $class = null)
|
|
{
|
|
if (empty($child)) {
|
|
$ul = '<ul class="nav navbar-nav '.$class.'">';
|
|
foreach ($nodes as $node) {
|
|
if (isset($node->children)) {
|
|
$ul .= parseNode($node, true);
|
|
} else {
|
|
$ul .= parseNode($node);
|
|
}
|
|
}
|
|
$ul .= '</ul>';
|
|
return $ul;
|
|
} else {
|
|
$ul = '<ul class="subnav dropdown-menu" role="menu">';
|
|
foreach ($nodes as $node) {
|
|
if (isset($node->children)) {
|
|
$ul .= parseNode($node, true);
|
|
} else {
|
|
$ul .= parseNode($node);
|
|
}
|
|
}
|
|
$ul .= '</ul>';
|
|
return $ul;
|
|
}
|
|
}
|
|
|
|
function parseNode($node, $child = null)
|
|
{
|
|
$req = strtok($_SERVER["REQUEST_URI"],'?');
|
|
$url = parse_url(slashUrl($node->slug));
|
|
$su = parse_url(site_url());
|
|
if (empty($child)) {
|
|
|
|
if (isset($url['host']) && isset($su['host'])) {
|
|
if ($url['host'] == $su['host']) {
|
|
if (slashUrl($url['path']) == slashUrl($req)) {
|
|
$li = '<li class="item nav-item active '.$node->class.'">';
|
|
} else {
|
|
$li = '<li class="item nav-item '.$node->class.'">';
|
|
}
|
|
} else {
|
|
$li = '<li class="item nav-item '.$node->class.'">'; // Link out
|
|
}
|
|
} else {
|
|
if (slashUrl($node->slug) == slashUrl($req)) {
|
|
$li = '<li class="item nav-item active '.$node->class.'">';
|
|
} else {
|
|
$li = '<li class="item nav-item '.$node->class.'">';
|
|
}
|
|
}
|
|
|
|
$li .= '<a class="nav-link" href="'.htmlspecialchars(slashUrl($node->slug), FILTER_SANITIZE_URL).'">'.$node->name.'</a>';
|
|
if (isset($node->children)) {
|
|
$li .= parseNodes($node->children, true, null);
|
|
}
|
|
$li .= '</li>';
|
|
return $li;
|
|
} else {
|
|
|
|
if (isset($url['host']) && isset($su['host'])) {
|
|
if ($url['host'] == $su['host']) {
|
|
if (slashUrl($url['path']) == slashUrl($req)) {
|
|
$li = '<li class="item nav-item dropdown active '.$node->class.'">';
|
|
} else {
|
|
$li = '<li class="item nav-item dropdown '.$node->class.'">';
|
|
}
|
|
} else {
|
|
$li = '<li class="item nav-item dropdown '.$node->class.'">'; // Link out
|
|
}
|
|
} else {
|
|
if (slashUrl($node->slug) == slashUrl($req)) {
|
|
$li = '<li class="item nav-item dropdown active '.$node->class.'">';
|
|
} else {
|
|
$li = '<li class="item nav-item dropdown '.$node->class.'">';
|
|
}
|
|
}
|
|
|
|
$li .= '<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="'.htmlspecialchars(slashUrl($node->slug), FILTER_SANITIZE_URL).'">'.$node->name.'<b class="caret"></b></a>';
|
|
if (isset($node->children)) {
|
|
$li .= parseNodes($node->children, true, null);
|
|
}
|
|
$li .= '</li>';
|
|
return $li;
|
|
}
|
|
}
|
|
|
|
// Menu
|
|
function menu($class = null)
|
|
{
|
|
$filename = "content/data/menu.json";
|
|
if (file_exists($filename)) {
|
|
$json = json_decode(file_get_contents('content/data/menu.json', true));
|
|
$nodes = json_decode($json);
|
|
if (empty($nodes)) {
|
|
return get_menu($class);
|
|
} else {
|
|
$html = parseNodes($nodes, null, $class);
|
|
$output = '';
|
|
libxml_use_internal_errors(true);
|
|
$doc = new DOMDocument();
|
|
$doc->loadHTML('<span class="dom-charset"><meta charset="utf8"></span>' . $html);
|
|
|
|
$finder = new DOMXPath($doc);
|
|
$elements = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' dropdown-menu ')]");
|
|
|
|
// loop through all <ul> with dropdown-menu class
|
|
foreach ($elements as $element) {
|
|
$nodes = $element->childNodes;
|
|
foreach ($nodes as $node) {
|
|
$class = $node->getAttribute('class');
|
|
if (stripos($class, 'active')) {
|
|
$parentClass = $element->parentNode->getAttribute('class') . ' active';
|
|
$element->parentNode->setAttribute('class', $parentClass);
|
|
}
|
|
}
|
|
}
|
|
|
|
$output = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', mb_convert_encoding($doc->saveHTML($doc->documentElement), 'UTF-8'));
|
|
return str_replace('<span class="dom-charset"><meta charset="utf8"></span>', '', $output);
|
|
|
|
}
|
|
} else {
|
|
return get_menu($class);
|
|
}
|
|
}
|
|
|
|
// Get the title from file
|
|
function get_title_from_file($v)
|
|
{
|
|
// Get the contents and convert it to HTML
|
|
$content = MarkdownExtra::defaultTransform(file_get_contents($v));
|
|
|
|
$filename= pathinfo($v, PATHINFO_FILENAME);
|
|
|
|
// Extract the title and body
|
|
return get_content_tag('t', $content, str_replace('-', ' ', $filename));
|
|
}
|
|
|
|
// Auto generate menu from static page
|
|
function get_menu($custom = null, $auto = null)
|
|
{
|
|
$posts = get_static_pages();
|
|
$req = $_SERVER['REQUEST_URI'];
|
|
$menu = '';
|
|
|
|
if (!empty($posts)) {
|
|
|
|
asort($posts);
|
|
|
|
$menu .= '<ul class="nav ' . $custom . '">';
|
|
|
|
if (is_null($auto)) {
|
|
if ($req == site_path() . '/' || stripos($req, site_path() . '/?page') !== false) {
|
|
$menu .= '<li class="item nav-item first active"><a class="nav-link" href="' . site_url() . '">' . config('breadcrumb.home') . '</a></li>';
|
|
} else {
|
|
$menu .= '<li class="item nav-item first"><a class="nav-link" href="' . site_url() . '">' . config('breadcrumb.home') . '</a></li>';
|
|
}
|
|
|
|
if (config('blog.enable') == 'true' ) {
|
|
if ($req == site_path() . '/' . blog_path() || stripos($req, site_path() . '/' . blog_path() . '?page') !== false) {
|
|
$menu .= '<li class="item nav-item active"><a class="nav-link" href="' . site_url() . blog_path() . '">' . blog_string() . '</a></li>';
|
|
} else {
|
|
$menu .= '<li class="item nav-item"><a class="nav-link" href="' . site_url() . blog_path() . '">' . blog_string() . '</a></li>';
|
|
}
|
|
}
|
|
}
|
|
|
|
$i = 0;
|
|
$len = count($posts);
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
if ($i == $len - 1) {
|
|
$class = 'item nav-item last';
|
|
} else {
|
|
$class = 'item nav-item';
|
|
}
|
|
$i++;
|
|
|
|
// Filename string
|
|
|
|
$fn = explode('.', $v['filename']);
|
|
|
|
if (isset($fn[1])) {
|
|
$filename= $fn[1];
|
|
} else {
|
|
$filename= $v['filename'];
|
|
}
|
|
|
|
$url = site_url() . $filename;
|
|
$parent_file = $v['dirname'] . '/' . $v['basename'];
|
|
|
|
$title = get_title_from_file($parent_file);
|
|
|
|
if ($req == site_path() . "/" . $filename || stripos($req, site_path() . "/" . $filename) !== false) {
|
|
$active = ' active';
|
|
$reqBase = '';
|
|
} else {
|
|
$active = '';
|
|
}
|
|
|
|
$subPages = get_static_subpages($filename);
|
|
if (!empty($subPages)) {
|
|
asort($subPages);
|
|
$menu .= '<li class="' . $class . $active .' dropdown">';
|
|
$menu .= '<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="' . $url . '">' . ucwords($title) . '<b class="caret"></b></a>';
|
|
$menu .= '<ul class="subnav dropdown-menu" role="menu">';
|
|
$iSub = 0;
|
|
$countSub = count($subPages);
|
|
foreach ($subPages as $index => $sp) {
|
|
$classSub = "item nav-item";
|
|
if ($iSub == 0) {
|
|
$classSub .= " first";
|
|
}
|
|
if ($iSub == $countSub - 1) {
|
|
$classSub .= " last";
|
|
}
|
|
|
|
$bs = explode('.', $sp['filename']);
|
|
if (isset($bs[1])) {
|
|
$baseSub = $bs[1];
|
|
} else {
|
|
$baseSub= $sp['filename'];
|
|
}
|
|
|
|
$child_file = $sp['dirname'] . '/' . $sp['basename'];
|
|
if ($req == site_path() . "/" . $filename . "/" . $baseSub) {
|
|
$classSub .= ' active';
|
|
}
|
|
$urlSub = $url . "/" . $baseSub;
|
|
$menu .= '<li class="' . $classSub . '"><a class="nav-link" href="' . $urlSub . '">' . get_title_from_file($child_file) . '</a></li>';
|
|
$iSub++;
|
|
}
|
|
$menu .= '</ul>';
|
|
} else {
|
|
$menu .= '<li class="' . $class . $active .'">';
|
|
$menu .= '<a class="nav-link" href="' . $url . '">' . ucwords($title) . '</a>';
|
|
}
|
|
$menu .= '</li>';
|
|
}
|
|
$menu .='</ul>';
|
|
return $menu;
|
|
} else {
|
|
|
|
$menu .= '<ul class="nav ' . $custom . '">';
|
|
if ($req == site_path() . '/') {
|
|
$menu .= '<li class="item nav-item first active"><a class="nav-link" href="' . site_url() . '">' . config('breadcrumb.home') . '</a></li>';
|
|
} else {
|
|
$menu .= '<li class="item nav-item first"><a class="nav-link" href="' . site_url() . '">' . config('breadcrumb.home') . '</a></li>';
|
|
}
|
|
if (config('blog.enable') == 'true' ) {
|
|
if ($req == site_path() . '/' . blog_path() || stripos($req, site_path() . '/'. blog_path() .'?page') !== false) {
|
|
$menu .= '<li class="item nav-item active"><a class="nav-link" href="' . site_url() . blog_path . '">' . blog_string() . '</a></li>';
|
|
} else {
|
|
$menu .= '<li class="item nav-item"><a class="nav-link" href="' . site_url() . blog_path() . '">' . blog_string() . '</a></li>';
|
|
}
|
|
}
|
|
$menu .= '</ul>';
|
|
return $menu;
|
|
}
|
|
}
|
|
|
|
// Search form
|
|
function search($text = null)
|
|
{
|
|
if(!empty($text)) {
|
|
echo <<<EOF
|
|
<form id="search-form" method="get">
|
|
<input type="text" class="search-input" name="search" value="{$text}" onfocus="if (this.value == '{$text}') {this.value = '';}" onblur="if (this.value == '') {this.value = '{$text}';}">
|
|
<input type="submit" value="{$text}" class="search-button">
|
|
</form>
|
|
EOF;
|
|
} else {
|
|
$search = i18n('Search');
|
|
echo <<<EOF
|
|
<form id="search-form" method="get">
|
|
<input type="text" class="search-input" name="search" value="{$search}" onfocus="if (this.value == '{$search}') {this.value = '';}" onblur="if (this.value == '') {this.value = '{$search}';}">
|
|
<input type="submit" value="{$search}" class="search-button">
|
|
</form>
|
|
EOF;
|
|
}
|
|
if (isset($_GET['search'])) {
|
|
$search = _h($_GET['search']);
|
|
$url = site_url() . 'search/' . remove_accent($search);
|
|
header("Location: $url");
|
|
}
|
|
}
|
|
|
|
// The not found error
|
|
function not_found($request = null)
|
|
{
|
|
if (!config('views.root')) die('HTMLy is not installed!');
|
|
$vroot = rtrim(config('views.root'), '/');
|
|
$lt = $vroot . '/layout--404.html.php';
|
|
if (file_exists($lt)) {
|
|
$layout = 'layout--404';
|
|
} else {
|
|
$layout = '';
|
|
}
|
|
|
|
if (config('views.counter') == 'true') {
|
|
if (!is_null($request)) {
|
|
$filename = "content/data/views.json";
|
|
$views = array();
|
|
if (file_exists($filename)) {
|
|
$views = json_decode(file_get_data($filename), true);
|
|
}
|
|
if (isset($views[$request])) {
|
|
unset($views[$request]);
|
|
save_json_pretty($filename, $views);
|
|
}
|
|
}
|
|
}
|
|
|
|
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
|
|
render('404', array(
|
|
'title' => generate_title('is_default', i18n('This_page_doesnt_exist')),
|
|
'description' => i18n('This_page_doesnt_exist'),
|
|
'canonical' => site_url(),
|
|
'metatags' => generate_meta(null, null),
|
|
'breadcrumb' => '<a href="' . site_url() . '">' . config('breadcrumb.home') . '</a> » ' . i18n('This_page_doesnt_exist'),
|
|
'bodyclass' => 'error-404',
|
|
'is_404' => true,
|
|
), $layout);
|
|
die();
|
|
}
|
|
|
|
// Turn an array of posts into an RSS feed
|
|
function generate_rss($posts, $data = null)
|
|
{
|
|
$feed = new Feed();
|
|
$channel = new Channel();
|
|
$rssLength = config('rss.char');
|
|
$data = $data;
|
|
$rssDesc = config('rss.description');
|
|
|
|
if (is_null($data)) {
|
|
$channel
|
|
->title(blog_title())
|
|
->description(blog_description())
|
|
->url(site_url())
|
|
->appendTo($feed);
|
|
} else {
|
|
$channel
|
|
->title($data->title)
|
|
->description(strip_tags($data->body))
|
|
->url($data->url)
|
|
->appendTo($feed);
|
|
}
|
|
if ($posts) {
|
|
foreach ($posts as $p) {
|
|
$img = get_image($p->body);
|
|
if ($rssDesc == "meta") {
|
|
if (!empty($rssLength)) {
|
|
$body = shorten($p->description, $rssLength);
|
|
} else {
|
|
$body = $p->description;
|
|
}
|
|
} else {
|
|
if (!empty($rssLength)) {
|
|
$body = shorten($p->body, $rssLength);
|
|
} else {
|
|
$body = $p->body;
|
|
}
|
|
}
|
|
$item = new Item();
|
|
$item
|
|
->category(strip_tags($p->category));
|
|
$item
|
|
->title($p->title)
|
|
->pubDate($p->date)
|
|
->description($body)
|
|
->url($p->url)
|
|
->appendTo($channel);
|
|
|
|
if (!empty($p->image)) {
|
|
$item->enclosure($p->image, 0, "image/" . pathinfo($p->image, PATHINFO_EXTENSION));
|
|
} elseif (!empty($img)) {
|
|
$item->enclosure($img, 0, "image/" . pathinfo($img, PATHINFO_EXTENSION));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return $feed;
|
|
}
|
|
|
|
// Return post, archive url for sitemap
|
|
function sitemap_post_path($posts, $page = 1, $perpage = 0)
|
|
{
|
|
if (empty($posts)) {
|
|
$posts = get_blog_posts();
|
|
}
|
|
|
|
krsort($posts);
|
|
|
|
$tmp = array();
|
|
|
|
$posts = array_slice($posts, ($page - 1) * $perpage, $perpage);
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$post = new stdClass;
|
|
|
|
$filepath = $v['dirname'] . '/' . $v['basename'];
|
|
|
|
// Extract the date
|
|
$arr = explode('_', $v['basename']);
|
|
|
|
// dirname string
|
|
$dirname = $v['dirname'];
|
|
|
|
// Author string
|
|
$str = explode('/', $dirname);
|
|
$author = $str[1];
|
|
|
|
$post->authorUrl = site_url() . 'author/' . $author;
|
|
|
|
$dt = str_replace($dirname, '', $arr[0]);
|
|
$t = str_replace('-', '', $dt);
|
|
$time = new DateTime($t);
|
|
$timestamp = $time->format("Y-m-d H:i:s");
|
|
|
|
// The post date
|
|
$post->date = strtotime($timestamp);
|
|
$post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($filepath)));
|
|
|
|
// The archive per month
|
|
$post->archivemonth = site_url() . 'archive/' . date('Y-m', $post->date);
|
|
|
|
// The archive per year
|
|
$post->archiveyear = site_url() . 'archive/' . date('Y', $post->date);
|
|
|
|
// The post URL
|
|
if (permalink_type() == 'default') {
|
|
$post->url = site_url() . date('Y/m', $post->date) . '/' . str_replace('.md', '', $arr[2]);
|
|
} else {
|
|
$post->url = site_url() . permalink_type() . '/' . str_replace('.md', '', $arr[2]);
|
|
}
|
|
|
|
$tmp[] = $post;
|
|
}
|
|
|
|
return $tmp;
|
|
}
|
|
|
|
// Return static page path for sitemap
|
|
function sitemap_page_path()
|
|
{
|
|
$posts = get_static_pages();
|
|
|
|
$tmp = array();
|
|
|
|
if (!empty($posts)) {
|
|
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$post = new stdClass;
|
|
|
|
$fn = explode('.', $v['filename']);
|
|
|
|
if (isset($fn[1])) {
|
|
$filename = $fn[1];
|
|
} else {
|
|
$filename= $v['filename'];
|
|
}
|
|
|
|
$file = $v['dirname'] . '/' . $v['basename'];
|
|
$post->url = site_url() . $filename;
|
|
$post->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($file)));
|
|
|
|
$tmp[] = $post;
|
|
|
|
$subPages = get_static_subpages($filename);
|
|
|
|
foreach ($subPages as $sIndex => $sp) {
|
|
|
|
$subpost = new stdClass;
|
|
|
|
$bs = explode('.', $sp['filename']);
|
|
|
|
if (isset($bs[1])) {
|
|
$baseSub = $bs[1];
|
|
} else {
|
|
$baseSub = $sp['filename'];
|
|
}
|
|
|
|
$urlSub = $filename . '/' . $baseSub;
|
|
$subfile = $sp['dirname'] . '/' . $sp['basename'];
|
|
$subpost->url = site_url() . $urlSub;
|
|
$subpost->lastMod = strtotime(date('Y-m-d H:i:s', filemtime($subfile)));
|
|
|
|
$tmp[] = $subpost;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $tmp;
|
|
}
|
|
|
|
// Generate sitemap.xml.
|
|
function generate_sitemap($str)
|
|
{
|
|
$default_priority = '0.5';
|
|
$map = '';
|
|
|
|
header('X-Robots-Tag: noindex');
|
|
|
|
$map .= '<?xml version="1.0" encoding="UTF-8"?>';
|
|
|
|
if ($str == 'index.xml') {
|
|
|
|
$map .= '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if (config('sitemap.priority.base') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.base.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.post') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.post.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.static') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.static.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.category') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.category.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.tag') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.tag.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.archiveDay') !== '-1' || config('sitemap.priority.archiveMonth') !== '-1' || config('sitemap.priority.archiveYear') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.archive.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.author') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.author.xml</loc></sitemap>';
|
|
}
|
|
|
|
if (config('sitemap.priority.type') !== '-1') {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.type.xml</loc></sitemap>';
|
|
}
|
|
|
|
$map .= '</sitemapindex>';
|
|
|
|
} elseif ($str == 'base.xml') {
|
|
|
|
$priority = (config('sitemap.priority.base')) ? config('sitemap.priority.base') : '1.0';
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if ($priority !== '-1') {
|
|
$map .= '<url><loc>' . site_url() . '</loc><priority>' . $priority . '</priority></url>';
|
|
if (config('blog.enable') === 'true') {
|
|
$map .= '<url><loc>' . site_url() . blog_path() .'</loc><priority>' . $priority . '</priority></url>';
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif (strpos($str, 'post.') !== false ) {
|
|
|
|
if ($str == 'post.xml') {
|
|
|
|
$map .= '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
$totalPosts = array();
|
|
$totalPosts = get_blog_posts();
|
|
|
|
$total = count($totalPosts);
|
|
$totalPage = ceil($total / 500);
|
|
|
|
for ($i = 1; $i <= $totalPage; $i++) {
|
|
$map .= '<sitemap><loc>' . site_url() . 'sitemap.post.'. $i .'.xml</loc></sitemap>';
|
|
}
|
|
|
|
$map .= '</sitemapindex>';
|
|
|
|
} else {
|
|
|
|
$priority = (config('sitemap.priority.post')) ? config('sitemap.priority.post') : $default_priority;
|
|
|
|
$posts = array();
|
|
$arr = explode('.', $str);
|
|
if ($priority !== '-1') {
|
|
$posts = sitemap_post_path(null, $arr[1], 500);
|
|
}
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
foreach ($posts as $p) {
|
|
|
|
$map .= '<url><loc>' . $p->url . '</loc><priority>' . $priority . '</priority><lastmod>' . date('Y-m-d\TH:i:sP', $p->lastMod) . '</lastmod></url>';
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
}
|
|
|
|
} elseif ($str == 'static.xml') {
|
|
|
|
$priority = (config('sitemap.priority.static')) ? config('sitemap.priority.static') : $default_priority;
|
|
|
|
$posts = array();
|
|
if ($priority !== '-1') {
|
|
$posts = sitemap_page_path();
|
|
}
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
foreach ($posts as $p) {
|
|
|
|
$map .= '<url><loc>' . $p->url . '</loc><priority>' . $priority . '</priority><lastmod>' . date('Y-m-d\TH:i:sP', $p->lastMod) . '</lastmod></url>';
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif ($str == 'tag.xml') {
|
|
|
|
$priority = (config('sitemap.priority.tag')) ? config('sitemap.priority.tag') : $default_priority;
|
|
|
|
$posts = array();
|
|
if ($priority !== '-1') {
|
|
$posts = get_blog_posts();
|
|
}
|
|
|
|
$tags = array();
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if($posts) {
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$arr = explode('_', $v['filename']);
|
|
$data = $arr[1];
|
|
$mtag = explode(',', $data);
|
|
foreach ($mtag as $etag) {
|
|
$tags[] = strtolower($etag);
|
|
}
|
|
}
|
|
|
|
foreach ($tags as $t) {
|
|
$tag[] = site_url() . 'tag/' . strtolower($t);
|
|
}
|
|
|
|
if (isset($tag)) {
|
|
|
|
$tag = array_unique($tag, SORT_REGULAR);
|
|
|
|
foreach ($tag as $t) {
|
|
$map .= '<url><loc>' . $t . '</loc><priority>' . $priority . '</priority></url>';
|
|
}
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif ($str == 'archive.xml') {
|
|
|
|
$priorityMonth = (config('sitemap.priority.archiveMonth')) ? config('sitemap.priority.archiveMonth') : $default_priority;
|
|
$priorityYear = (config('sitemap.priority.archiveYear')) ? config('sitemap.priority.archiveYear') : $default_priority;
|
|
|
|
$posts = sitemap_post_path(null, 1, null);
|
|
$month = array();
|
|
$year = array();
|
|
|
|
foreach ($posts as $p) {
|
|
$month[] = $p->archivemonth;
|
|
$year[] = $p->archiveyear;
|
|
}
|
|
|
|
$month = array_unique($month, SORT_REGULAR);
|
|
$year = array_unique($year, SORT_REGULAR);
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if ($priorityYear !== '-1') {
|
|
foreach ($year as $y) {
|
|
$map .= '<url><loc>' . $y . '</loc><priority>' . $priorityYear . '</priority></url>';
|
|
}
|
|
}
|
|
|
|
if ($priorityMonth !== '-1') {
|
|
foreach ($month as $m) {
|
|
$map .= '<url><loc>' . $m . '</loc><priority>' . $priorityMonth . '</priority></url>';
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif ($str == 'author.xml') {
|
|
|
|
$priority = (config('sitemap.priority.author')) ? config('sitemap.priority.author') : $default_priority;
|
|
|
|
$author = array();
|
|
if ($priority !== '-1') {
|
|
|
|
$posts = sitemap_post_path(null, 1, null);
|
|
|
|
foreach ($posts as $p) {
|
|
$author[] = $p->authorUrl;
|
|
}
|
|
|
|
$author = array_unique($author, SORT_REGULAR);
|
|
}
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if ($priority !== '-1') {
|
|
foreach ($author as $a) {
|
|
$map .= '<url><loc>' . $a . '</loc><priority>' . $priority . '</priority></url>';
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif ($str == 'category.xml') {
|
|
|
|
$priority = (config('sitemap.priority.category')) ? config('sitemap.priority.category') : $default_priority;
|
|
|
|
$posts = array();
|
|
if ($priority !== '-1') {
|
|
$posts = get_blog_posts();
|
|
}
|
|
|
|
$cats = array();
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if($posts) {
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$dirname = $v['dirname'];
|
|
$str = explode('/', $dirname);
|
|
$cats[] = $str[3];
|
|
|
|
}
|
|
|
|
foreach ($cats as $c) {
|
|
$cat[] = site_url() . 'category/' . strtolower($c);
|
|
}
|
|
|
|
if (isset($cat)) {
|
|
|
|
$cat = array_unique($cat, SORT_REGULAR);
|
|
|
|
foreach ($cat as $c) {
|
|
$map .= '<url><loc>' . $c . '</loc><priority>' . $priority . '</priority></url>';
|
|
}
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
|
|
} elseif ($str == 'type.xml') {
|
|
|
|
$priority = (config('sitemap.priority.type')) ? config('sitemap.priority.type') : $default_priority;
|
|
|
|
$posts = array();
|
|
if ($priority !== '-1') {
|
|
$posts = get_blog_posts();
|
|
}
|
|
|
|
$cats = array();
|
|
|
|
$map .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
|
|
|
|
if($posts) {
|
|
foreach ($posts as $index => $v) {
|
|
|
|
$dirname = $v['dirname'];
|
|
$str = explode('/', $dirname);
|
|
$types[] = $str[4];
|
|
}
|
|
|
|
foreach ($types as $t) {
|
|
$type[] = site_url() . 'type/' . strtolower($t);
|
|
}
|
|
|
|
if (isset($type)) {
|
|
|
|
$type = array_unique($type, SORT_REGULAR);
|
|
|
|
foreach ($type as $t) {
|
|
$map .= '<url><loc>' . $t . '</loc><priority>' . $priority . '</priority></url>';
|
|
}
|
|
}
|
|
}
|
|
|
|
$map .= '</urlset>';
|
|
}
|
|
echo $map;
|
|
}
|
|
|
|
// Function to generate OPML file
|
|
function generate_opml()
|
|
{
|
|
$opml_data = array(
|
|
'head' => array(
|
|
'title' => blog_title() . ' OPML File',
|
|
'ownerName' => blog_title(),
|
|
'ownerId' => site_url()
|
|
),
|
|
'body' => array(
|
|
array(
|
|
'text' => blog_title(),
|
|
'description' => blog_description(),
|
|
'htmlUrl' => site_url(),
|
|
'language' => 'unknown',
|
|
'title' => blog_title(),
|
|
'type' => 'rss',
|
|
'version' => 'RSS2',
|
|
'xmlUrl' => site_url() . 'feed/rss'
|
|
)
|
|
)
|
|
);
|
|
|
|
$opml = new opml($opml_data);
|
|
return $opml->render();
|
|
}
|
|
|
|
// Turn an array of posts into a JSON
|
|
function generate_json($posts)
|
|
{
|
|
return json_encode($posts);
|
|
}
|
|
|
|
// TRUE if the current page is an index page like frontpage, tag index, archive index and search index.
|
|
function is_index()
|
|
{
|
|
if (blog_path() == permalink_type()) {
|
|
$req = rtrim(strtok($_SERVER["REQUEST_URI"], '?'), '/') . '/';
|
|
$in = explode('/' . blog_path(), $req);
|
|
if (isset($in[1])) {
|
|
if ($in[1] == '/') {
|
|
return true;
|
|
}
|
|
}
|
|
if (stripos($req, '/category/') !== false || stripos($req, '/archive/') !== false || stripos($req, '/tag/') !== false || stripos($req, '/search/') !== false || stripos($req, '/type/') !== false || $req == site_path() . '/') {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
$req = strtok($_SERVER["REQUEST_URI"], '?');
|
|
if (stripos($req, '/category/') !== false || stripos($req, '/archive/') !== false || stripos($req, '/tag/') !== false || stripos($req, '/search/') !== false || stripos($req, '/type/') !== false || stripos($req, '/' . blog_path()) !== false || $req == site_path() . '/') {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return post permalink type
|
|
function permalink_type()
|
|
{
|
|
$permalink = config('permalink.type');
|
|
if (!is_null($permalink) && !empty($permalink)) {
|
|
return strtolower(str_replace('/', '', $permalink));
|
|
}
|
|
return 'default';
|
|
}
|
|
|
|
// Return blog path index
|
|
function blog_path()
|
|
{
|
|
$path = config('blog.path');
|
|
if (!is_null($path) && !empty($path)) {
|
|
return strtolower(str_replace('/', '', $path));
|
|
}
|
|
return 'blog';
|
|
}
|
|
|
|
// Return blog string
|
|
function blog_string()
|
|
{
|
|
$string = config('blog.string');
|
|
if (!is_null($string) && !empty($string)) {
|
|
return $string;
|
|
}
|
|
return 'Blog';
|
|
}
|
|
|
|
// Return blog title
|
|
function blog_title()
|
|
{
|
|
return config('blog.title');
|
|
}
|
|
|
|
// Return blog tagline
|
|
function blog_tagline()
|
|
{
|
|
return config('blog.tagline');
|
|
}
|
|
|
|
// Return blog description
|
|
function blog_description()
|
|
{
|
|
return config('blog.description');
|
|
}
|
|
|
|
// Return blog copyright
|
|
function blog_copyright()
|
|
{
|
|
return config('blog.copyright');
|
|
}
|
|
|
|
// Return blog language
|
|
function blog_language()
|
|
{
|
|
$lang = config('language');
|
|
if (!empty($lang)) {
|
|
$exp = explode('_', $lang);
|
|
return $exp[0] . '-' . $exp[1];
|
|
}
|
|
return 'en-US';
|
|
}
|
|
|
|
// Return locale language
|
|
function locale_language()
|
|
{
|
|
$lang = config('language');
|
|
if (!empty($lang)) {
|
|
$exp = explode('_', $lang);
|
|
return $exp[0] . '_' . $exp[1];
|
|
}
|
|
return 'en_US';
|
|
}
|
|
|
|
// Output head contents
|
|
function head_contents()
|
|
{
|
|
$output = '';
|
|
$wmt_id = config('google.wmt.id');
|
|
if (config('show.version') !== 'false') {
|
|
$version = 'HTMLy ' . constant('HTMLY_VERSION');
|
|
} else {
|
|
$version = 'HTMLy';
|
|
}
|
|
$favicon = config('favicon.image');
|
|
if (empty($favicon)) {
|
|
$favicon = '<link rel="icon" type="image/png" href="' . site_url() . 'favicon.png" />' . "\n";
|
|
} else {
|
|
$favicon = '<link rel="icon" type="image/'. pathinfo($favicon, PATHINFO_EXTENSION) .'" href="' . $favicon . '" />' . "\n";
|
|
}
|
|
$output .= '<meta charset="utf-8" />' . "\n";
|
|
$output .= '<meta http-equiv="X-UA-Compatible" content="IE=edge" />' . "\n";
|
|
$output .= '<meta name="viewport" content="width=device-width, initial-scale=1" />' . "\n";
|
|
$output .= '<meta name="generator" content="' . $version . '" />' . "\n";
|
|
$output .= $favicon;
|
|
$output .= '<link rel="sitemap" href="' . site_url() . 'sitemap.xml" />' . "\n";
|
|
$output .= '<link rel="alternate" type="application/rss+xml" title="' . blog_title() . ' Feed" href="' . site_url() . 'feed/rss" />' . "\n";
|
|
if (!empty($wmt_id)) {
|
|
$output .= '<meta name="google-site-verification" content="' . $wmt_id . '" />' . "\n";
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
// File cache
|
|
function file_cache($request)
|
|
{
|
|
if (config('cache.off') == 'true') return;
|
|
$hour = config('cache.expiration');
|
|
if (empty($hour)) {
|
|
$hour = 6;
|
|
}
|
|
|
|
$now = time();
|
|
$c = str_replace('/', '#', str_replace('?', '~', rawurldecode($request)));
|
|
$cachefile = 'cache/page/' . $c . '.cache';
|
|
if (file_exists($cachefile)) {
|
|
if ($now - filemtime($cachefile) >= 60 * 60 * $hour) {
|
|
unlink($cachefile);
|
|
} else {
|
|
header('Content-type: text/html; charset=utf-8');
|
|
readfile($cachefile);
|
|
die;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add page views count
|
|
function add_view($page)
|
|
{
|
|
$dir = 'content/data/';
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
$filename = "content/data/views.json";
|
|
$views = array();
|
|
if (file_exists($filename)) {
|
|
$views = json_decode(file_get_data($filename), true);
|
|
}
|
|
if (isset($views[$page])) {
|
|
$views[$page]++;
|
|
save_json_pretty($filename, $views);
|
|
} else {
|
|
if (isset($views['flock_fail'])) {
|
|
return;
|
|
} else {
|
|
$views[$page] = 1;
|
|
save_json_pretty($filename, $views);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get the page views count
|
|
function get_views($page, $oldID = null, $views = null)
|
|
{
|
|
$filename = "content/data/views.json";
|
|
|
|
if (is_null($views)) {
|
|
if (file_exists($filename)) {
|
|
$views = json_decode(file_get_contents($filename), true);
|
|
}
|
|
}
|
|
|
|
if (!is_null($oldID)) {
|
|
if (isset($views[$oldID])) {
|
|
if (file_exists($filename)) {
|
|
$views = json_decode(file_get_data($filename), true);
|
|
}
|
|
if (isset($views['flock_fail'])) {
|
|
return -1;
|
|
} else {
|
|
$arr = replace_key($views, $oldID, $page);
|
|
save_json_pretty($filename, $arr);
|
|
}
|
|
return $views[$oldID];
|
|
} else {
|
|
if (isset($views[$page])) {
|
|
return $views[$page];
|
|
}
|
|
}
|
|
} else {
|
|
if (isset($views[$page])) {
|
|
return $views[$page];
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// Get tag inside the markdown files
|
|
function get_content_tag($tag, $string, $alt = null)
|
|
{
|
|
$reg = '/\<!--' . $tag . '(.+)' . $tag . '--\>/';
|
|
$ary = array();
|
|
if (preg_match($reg, $string, $ary)) {
|
|
if (isset($ary[1])) {
|
|
$result = trim($ary[1]);
|
|
if (!empty($result)) {
|
|
return $result;
|
|
}
|
|
}
|
|
}
|
|
return $alt;
|
|
}
|
|
|
|
// Strip html comment
|
|
function remove_html_comments($content)
|
|
{
|
|
$patterns = array('/(\s|)<!--t(.*)t-->(\s|)/', '/(\s|)<!--d(.*)d-->(\s|)/', '/(\s|)<!--tag(.*)tag-->(\s|)/', '/(\s|)<!--image(.*)image-->(\s|)/', '/(\s|)<!--video(.*)video-->(\s|)/', '/(\s|)<!--audio(.*)audio-->(\s|)/', '/(\s|)<!--link(.*)link-->(\s|)/', '/(\s|)<!--quote(.*)quote-->(\s|)/', '/(\s|)<!--post(.*)post-->(\s|)/');
|
|
return preg_replace($patterns, '', $content);
|
|
}
|
|
|
|
// Google recaptcha
|
|
function isCaptcha($reCaptchaResponse)
|
|
{
|
|
$url = "https://www.google.com/recaptcha/api/siteverify";
|
|
$options = array(
|
|
"secret" => config("login.protect.private"),
|
|
"response" => $reCaptchaResponse,
|
|
"remoteip" => $_SERVER['REMOTE_ADDR'],
|
|
);
|
|
$fileContent = @file_get_contents($url . "?" . http_build_query($options));
|
|
if ($fileContent === false) {
|
|
return false;
|
|
}
|
|
$json = json_decode($fileContent, true);
|
|
if ($json == false) {
|
|
return false;
|
|
}
|
|
return ($json['success']);
|
|
}
|
|
|
|
// Cloudflare Turnstile
|
|
function isTurnstile($turnstileResponse)
|
|
{
|
|
$public = config("login.protect.public");
|
|
$private = config("login.protect.private");
|
|
$ip = $_SERVER['REMOTE_ADDR'];
|
|
|
|
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
|
|
$data = array('secret' => $private, 'response' => $turnstileResponse, 'remoteip' => $ip);
|
|
|
|
$query = http_build_query($data);
|
|
$options = array(
|
|
'http' => array(
|
|
'header' => "Content-Type: application/x-www-form-urlencoded\r\n".
|
|
"Content-Length: ".strlen($query)."\r\n".
|
|
"User-Agent:HTMLy/1.0\r\n",
|
|
'method' => "POST",
|
|
'content' => $query,
|
|
)
|
|
);
|
|
|
|
$stream = stream_context_create($options);
|
|
$fileContent = file_get_contents($url, false, $stream);
|
|
|
|
if ($fileContent === false) {
|
|
return false;
|
|
}
|
|
$json = json_decode($fileContent, true);
|
|
if ($json == false) {
|
|
return false;
|
|
}
|
|
return ($json['success']);
|
|
}
|
|
|
|
// Get video ID
|
|
function get_video_id($url)
|
|
{
|
|
if(empty($url)) {
|
|
return;
|
|
}
|
|
|
|
$link = parse_url($url);
|
|
|
|
if(!isset($link['host'])) {
|
|
return $url;
|
|
}
|
|
|
|
if (stripos($link['host'], 'youtube.com') !== false || stripos($link['host'], 'youtu.be') !== false) {
|
|
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
|
|
return $match[1];
|
|
} elseif (stripos($link['host'], 'vimeo.com') !== false) {
|
|
preg_match('%^https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)(?:[?]?.*)$%im', $url, $match);
|
|
return $match[3];
|
|
} else {
|
|
return $url;
|
|
}
|
|
}
|
|
|
|
// translate tag to i18n
|
|
function tag_i18n($tag)
|
|
{
|
|
static $tags = array();
|
|
|
|
if (empty($tags)) {
|
|
$filename = "content/data/tags.lang";
|
|
if (file_exists($filename)) {
|
|
$tags = unserialize(file_get_contents($filename));
|
|
}
|
|
}
|
|
if (isset($tags[$tag])) {
|
|
return $tags[$tag];
|
|
}
|
|
return $tag;
|
|
}
|
|
|
|
// return html safe string
|
|
function safe_html($string)
|
|
{
|
|
$string = htmlspecialchars($string, ENT_QUOTES);
|
|
$string = preg_replace('/\r\n|\r|\n/', ' ', $string);
|
|
$string = preg_replace('/\s\s+/', ' ', $string);
|
|
$string = ltrim(rtrim($string));
|
|
return $string;
|
|
}
|
|
|
|
// Replace href
|
|
function replace_href($string, $tag, $class, $url)
|
|
{
|
|
|
|
libxml_use_internal_errors(true);
|
|
|
|
// Load the HTML in DOM
|
|
$doc = new DOMDocument();
|
|
$doc->loadHTML('<span class="dom-charset"><meta charset="utf8"></span>' . $string);
|
|
$output = '';
|
|
// Then select all anchor tags
|
|
$all_anchor_tags = $doc->getElementsByTagName($tag);
|
|
foreach ($all_anchor_tags as $_tag) {
|
|
if ($_tag->getAttribute('class') == $class) {
|
|
// If match class get the href value
|
|
$old = $_tag->getAttribute('href');
|
|
$new = $_tag->setAttribute('href', $url . mb_convert_encoding($old, 'UTF-8'));
|
|
}
|
|
}
|
|
|
|
$output = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', mb_convert_encoding($doc->saveHTML($doc->documentElement), 'UTF-8'));
|
|
return str_replace('<span class="dom-charset"><meta charset="utf8"></span>', '', $output);
|
|
|
|
}
|
|
|
|
// Format the date
|
|
function format_date($date, $dateFormat = null)
|
|
{
|
|
if (empty($dateFormat)) {
|
|
$dateFormat = config('date.format');
|
|
}
|
|
if (extension_loaded('intl')) {
|
|
$format_map = array('s' => 'ss', 'i' => 'mm', 'H' => 'HH', 'G' => 'H', 'd' => 'dd', 'j' => 'd', 'D' => 'EE', 'l' => 'EEEE', 'm' => 'MM', 'M' => 'MMM', 'F' => 'MMMM', 'Y' => 'yyyy');
|
|
$intlFormat = strtr($dateFormat, $format_map);
|
|
$formatter = new IntlDateFormatter(locale_language(), IntlDateFormatter::NONE, IntlDateFormatter::NONE, config('timezone'), IntlDateFormatter::GREGORIAN, $intlFormat);
|
|
return $formatter->format($date);
|
|
} else {
|
|
return date($dateFormat, $date);
|
|
}
|
|
}
|
|
|
|
// Publish scheduled post
|
|
function publish_scheduled()
|
|
{
|
|
$posts = get_scheduled_posts();
|
|
if (!empty($posts)) {
|
|
foreach ($posts as $index => $v) {
|
|
$str = explode('_', $v['basename']);
|
|
$old = $v['dirname'] . '/' . $v['basename'];
|
|
$new = dirname($v['dirname']) . '/' . $v['basename'];
|
|
$t = str_replace('-', '', $str[0]);
|
|
$time = new DateTime($t);
|
|
$timestamp = $time->format("Y m d H:i:s");
|
|
if (date('Y m d H:i:s') >= $timestamp) {
|
|
rename($old, $new);
|
|
rebuilt_cache('all');
|
|
clear_cache();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Insert toc
|
|
function insert_toc($id, $part_1 = null, $part_2 = null)
|
|
{
|
|
$state = config('toc.state');
|
|
if ($state !== 'open') {
|
|
$state = '';
|
|
}
|
|
$label = config('toc.label');
|
|
if (empty($label)) {
|
|
$label = 'Table of Contents';
|
|
}
|
|
$style = config('toc.style');
|
|
if ($style == 'default' || empty($style)) {
|
|
$style = '<link rel="stylesheet" id="default-toc-style" href="'. site_url() .'system/resources/css/toc.css" type="text/css" media="all">';
|
|
} else {
|
|
$style = '';
|
|
}
|
|
$load = <<<EOF
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
if (document.getElementById('toc-wrapper.{$id}').parentNode.classList.contains('{$id}')) {
|
|
generateTOC('.{$id}');
|
|
} else {
|
|
document.getElementById('toc-wrapper.{$id}').parentNode.classList.add('{$id}');
|
|
generateTOC('.{$id}');
|
|
}
|
|
});
|
|
</script>
|
|
EOF;
|
|
$result = $part_1 . '<div class="toc-wrapper" id="toc-wrapper.'. $id .'" style="display:none;" >'. $load . $style .'<details '. $state .'><summary title="'. $label .'"><span class="details">'. $label .'</span></summary><div class="inner"><div class="toc" id="toc.'. $id .'"></div></div></details><script src="'. site_url().'system/resources/js/toc.generator.js"></script></div>' . $part_2;
|
|
return $result;
|
|
}
|
|
|
|
// Automatically add toc after x paragraph
|
|
function automatic_toc($content, $id)
|
|
{
|
|
$pos = config('toc.position');
|
|
$exp = explode('</p>', $content);
|
|
if (is_null($pos) || $pos > count($exp)){
|
|
return $content;
|
|
}
|
|
array_splice($exp, $pos, 0, insert_toc($id) . '<p>');
|
|
$content = implode('</p>', $exp);
|
|
return $content;
|
|
}
|
|
|
|
function generate_title($type = null, $object = null)
|
|
{
|
|
if ($type == 'is_front') {
|
|
$format = config('home.title.format');
|
|
if (empty($format)) {
|
|
$format = '%blog_title% - %blog_tagline%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description());
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_post') {
|
|
$format = config('post.title.format');
|
|
if (empty($format)) {
|
|
$format = '%post_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%post_title%' => $object->title, '%post_description%' => $object->description, '%post_category%' => $object->categoryTitle, '%post_tag%' => $object->tag, '%post_author%' => $object->authorName, '%post_type%' => ucfirst($object->type));
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_page' || $type == 'is_subpage') {
|
|
$format = config('page.title.format');
|
|
if (empty($format)) {
|
|
$format = '%page_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%page_title%' => $object->title, '%page_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_profile') {
|
|
$format = config('profile.title.format');
|
|
if (empty($format)) {
|
|
$format = '%author_name% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%author_name%' => $object->title, '%author_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_category') {
|
|
$format = config('category.title.format');
|
|
if (empty($format)) {
|
|
$format = '%category_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%category_title%' => $object->title, '%category_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_tag') {
|
|
$format = config('tag.title.format');
|
|
if (empty($format)) {
|
|
$format = '%tag_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%tag_title%' => $object->title, '%tag_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_archive') {
|
|
$format = config('archive.title.format');
|
|
if (empty($format)) {
|
|
$format = '%archive_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%archive_title%' => $object->title, '%archive_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_search') {
|
|
$format = config('search.title.format');
|
|
if (empty($format)) {
|
|
$format = '%search_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%search_title%' => $object->title, '%search_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_type') {
|
|
$format = config('type.title.format');
|
|
if (empty($format)) {
|
|
$format = '%type_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%type_title%' => $object->title, '%type_description%' => $object->description);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_blog') {
|
|
$format = config('blog.title.format');
|
|
if (empty($format)) {
|
|
$format = 'Blog - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description());
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
} elseif ($type == 'is_default') {
|
|
$format = config('default.title.format');
|
|
if (empty($format)) {
|
|
$format = '%page_title% - %blog_title%';
|
|
}
|
|
$var_map = array('%blog_title%' => blog_title(), '%blog_tagline%' => blog_tagline(), '%blog_description%' => blog_description(), '%page_title%' => $object);
|
|
$var = strtr($format, $var_map);
|
|
return strip_tags($var);
|
|
}
|
|
}
|
|
|
|
function generate_meta($type = null, $object = null)
|
|
{
|
|
$tags = '';
|
|
$defaultImg = config('default.image');
|
|
if (empty($defaultImg)) {
|
|
$defaultImg = site_url() . 'system/resources/images/logo-big.png';
|
|
}
|
|
$fbApp = config('fb.appid');
|
|
$facebook = config('social.facebook');
|
|
$twitter = config('social.twitter');
|
|
if (is_null($object)) {
|
|
$tags .= '<meta property="og:locale" content="'. locale_language() .'" />' . "\n";
|
|
$tags .= '<meta property="og:type" content="website" />' . "\n";
|
|
$tags .= '<meta property="og:site_name" content="'. blog_title() . '" />' . "\n";
|
|
if ($type == 'is_blog') {
|
|
$tags .= '<meta property="og:title" content="'. generate_title('is_blog', null) . '" />' . "\n";
|
|
$tags .= '<meta property="og:description" content="'. blog_title() . ' ' . blog_string() .'" />' . "\n";
|
|
} else {
|
|
$tags .= '<meta property="og:title" content="'. generate_title('is_front', null) . '" />' . "\n";
|
|
$tags .= '<meta property="og:description" content="'. safe_html(strip_tags(blog_description())) .'" />' . "\n";
|
|
}
|
|
$tags .= '<meta property="og:url" content="'. site_url() .'" />' . "\n";
|
|
$tags .= '<meta property="og:image" content="'. $defaultImg .'" />' . "\n";
|
|
$tags .= '<meta name="twitter:card" content="summary_large_image" />' . "\n";
|
|
if(!empty($twitter)) {
|
|
$twitter = parse_url($twitter);
|
|
$tags .= '<meta name="twitter:site" content="'. str_replace('/', '@', $twitter['path']) .'" />' . "\n";
|
|
}
|
|
if (!empty($fbApp)) {
|
|
$tags .= '<meta property="fb:app_id" content="'. $fbApp .'" />' . "\n";
|
|
}
|
|
} else {
|
|
if(!empty($object->image)) {
|
|
$image = $object->image;
|
|
} else {
|
|
$image = get_image($object->body);
|
|
if(empty($image)) {
|
|
$image = $defaultImg;
|
|
}
|
|
}
|
|
$tags .= '<meta property="og:locale" content="'. locale_language() .'" />' . "\n";
|
|
$tags .= '<meta property="og:site_name" content="'. blog_title() . '" />' . "\n";
|
|
$tags .= '<meta property="og:type" content="article" />' . "\n";
|
|
$tags .= '<meta property="og:title" content="'. $object->title .'" />' . "\n";
|
|
if ($type == 'is_post') {
|
|
$tags .= '<meta name="author" content="'. $object->authorName .'" />' . "\n";
|
|
$tags .= '<meta name="article:published_time" content="'. date('c', $object->date) .'" />' . "\n";
|
|
$tags .= '<meta name="article:modified_time" content="'. date('c', $object->lastMod) .'" />' . "\n";
|
|
$tags .= '<meta name="article:section" content="'. $object->categoryTitle .'" />' . "\n";
|
|
$tags .= '<meta name="article:section_url" content="'. $object->categoryUrl .'" />' . "\n";
|
|
}
|
|
if ($type == 'is_page' || $type == 'is_subpage') {
|
|
$tags .= '<meta name="article:modified_time" content="'. date('c', $object->lastMod) .'" />' . "\n";
|
|
}
|
|
if(!empty($facebook)) {
|
|
$tags .= '<meta property="article:publisher" content="'. $facebook .'" />' . "\n";
|
|
}
|
|
if(!empty($twitter)) {
|
|
$twitter = parse_url($twitter);
|
|
$tags .= '<meta name="twitter:creator" content="'. str_replace('/', '@', $twitter['path']) .'" />' . "\n";
|
|
$tags .= '<meta name="twitter:site" content="'. str_replace('/', '@', $twitter['path']) .'" />' . "\n";
|
|
}
|
|
$tags .= '<meta property="og:url" content="'. $object->url .'" />' . "\n";
|
|
$tags .= '<meta property="og:description" content="'. $object->description .'" />' . "\n";
|
|
$tags .= '<meta name="twitter:card" content="summary_large_image" />' . "\n";
|
|
$tags .= '<meta property="og:image" content="'. $image .'" />' . "\n";
|
|
if (!empty($fbApp)) {
|
|
$tags .= '<meta property="fb:app_id" content="'. $fbApp .'" />' . "\n";
|
|
}
|
|
}
|
|
|
|
return $tags;
|
|
}
|