echo O_BEGIN . $page->js . O_END; } }); Shield::attach('page-' . $slug); }, 100); /** * Home Page * --------- * * [1]. / * */ Route::accept('/', function () use($config, $excludes) { Session::kill('search.query'); Session::kill('search.results'); $s = Get::articles(); if ($articles = Mecha::eat($s)->chunk(1, $config->index->per_page)->vomit()) { $articles = Mecha::walk($articles, function ($path) use($excludes) { return Get::article($path, $excludes); }); } else { $articles = false; } Filter::add('pager:url', function ($url) { return Filter::apply('index:url', $url); }); Config::set(array('articles' => $articles, 'pagination' => Navigator::extract($s, 1, $config->index->per_page, $config->index->slug))); Shield::attach('page-home'); }, 110); /** * Route Hook: after
<?php $bucket = array(); $url_base = $config->url . '/feed/json'; $json_order = strtoupper(Request::get('order', 'DESC')); $json_filter = Request::get('filter', ""); $json_limit = Request::get('chunk', 25); if ($pages = Mecha::eat(Get::articles($json_order, $json_filter))->chunk($config->offset, $json_limit)->vomit()) { foreach ($pages as $path) { $bucket[] = Get::articleHeader($path); } } $json = array('meta' => array('generator' => 'Mecha ' . MECHA_VERSION, 'title' => $config->title, 'slogan' => $config->slogan, 'url' => array('home' => $config->url, 'previous' => $config->offset > 1 ? Filter::colon('feed:url', $url_base . '/' . ($config->offset - 1)) : null, 'next' => $config->offset < ceil($config->total_articles / $json_limit) ? Filter::colon('feed:url', $url_base . '/' . ($config->offset + 1)) : null), 'description' => $config->description, 'update' => date('c'), 'author' => (array) $config->author, 'offset' => $config->offset, 'total' => $config->total_articles, 'tags' => Get::articleTags()), 'item' => null); if (!empty($bucket)) { $json['item'] = array(); foreach ($bucket as $i => $item) { $json['item'][$i] = array('title' => $item->title, 'url' => $item->url, 'date' => $item->date->W3C, 'update' => Date::format($item->update, 'c'), 'id' => $item->id, 'description' => $item->description, 'kind' => Mecha::A($item->kind)); Weapon::fire('json_item', array(&$json['item'][$i], $item, $i)); } } Weapon::fire('json_meta', array(&$json['meta'])); echo (isset($_GET['callback']) ? $_GET['callback'] . '(' : "") . json_encode($json) . (isset($_GET['callback']) ? ');' : "");
<?php $bucket = array(); if ($config->total_pages > 0) { foreach (Get::pages() as $page) { list($time, $kind, $slug) = explode('_', File::N($page), 3); $bucket[] = (object) array('url' => $config->url . '/' . $slug, 'date' => Date::format($time, 'c'), 'changefreq' => 'weekly', 'priority' => (string) '0.5'); } } if ($config->total_articles > 0) { foreach (Get::articles() as $article) { list($time, $kind, $slug) = explode('_', File::N($article), 3); $bucket[] = (object) array('url' => $config->url . '/' . $config->index->slug . '/' . $slug, 'date' => Date::format($time, 'c'), 'changefreq' => 'weekly', 'priority' => (string) '1.0'); } } echo '<?xml version="1.0" encoding="UTF-8" ?>'; echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; if (!empty($bucket)) { foreach ($bucket as $i => $item) { echo '<url>'; echo '<loc>' . $item->url . '</loc>'; echo '<lastmod>' . $item->date . '</lastmod>'; echo '<changefreq>' . $item->changefreq . '</changefreq>'; echo '<priority>' . $item->priority . '</priority>'; Weapon::fire('sitemap_item', array($item, $i)); echo '</url>'; } } echo '</urlset>';
$article = Mecha::O(array('id' => "", 'path' => "", 'state' => 'draft', 'date' => array('W3C' => ""), 'title' => $config->defaults->article_title, 'slug' => "", 'content_raw' => $config->defaults->article_content, 'content_type' => $config->html_parser, 'description' => "", 'kind' => array(), 'author' => Guardian::get('author'), 'css_raw' => $config->defaults->article_custom_css, 'js_raw' => $config->defaults->article_custom_js, 'fields' => array())); Config::set(array('page_title' => Config::speak('manager.title_new_', $speak->article) . $config->title_separator . $config->manager->title, 'article' => Mecha::A($article))); } $G = array('data' => Mecha::A($article)); Config::set('html_parser', $article->content_type); if ($request = Request::post()) { Guardian::checkToken($request['token']); $task_connect = $article; include DECK . DS . 'workers' . DS . 'task.field.5.php'; $extension = $request['action'] === 'publish' ? '.txt' : '.draft'; $kind = isset($request['kind']) ? $request['kind'] : array(0); sort($kind); // Check for duplicate slug, except for the current old slug. // Allow user(s) to change their post slug, but make sure they // do not type the slug of another post. if (trim($slug) !== "" && $slug !== $article->slug && ($files = Get::articles('DESC', "", 'txt,draft,archive'))) { foreach ($files as $file) { if (strpos(File::B($file), '_' . $slug . '.') !== false) { Notify::error(Config::speak('notify_error_slug_exist', $slug)); Guardian::memorize($request); break; } } unset($files); } // Slug must contains at least one letter or one `-`. This validation added // to prevent user(s) from inputting a page offset instead of article slug. // Because the URL pattern of article's index page is `article/1` and the // URL pattern of article's single page is `article/article-slug` if (!preg_match('#[a-z\\-]#i', $slug)) { Notify::error($speak->notify_error_slug_missing_letter);
* [1]. / * */ Route::accept('/', function () use($config) { Session::kill('search_query'); Session::kill('search_results'); if ($files = Mecha::eat(Get::articles())->chunk(1, $config->index->per_page)->vomit()) { $articles = array(); foreach ($files as $file) { $articles[] = Get::article($file, array('content', 'tags', 'css', 'js', 'comments')); } unset($files); } else { $articles = false; } Config::set(array('articles' => $articles, 'pagination' => Navigator::extract(Get::articles(), 1, $config->index->per_page, $config->index->slug))); Shield::attach('page-home'); }, 110); /** * Do Routing * ---------- */ Route::execute(); /** * 404 Page * -------- * * Fallback to 404 page if nothing matched. * */ Shield::abort();
/** * Widget Related Post * ------------------- * * [1]. Widget::relatedPost(); * [2]. Widget::relatedPost(5); * */ public static function relatedPost($total = 7) { $T1 = TAB; $T2 = str_repeat($T1, 2); $config = Config::get(); if ($config->page_type !== 'article') { return self::randomPost($total); } else { if (!($files = Get::articles('DESC', 'kind:' . implode(',', (array) $config->article->kind)))) { return O_BEGIN . '<div class="widget widget-related widget-related-post">' . Config::speak('notify_empty', strtolower($speak->posts)) . '</div>' . O_END; } if (count($files) <= 1) { return self::randomPost($total); } $files = Mecha::eat($files)->shake()->vomit(); $html = O_BEGIN . '<div class="widget widget-related widget-related-post" id="widget-related-post-' . self::$id['related_post'] . '">' . NL; self::$id['related_post']++; $html .= $T1 . '<ul>' . NL; for ($i = 0, $count = count($files); $i < $total; ++$i) { if ($i === $count) { break; } if ($files[$i] !== $config->article->path) { $article = Get::articleAnchor($files[$i]); $html .= $T2 . '<li><a href="' . $article->url . '">' . $article->title . '</a></li>' . NL; } } $html .= $T1 . '</ul>' . NL; $html .= '</div>' . O_END; $html = Filter::apply('widget', $html); return Filter::apply('widget:related.post', Filter::apply('widget:related', $html)); } }