<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.invenzzia.org/pl/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Invenzzia... po polsku - Tag - dokumentacja</title>
  <link>http://blog.invenzzia.org/pl/</link>
  <atom:link href="http://blog.invenzzia.org/pl/feed/tag/dokumentacja/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>pl</language>
  <pubDate>sob, 15 sty 2011 22:56:54 +0100</pubDate>
  <copyright>Copyright &amp;copy; Invenzzia</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Wiki.invenzzia.org</title>
    <link>http://blog.invenzzia.org/pl/post/Wiki.invenzzia.org</link>
    <guid isPermaLink="false">urn:md5:54860fb5e8c4919cf33c8439bda4497b</guid>
    <pubDate>nie, 08 lut 2009 17:10:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Invenzzia</category>
        <category>dokumentacja</category><category>invenzzia</category><category>website</category><category>wiki</category>    
    <description>    &lt;p&gt;Dzisiaj oficjalnie zostało uruchomione wiki Invenzzii, na wszyscy zainteresowani będą mogli publikować porady, artykuły oraz inne materiały poświęcone projektom open-source takim, jak Open Power Template czy TypeFriendly. W przeciągu ostatnich kilku dni konfigurowałem MediaWiki oraz instalowałem niezbędne dodatki, jednak wciąż jeszcze sporo pozostało do zrobienia. Jak widać, na wiki brakuje wielu stron pomocy i szablonów technicznych, jednak powinny one zostać w najbliższych dniach dodane. Zachęcam wszystkich do opisywania tam swoich rozwiązań, pomysłów oraz dodatków - wystarczy do tego jedynie konto na naszym forum i znajomość języka angielskiego, jako że wiki dostępne jest tylko w nim.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Wiki.invenzzia.org#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Wiki.invenzzia.org#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/46</wfw:commentRss>
      </item>
    
  <item>
    <title>Pożegnanie z Polską</title>
    <link>http://blog.invenzzia.org/pl/post/Poegnanie-z-Polsk</link>
    <guid isPermaLink="false">urn:md5:accbd7d74991ae4cbf07af8621172ac6</guid>
    <pubDate>sob, 20 wrz 2008 17:21:00 +0200</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Invenzzia</category>
        <category>dokumentacja</category><category>invenzzia</category><category>website</category>    
    <description>&lt;p&gt;Dzisiaj kolektywnie doszliśmy do wniosku, że postawienie na polskich programistów i język polski było dużym błędem. Sprawa tłumaczeń i utrzymywania dwujęzyczności okazała się trudniejsza, a z rodzimej części, zamiast spodziewanego odezwu, słyszymy głównie krytykę, że forum jest puste, społeczność nikła i tekstów mało. Dokładniejszy przegląd sytuacji zawarłem na moim blogu i nie chcę się tu powielać, ograniczając się jedynie do skutków dla Invenzzii.&lt;/p&gt;    &lt;p&gt;A tych będzie trochę:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dokumentacje będą docelowo tworzone tylko w języku angielskim. Polska wersja uzależniona jest wyłącznie od naszej dobrej woli, czasu i chęci.&lt;/li&gt;
&lt;li&gt;Artykuły będą docelowo tworzone w języku angielskim. Jak wyżej.&lt;/li&gt;
&lt;li&gt;Polskie forum będzie zredukowane, ale nie likwidowane.&lt;/li&gt;
&lt;li&gt;Polski blog zostaje, ale tym razem wiadomości będą pojawiać się przede wszystkim po angielsku.&lt;/li&gt;
&lt;li&gt;Wszystkie informacje najpierw pojawią się w języku angielskim.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jeśli ktoś nie zna angielskiego, trudno. W końcu i tak korzysta z projektów pokroju Zend Frameworka, które przecież kompletnej i dobrej polskiej dokumentacji nie mają. Przynajmniej dzięki takiemu krokowi będzie mogła reszta świata skorzystać, a ja nie będę tracił czasu na pisanie dwukrotnie tego samego. Ponadto zauważyłem, że znacznie wygodniej pisze mi się najpierw tekst po angielsku, później tłumacząc na polski, niż w drugą stronę.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Poegnanie-z-Polsk#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Poegnanie-z-Polsk#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/36</wfw:commentRss>
      </item>
    
  <item>
    <title>OPT 2.0.0-dev7</title>
    <link>http://blog.invenzzia.org/pl/post/OPT-200-dev7</link>
    <guid isPermaLink="false">urn:md5:b131a991b46030d10b663233a603ff4b</guid>
    <pubDate>śro, 20 sie 2008 11:31:00 +0200</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>development</category><category>dokumentacja</category><category>opt2</category><category>releases</category>    
    <description>&lt;p&gt;3 miesiące i 10 dni. Tyle zajęło przepisywanie dotychczasowego kodu OPT do nowej, lepszej wersji. Dziś w końcu uznałem, że dotarł on do punktu, w którym może aspirować do miana &quot;dev7&quot; i odpowiednia paczka znalazła się w działach &quot;Download&quot;. Zmian jest sporo, głównie związanych z API biblioteki, którą teraz się nieco inaczej inicjuje. Poprawiłem też nieco kompilator, dodając do szablonów parę nowych możliwości oraz znacząco rozbudowałem dokumentację, która zresztą dołączona jest do wydania.&lt;/p&gt;    &lt;h2&gt;Zmiany w API&lt;/h2&gt;


