249 lines
7.8 KiB
PHP
249 lines
7.8 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace brain\utility;
|
||
|
|
||
|
use Mni\FrontYAML\Parser;
|
||
|
use brain\data\Book;
|
||
|
use brain\data\Settings;
|
||
|
|
||
|
use function _\find;
|
||
|
use function _\filter;
|
||
|
|
||
|
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",
|
||
|
]);
|
||
|
//$cleaned = preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $cleaned);
|
||
|
//$cleaned = html_entity_decode($cleaned, ENT_QUOTES, "UTF-8");
|
||
|
|
||
|
//if page feature isn't empty, replace page info meta image
|
||
|
if ($page["feature"] != "" || $page["feature"] != null) {
|
||
|
$pageInfo["image"] = $pageInfo["baseURL"] . $page["feature"];
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|