loader = new \Twig\Loader\FilesystemLoader("../content/themes"); $this->twig = new \Twig\Environment($this->loader, []); $settings = $config->getSettings(); $this->menu = $settings["menu"]; $this->theme = $settings["global"]["theme"]; $this->pageInfo = [ "keywords" => isset($settings["global"]["keywords"]) ? $settings["global"]["keywords"] : "fipamo, blog, jamstack, php, markdown, js", "description" => $settings["global"]["descriptions"], "image" => $settings["global"]["background"], ]; } public function renderPages() { $pages = (new Book("../content/pages"))->getContents(); $recent = []; $featured = []; $limit = 4; foreach ($pages as $page) { if (!$page["deleted"] && $page["published"]) { if (count($recent) < $limit) { array_push($recent, [ "path" => $page["path"], "slug" => $page["slug"], "title" => $page["title"], ]); } if ($page["featured"] == true) { if (count($featured) < $limit) { array_push($featured, [ "path" => $page["path"], "slug" => $page["slug"], "title" => $page["title"], ]); } } $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", "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["layout"] == "index") { $template = $this->theme . "/index.twig"; $location = "../public/index.html"; $dir = null; $pageOptions = [ "title" => $page["title"], "background" => $page["feature"], "content" => $cleaned, "meta" => $meta, "recent" => $recent, "featured" => $featured, "info" => $this->pageInfo, "menu" => $this->menu, ]; } 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" => $cleaned, "meta" => $meta, "info" => $this->pageInfo, "menu" => $this->menu, ]; } $html = $this->twig->render($template, $pageOptions); DocTools::writeHTML($location, $html, $dir); } } } public function renderArchive() { $archive = Sorting::archive(); $template = $this->theme . "/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 = $this->theme . "/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); } } } }