&lt;p&gt;Nowe OPT zupełnie inaczej się inicjuje. Biblioteka nie jest w pełni samodzielna - aby ułatwić późniejszą integrację z innymi produktami serii OPL, powstał pakiet OPL zawierający podstawowe interfejsy oraz klasy. Wyekspediowana tam została m.in. obsługa konsoli debugowej oraz konfiguracji, ponadto dodaje on autoloader z prawdziwego zdarzenia. Kod OPL dołączony jest domyślnie do paczki z OPT, tak więc w dalszym stopniu wystarczy skrypt tylko rozpakować.&lt;/p&gt;


&lt;p&gt;Aby nie być gołosłownym przedstawiam odrobinę kodu:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;&amp;lt;?php
    // OPL Initialization
    require('../../lib/opl/base.php');
    Opl_Loader::setDirectory('../../lib/');
    Opl_Registry::setState('opl_debug_console', true);
    Opl_Registry::setState('opl_extended_errors', true);
    spl_autoload_register(array('Opl_Loader', 'autoload'));
    
    try
    {
    	$tpl = new Opt_Class;
    	$tpl-&amp;gt;sourceDir = './templates/';
    	$tpl-&amp;gt;compileDir = './templates_c/';
    	$tpl-&amp;gt;charset = 'utf-8';
    	$tpl-&amp;gt;compileMode = Opt_Class::CM_REBUILD;
    	$tpl-&amp;gt;stripWhitespaces = false;
    	$tpl-&amp;gt;setContentType(Opt_Class::HTML);
    	$tpl-&amp;gt;setup();
    	
    	$tpl-&amp;gt;assign('foo', 'Blok');
    	$tpl-&amp;gt;parse('szablon.tpl');    
    }
    catch(Opt_Exception $exception)
    {
    	Opt_Error_Handler($exception);
    }
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Podstawowa inicjacja polega na załadowaniu głównego pliku biblioteki OPL, ustawieniu katalogu ze źródłami oraz autoloadera. Podany katalog musi zawierać zarówno foldery &quot;opl&quot;, jak i &quot;opt&quot;, gdyż inaczej nic się nam nie załaduje. Przy okazji możemy ustawić ogólne aspekty funkcjonowania wszystkich bibliotek OPL.&lt;/p&gt;


&lt;p&gt;Jak widać, zmienione zostało nazewnictwo klas. Musiałem to zrobić, ponieważ taki zapis jest znacznie łatwiej parsować w autoloaderze, a przy okazji ucieszy fanów Zend Frameworka. Zmieniłem także nazwy niektórym metodom, np. powyżej widać, że &lt;code&gt;httpHeaders()&lt;/code&gt; został przechrzczony na &lt;code&gt;setContentType()&lt;/code&gt;. Jeśli zajrzymy do katalogu &lt;code&gt;/lib/opt/&lt;/code&gt;, ujrzymy, że cały kompilator został zmodularyzowany, lecz i tak nie uchroniło to głównej klasy &lt;code&gt;Opt_Compiler_Class&lt;/code&gt; przed zajmowaniem 65 KB na dysku twardym. Tego się już bardziej odchudzić po prostu nie da, ale możecie się pocieszać, że do tego pliku właściwie tylko ja muszę zaglądać i się w nim orientować :).&lt;/p&gt;


&lt;p&gt;Tutaj mała uwaga: z OPT wyrzuciłem system cache. Doszedłem do wniosku, że zmuszanie tej biblioteki do zajmowania się jeszcze tym to lekkie przegięcie. Zamiast tego, pozostał bardzo prosty interfejs &lt;code&gt;Opt_Cache_Hook_Interface&lt;/code&gt;, który należy sobie zaimplementować, aby podłączyć dowolny inny system cache. W ten sposób biblioteka łatwiej będzie integrować się z frameworkami, które często obsługują ten element we własnym zakresie. Gdyby ktoś jednak czegoś takiego nie miał, dotychczasowy kod niebawem będzie dostępny z powrotem... lecz jako osobna biblioteka, dla której jeszcze nie wymyśliłem nazwy.&lt;/p&gt;


&lt;h2&gt;Zmiany w szablonach&lt;/h2&gt;


