getFromCache(); if (is_null($news)) { if (!($files = scandir(join(DIRECTORY_SEPARATOR, [DIR_DATA, DEFAULT_LOCALE, 'news'])))) { throw new \ErrorException(self::NO_FILES); } global $lang; $news = []; foreach ($files as $filename) { if (substr($filename, -9) != '.markdown') { continue; } if (!is_file(($fname = join(DIRECTORY_SEPARATOR, [DIR_DATA, $lang, 'news', basename($filename)]))) || !is_readable($fname) || !($data = @file_get_contents($fname)) ) { if (($data = @file_get_contents(join( DIRECTORY_SEPARATOR, [DIR_DATA, DEFAULT_LOCALE, 'news', $filename] ))) === false) { continue; } } $news[] = new News($data, $filename, $processContent); } $news = array_reverse($news); $this->saveToCache($news); } return $news; } /** * Get the latest number of news items, or if no number is specified get all news items. * * @return News[] */ public function getLatestNews(int $num = -1, bool $processContent = false): array { if ($num == -1) { return $this->getAllNews($processContent); } else { if (!($newslist = $this->getListOfNewsFilenames())) { throw new \ErrorException(self::NO_FILES); } rsort($newslist, SORT_STRING); $newslist = array_slice($newslist, 0, $num); $news = []; foreach ($newslist as $filename) { $news[] = $this->getOneByFilename($filename, $processContent); } return $news; } } /* Get the news item that was posted on a specific date. */ public function getOneByFilename(?string $filename, bool $processContent = false): News { if (is_null($filename) || !preg_match('/^\d{8,12}[a-z]?$/', $filename)) { throw new \ErrorException(self::INVALID_DATE); } $fname = $this->getLocalizedFile("news/$filename.markdown"); $data = @file_get_contents($fname); if ($data === false) { throw new \ErrorException(self::FILE_NOT_FOUND); } return new News($data, $fname, $processContent); } }