You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
6.8 KiB
PHTML
207 lines
6.8 KiB
PHTML
3 years ago
|
<?php
|
||
|
|
||
|
namespace brain\data;
|
||
|
|
||
|
use Mni\FrontYAML\Parser;
|
||
|
use brain\data\Settings;
|
||
|
use brain\data\Book;
|
||
|
use brain\utility\Sorting;
|
||
|
use brain\utility\DocTools;
|
||
|
|
||
|
use function _\find;
|
||
|
|
||
|
class Render
|
||
|
{
|
||
|
public $loader;
|
||
|
public $twig;
|
||
|
public $pageInfo;
|
||
|
public $menu;
|
||
|
public $background;
|
||
|
public function __construct()
|
||
|
{
|
||
|
$config = new Settings();
|
||
|
//TODO: Add theme folder to loader
|
||
|
$settings = $config->getSettings();
|
||
|
$this->menu = $settings["menu"];
|
||
|
$this->theme = $settings["global"]["theme"];
|
||
|
$this->loader = new \Twig\Loader\FilesystemLoader("../content/themes/" . $this->theme);
|
||
|
$this->twig = new \Twig\Environment($this->loader, []);
|
||
|
$this->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"],
|
||
|
];
|
||
|
//move global theme image assets to public folder
|
||
|
foreach (
|
||
|
new \DirectoryIterator("../content/themes/" . $this->theme . "/assets/images/global/") as $file
|
||
|
) {
|
||
|
if ($file->isDot()) {
|
||
|
continue;
|
||
|
}
|
||
|
if (!is_file("../public/assets/images/global/" . $file->getFileName())) {
|
||
|
copy(
|
||
|
"../content/themes/" .
|
||
|
$this->theme .
|
||
|
"/assets/images/global/" .
|
||
|
$file->getFileName(),
|
||
|
"../public/assets/images/global/" . $file->getFileName()
|
||
|
);
|
||
|
} else {
|
||
|
//image is already there, so chill
|
||
|
}
|
||
|
//print $file->getFilename() . "\n";
|
||
|
}
|
||
|
|
||
|
//copy current theme assets to public
|
||
|
|
||
|
//clear files in css and scripts folder
|
||
|
$styles = glob('../public/assets/css/*'); // get all file names
|
||
|
foreach ($styles as $file) { // iterate files
|
||
|
if (is_file($file)) {
|
||
|
//don't erase dashboard css
|
||
|
if (!$file == '../public/assets/css/dash.css') {
|
||
|
unlink($file); // delete file
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$scripts = glob('../public/assets/scripts/*'); // get all file names
|
||
|
foreach ($scripts as $file) { // iterate files
|
||
|
if (is_file($file)) {
|
||
|
if (!$file == "../public/assets/scripts/Start.js") {
|
||
|
unlink($file); // delete file
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//copy theme assets to public
|
||
|
$newcss = glob("../content/themes/" . $this->theme . "/assets/css/*");
|
||
|
foreach ($newcss as $file) { // iterate files
|
||
|
if (is_file($file)) {
|
||
|
$path = explode("/", $file);
|
||
|
copy($file, "../public/assets/css/" . $path[6]);
|
||
|
}
|
||
|
}
|
||
|
$newjs = glob("../content/themes/" . $this->theme . "/assets/scripts/*");
|
||
|
foreach ($newjs as $file) { // iterate files
|
||
|
if (is_file($file)) {
|
||
|
$path = explode("/", $file);
|
||
|
copy($file, "../public/assets/scripts/" . $path[6]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function renderPages()
|
||
|
{
|
||
|
$pages = (new Book())->getContents();
|
||
|
$recent = [];
|
||
|
$featured = [];
|
||
|
$limit = 4;
|
||
|
foreach ($pages as $page) {
|
||
|
$pageOptions = Sorting::page($page);
|
||
|
|
||
|
$layout = $page["layout"];
|
||
|
//new pages have no layout, so defautl for now
|
||
|
if ($layout == "" || $layout == null) {
|
||
|
$layout = "page";
|
||
|
}
|
||
|
|
||
|
$template = $layout . ".twig";
|
||
|
if (str_contains($page["layout"], "index")) {
|
||
|
$location = "../public/index.html";
|
||
|
$dir = null;
|
||
|
} else {
|
||
|
// if page is a menu item, render the page on public root
|
||
|
if ($page["menu"] == "true") {
|
||
|
$location = "../public/" . $page["slug"] . ".html";
|
||
|
$dir = "../public/";
|
||
|
} else {
|
||
|
$location =
|
||
|
"../public/" . $page["path"] . "/" . $page["slug"] . ".html";
|
||
|
$dir = "../public/" . $page["path"];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$html = $this->twig->render($template, $pageOptions);
|
||
|
DocTools::writeHTML($location, $html, $dir);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function renderArchive()
|
||
|
{
|
||
|
$archive = Sorting::archive();
|
||
|
$template = "archive.twig";
|
||
|
$pageOptions = [
|
||
|
"title" => "Archive",
|
||
|
"background" => $this->pageInfo["image"],
|
||
|
"archives" => $archive,
|
||
|
"info" => $this->pageInfo,
|
||
|
"menu" => $this->menu,
|
||
|
];
|
||
|
|
||
|
$html = $this->twig->render($template, $pageOptions);
|
||
|
$location = "../public/archives.html";
|
||
|
DocTools::writeHTML($location, $html);
|
||
|
}
|
||
|
|
||
|
public function renderTags()
|
||
|
{
|
||
|
$list = Sorting::tags();
|
||
|
foreach ($list as $item) {
|
||
|
$template = "tags.twig";
|
||
|
$pageOptions = [
|
||
|
"title" => "Pages Tagged as " . $item["tag_name"],
|
||
|
"background" => $this->pageInfo["image"],
|
||
|
"tag_list" => $item["pages"],
|
||
|
"info" => $this->pageInfo,
|
||
|
"menu" => $this->menu,
|
||
|
];
|
||
|
|
||
|
$html = $this->twig->render($template, $pageOptions);
|
||
|
|
||
|
$location = "../public/tags/" . $item["slug"] . ".html";
|
||
|
|
||
|
//if tags folder doesn't exist, make it
|
||
|
if (!is_dir("../public/tags")) {
|
||
|
mkdir("../public/tags", 0755, true);
|
||
|
} else {
|
||
|
}
|
||
|
|
||
|
if (!is_file($location)) {
|
||
|
file_put_contents($location, $html);
|
||
|
} else {
|
||
|
($new = fopen($location, "w")) or die("Unable to open file!");
|
||
|
fwrite($new, $html);
|
||
|
fclose($new);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function renderIndex()
|
||
|
{
|
||
|
//TODO: Need to fix this to account for new index templating system
|
||
|
$pages = (new Book())->getContents();
|
||
|
$index = find($pages, ["layout" => "index"]);
|
||
|
$template = "index.twig";
|
||
|
$location = "../public/index.html";
|
||
|
$dir = null;
|
||
|
|
||
|
$meta = [
|
||
|
"who" => $index["author"],
|
||
|
"when" => $index["created"],
|
||
|
];
|
||
|
|
||
|
$pageOptions = [
|
||
|
"title" => $index["title"],
|
||
|
"background" => $index["feature"],
|
||
|
"meta" => $meta,
|
||
|
];
|
||
|
|
||
|
$html = $this->twig->render($template, $pageOptions);
|
||
|
DocTools::writeHTML($location, $html, $dir);
|
||
|
}
|
||
|
}
|