Markaby - pisz w Ruby, wyświetlaj html 4

Posted by wijet
on Thursday, May 03

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!).

Comments

Leave a response

  1. dr_bonzoMay 12, 2007 @ 12:07 PM

    Jesli chcesz zrobic cos prostego to jest to w miare proste. Ale jak chcesz miec full zgodnosc ze spec. to jest to masa roboty.

  2. wijetMay 12, 2007 @ 03:07 PM

    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.

  3. dr_bonzoMay 12, 2007 @ 06:07 PM

    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.

  4. zajefajnyxNovember 23, 2009 @ 08:27 PM

    Chcemy wiecej :D

Comment