&lt;p&gt;Szablony powinny działać bez większych problemów, aczkolwiek przy okazji przepisywania pchnąłem lekko do przodu prace nad instrukcjami. Pojawił się &lt;code&gt;opt:tag&lt;/code&gt;, a &lt;code&gt;opt:extend&lt;/code&gt; w pełni obsługuje już escape'owanie. Nie ma jeszcze &lt;code&gt;opt:tree&lt;/code&gt;, &lt;code&gt;opt:grid&lt;/code&gt; i &lt;code&gt;opt:pagination&lt;/code&gt;, gdyż zmieniłem silnik sekcji i na razie zdążyłem go przetestować jedynie na &lt;code&gt;opt:section&lt;/code&gt;. Sekcje są teraz o tyle fajne, że obsługują tzw. klasy uchwytów (hook classes), dzięki którym można nauczyć je obsługi dowolnego formatu danych, jaki nam się tylko zamarzy. W finalnym wydaniu nie będzie żadnych problemów, żeby sekcja potrafiła odczytywać dane np. bezpośrednio z obiektów PHP-Doctrine lub różnych elementów frameworków. Wszelkie sprawy związane z wybranym formatem są zupełnie niewidoczne po stronie szablonu:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;opt:section name=&amp;quot;sekcja&amp;quot;&amp;gt;
  .... {$sekcja.blok}
&amp;lt;/opt:section&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Format natomiast wybieramy w skrypcie, np.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;$tpl-&amp;gt;assign('sekcja', $PDOStatement, 'PDO');
&lt;/pre&gt;


&lt;p&gt;OPT zajmie się całą resztą, czyli dopasowaniem formatu do sekcji, korzystając z podanej klasy uchwytów. Klasy uchwytów mogą również modyfikować działanie zwyczajnych bloków, a twórcy instrukcji mogą korzystać z ich API w swoich produkcjach. W samych sekcjach pojawił się nowy atrybut: &lt;code&gt;parent&lt;/code&gt;, który ułatwi tworzenie relacji. Przypomnę, że w dalszym ciągu sam fakt zagnieżdżenia jednej sekcji w innej tworzy między ich elementami relację przynależności, lecz jeśli domyślne zachowanie nam nie pasuje, możemy to zmienić:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;opt:section name=&amp;quot;sekcja1&amp;quot;&amp;gt;
   &amp;lt;opt:section name=&amp;quot;sekcja2&amp;quot;&amp;gt;
      &amp;lt;opt:section name=&amp;quot;sekcja3&amp;quot; parent=&amp;quot;sekcja1&amp;quot;&amp;gt;
         ....
      &amp;lt;/opt:section&amp;gt;
   &amp;lt;/opt:section&amp;gt;
&amp;lt;/opt:section&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Teraz elementy sekcji3 są przyłączone do sekcji1, a nie sekcji2. Ponadto, niedawno na forum Nowaker zaproponował, aby OPT zgodnie z logiką obsługiwał następujący blok sekcji: &lt;code&gt;{$sekcja.blok.elementTablicy}&lt;/code&gt;. Wola jego stała się faktem i teraz OPT skanuje cały taki blok w poszukiwaniu nazwy dowolnej aktywnej obecnie sekcji.&lt;/p&gt;


&lt;p&gt;Z innych nowości należy wymienić możliwość przypisania bloku do konkretnego szablonu. Dostęp jest realizowany poprzez &lt;code&gt;$this.blok&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;Dokumentacja&lt;/h2&gt;


&lt;p&gt;Spędziłem niedawno dużo czasu nad dokumentacją do OPT 2, a przede wszystkim nad przekonwertowaniem dotychczasowych wyczynów na TypeFriendly. Efekt jest następujący:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na ukończeniu jest opis składni szablonów. Jedynie dwie instrukcje nie posiadają jeszcze dokumentacji i trochę funkcji.&lt;/li&gt;
&lt;li&gt;Opisana jest większość API biblioteki.&lt;/li&gt;
&lt;li&gt;Opisane są wszystkie aktualnie wykorzystywane i zatwierdzone dyrektywy konfiguracyjne.&lt;/li&gt;
&lt;li&gt;Na ukończeniu są strony opisujące migrację z: PHP, OPT 1.x oraz Smarty'ego. Szczególnie w OPT 1.1.x ludzie się krzywili na ostatni z wymienionych opisów, że głupoty opisuje, zamiast konkretów. Teraz się poprawiłem i różnica jakościowo-ilościowa powinna być widoczna gołym okiem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dokumentacja dołączona jest do paczki, jest także możliwość przejrzenia jej on-line: &lt;a href=&quot;http://www.invenzzia.org/docs/opt2-pl/&quot; hreflang=&quot;pl&quot;&gt;on-line&lt;/a&gt;. Można także zapoznać się z zalążkiem angielskiej dokumentacji do &lt;a href=&quot;http://www.invenzzia.org/docs/opl2-en/&quot; hreflang=&quot;en&quot;&gt;OPL&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Zakończenie&lt;/h2&gt;


&lt;p&gt;Wykaz paczek można znaleźć &lt;a href=&quot;http://libs.invenzzia.org/pl/download&quot; hreflang=&quot;pl&quot;&gt;tutaj&lt;/a&gt;. Na kolejną niestety znów przyjdzie trochę poczekać. W sobotę wyjeżdżam na tydzień, a zaraz później pochłonie mnie przeprowadzka do Krakowa i egzamin na uczelni, tak więc będę &quot;wolny&quot; dopiero za jakiś miesiąc. W tym czasie będę wrzucać jakieś mniejsze rzeczy na SVN i tam też będzie najświeższa wersja. Z drugiej strony, eXtreme już coś tam kombinuje z Open Power Classes, a konkretniej jego klasą &quot;Opc_Paginator&quot; do stronicowania. Myślę, że również Radzio w końcu zrobi swoje API dla Google Charts.&lt;/p&gt;


&lt;p&gt;Na koniec należy uczciwie zaznaczyć, że OPT 2.0.0-dev7 przeszedł z LGPL 3 na zmodyfikowaną licencję BSD, co Wam ułatwi później dodawanie go do projektów komercyjnych, a wszystkim utrudni życie z przyjmowaniem zewnętrznych patchów i poprawek. Licencja LGPL była o tyle fajna, że z definicji obejmowała sobą również wszystkie poprawki i patche. Zmodyfikowana BSD tak nie robi i będę musiał odmawiać ich dodania do SVN bez podpisanego papierka ze zgodą na wydanie ich na podanej licencji, tak jak to robi Zend ze swoim Frameworkiem. Coś za coś.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/OPT-200-dev7#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/OPT-200-dev7#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/34</wfw:commentRss>
      </item>
    
  <item>
    <title>TypeFriendly</title>
    <link>http://blog.invenzzia.org/pl/post/TypeFriendly</link>
    <guid isPermaLink="false">urn:md5:759da236043100759dab1375858eff8f</guid>
    <pubDate>śro, 02 lip 2008 20:51:00 +0200</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>TypeFriendly</category>
        <category>development</category><category>dokumentacja</category><category>typefriendly</category>    
    <description>&lt;p&gt;Z eXtremem ciężko pracujemy, by pierwsza wersja ujrzała w końcu światło dzienne i jesteśmy już bardzo blisko. W związku z tym chciałbym bliżej przedstawić ten projekt, który z pewnością powinni docenić inni programiści, autorzy rozmaitych skryptów i poszukujących sensownego narzędzia do generowania dokumentacji. Pomysł na napisanie TypeFriendly zrodził się w mojej głowie po nieudanych zmaganiach z dodaniem paru niezbędnych rzeczy do parsera XSLT dla DocBook. Widać choćby po dokumentacji PHP, co można z tym zrobić (kolorowanie składni, wiele różnych formatów, ogromna ilość pomocnych znaczników), ale nie dajmy się zwariować. To są wręcz tygodnie siedzenia, by osiągnąć podobny efekt. Pomijam już fakt, że byłby on słabo przenośny... wolałem poświęcić te tygodnie na stworzenie czegoś bardziej przydatnego.&lt;/p&gt;    &lt;p&gt;TypeFriendly jest więc systemem generowania dokumentacji, ale innego pokroju niż np. phpDocumentor, który skanuje kod źródłowy Twojego projektu i robi opisy do wszystkich napotkanych klas i funkcji. Tutaj rozdziały piszemy sami od A do Z i sami układamy je w żądanym porządku, podobnie jak w DocBooku. Na tym podobieństwa się kończą, ponieważ TF z definicji zawiera już wszystko, co potrzeba, a został tak zaprojektowany, by dokumentację pisało się intuicyjnie.&lt;/p&gt;


&lt;p&gt;Cechy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;W TF dokumentację tworzymy, pisząc tekst w zwykłych plikach tekstowych, korzystając ze składni Markdown. Dodatkowo, na początku umieszczamy różne dodatkowe tagi, dzięki którym możemy ustawić tytuł, informacje o wersji czy np. listę &quot;Zobacz także&quot;.&lt;/li&gt;
&lt;li&gt;TF automatycznie układa nasze pliki w rozdziały na podstawie ich nazwy i sortuje alfabetycznie. Jednak zawsze możemy wprowadzić własny układ - w pliku &quot;ze wskazówkami do sortowania&quot; definiujemy własną kolejność. To, czego tam nie zapisaliśmy, pozostanie alfabetycznie.&lt;/li&gt;
&lt;li&gt;TF posiada wbudowaną opcję kolorowania składni kodu źródłowego.&lt;/li&gt;
&lt;li&gt;TF samodzielnie generuje pełną nawigację pomiędzy rozdziałami, podobnie jak spis treści.&lt;/li&gt;
&lt;li&gt;TF jest zaprojektowany do rozwijania dokumentacji w kilku językach. Posiada nie tylko możliwość przetłumaczenia tekstów interfejsu, ale także proste narzędzie do sprawdzania aktualności &quot;pochodnych wersji językowych&quot;.&lt;/li&gt;
&lt;li&gt;TF umożliwia wygenerowanie wyjściowej dokumentacji w formacie XHTML (w wersji z wieloma podstronami lub na jednej). Przygotowujemy też specjalny format umożliwiający szybki import dokumentacji do bazy danych i udostępnienie np. możliwości jej komentowania on-line.&lt;/li&gt;
&lt;li&gt;TF oprawia dokumentację w bardzo ładną szatę graficzną, którą możecie podziwiać np. w dokumentacji do OPTv2 (robionej właśnie w TF).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wprawdzie wydania żadnego jeszcze nie było, ale chętni mogą już teraz połączyć się z naszym nowym SVN-em i ściągnąć projekt stamtąd. Link do polecenia &lt;em&gt;checkout&lt;/em&gt; jest następujący: &lt;em&gt;http://svn.invenzzia.org/svn/typefriendly/trunk/&lt;/em&gt; - serdecznie zachęcam już teraz do testów. W repozytorium jest plik README oraz będąca już na ukończeniu dokumentacja w języku polskim.&lt;/p&gt;


&lt;p&gt;Żeby nie być gołosłownym, pokażę co ciekawsze opcje na przykładzie paru fragmentów. Pierwszym z nich będzie jeden z plików manuala OPTv2 (library.optnode.txt):&lt;/p&gt;

&lt;pre&gt;
Title: Klasa optNode
ShortTitle: optNode
Status: abstract
Extends: library.optcodebuffer
ExtendedBy:
 - library.optscannable
 - library.optcharacterdata
 - library.optexpression

----
Abstrakcyjna klasa węzła. Zapewnia obsługę podstawowych własności, jak rodzic i typ.

Pola klasy
----------
Wszystkie pola klasy są chronione.

 Nazwa         | Typ       | Opis
---------------|-----------|---------------------------------------
 $type         | Integer   | Numeryczny identyfikator typu.
 $parent       | optNode   | Rodzic węzła.

Dostępne identyfikatory typów:

1. `OPT_CDATA_NODE` - `optCharacterData`
2. `OPT_TEXT_NODE` - `optText`
3. `OPT_EXPRESSION_NODE` - `optExpression`
4. `OPT_ELEMENT_NODE` - `optElement`
5. `OPT_ROOT_NODE` - `optRoot`
&lt;/pre&gt;


&lt;p&gt;Na początku pliku znajduje się nagłówek, w którym umieszczamy tzw. tagi. Tam właśnie określany jest właściwy tytuł, a w tym wypadku również zależności między klasami. Zauważmy, że do innych klas odwołujemy się, podając identyfikatory rozdziałów, które je opisują. Oczywiście każdy z tych &quot;obiektowych&quot; tagów posiada także wersję, gdzie nazwy możemy wpisać bezpośrednio (np. gdybyśmy dziedziczyli po klasie wbudowanej w PHP). Dostępnych tagów jest więcej. Przykładowo, można bardzo łatwo zrobić listę &quot;Zobacz także&quot;, która wygląda mniej więcej tak:&lt;/p&gt;

&lt;pre&gt;
SeeAlso:
 - chapter.text1
 - chapter.text2
 - chapter.text3
&lt;/pre&gt;


&lt;p&gt;Gdy lista tagów dobiegnie końca, przechodzimy do właściwej treści pisanej w formacie &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot; hreflang=&quot;pl&quot;&gt;Markdown&lt;/a&gt;. Autor zaprojektował go bazując na formatowaniu używanym powszechnie w rozmaitych plikach tekstowych czy e-mailach (można powiedzieć, że napisał parser do składni, która sama wyewoluowała :)). Tekst źródłowy jest przez to niesamowicie czytelny i na dobrą sprawę czyta się go niewiele gorzej, niż gdyby był faktycznie sformatowany. Trochę gorzej, gdy ktoś jest przyzwyczajony już do jakiejś składni wiki, bo MD nie zawsze takowe wiki przypomina (zwróćcie uwagę chociażby na sposób wykonania tabelki). Jednak można się dość łatwo przyzwyczaić - w Markdownie klepiemy również teksty na naszą stronę i muszę powiedzieć, że jest to całkiem przyjemne narzędzie, które z pewnością ujrzycie w niejednym produkcie Invenzzii. Jedyny mankament jest taki, że oficjalny parser obsługuje tylko jeden słuszny format - XHTML. O LaTeXu czy innych na razie trzeba niestety zapomnieć, ale na to już ostrzymy sobie zęby :).&lt;/p&gt;


&lt;p&gt;Najgorszy problem przy tworzeniu dokumentacji to nawigacja. Linki &quot;Poprzedni/Następny/W górę&quot; załatwia TypeFriendly, sekcję &quot;Zobacz także&quot; robimy za pomocą znaczników, a co z klikalnymi nazwami funkcji i klas? Myślałem nad tym i wymyśliłem rozwiązanie genialne w swej prostocie. W dodatkowym pliku tekstowym definiujemy kawałki tekstów, które mają zostać zamienione na odnośnik. Przykładowo, wpisujemy tam, że &lt;code&gt;`optClass::parse()`&lt;/code&gt; ma, oprócz nadania mu standardowego formatowania, zostać zmienione na odnośnik do &lt;em&gt;library.optclass.parse&lt;/em&gt; i już się niczym więcej przejmować nie musimy. Niestety, do takich przeróbek Markdowna jeszcze nie doszliśmy i pierwsza wersja tego bajeru nie będzie jeszcze zawierać. Wszystko w swoim czasie.&lt;/p&gt;


&lt;p&gt;TypeFriendly obsługiwany jest w całości z konsoli systemu operacyjnego. Testowaliśmy go na Linuksie i Windowsie - w obu systemach działa póki co bez zarzutów. Do działania potrzebny jest wyłącznie interpreter PHP. W połączeniu z intuicyjną składnią oraz wbudowanym wsparciem dla wielojęzyczności powinno to zachęcić wielu ludzi do pomocy przy tłumaczeniach, rozwoju oryginalnej wersji, a nawet tworzeniu nowych wyjść. Przetworzenie naszych plików na XHTML to kwestia wklepania jednego polecenia:&lt;/p&gt;

&lt;pre&gt;
php ./typefriendly.php -l pl -o xhtml ./sciezka/do/dokumentacji/
&lt;/pre&gt;


&lt;p&gt;Porównajmy to z DocBookiem - sam format jest nieco bardziej rozwlekły, ale stosunkowo łatwy do opanowania. Do konwersji jednak potrzeba trochę więcej narzędzi - DTD, sam zestaw DocBok XSL Stylesheet i wreszcie sam parser XSLT. Jego wybór jest nie bez znaczenia, gdyż ze zwykłym, szybkim i łatwym w użyciu xsltproc nie dostaniemy np. kolorowania składni. Użytkownicy Windowsa natomiast mają kompletnie prze.... jeśli autor projektu dodatkowo zrobi na DocBooku framework do budowania dokumentacji, w którym część narzędzi napisana jest w... Bashu. Nie trzeba takich kwiatków daleko szukać - jak myślicie, co odpowiada za dokumentację PHP? :) Z chęcią bym do niej coś popisał, gdyby choć raz udało mi się uruchomić ichniejszy framework i cokolwiek przetworzyć.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/TypeFriendly#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/TypeFriendly#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/29</wfw:commentRss>
      </item>
    
  <item>
    <title>OPT 2.0.0-dev6</title>
    <link>http://blog.invenzzia.org/pl/post/OPT-200-dev6</link>
    <guid isPermaLink="false">urn:md5:e3094cab72537f268ece4f7353879f33</guid>
    <pubDate>sob, 10 maj 2008 14:15:00 +0200</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>development</category><category>dokumentacja</category><category>opt2</category>    
    <description>&lt;p&gt;Do ściągnięcia dostępna jest wreszcie kolejna wersja rozwojowa OPT. Jej zawartość opisałem w poprzednim wpisie, dlatego tu dodam tylko, że wbrew zapowiedziom, nie ma jeszcze instrukcji &lt;code&gt;opt:grid&lt;/code&gt; z powodów, które zaraz wyjaśnię. Ponadto nie da się jeszcze ustawiać statusu escape'owania dla pojedynczego szablonu, ale takowy z globalnej konfiguracji i ustawień wyrażenia w klamerkach już działa ładnie. Za to dodałem implementację instrukcji &lt;code&gt;opt:capture&lt;/code&gt; i częściową &lt;code&gt;opt:cycle&lt;/code&gt;. Polskich użytkowników z pewnością ucieszy informacja, że podczas długiego weekendu doprowadziłem do względnego porządku nasz nowy system dokumentowania TypeFriendly i OPT 2 ma już nową, ładną dokumentację :)&lt;/p&gt;    &lt;p&gt;Dostałem niedawno parę pytań, czy można już powoli zacząć używać OPT 2 w rzeczywistych projektach. Odpowiadałem, że większość rzeczy już jest gotowa i w nich raczej zmian nie będzie, aczkolwiek nic nie gwarantuję. W kolejnym devie okaże się, że dobrze zrobiłem, nic nie gwarantując, ponieważ OPT wymaga paru drastycznych zmian.&lt;/p&gt;


&lt;h2&gt;Sekcje&lt;/h2&gt;


&lt;p&gt;Od strony szablonu wszystko zostaje po staremu, za to zmieni się trochę interfejs skryptowy. W OPT już od pewnego czasu istnieją elementy pozwalające uniezależnić szablony od interfejsów skryptu, dzięki czemu zmiany w silniku nie muszą iść w parze z przepisywaniem wszystkich szablonów, co jest bolączką innych parserów (w tym Smarty'ego, gdzie na forach widziałem już takie cudaczne konstrukcje, że aż głowa może rozboleć). Sekcje już od dawna stanowiły jedną z nich, gdyż skrywały sposób łączenia sekcji podrzędnych i nadrzędnych, a także zawierały obsługę generowania danych &quot;w locie&quot; oraz alternatywny format tablic. Wszystko to było jednak zakodowane na sztywno w kodzie, a dodanie doń czegoś nowego jest kłopotliwe. Przecież formaty danych mogą być jeszcze inne, stąd pomysł, by wprowadzić modularyzację samych sekcji. Instrukcja jako taka zapewnia wyłącznie szkielet podpinający wszystko, gdzie trzeba w drzewku XML. My natomiast za pomocą pluginów możemy łatwo nauczyć sekcję, żeby np. pobierała dane np. bezpośrednio z PHP-Doctrine czy też iterowała po obiekcie :). Zastosowanie:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;opt:section name=&amp;quot;foo&amp;quot;&amp;gt;
 {$foo.bar}
&amp;lt;/opt:section&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Nie musimy się już martwić, czy element &lt;code&gt;foo&lt;/code&gt; jest obiektem, a my odwołujemy się do pola &quot;bar&quot;, czy też tablicą. Po stronie szablonu &lt;code&gt;foo.bar&lt;/code&gt; oznacza blok &quot;bar&quot; w elemencie &quot;foo&quot;, natomiast zadaniem skryptu jest nadanie mu jakiegoś konkretnego znaczenia (tablica, obiekt itd.). Analogicznie, nie obchodzi nas również budowa danych dla sekcji jako takiej - czy to jest sekcja dynamiczna, czy tablica w jakimś formacie, czy też obiekt... Wszystko będzie można łatwo zaprogramować.&lt;/p&gt;


&lt;p&gt;Po stronie skryptu pojawi się metoda w stylu &lt;em&gt;setSectionType&lt;/em&gt; służąca do określenia, jak OPT powinien przetworzyć daną sekcję:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;$tpl -&amp;gt; setSectionType('foo', 'mojPluginObiektowy');
$tpl -&amp;gt; assign('foo', new obiektPoKtorymMoznaIterowac);
&lt;/pre&gt;


&lt;p&gt;Gdy nie określiliśmy typu, OPT wybierze standardową postać tablicową.&lt;/p&gt;


&lt;p&gt;Zalety:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Po stronie szablonu już nas kompletnie nic nie obchodzi. Sekcje możemy kopiować metodą Ctrl+C, a one bez zmiany jednego znaku w pełni dostosują się do sytuacji w nowym szablonie bez naszej ingerencji.&lt;/li&gt;
&lt;li&gt;Koniec narzekań, czemu sekcje nie obsługują czegośtam, albo że format jest debilny :)&lt;/li&gt;
&lt;li&gt;Jednolita kontrola obsługi po stronie skryptu.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Modularyzacja kompilatora&lt;/h2&gt;


&lt;p&gt;Kompilator zostanie rozbity na większą ilość mniejszych plików, gdyż jest on ładowany raz na jakiś czas i zyski ze zbicia wszystkiego w dwa mega-pliki są znikome. Wpływ na skrypty korzystające z OPT powinien być zerowy.&lt;/p&gt;


&lt;h2&gt;Zmiany w obsłudze błędów&lt;/h2&gt;


&lt;p&gt;Niebawem pojawi się Open Power Classes 1.0.0-dev1, a w planach są też inne projekty. Jeśli ma to być coś więcej, niż tylko zbiór bibliotek o podobnej nazwie, trzeba ujednolicić niektóre elementy. Oczywiście wspólną częścią jest obsługa błędów - każda z bibliotek musi więc zawierać taki sam plik z odpowiednim współdzielonym kodem, który może być używany przez wszystkie z nich jednocześnie. Jeżeli poza przechwytywaniem wyjątku optException i kierowaniem go do &lt;code&gt;optErrorHandler()&lt;/code&gt; nie robisz z nim nic więcej, wtedy zmiana nie powinna Cię dotknąć.&lt;/p&gt;


&lt;h4&gt;Poprawa hermetyzacji klasy głównej!!&lt;/h4&gt;


&lt;p&gt;Rzecz musi zostać ujednolicona, żeby nie powstała kolejna niedorzeczność pod postacią &quot;dlaczego jedne dane są chronione, choć potrzebuje ich kompilator, a inne nie&quot;. Jeśli odwoływałeś się wyłącznie do pól konfiguracyjnych, zmiana nie powinna Cię dotknąć.&lt;/p&gt;


&lt;h2&gt;Nowa dokumentacja&lt;/h2&gt;


&lt;p&gt;Jak pisałem, wreszcie OPT 2 posiada nową, zapowiadaną jakiś czas temu dokumentację. Za jej generowanie odpowiada napisany w PHP silnik TypeFriendly obsługujący m.in. kolorowanie składni. Zostanie on wydany na licencji GNU GPL, gdy tylko uporządkuję trochę jego kod i napiszę dokumentację pokazującą, jak z niego korzystać. Tak czy inaczej jego obecność pozwoli nawet na takie bajery, jak wersja on-line dokumentacji z komentarzami użytkowników.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/OPT-200-dev6#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/OPT-200-dev6#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/26</wfw:commentRss>
      </item>
    
  <item>
    <title>Dokumentacje</title>
    <link>http://blog.invenzzia.org/pl/post/Dokumentacje</link>
    <guid isPermaLink="false">urn:md5:3b67fd8596bd156bd1177cb95c3aaf94</guid>
    <pubDate>sob, 08 mar 2008 22:29:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>dokumentacja</category>    
    <description>&lt;p&gt;Jak dotąd, wszystkie dokumentacje tworzymy w pakiecie bazującym na DocBooku (dodanych kilka drobnych znaczników), z których wersja HTML-owa tworzona jest arkuszami XSLT. Istniejące systemy przetwarzania automatycznie dbają o utworzenie nawigacji między rozdziałami oraz podział tego na pojedyncze pliki, o ile wybraliśmy taki tryb. Niestety, utworzenie kompletnego frameworka dla dokumentacji jest okropnie skomplikowane, co tłumaczy fakt, dlaczego całość zapisana jest póki co w jednym wielkim pliku XML, a przykłady nie mają kolorowania składni. Do tego dochodzi problem z parserami XSLT. Choć w DocBooku piszę od dawna, postanowiłem znaleźć alternatywne rozwiązanie i rozpocząć projekt gotowego do użycia generatora dokumentacji napisanego w PHP i korzystającego z prostszej składni. eXtreme ochrzcił go mianem TypeFriendly.&lt;/p&gt;    &lt;p&gt;Ogólna zasada działania nie zmieni się. Na wejście podajemy zbiór plików źródłowych dokumentacji i otrzymujemy przetworzone dokumenty HTML. Jest jednak szereg zmian w stosunku do DocBooka:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Z definicji zakładamy, że dokumentacja złożona jest z wielu plików. TypeFriendly na podstawie nazwy pliku ustala zależności między poszczególnymi rozdziałami, a tam, gdzie nie chcemy mieć alfabetycznego porządku, możemy zdefiniować własny w osobnym pliku.&lt;/li&gt;
&lt;li&gt;Poszczególne pliki korzystać będą z bardzo wygodnej składni Markdown, lekko rozszerzonej pod kątem tworzenia dokumentacji. Dodatkowo jeżeli podamy parserowi listę stałych, metod, funkcji itd., będzie on mógł automatycznie zamieniać występujące w tekście odwołania do nich na odnośniki do stosownych rozdziałów. Na początku każdego dokumentu możliwe będzie umieszczenie kilku informacji o pliku, np.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
Title: Tytuł strony
Author: Zyx
Tags: dokumentacja
SeeAlso: library.class-x.foo
-----
Witamy w dokumentacji
=====================
To jest krótka dokumentacja napisana w Markdownie.
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Trzy tryby wyświetlania: XHTML (jedna strona), XHTML (wiele stron), wersja on-line. Dwie pierwsze wersje to generatory dokumentacji do lektury w trybie offline, podobnie jak np. aktualny manual OPT. W trzeciej, TypeFriendly utworzy zbiór zserializowanych tablic z informacjami o wszystkich podstronach. Dowolny skrypt PHP może je szybko wczytać i umieścić np. w bazie danych strony WWW tak, aby umożliwić szybką budowę dokumentacji on-line, z komentarzami użytkowników, wyszukiwarką oraz innymi bajerkami. W każdym trybie będzie istnieć kolorowanie składni identyczne z tym używanym na blogu.&lt;/li&gt;
&lt;li&gt;Obsługa wielu języków.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przekonwertowałem już część dokumentacji OPT na nowy format i pisze się w nim wygodnie. Kodowanie samego TypeFriendly rozpocząłem natomiast dziś rano. Istnieje już szkielet aplikacji oraz parsery niezbędnych formatów plików. Niedługo będzie można obejrzeć to publicznie. Skrypt będzie aplikacją czysto konsolową, odpalaną z linii komend. Działać ma zarówno w systemach uniksowych, jak i pod Windowsem.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Dokumentacje#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Dokumentacje#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/atom/comments/19</wfw:commentRss>
      </item>
    
</channel>
</rss>
