sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

Badmeester in het buitenland
Omdat dit al onze zevende zomer was dat we dit deden, hoefden we niet geinfor- meerd te worden over het wat en hoe van het zwembad. De dagindeling was werkelijk te gek: om 9 uur begonnen we met het openen maken van alle kleedkamers, om half tien opende het zwembad en zaten twee van ons achter de kassa. De andere twee zaten bij het grote en het kleine zwembad. Rond half een ginger er twee eten van de twee groe- pjes. Na een half uur gingen de andere eten en wisselden we van taak. Om de an- dere dag begonnen we met de ene taak en dan weer met de andere. Door dit systeem zaten we allemaal even vaak bij de kassa als bij het zwembad. Tegen 5 uur waarschuwden we zwemmers dat we in een half uur gingen sluiten en na dat half uur werkten we de laatste bad- gasten uit het water. Deze hadden dan nog een half uur de tijd om zich om te kleden zodat we tegen 6 uur de boel kon- den afsluiten.

Wat nu het beste was om mee te beginnen weet ik niet. Maar vandaag zaten Wilco en ik 's ochtends achter de kassa. We hielpen zoals gewoonlijk de klanten en bemerkten al gauw dat het een drukke dag zou gaan worden. Tegen half twaalf waren de hokjes voor het afgeven van sieraden en sleutels allemaal al vol. Niet dat dit er nu zoveel waren maar toch: slechts op een drukke dag gebeurde zoiets zo vroeg al. Na het eten liepen we nog even over de grasvelden die om de zwembaden heenlagen en bewonderde we het vrouwelijk schoon dat zich op het gras gedrapeerd had. Voor het gemak bij het communiceren hadden we een puntensysteem in gevoerd wat bestond uit een schaal voor drie delen van het li- chaam: het hoofd, het 'lijf' en de heupen tot aan de tenen. Op elke deel kon dan een aan- tal punten tot tien gegeven worden. Ik zag al gauw een 7-9-7 lopen en zei dit ook te- gen Wilco. Jesus, die is voor mij, was zijn antwoord. Ik liep ondertussen naar de stoel, zoals de scheids bij tennis heeft, bij het grote bad. Daarop gezeten kon je alles goed over- zien. Wilco was ondertussen naast het meisje gaan liggen en probeerde contact te maken. Na wat gedraai en de blik op het gezicht van Wilco begreep ik dat het niet een al te beste poging was geweest. Bij het kinderbad was ook zo'n stoel en daar was Wilco gaan zitten. We hielden contact met elkaar door signalen voor bijvoorbeeld pro- blemen was het een opgestoken vuist. Voor de punten was het drie keer een aantal vingers de lucht in plus een aanduiding van de rich- ting. Zelfs na zeven jaar was ik het kijken naar meisjes nog niet zat. Elke dag liepen er wel een paar uitschieters bij die beter in een reservaat gestopt konden worden. Vandaag viel het een beetje tegen en voordat ik er erg in had was het vijf uur en zag ik Wilco de kin- deren uit het bad jagen. Blijkbaar wilde die vroeg naar huis. Ik stapte ook naar beneden en begon een rondje om het bad waarbij ik ver- telde dat we in een half uur gingen sluiten. Toen pas besefte ik dat ik te lang in de zon gezeten had want in het midden dreef een 8-9-8 op het water. Schitterend zoals haar borsten licht naar de wolken priemde. Er ging een ril- ling door me heen en ik probeerde even aan iets anders te denken om een erectie te voor- komen.

