getContents(); foreach ($pages as $page) { $temp = []; if (isset($page['tags'])) { $temp = explode(',', $page['tags']); foreach ($temp as $tag) { $label = trim($tag); if (!find(self::$p_tags, ['tag_name' => $label])) { array_push(self::$p_tags, [ 'tag_name' => $label, 'slug' => StringTools::safeString($label), 'pages' => self::tagPages($label, $pages), ]); } } } } return self::$p_tags; } private static function tagPages($tag, $pages) { $tagged = []; foreach ($pages as $page) { if (isset($page['tags'])) { 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::$p_archive, [ 'year' => $year['year'], 'year_data' => $sorted, ]); } return self::$p_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'], ]; $tags = []; if (isset($page['tags'])) { $taglist = explode(',', $page['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; } }