|
|
|
<?php
|
|
|
|
|
|
|
|
namespace brain\utility;
|
|
|
|
|
|
|
|
use function _\filter;
|
|
|
|
use function _\find;
|
|
|
|
use brain\data\Book;
|
|
|
|
use brain\data\Settings;
|
|
|
|
use Mni\FrontYAML\Parser;
|
|
|
|
|
|
|
|
class Sorting
|
|
|
|
{
|
|
|
|
private static $_tags = [];
|
|
|
|
private static $_archive = [];
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
public static function tags()
|
|
|
|
{
|
|
|
|
$pages = (new Book('../content/pages'))->getContents();
|
|
|
|
foreach ($pages as $page) {
|
|
|
|
$temp = [];
|
|
|
|
$temp = explode(',', $page['tags']);
|
|
|
|
foreach ($temp as $tag) {
|
|
|
|
$label = trim($tag);
|
|
|
|
if (!find(self::$_tags, ['tag_name' => $label])) {
|
|
|
|
array_push(self::$_tags, [
|
|
|
|
'tag_name' => $label,
|
|
|
|
'slug' => StringTools::safeString($label),
|
|
|
|
'pages' => self::tagPages($label, $pages),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return self::$_tags;
|
|
|
|
}
|
|
|
|
private static function tagPages($tag, $pages)
|
|
|
|
{
|
|
|
|
$tagged = [];
|
|
|
|
foreach ($pages as $page) {
|
|
|
|
if (strpos($page['tags'], $tag) !== false) {
|
|
|
|
array_push($tagged, [
|
|
|
|
'title' => $page['title'],
|
|
|
|
'slug' => $page['slug'],
|
|
|
|
'path' => $page['path'],
|
|
|
|
'feature' => $page['feature'],
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $tagged;
|
|
|
|
}
|
|
|
|
public static function archive()
|
|
|
|
{
|
|
|
|
$pages = (new Book('../content/pages'))->getContents();
|
|
|
|
$years = [];
|
|
|
|
$archive = [];
|
|
|
|
foreach ($pages as $page) {
|
|
|
|
// $year = date("Y", date($page["rawCreated"]));
|
|
|
|
$date = explode('/', $page['path']);
|
|
|
|
// echo $page["title"] . " : " . $year . "\n";
|
|
|
|
if (!find($years, ['year' => trim($date[0])])) {
|
|
|
|
$findPages = filter($pages, ['createdYear' => trim($date[0])]);
|
|
|
|
// var_dump($findPages);
|
|
|
|
array_push($years, [
|
|
|
|
'year' => trim($date[0]),
|
|
|
|
'count' => count($findPages),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
foreach ($years as $year) {
|
|
|
|
$sorted = [];
|
|
|
|
$filtered = filter($pages, ['createdYear' => $year['year']]);
|
|
|
|
|
|
|
|
foreach ($filtered as $obj) {
|
|
|
|
$month = date('m', date($obj['rawCreated']));
|
|
|
|
if (!find($sorted, ['month' => $month])) {
|
|
|
|
$perMonth = filter($pages, [
|
|
|
|
'path' => $year['year'] . '/' . $month,
|
|
|
|
'deleted' => false,
|
|
|
|
'published' => true,
|
|
|
|
'layout' => 'page',
|
|
|
|
]);
|
|
|
|
array_push($sorted, [
|
|
|
|
'month' => $month,
|
|
|
|
'full_month' => date('F', date($obj['rawCreated'])),
|
|
|
|
'count' => count($perMonth),
|
|
|
|
'pages' => $perMonth,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
array_push(self::$_archive, [
|
|
|
|
'year' => $year['year'],
|
|
|
|
'year_data' => $sorted,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return self::$_archive;
|
|
|
|
}
|
|
|
|
public static function page($page)
|
|
|
|
{
|
|
|
|
$config = new Settings();
|
|
|
|
$settings = $config->getSettings();
|
|
|
|
$pageOption = [];
|
|
|
|
|
|
|
|
$pageInfo = [
|
|
|
|
'keywords' => isset($settings['global']['keywords'])
|
|
|
|
? $settings['global']['keywords']
|
|
|
|
: 'fipamo, blog, jamstack, php, markdown, js',
|
|
|
|
'description' => $settings['global']['descriptions'],
|
|
|
|
'image' => $settings['global']['base_url'] . $settings['global']['background'],
|
|
|
|
'baseURL' => $settings['global']['base_url'],
|
|
|
|
];
|
|
|
|
|
|
|
|
$taglist = explode(',', $page['tags']);
|
|
|
|
$tags = [];
|
|
|
|
foreach ($taglist as $tag) {
|
|
|
|
$label = trim($tag);
|
|
|
|
array_push($tags, [
|
|
|
|
'label' => $label . ' ',
|
|
|
|
'slug' => StringTools::safeString($label),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
$meta = [
|
|
|
|
'who' => $page['author'],
|
|
|
|
'when' => $page['created'],
|
|
|
|
'tags' => $tags,
|
|
|
|
];
|
|
|
|
|
|
|
|
// render markdown content and clean it
|
|
|
|
$parser = new Parser();
|
|
|
|
$rendered = $parser->parse($page['content']);
|
|
|
|
$sanitizer = \HtmlSanitizer\Sanitizer::create([
|
|
|
|
'extensions' => ['basic', 'image', 'list', 'code'],
|
|
|
|
'tags' => [
|
|
|
|
'img' => [
|
|
|
|
'allowed_attributes' => ['src', 'alt', 'title', 'class'],
|
|
|
|
'allowed_hosts' => null,
|
|
|
|
],
|
|
|
|
],
|
|
|
|
]);
|
|
|
|
|
|
|
|
$preclean = $sanitizer->sanitize($rendered->getContent());
|
|
|
|
|
|
|
|
// just clean renderd string for now, Sanitize doesn't like relative img urls
|
|
|
|
// so another option is needed
|
|
|
|
$cleaned = strip_tags($rendered->getContent(), [
|
|
|
|
'a',
|
|
|
|
'br',
|
|
|
|
'p',
|
|
|
|
'strong',
|
|
|
|
'br',
|
|
|
|
'img',
|
|
|
|
'iframe',
|
|
|
|
'ul',
|
|
|
|
'li',
|
|
|
|
'i',
|
|
|
|
'em',
|
|
|
|
'h1',
|
|
|
|
'h2',
|
|
|
|
'h3',
|
|
|
|
'pre',
|
|
|
|
'code',
|
|
|
|
]);
|
|
|
|
|
|
|
|
// if page feature isn't empty, find image from list and set it as background image
|
|
|
|
// if it is empty, just use global background
|
|
|
|
if ($page['feature'] != '' || $page['feature'] != null) {
|
|
|
|
$media = explode(',', $page['feature']);
|
|
|
|
$set = false;
|
|
|
|
foreach ($media as $file) {
|
|
|
|
$item = trim($file);
|
|
|
|
$ext = pathinfo($item, PATHINFO_EXTENSION);
|
|
|
|
|
|
|
|
if ($ext != 'mp4' && !$set) {
|
|
|
|
$pageInfo['image'] = $pageInfo['baseURL'] . $item;
|
|
|
|
$set = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($page['layout'] == 'index') {
|
|
|
|
// $template = $this->theme . "/index.twig";
|
|
|
|
// $location = "../public/index.html";
|
|
|
|
// $dir = null;
|
|
|
|
|
|
|
|
$recent = [];
|
|
|
|
$featured = [];
|
|
|
|
$limit = 4;
|
|
|
|
$pages = (new Book())->getContents();
|
|
|
|
foreach ($pages as $item) {
|
|
|
|
if (!$item['deleted'] &&
|
|
|
|
$item['published'] &&
|
|
|
|
$item['menu'] != 'true'
|
|
|
|
) {
|
|
|
|
if (count($recent) < $limit) {
|
|
|
|
array_push($recent, [
|
|
|
|
'path' => $item['path'],
|
|
|
|
'slug' => $item['slug'],
|
|
|
|
'title' => $item['title'],
|
|
|
|
'feature' => $item['feature'],
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($item['featured'] == true) {
|
|
|
|
if (count($featured) < $limit) {
|
|
|
|
array_push($featured, [
|
|
|
|
'path' => $item['path'],
|
|
|
|
'slug' => $item['slug'],
|
|
|
|
'title' => $item['title'],
|
|
|
|
'feature' => $item['feature'],
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$pageOptions = [
|
|
|
|
'title' => $page['title'],
|
|
|
|
'background' => $page['feature'],
|
|
|
|
'content' => $page['html'], // $cleaned,
|
|
|
|
'meta' => $meta,
|
|
|
|
'recent' => $recent,
|
|
|
|
'featured' => $featured,
|
|
|
|
'info' => $pageInfo,
|
|
|
|
'menu' => $settings['menu'],
|
|
|
|
'dynamicRender' => $settings['global']['dynamicRender'],
|
|
|
|
'media' => $page['media'],
|
|
|
|
'files' => $page['docs'],
|
|
|
|
];
|
|
|
|
} else {
|
|
|
|
// $template = $this->theme . "/page.twig";
|
|
|
|
// $location = "../public/" . $page["path"] . "/" . $page["slug"] . ".html";
|
|
|
|
// $dir = "../public/" . $page["path"];
|
|
|
|
$pageOptions = [
|
|
|
|
'title' => $page['title'],
|
|
|
|
'background' => $page['feature'],
|
|
|
|
'content' => $page['html'], // $cleaned,
|
|
|
|
'meta' => $meta,
|
|
|
|
'info' => $pageInfo,
|
|
|
|
'menu' => $settings['menu'],
|
|
|
|
'dynamicRender' => $settings['global']['dynamicRender'],
|
|
|
|
'media' => $page['media'],
|
|
|
|
'files' => $page['docs'],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
return $pageOptions;
|
|
|
|
}
|
|
|
|
}
|