Ik was dus al een tijdje bezig met mijn eigen template parser, in PHP (clutch of niet, kan me niet schelen
), maar ik kom 1 ranzig probleem tegen.
Ik zal eerst even in het kort uitleggen hoe hij ongeveer werkt.
Je hebt een html-template bestandje van de volgende vorm:
Nu is het de bedoeling, dat je aan een gecreerd template object een array met variabelen meegeeft. De variabelen op het eerste niveau van de array:
worden in het docje zo vervangen:
pseudo:
niet letterlijk, maar goed het idee is duidelijk.
Nu ziet het oplettende oog ook een forloopje staan. Die tilde (~) ervoor is om aan te geven dat het om een template control structure gaat en niet om platte tekst.
Nu heb je een beginpunt met de syntax:
waar arrayName dus een gewone niet associatieve array is met allemaal records uit vermoedelijk een database, waar de records wel weer associatief zijn.
dus
Het is dan natuurlijk de bedoeling dat de scope verandert van de array "data" naar de array die genoemd wordt in het for-loopje. Dan kunnen namelijk op vrijwel dezelfde manier de {...} dingetjes ge-replaced worden.
[/intro]
[eigenlijke probleem]
Maar... de grap is, dat die forloopjes ook genest moeten kunnen zijn. Dus met een soort van /.../e regex, gaat het niet lukken.
In mijn korte tijd op de HIO heb ik vernomen, dat je dat soort dingen oplost door er een stack voor op te zetten.
Goed, ik vol goede moed een stack gemaakt, de offset in de string van het begin van de forloop opslaan, en de string verder doorlopen totdat ik een forloop-sluitertje (~/for) tegenkom.
Dan heb ik dus een gedeelte van de template, een scope (die verschuift dus mee met het forloopje) en een data-array, die dus in feite de scope is van het forloopje, en tevens een childelement van $data, of verder genest...
[edit]
Na conversatie met Pelle over ICQ, kwam * drm erachter dat hij het probleem niet goed geformuleerd had.
Het feitelijke probleem is, dat ik niet weet hoe ik de content van een forloopje af moet handelen op het moment dat ik een sluit-tag tegenkom (en dus de corresponderende open-tag van de stack pop.
[/edit]
* drm cracked his brain for a few hours, but couldn't figure out how to code this sh*t
Als je tips, ideeen en of vragen hebt hoor ik het graag. Het is namelijk een ongelooflijk interessant test-case, maar ik kom er zo in m'n eentje echt niet uit...
edit:
als je code wilt zien kun je het ook even melden, maar ik denk dat dat voor dit probleem niet echt interessant is... Met pseudo-code komen we er wel
Ik zal eerst even in het kort uitleggen hoe hij ongeveer werkt.
Je hebt een html-template bestandje van de volgende vorm:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <html>
<head>
<title>{docTitle}</title>
</head>
<body>
<b>{title}</b>
<table>
~for items
<a href="detail.php?itemID={itemID}">{itemName}</a><br>
~/for
</table>
</body>
</html> |
Nu is het de bedoeling, dat je aan een gecreerd template object een array met variabelen meegeeft. De variabelen op het eerste niveau van de array:
code:
1
2
3
4
| $data = array ( "docTitle" => "drm's template parser voorbeeldje" "title" => "Items" ); |
worden in het docje zo vervangen:
pseudo:
code:
1
| $outputString = str_replace ( "{$key}", $data [ $key ], $outputString ); |
niet letterlijk, maar goed het idee is duidelijk.
Nu ziet het oplettende oog ook een forloopje staan. Die tilde (~) ervoor is om aan te geven dat het om een template control structure gaat en niet om platte tekst.
Nu heb je een beginpunt met de syntax:
code:
1
| ~for arrayName |
waar arrayName dus een gewone niet associatieve array is met allemaal records uit vermoedelijk een database, waar de records wel weer associatief zijn.
dus
code:
1
2
3
4
5
6
7
8
| $data = array (
"docTitle" => "...",
"title" => "...",
"items" => array (
array ( "itemID" => "0", "itemName" => "naam0" ),
array ( "itemID" => "1", "itemName" => "naam1" )
)
); |
Het is dan natuurlijk de bedoeling dat de scope verandert van de array "data" naar de array die genoemd wordt in het for-loopje. Dan kunnen namelijk op vrijwel dezelfde manier de {...} dingetjes ge-replaced worden.
[/intro]
[eigenlijke probleem]
Maar... de grap is, dat die forloopjes ook genest moeten kunnen zijn. Dus met een soort van /.../e regex, gaat het niet lukken.
In mijn korte tijd op de HIO heb ik vernomen, dat je dat soort dingen oplost door er een stack voor op te zetten.
Goed, ik vol goede moed een stack gemaakt, de offset in de string van het begin van de forloop opslaan, en de string verder doorlopen totdat ik een forloop-sluitertje (~/for) tegenkom.
Dan heb ik dus een gedeelte van de template, een scope (die verschuift dus mee met het forloopje) en een data-array, die dus in feite de scope is van het forloopje, en tevens een childelement van $data, of verder genest...
[edit]
Na conversatie met Pelle over ICQ, kwam * drm erachter dat hij het probleem niet goed geformuleerd had.
Het feitelijke probleem is, dat ik niet weet hoe ik de content van een forloopje af moet handelen op het moment dat ik een sluit-tag tegenkom (en dus de corresponderende open-tag van de stack pop.
[/edit]
* drm cracked his brain for a few hours, but couldn't figure out how to code this sh*t
Als je tips, ideeen en of vragen hebt hoor ik het graag. Het is namelijk een ongelooflijk interessant test-case, maar ik kom er zo in m'n eentje echt niet uit...
edit:
als je code wilt zien kun je het ook even melden, maar ik denk dat dat voor dit probleem niet echt interessant is... Met pseudo-code komen we er wel
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz