Markdown należy do tzw. lekkich języków znaczników. Jego głównym założeniem jest prostota tworzenia tekstu oraz maksymalna czytelność wersji źródłowej tak, by i ona mogła bez większych problemów być publikowana. Za jego powstanie odpowiadają John Gruber i Aaron Swartz, a pierwszy parser został napisany w Perlu. Obecnie istnieją dziesiątki portów dla wszystkich najważniejszych języków, w tym PHP, Ruby'ego i Pythona.
Składnia Markdowna czerpie wiele z już istniejących konwencji stosowanych przy tworzeniu plików tekstowych oraz e-maili. Oto przykładowy tekst w tym formacie:
Markdown ======== To jest przykładowy tekst w formacie *Markdown*. Jak widać, można go bez trudu czytać także w wersji źródłowej. Jest to zasługa odpowiedniego doboru znaczników bazujących na już istniejących konwencjach używanych przy pisaniu: 1. Plików tekstowych (np. dokumentów *readme*) 2. E-maili 3. Hmmm... wielu innych rzeczy. Powróćmy już jednak do normalnej formy...
Oryginalna składnia ma jednak trochę braków. Przykładowo, nie obsługuje w ogóle tabelek w postaci innej, niż HTML, co już takie wygodne nie jest. Z tego powodu różne parsery lekko rozszerzają istniejącą składnię o nowe możliwości. Ze strony PHP, bardzo ciekawą modyfikacją jest PHP Markdown Extra autorstwa Michela Fortina, wzbogacony o:
- System tworzenia tabelek
- Obsługę list definicji
- Parsowanie składni MD wewnątrz elementów blokowych języka HTML.
Fortin zauważył, że takie dodatki to nic przyjemnego, dlatego zainicjował prace nad oficjalną specyfikacją formatu, które choć znajdują się na dość wczesnym etapie, są na pewno właściwym krokiem w rozwoju.
Markdown w PHP
Implementacja Markdowna od strony PHP jest prosta - ściągamy ze strony Fortina parser PHP Markdown-Extra, który ma postać jednego pliku PHP, dołączamy go do naszego projektu i korzystamy z funkcji markdown(), gdzie za argument podajemy tekst do sformatowania. Na wyjściu otrzymujemy kod HTML:
<?php require('./markdown.php'); echo markdown($_POST['text']); ?>
Funkcja markdown() jest w rzeczywistości prostą nakładką na całą klasę - automatycznie inicjuje obiekt, jeśli go nie ma, i wywołuje stosowną metodą. Możemy to wykonać ręcznie:
<?php require('./markdown.php'); $parser = MarkdownExtra_Parser; echo $parser->transform($_POST['text']); ?>
Stosowanie klasy ma dodatkową zaletę. Otóż składnia Markdowna dopuszcza tworzenie linków przez referencję - w tekście podajemy tylko identyfikator, a dopiero gdzieś pod spodem definiujemy URL i opcjonalny tytuł. Dzięki klasie, możemy dostarczyć do parsera predefiniowaną i stworzoną przez nasz skrypt listę referencji:
<?php require('./markdown.php'); $parser = MarkdownExtra_Parser; $parser->predef_url = array( 'referencja1' => 'http://www.example.org/foo', 'referencja2' => 'http://www.example.org/bar' ); $parser->predef_title = array( 'referencja1' => 'Odnośnik do FOO' ); echo $parser->transform($_POST['text']); ?>
PHP Markdown zawiera także wbudowany kod odpowiedzialny za integrację z systemem blogowym WordPress oraz funkcję modyfikatora dla Smarty'ego, którą trzeba jedynie zarejestrować.
Gdzie znaleźć opis składni?
Anglojęzycznych opisów składni Markdown jest w Internecie kilka, w tym takich półobrazkowych dla półanglofabetów :). Polski opis też istnieje... od kilkunastu dni, a jest to zasługa eXtreme'a, który wyczerpująco opisał całą składnię na potrzeby systemu generowania dokumentacji TypeFriendly opartego właśnie na Markdownie. Opis zawiera wprawdzie kilka modyfikacji poczynionych na potrzeby tego projektu, ale cała reszta odpowiada temu, co potrafi PHP Markdown Extra.
Zakończenie
Markdown wyjątkowo mi się spodobał ze względu na swą intuicyjność i logiczną budowę. Początkowo musiałem przyzwyczaić się trochę do tworzenia linków, gdyż oczywiście każdy nowy format musi być w tym względzie odkrywczy i proponować coś zupełnie odmiennego od reszty, ale już się do tego przyzwyczaiłem i po bliższych oględzinach stwierdziłem, że nawet ma to sens. Myślę nawet o zastąpieniu parsera Dzienników zyxowych Markdownem, chociaż będzie to wymagać zapewne trybu dualnego, gdyż nie ma raczej mowy o przerabianiu 580 wpisów i 2600 komentarzy :).















Napisał eXtreme w środę, 23 lipca 2008 o 12:07
"gdyż nie ma raczej mowy o przerabianiu 580 wpisów"
Aaa tam głupoty gadasz, ja, gdy zmieniałem parser z Textile na Markdown na TrueCombat.pl przepisałem ponad 120 newsów i kilka artykułów. :d