Kiki's Template Engine

Het Kiki framework bevat een eigen, zelfgeschreven, template engine.

Kiki logo

Geschiedenis

Bij een voormalige werkgever raakte ik bekend met templates, daarvoor mixte ik gewoon de code en HTML — lang geleden kon het nauwelijks anders. We gebruikten Smarty en later Twig. Als backend programmeur vond ik het allemaal best, maar toen ik voor mijn eigen framework Kiki een MVC model ging ontwikkelen werd het toch nodig om er eentje te gebruiken.

Maar ik schrok enorm van de bestaande template engines. Ze waren log, traag, genoten vele dependencies en pasten eigenlijk helemaal niet in de structuur die ik voor ogen had. Dus ging ik zelf maar aan de slag (gevalletje Not Invented Here syndroom) om iets te programmeren wat templateteksten kon parsen. Hiervoor gebruikte ik — schrik niet — reguliere expressies.

Resultaat

Het resultaat is wat mogelijk zowel mijn meest bevredigende als meest afschuwelijke code is die ik ooit geschreven heb, met compleet gestoorde reguliere expressies als deze:

'~\n?\{\{foreach'. $i. ' (\$[\w\.]+) as (\$[\w]+)(?: => (\$[\w]+))?\}\}\n?(.*)\n?\{\{\/foreach'. $i. '\}\}\n?~sU';

Foeilelijk? Onverantwoord? Wellicht, maar... het werkt! Vraag me niet precies hoe, maar dat je deze website kunt bekijken is het levende bewijs.

Beperkingen

De template engine heeft wel wat beperkingen, zo heb ik nog steeds geen else if ingebouwd en condities zijn beperkt tot een enkele evaluatie of simpele vergelijking tussen twee variabelen. Complexere constructies met && (and) of || (or), laat staan groeperingen met haakjes worden (nog) niet ondersteund.

Het zijn dan ook nog geen duizend regels code, waarvan de helft commentaar of blanco:

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                              1            165            204            516
-------------------------------------------------------------------------------

Features

Juist vanwege die enorm beperkte footprint benk ik toch redelijk trots op wat het allemaal wel kan:

Template extending!

{{extends 'other/template/file'}}

Pas in 2023 toegevoegd, samen met {{block 'naam'}} ... {{/block}} om elementen van basis templates te herschrijven. Ooit populair gemaakt door Django en inmiddels zo'n beetje onmisbaar voor een nette structuur van een complexere website. Ben er erg blij mee dat Kiki dit nu ook kan — al was het een hels karwij bestaande templates te converteren naar het nieuwe systeem. Sluit prachtig aan op de Controllers, die elkaar al lang uitbreiden en overschrijven.

Tot slot

Dit was mijn spreekbeurt over Kiki's template engine.

Geen idee wat een ander er aan heeft. Wellicht geeft de code je inspiratie. Of wellicht een lachbui als voorbeeld wat niet te doen, want het is op zich echt een verschrikkelijk slecht idee om zelf een template engine schrijven in reguliere expressies. Maar goed, als je dan toch een eigen framework schrijft, double down.