Przyjrzałem się trochę możliwością Markaby i stwierdziłem to jest to czego potrzebuje, jak rozwiniecie nazwy wskazuje markaby pozwala nam pisać szablony w czystym ruby, po przetworzeniu otrzymujemy gotowy do wyświetlenia kod HTML. Jest doskonała alternatywa dla ERB i innych systemów szablonów opartych na znacznikach i jakiejś nowej składni, można go używać w railsach. Co więcej Markaby tworzy kod zgodny z XHTML 1.0 Strict lub Transitional, potrafi wyłapywać nasze niektóre pomyki, a także znaczniki które są niedozwolone w danym standardzie.
Markaby jest dostępne w postaci gemu i paczki tgz "http://rubyforge.org/projects/markaby":http://rubyforge.org/projects/markaby. Instalowanie czegokolwiek za pomocą rubygems jest banalnie proste wiec tak zrobimy:
gem install markaby -y
Cała praca z Markaby to tak naprawdę wywoływanie metod(tu małe kłamstwo) i przekazywanie im bloków kodu. Nazwy metod które wywołujemy to nazwy tagów HTML. Przejdźmy do przykładu by zobaczyć jak to wygląda.
require 'markaby'
output = Markaby::Builder.new(:indent=>1) do
html do
head { title "To jest jakis tytul" }
body { "Jakis napis w ciele dokumentu" }
end
end
puts output.to_s
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>To jest jakis tytul</title>
</head>
<body>
Jakis napis w ciele dokumentu
</body>
</html>
Parametr :indent określa o ile spacji będzie wcinany każdy blok kodu wynikowego. Domyślnie ma on wartość zero, która powoduje ze otrzymamy kod html w jednej linii.
xhtml_strict do
head { title "Strona numer 2" }
body do
h1 "Naglowek strony numer 2"
div do
p "Pierwszy akapit"
strong "tu pogrubione"
div { blockquote "a tu kawalek cytatu w div'e" }
end
end
end
end
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<h1>Naglowek strony numer 2</h1>
<div>
<p>Pierwszy akapit</p>
<strong>tu pogrubione</strong>
<div>
<blockquote>a tu kawalek cytatu w div'e</blockquote>
</div>
</div>
Jak widać aby zagnieżdżając coś pomiędzy tagami html wystarczy przekazać to jako blok kodu. Jest bardzo intuicyjne, robimy to tak samo jak w przypadku zwykłego kodu html. Możemy także manipulować parametrami tagów, umieszczając odpowiedni parament w postaci symbolu po argumencie metody będącym zawartością tagu, jeśli ten argument jest podany.
a "Ruby!",:href=>"http://ruby-lang.org"
p "To bedzie na zielono",:style=>"color:green"
div :style=>"color:red;font-weight:bolder" do
"Tu cos w div'ie"
end
<a href="http://ruby-lang.org">Ruby!</a>
<p style="color: green">To bedzie na zielono</p>
<div style="color: red; font-weight: bolder">Tu cos w div'ie</div>
Gdy używamy stylów css przydaje się aby elementy naszej strony należały do jakiejś klasy i/albo posiadały jakiś identyfikator, markaby łatwo pozwala je nadawać, spójrzmy na przykład.
div.spis! do
ul do
["abc","123","a2c"].each do |var|
li.wartosci var
end
end
end
p.zielony { "Tu powinno byc zielono" }
<div id="spis">
<ul>
<li class="wartosci">abc</li>
<li class="wartosci">123</li>
<li class="wartosci">a2c</li>
</ul>
</div>
<p class="zielony">Tu powinno byc zielono</p>
Jak widać kod szablonu jest bardzo przejrzysty, łatwy do czytania i interpretacji (w końcu to ruby!).
Jesli chcesz zrobic cos prostego to jest to w miare proste. Ale jak chcesz miec full zgodnosc ze spec. to jest to masa roboty.
Hmm specyfikacja, jeśli na nią popatrzeć to trudno nazwać mój serwer serwerem http. To jak wyglądają nagłówki odpowiedzi zerżnąłem z http://web-sniffer.net/ odpytując jakiś tam serwer. W założeniu ma to być serwer plików, udostępniający api do pisania własnych handlerów i pluginów + obsługa małej części tego co oferuje biblioteka CGI, coś jak mongler. Narzazie nie mam zbytnio czasu bo okres kolokwiów trwa:), ale jak skończę serwer to wrzucę kod i napisze jakiś opis, jak go rozszerzać o nowe funkcjonalności itp.
Moze napiszesz cos wiecej o serwerze. Ja mialem go zrobic na projekt na uczelnie ale jak przejrzalem specyfikacje HTTP 1.1 i CGI to odpuscilem, szczegolnie ze zostalo mi tylko pol semestru.
Chcemy wiecej :D