Binnen een half uur was iedereen richting kleed- kamer vertrokken. Ook zij was na zo'n twintig minuten op weg naar de kleedkamers. Ik waar- schuwde Wilco en vertelde van mijn bevindingen met de opmerking dat ze voor mij was. Hij ge- loofde me niet helemaal dus besloten we een kijkje te gaan nemen. We sloten het hek voor de zwembaden af en liepen richting de kleed- lokalen. Er was zowel voor meisjes als jongens een apart gebouw. In elk gebouw waren aparte hokjes en een soort zaaltje waar je met meerdere personen tegelijk je om kon kleden, dit voor het schoolzwemmen. Van achter het gebouw waar de meisjes zaten, had- den we op verschillende posities voorwerpen staan zodat we een blik konden werpen als dat nodig mocht zijn. Na een paar keer verkeerd ge- gokt te hebben, zagen we haar in het zaaltje staan. Waarschijnlijk was ze niet zo preuts dat ze een eigen hokje nodig had. Nog nat van een verfrissende does pakte ze een groot bad- laken en begon zich af te drogen. Om haar mid- del zat een minuscuul broekje dat net groot genoeg was om het belangrijkste verborgen te houden. Haar bikini was goed gevuld en haar borsten stonden stevig naar voren. Ik stond te watertanden en wachtte geduldig af. Nadat ze zich had afgedroogd, haakte ze haar bikini los. Beide borsten wipte brutaal naar voren. Uit haar tas pakte ze een fles met badolie en daarmee begon ze haar borsten in te smeren. Het zonlicht dat door het smalle raam viel, liet haar tepels glinsteren als twee sterren aan een heldere hemel. Haar borsten glommen helemaal. Toen het voldoende was, zakte haar handen naar beneden en trok ze langzaam haar broekje naar beneden. Er on- der ging een pracht van een kutje schuil. Het was licht behaard en was fijn van vorm. Ik hield het niet meer en stapte van de ton af. Wilco, fluisterde ik, maar die was nergens meer te bekennen. Oke, dacht ik, dan moet je het zelf maar weten. Ik liep naar de ingang van het kleedlokaal en opende voorzichtig alle deurtjes. Op een na waren ze allemaal verlaten en aan het geluid daarachter te ho- ren wist ik wat Wilco, en met wie, aan het doen was. Ik liep verder richting het zaaltje en stapte alsof ik van niks wist naar binnen. O sorry, stamelde ik. Ze had nog niks aangetrokken en was met de olie aan haar kutje bezig. Ik dacht dat iedereen al weg was en wilde gaan schoon- maken. Ze keek me een beetje verrast aan en ging toen doodleuk verder met het insmeren van de olie. Aan de tent in mijn zwemshort, zo'n moderne met binnenbroek, was te merken dat dit alles met niet onberoerd liet. Ik wacht wel even tot je klaar bent, zei ik en wilde weer weglopen. Nee joh, dat is niet nodig. Begin maar vast, van mij zal je geen last hebben, was haar antwoord.

Een beetje onzeker pakte ik uit de kast een emmer en een trekker. Ik kan nog niet begin- nen, je hebt al je spullen nog op de grond liggen. Ze draaide zich een kwartslag en ik keek recht naar haar tieten. Een hand ruste op haar vagina en nog iets: een vinger was zeer waarschijnlijk binnen bezig. O, wil je me dan even helpen, vroeg ze vriendelijk. Ik liep naar haar toe en zette haar tas op de bank onder de klerenhaken. Achter me voelde ik iets bewegen en niet lang daarna ging een hand langs me heupen richting me kruis. Ik dacht er nog aan me om te draaien maar be- dacht me op het moment dat ze zachtjes in me kruis kneep. Langzaam begon ze door de stof van mijn short heen me lul te masseren en te kneden. Ik had nooit van mezelf gewe- ten dat ie zo hard en lang kon groeien. Ze knoopte de knoop los en hielp me uit de short. Naakt stond ik voor haar en zei dat ik de hele dag al naar je had uitgekeken. Dat dacht ik al, zei ze, ik hoop dat ik je beval. Ik ging met mijn handen richting haar borsten en begon ze beide te kneden, heerlijk was dat gevoel van stevig 'vlees' vast te houden. Ze pakte haar olie weer en begon mij penis in te smeren. Met een af- trek beweging voelde ik een climax nade- ren. Heerlijk, o........., wat is dat lekker, kon ik er uit krijgen. Nooit gedacht dat het daarmee zo lekker voelde ......... Diana, antwoorde ze. Leuk je te ontmoeten, ik ben Marcel, grapte ik. Ze ging verder met haar oefening en net voordat ik ging spuiten hield ze op. Ze spreidde een handdoek op de grond uit en ging er met gespreidde benen op liggen. Ik zakte naar beneden en ging met mijn tong vanaf haar voeten omhoog. Ik meed haar vagina en cirkelde verder omhoog. Met het puntje van mijn tong boorde ik in haar navel. Door de olie gleed ik verder en ik bevoelde haar borsten met mijn tong. Al rondjes draaiend om haar tepel van haar linker en rechter borst bracht ik haar op temperatuur. Ze lag als een paling onder me te kronkelen en zuchtte hevig toen ik in een van haar tepels beet. Ik pakte met mijn hand haar andere tiet beet en ging er lichtjes in knijpen. Met mijn tong ging ik verder omhoog en duwde hem als finale in haar mond. Ze zoog zich eraan vast en tongzoende me voor ik weet niet hoe lang.

