blog.php.txt 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. declare(strict_types=1);
  3. // ========================
  4. // CONFIG
  5. // ========================
  6. $blogDir = __DIR__ . '/posts/';
  7. $defaultPost = 'index';
  8. // ========================
  9. // SECURITY: sanitize input
  10. // ========================
  11. $post = $_GET['b'] ?? $defaultPost;
  12. // allow only safe filenames
  13. if (!preg_match('/^[a-zA-Z0-9_-]+$/', $post)) {
  14. http_response_code(400);
  15. die('Invalid post name.');
  16. }
  17. $mdFile = $blogDir . $post . '.md';
  18. if (!file_exists($mdFile)) {
  19. http_response_code(404);
  20. $mdContent = "# 404\n\nPost not found.";
  21. } else {
  22. $mdContent = file_get_contents($mdFile);
  23. }
  24. // ========================
  25. // MARKDOWN PARSER
  26. // ========================
  27. require_once __DIR__ . '/../vendor/Parsedown.php';
  28. require_once __DIR__ . '/../vendor/ParsedownExtra.php';
  29. $parser = new ParsedownExtra();
  30. $parser->setSafeMode(false); // allow HTML in markdown
  31. $parser->setMarkupEscaped(false); // don't escape HTML
  32. $htmlContent = $parser->text($mdContent);
  33. ?>
  34. <!DOCTYPE html>
  35. <html lang="pl">
  36. <head>
  37. <meta charset="UTF-8">
  38. <meta name="viewport" content="width=device-width, initial-scale=1">
  39. <title>Blog</title>
  40. <link rel="stylesheet" href="../style.css">
  41. <script src="https://unpkg.com/cursor-effects@latest/dist/browser.js"></script>
  42. <script>
  43. window.addEventListener("load", (event) => {
  44. new cursoreffects.ghostCursor();
  45. });
  46. </script>
  47. </style>
  48. </head>
  49. <body>
  50. <main class="container interests">
  51. <?= $htmlContent ?>
  52. </main>
  53. <footer>
  54. <p class="center"><img src="../favicon.ico">(c) computer_glamour</p>
  55. <img src="../buttons/-18.gif" class="footer-button">
  56. <img src="../buttons/xmpp.gif" class="footer-button">
  57. <img src="../buttons/notread.gif" class="footer-button">
  58. <img src="../buttons/right2repair.gif" class="footer-button">
  59. </footer>
  60. </body>
  61. </html>