Enthousiast ben ik een paar dagen geleden begonnen met het schrijven van een eigen template parsertje. Hoever ben ik nu:
• al mijn php functies die beginnen met "macro_" kunnen geven de gebruiker van het cms'je (=ik
) de mogelijkheid dynamische content toe te voegen aan de website, bijvoorbeeld:
• de hele website draait op een template bestand waar macro-tags op bovenstaande manier worden vervangen door de echte content:
• de macros worden vervangen door de functie output door een regel als $text = str_replace($macro, $expaned_macro, $text);
Mijn grootste probleem: als iemand een [content]-macro in bijvoorbeeld een comment of guestbook entry zet, slaat de webserver op hol (immers: eeuwige loop). Nu kan ik wel per macro gaan aangeven "deze macro kan/mag alleen gebruikt worden in de template zelf, niet in content-delen", maar er moet toch een intelligentere manier zijn om dat eeuwige-loop probleem te voorkomen?
Ik heb gezocht op de search op "template parser", en kwam veel topics tegen over recursieve en stackbased parsers. Wellicht ligt het aan mijn nog te beperkte php kennis, maar ik kwam er niet uit wat nu:
• de principes zijn waar elke parser aan moet voldoen
• wat een stackbased parser is
• of mijn probleem common is en hoe het opgelost kan worden
Graag enige aanwijzingen in deze richting
• al mijn php functies die beginnen met "macro_" kunnen geven de gebruiker van het cms'je (=ik
PHP:
1
2
3
4
5
6
| function macro_time($intro) { return $intro.': '.time(); } /* als je in het template bestand (of in een post op de website) de macro [time|Het is nu] zet, wordt dit geparsed naar "Het is nu: 1113942557" */ |
• de hele website draait op een template bestand waar macro-tags op bovenstaande manier worden vervangen door de echte content:
code:
1
2
3
4
5
6
7
8
9
10
| /* template (komt uit database of van filesystem): */
<html>
<body>
<div id="menu">[menu]</div>
<div id="content">[content]</div>
</body>
</html>
/* [menu] wordt vervangen door de output van de functie macro_menu(), etc */ |
• de macros worden vervangen door de functie output door een regel als $text = str_replace($macro, $expaned_macro, $text);
Mijn grootste probleem: als iemand een [content]-macro in bijvoorbeeld een comment of guestbook entry zet, slaat de webserver op hol (immers: eeuwige loop). Nu kan ik wel per macro gaan aangeven "deze macro kan/mag alleen gebruikt worden in de template zelf, niet in content-delen", maar er moet toch een intelligentere manier zijn om dat eeuwige-loop probleem te voorkomen?
Ik heb gezocht op de search op "template parser", en kwam veel topics tegen over recursieve en stackbased parsers. Wellicht ligt het aan mijn nog te beperkte php kennis, maar ik kwam er niet uit wat nu:
• de principes zijn waar elke parser aan moet voldoen
• wat een stackbased parser is
• of mijn probleem common is en hoe het opgelost kan worden
Graag enige aanwijzingen in deze richting
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."