Dziś jest poniedziałek, 8 września 2008 roku (z kalendarza...)

Markdown

Icon

23.07.2008, 11:44

PHP

Komentarze (7)

Powrót

Pisanie tekstu w czystym HTML-u jest na dłuższą metę niewygodne, dlatego na stronach internetowych stosowane są najrozmaitsze parsery, które pozwalają tworzyć artykuły i wiadomości w przystępnej formie, a na swoje barki biorą przetworzenie ich na postać czytelną dla przeglądarki. Używałem różnych systemów, począwszy od BBCode, poprzez parsery wiki z Text_Wiki na czele, własne produkcje (Dzienniki zyxowe), jednak z tego wszystkiego ostatnio wybił się Markdown.

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:

  1. System tworzenia tabelek
  2. Obsługę list definicji
  3. 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 :).

Powrót

Komentarze

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

Napisał Kłeczek Marcin w środę, 23 lipca 2008 o 13:04

A kto by ręcznie przerabiał :D napisz parser starego formatu i output w nowym :-)

Napisał Nowaker w czwartek, 24 lipca 2008 o 00:14

Markdown to jest to. Ma najbardziej naturalną składnię ze wszystkich :)

Napisał takieGadanie w czwartek, 24 lipca 2008 o 08:39

Fajne ;)
Ach, gdyby tak jeszcze generował ODF albo WordML :P

Napisał Lucas w czwartek, 24 lipca 2008 o 11:40

Ja swego czasu poszukując też parsera wygrzebałem http://texy.info/en/syntax . Składnię ma jak markdown ale większe możliwości i napisany w php5.
A z drugiej strony nie ma to jak czysty html ewentualnie przepuszczony przez XSLT (tak na marginesie do markdownu też jest chociaż nie był doskonały).

Napisał eXtreme w piątek, 25 lipca 2008 o 18:51

No w sumie ten texy to też ciekawa rzecz.

Napisał sobstel w sobotę, 16 sierpnia 2008 o 21:25

Polecam sprawdzic RST (reStructuredText). W ezComponents mozna znaleźć parser do tego. O wiele większe możliwości od Markdowna, zachowujac jego prostotę i przejrzystość.

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia