Zamieszczam parę przykładów pokazujących, co ciekawego można już zrobić. Zacznijmy od czegoś prostego. W OPT do osadzania wyrażeń w treści służą nawiasy klamrowe, w których umieszczamy wyrażenie, np.

tekst tekst tekst {$blok} tekst tekst tekst

Istnieje także instrukcja opt:put, która na pierwszy rzut oka wykonuje dokładnie to samo:

tekst tekst tekst <opt:put value="$blok"/> tekst tekst tekst

Jednak dzięki temu, że to jest instrukcja, a nie nawiasy klamrowe, można z nią zrobić parę fajnych rzeczy przy pomocy atrybutów. Przypuśćmy, że chcemy uzyskać coś w stylu "Wartość 1 / Wartość 2 / Wartość 3". Wystarczy nam do tego instrukcja opt:put, sekcja i separator:

<p><opt:put value="$sekcja.wartosc" opt:section="sekcja" str:separator=" / "/></p>

Jak widać, taka sekcja obejmuje także znacznik, do którego została doklejona i możemy umieszczać wartości elementów w pozostałych atrybutach. Separator domyślnie akceptuje wyrażenia, lecz gdy nie mamy ochoty na pisanie separator="'cośtam'" (cudzysłów, a później apostrof), zmieniamy po prostu przestrzeń nazw na "str".

Ukończyłem również implementację odwróconych apostrof, które w stosunku do poprzedniej wersji zmieniają swoje działanie. Tym razem programista może samodzielnie zaprogramować ich obsługę, pisząc zwykłą funkcję i przekazując jej nazwę do parsera. Można to wykorzystać np. do eleganckiej implementacji systemu językowego a'la gettext:

<p>{`Parę przydatnych informacji...`}</p>
<p>{`Autor:`} {$autor}</p>

W końcu ostatnia ze zmian. Skoro mamy parser XML, potrzebujemy paru instrukcji, które umożliwią twórcy szablonów bezpośrednie manipulowanie drzewem, np. dodanie atrybutu o zmiennej nazwie. OPT będzie zawierać dwie instrukcje do tego celu: opt:tag oraz opt:attribute. Ta druga została dodana do najnowszej wersji developerskiej. Możemy jej użyć, aby móc wczytać nazwę atrybutu z bloku:

<div>
  <opt:attribute name="$nazwa" value="$wartosc"/>
  Treść...
</div>

To nie koniec - w połączeniu z sekcją uzyskujemy szybkie narzędzie do masowego dodawania atrybutów:

<div>
  <opt:attribute name="$atrybut.nazwa" value="$atrybut.wartosc" opt:section="atrybut"/>
  treść...
</div>

Jeśli do takiej sekcji wyślemy tablicę: array(0 => array('nazwa' => 'class', 'wartosc' => 'dude'), array('nazwa' => 'id', 'wartosc' => 'lol')), uzyskamy:

<div class="dude" id="lol">
  treść...
</div>

Dość dużo czasu poświęciłem na rozwój dokumentacji. Wprawdzie dalej jest ona nieco z tyłu za kodem, ale powoli zaczyna go doganiać. Na ukończeniu jest opis sekcji, pojawiły się omówienia metod chronionych w optClass, a nawet zalążki opisu kompilatora. Muszę też porządkować już istniejący kod, aby pasował do aktualnego stanu kodu oraz moich zamierzeń. Zachęcam do testowania i nadsyłania swych uwag.

Download: http://www.invenzzia.org/download/opt-2.0.0-dev3.tar.gz