Kompletní průvodce, new vzhled, menší technické opravy funkčnosti

This commit is contained in:
2026-04-28 12:21:18 +02:00
parent 3e4f82adff
commit f52d2baaac
53 changed files with 1182 additions and 617 deletions
+54 -28
View File
@@ -9,7 +9,7 @@ if (empty($slug)) {
die("Chyba: Chybí parametr slug.");
}
// Cesta k Markdown souboru (definována v config.php jako PATH_CONTENT)
// Cesta k Markdown souboru
$markdownFile = PATH_CONTENT . $slug . '.md';
if (!file_exists($markdownFile)) {
@@ -19,42 +19,68 @@ if (!file_exists($markdownFile)) {
// Načtení obsahu
$markdownContent = file_get_contents($markdownFile);
// --- ZDE JE KLÍČOVÁ ČÁST: PŘEVOD MARKDOWN NA HTML ---
// Pokud nemáš nainstalovanou knihovnu (např. Parsedown), musíš převést ručně nebo použít jednoduchý parser.
// Pro testování použijeme jednoduchou funkci, která převede základní Markdown.
/**
* Jednoduchý převodník Markdown na HTML
* Zpracovává: Nadpisy, tučné/kurzíva, odkazy, seznamy, bloky kódu, inline kód
*/
function markdownToHtml($text) {
// H1 - H6
// 1. Kódové bloky (``` ... ```) - PŘEDNOSTNÍ ZPRACOVÁNÍ
// Použijeme callback pro bezpečné zpracování všech bloků
$text = preg_replace_callback('/```(\w*)\n(.*?)```/s', function($matches) {
$lang = $matches[1];
$code = htmlspecialchars($matches[2]); // Důležité: chrání před XSS a chybami v HTML
// Vrátíme kód s třídou pro Prism.js
return "\n<pre><code class=\"language-" . htmlspecialchars($lang) . "\">" . $code . "</code></pre>\n";
}, $text);
// 2. Inline kód (` ... `)
$text = preg_replace('/`([^`]+)`/', '<code>$1</code>', $text);
// 3. Nadpisy H1 - H6
$text = preg_replace('/^# (.*$)/m', '<h1>$1</h1>', $text);
$text = preg_replace('/^## (.*$)/m', '<h2>$1</h2>', $text);
$text = preg_replace('/^### (.*$)/m', '<h3>$1</h3>', $text);
// Tučné a kurzíva
$text = preg_replace('/^#### (.*$)/m', '<h4>$1</h4>', $text);
$text = preg_replace('/^##### (.*$)/m', '<h5>$1</h5>', $text);
$text = preg_replace('/^###### (.*$)/m', '<h6>$1</h6>', $text);
// 4. Tučné a kurzíva
$text = preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $text);
$text = preg_replace('/\*(.*?)\*/', '<em>$1</em>', $text);
// Odkazy [text](url)
$text = preg_replace('/\[(.*?)\]\((.*?)\)/', '<a href="$2">$1</a>', $text);
// Kódové bloky ``` ... ```
$text = preg_replace('/```(.*?)```/s', '<pre><code class="language-bash">$1</code></pre>', $text);
// Inline kód ` ... `
$text = preg_replace('/`(.*?)`/', '<code>$1</code>', $text);
// Seznamy -
// 5. Odkazy [text](url)
$text = preg_replace('/\[(.*?)\]\((.*?)\)/', '<a href="$2" target="_blank">$1</a>', $text);
// 6. Seznamy (- položka)
// Nejdřív nahradíme jednotlivé položky
$text = preg_replace('/^- (.*$)/m', '<li>$1</li>', $text);
// Pak obalíme souvislé bloky <li> do <ul>
$text = preg_replace('/(<li>.*<\/li>\n?)+/', '<ul>$0</ul>', $text);
// 7. Horizontální čára
$text = preg_replace('/^---$/m', '<hr>', $text);
// 8. Odstranění prázdných řádků a převod na <p>
// Oddělíme bloky textu prázdnými řádky
$blocks = preg_split('/\n\s*\n/', $text);
$htmlBlocks = [];
// Odstranění prázdných řádků a převod na <p>
$text = preg_replace('/\n\n+/', '</p><p>', $text);
$text = '<p>' . $text . '</p>';
// Čištění
$text = str_replace('</p><p></p>', '</p>', $text);
$text = str_replace('<p></p>', '', $text);
return $text;
foreach ($blocks as $block) {
$block = trim($block);
if (empty($block)) continue;
// Pokud blok již obsahuje HTML tagy (h1, pre, ul, hr), necháme ho tak
if (preg_match('/^(<h[1-6]|<pre|<ul|<hr)/', $block)) {
$htmlBlocks[] = $block;
} else {
// Jinak obalíme do <p>
// Nahradíme jednotlivé nové řádky v textu za <br>
$block = nl2br($block);
$htmlBlocks[] = '<p>' . $block . '</p>';
}
}
return implode("\n", $htmlBlocks);
}
// Převod