response->disable(); $this->response->getHeader()->sendHttpHeaders(); $filename = CHANGELOG_FILE; /** * Read changelog. */ // Check if the file is available, some distributions remove these. if (! @is_readable($filename)) { printf( __( 'The %s file is not available on this system, please visit %s for more information.' ), $filename, 'phpmyadmin.net' ); return; } // Test if the if is in a compressed format if (substr($filename, -3) === '.gz') { ob_start(); readgzfile($filename); $changelog = ob_get_clean(); } else { $changelog = file_get_contents($filename); } /** * Whole changelog in variable. */ $changelog = htmlspecialchars((string) $changelog); $github_url = 'https://github.com/phpmyadmin/phpmyadmin/'; $faq_url = 'https://docs.phpmyadmin.net/en/latest/faq.html'; $replaces = [ '@(https?://[./a-zA-Z0-9.-_-]*[/a-zA-Z0-9_])@' => '\\1', // mail address '/([0-9]{4}-[0-9]{2}-[0-9]{2}) (.+[^ ]) +<(.*@.*)>/i' => '\\1 \\2', // FAQ entries '/FAQ ([0-9]+)\.([0-9a-z]+)/i' => 'FAQ \\1.\\2', // GitHub issues '/issue\s*#?([0-9]{4,5}) /i' => 'issue #\\1 ', // CVE/CAN entries '/((CAN|CVE)-[0-9]+-[0-9]+)/' => '\\1', // PMASAentries '/(PMASA-[0-9]+-[0-9]+)/' => '\\1', // Highlight releases (with links) '/([0-9]+)\.([0-9]+)\.([0-9]+)\.0 (\([0-9-]+\))/' => '' . '' . '\\1.\\2.\\3.0 \\4', '/([0-9]+)\.([0-9]+)\.([0-9]+)\.([1-9][0-9]*) (\([0-9-]+\))/' => '' . '' . '\\1.\\2.\\3.\\4 \\5', // Highlight releases (not linkable) '/( ### )(.*)/' => '\\1\\2', // Links target and rel '/a href="/' => 'a target="_blank" rel="noopener noreferrer" href="', ]; $this->response->header('Content-type: text/html; charset=utf-8'); echo $this->template->render('changelog', [ 'changelog' => preg_replace(array_keys($replaces), $replaces, $changelog), ]); } }