Door dit voorspel was ze heerlijk vochtig geworden, iets was samen met de opgebrachte olie sensationeel aanvoelde. Ik boorde langzaam met een vinger naar binnen in haar overheerlijke vulva en begon in een lijzig tempo te pompen. Met mijn mond was ik weer bij haar memmen aangeland waar ik ze omste beurt knuffelde. Door het tempo te verho- gen, voelde ik dat ze naar haar hoogte- punt gevoerd werd. Ik beukte nu met drie vingers in haar en voelde haar kutspieren samenspannen toen ze een orgasme kreeg. Rijkelijk vloeide haar kutsappen over me hand heen en druppelde op het badlaken. Ik zakte met mijn hoofd verder naar be- nenen en begon haar vagina leeg te drin- ken. Op mijn gemak beffend, gluurde ik omhoog en zag dat ze een blik van genot op haar gezicht had. Nu was het echter tijd voor wat vuurwerk en ik bracht mijn kanon dan ook in stelling. Tenminste, ik wilde het niet op de norma- le boven-onder manier doen, dus vroeg ik haar op handen en knieen te gaan zitten. Op z'n hondjes krijg ik altijd de beste or- gasmes. Ik knielde achter haar neer en mikte me eikel in de goede richting. Met een stoot, duwde ik mijn hele lul in haar, door de olie gleed ie zowat vanzelf. Wat een gevoel was dat als je in en uit haar kutje ging. O.........o......Diana dit is ....heerlijk. Ik bleef pompen wat haast vanzelf ging. Met mijn linkerhand was ik op weg naar haar tieten en begon een ervan te melken. Ze kreunde luid en zei: Marcel niet te snel, ik wil.. ervan ..genieten. Ik verlaagde me tempo wat en besteede meer aandacht aan haar borsten. Een voor een ging ik ze melken en na een serie van twee trekken stootte ik mijn lul in en uit haar flamoes. Mijn orgasme naderde rap zodat ik toch weer besloot het tempo omhoog te gooien. Ik pakte haar kont beet en beukte nu als een idioot in en uit haar. Ze begon zowat te schreeuwen van genot en zuchte el- ke keer als ik in haar kwam. Niet lang daarna was het zover en spoot ik mijn la- ding sperma in haar grotje. Ze kneep haar spieren samen en hield zo mijn lul vast totdat de laatste druppel eruit vloeide.

Voorzichtig trok ik mijn lul uit haar en zakte naast haar neer. Ze kroop richting mijn kruis en begon met haar mond een puntje aan mijn eikel te zuigen. Het duur- de niet lang of mijn staaf was weer naar een redelijke lengte gegroeid, ze bleef echter doorgaan met zuigen zodat ik voor een tweede keer klaarkwam. Nu spoot ik echter de lading in haar mond. Elke drup- pel die ze binnen kreeg, slikte als over- heerlijk sap door. Toen het laatste reste eruit gekomen was, klakte ze met haar tong en keek me verlekkerd aan. Ik boog naar haar toe en kuste haar op haar mond. Weet je, ik hoop dat je elke dag deze zo- mervakantie hier komt zwemmem. Ik zal de toegang tot het zwembad regelen als jij de toegang tot je je-weet-wel regelt, zei ik. Prima, antwoorde Diana, en ze kneep als afscheidsgroet in mijn pik die gelijk weer even stijgerde. Ik kuste haar nog een keer en keek naar haar lichaam toen ze haar kle- ren aantrok. Samen liepen we naar buiten waar we Wilco afscheid zagen nemen van de 7-9-7. Hallo, zei hij. Ja sorry hoor maar het wordt nu echt tijd dat we gaan sluiten.
Dit sexverhaal is geplaatst op 17 Nov 2008 door eroverhalen
Content Management Powered by CuteNews

parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?> parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?> parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?>