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"], ]); } } 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", "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("../content/pages"))->getContents(); foreach ($pages as $item) { //TODO: Move page data organization to render to utility class if (!$item["deleted"] && $item["published"]) { if (count($recent) < $limit) { array_push($recent, [ "path" => $item["path"], "slug" => $item["slug"], "title" => $item["title"], ]); } if ($item["featured"] == true) { if (count($featured) < $limit) { array_push($featured, [ "path" => $item["path"], "slug" => $item["slug"], "title" => $item["title"], ]); } } } } $pageOptions = [ "title" => $page["title"], "background" => $page["feature"], "content" => $cleaned, "meta" => $meta, "recent" => $recent, "featured" => $featured, "info" => $pageInfo, "menu" => $settings["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" => $pageInfo, "menu" => $settings["menu"], ]; } return $pageOptions; } }