9

Rozdział 9 z 21

Osadzanie kodu i kolorowanie składni

Opublikowany

Render Markdown mamy już z Rozdziału 5. Teraz sprawiamy, że treść artykułu wygląda profesjonalnie: bloki kodu z kolorowaniem składni (highlight.js), kod inline oraz stylowanie treści (.blog-content). Na koniec przegląd elementów Markdown, których możesz używać w artykułach.

Czego się nauczysz

  • Kolorowanie składni kodu (highlight.js)
  • Bloki kodu z językiem (fenced code)
  • Kod inline i stylowanie treści (.blog-content)
  • Przegląd elementów Markdown w artykule

Rozdział 9: Osadzanie kodu i kolorowanie składni

Zaczynamy Część II — Bogata treść. Render Markdown mamy już z Rozdziału 5 (MarkdownExtension) — teraz sprawimy, że treść artykułu wygląda profesjonalnie: bloki kodu z kolorowaniem składni (highlight.js), kod inline i porządne stylowanie treści. Na koniec przegląd elementów Markdown, których możesz używać w artykułach.

Stan wejściowy: działający filtr |markdown z Rozdziału 5. Tu dokładamy warstwę wizualną — bez zmian w PHP, wyłącznie CSS/JS na stronie artykułu.


Bloki kodu w Markdown

MarkdownExtension z Rozdziału 5 zamienia ogrodzony blok kodu (fenced code) na HTML. Ważne, by podać język po trzech backtickach:

```php
#[Route('/blog/{slug}', name: 'app_blog_show')]
public function show(string $slug): Response
{
    // …
}
```

CommonMark wygeneruje z tego:

<pre><code class="language-php">#[Route('/blog/{slug}', name: 'app_blog_show')] …</code></pre>

Kluczowa jest klasa language-php — po niej biblioteka kolorująca rozpozna język. Bez podania języka blok i tak się wyrenderuje, ale bez kolorów.


Kolorowanie składni (highlight.js)

Kolorowanie robimy po stronie przeglądarki biblioteką highlight.js (bez żadnego kodu PHP). Dodajemy ją na stronie artykułu — motyw CSS w {% block stylesheets %} i skrypt w {% block javascripts %} szablonu show.html.twig:

{% block stylesheets %}
    {{ parent() }}
    <link rel="stylesheet"
          href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
{% endblock %}

{% block javascripts %}
    {{ parent() }}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
    <script>
        document.addEventListener('DOMContentLoaded', () => hljs.highlightAll());
    </script>
{% endblock %}
  • hljs.highlightAll() znajduje wszystkie <pre><code class="language-…"> na stronie i koloruje je.
  • Motyw github-dark — ciemne tło bloków, jak w tym tutorialu. Do wyboru są dziesiątki motywów (wystarczy podmienić plik CSS).
  • To rozwiązanie CDN — zero konfiguracji buildu. (Docelowo można je wciągnąć przez Vite/AssetMapper, ale na potrzeby bloga CDN w zupełności wystarcza.)

Bezpieczeństwo bez zmian: highlight.js operuje na już zrenderowanym, oczyszczonym HTML-u (html_input: strip z Rozdziału 5) — nie wykonuje kodu z treści, tylko go koloruje.


Kod inline i stylowanie treści

Sam Markdown daje surowy HTML — dopracujmy jego wygląd klasą .blog-content (kontener, w którym renderujemy {{ article.content|markdown }}). Style dokładamy do {% block stylesheets %}:

/* Bloki kodu */
.blog-content pre {
    border-radius: .5rem;
    margin: 1.25rem 0;
    font-size: .875rem;
}

/* Kod inline — pojedyncze `backticki` w tekście */
.blog-content code:not(pre code) {
    background: #f1f3f5;
    color: #d63384;
    padding: .15em .4em;
    border-radius: .25rem;
    font-size: .875em;
}

/* Nagłówki, tabele, cytaty, obrazki */
.blog-content h2 { font-size: 1.5rem; border-bottom: 2px solid #e9ecef; padding-bottom: .4rem; }
.blog-content p  { line-height: 1.8; margin-bottom: 1.1rem; }
.blog-content blockquote {
    border-left: 4px solid #0d6efd;
    background: #f8f9fa;
    padding: .75rem 1.25rem;
    border-radius: 0 .375rem .375rem 0;
}
.blog-content table { width: 100%; border-collapse: collapse; }
.blog-content th, .blog-content td { border: 1px solid #dee2e6; padding: .5rem .75rem; }
.blog-content img { max-width: 100%; border-radius: .5rem; }
  • code:not(pre code) — celujemy tylko w kod inline (pojedyncze backticki), nie w bloki <pre> (te koloruje highlight.js). To ważne rozróżnienie — inaczej styl inline nadpisałby motyw bloków.
  • img { max-width: 100% } — obrazki w treści są responsywne (przydadzą się w Rozdziale 10).

Przegląd elementów Markdown

Dzięki CommonMark + GitHub Flavored Markdown (z Rozdziału 5) w treści artykułu masz do dyspozycji:

Element Składnia
Nagłówki ## Sekcja, ### Podsekcja
Pogrubienie / kursywa **tekst**, *tekst*
Przekreślenie (GFM) ~~tekst~~
Kod inline `kod`
Blok kodu ```php … ```
Lista / lista zadań (GFM) - punkt, - [x] zrobione
Tabela (GFM) | A | B |
Cytat > cytat
Link / autolink (GFM) [tekst](url), https://…
Obrazek ![opis](/images/…)
Linia pozioma ---

Pamiętaj: surowy HTML wpisany w treść jest usuwany (html_input: strip z Rozdziału 5). Cała bogata treść powstaje z Markdown — bezpiecznie i przewidywalnie.


Podsumowanie

Treść artykułu wygląda teraz profesjonalnie:

  • ✅ bloki kodu z języka (```php) — MarkdownExtension generuje <pre><code class="language-php">,
  • ✅ kolorowanie składni przez highlight.js (CDN, motyw github-dark, hljs.highlightAll()),
  • ✅ kod inline i pełne stylowanie .blog-content (nagłówki, tabele, cytaty, obrazki),
  • ✅ przegląd Markdown (GFM: tabele, listy zadań, przekreślenia, autolinki),
  • ✅ działający stan: artykuł z blokami kodu wyświetla się z kolorami, a cała treść jest ładnie sformatowana.

W Rozdziale 10 dodamy obrazki — inline w Markdown oraz galerię powiązaną z artykułem przez encję BlogMedia.

Narzędzia / paczki

highlight.js Twig Markdown

Spis treści