sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

van de regen in de boter
En toen gebeurde het: PANG! En met een noodkramp deden mijn armen hun uiterste best om het plotsklaps onbestuurbare voorwiel in bedwang te houden! Tevergeefs! Mijn fiets kletterde op het asfalt en ik ging er achterán en rolde en rolde nog meters verder tot ik tegen het betonnen stoepje hardhandig tot stilstand kwam... BAF, AUW!
KUT! Daar lag ik: in de stromende goot, midden in de polder, geen droge draad meer aan mijn gewonde lijf...
“Nou ja, niet zo aanstellen! komop: opstaan!” Zei ik tegen mezelf en voegde daad bij woord. Het viel mee. Ik was toch nog heel.
Toen ik mijn fiets opraapte, zag ik dat het met hem minder was afgelopen. Het voorwiel had de vorm van een boemerang. Dus naar huis fietsen kon ik wel vergeten. Dan maar lopen en die fiets meenemen... Dat ging dus ook niet: door dat klote-wiel!
Nou ja, na een meter of twintig gooide ik dat ding in de berm en liep met m’n schooltas onder mijn arm bij de dichtstbijzijnde boerderij het erf op. Die hadden daar een klein winkeltje, waar ze ‘piepers en snoepies’ verkochten aan voorbijgangers. Ik dacht: daar kan ik wel effe bellen.

Dus stond ik daar een minuut later op de deurmat. De vrouw des boers zag mij aan en verviel in welgemeende bezorgdheid. Haar handen sloegen d’r om d’r wangen.
-“ Jong jong, wat zie je d’r ut! Je likke wel een snoekbaars op ut drôge en een verzopen kater tugelik!... wat hebbu daan, jong!?”
-“Hè ja ehm, ik ben gevallen, met m’n fiets.” Zei ik wat bedremmeld.
-“Ach kom dan maar eens mee, sneuen jongen.”
De vrouw nam me twee deuren door mee naar achteren.
–“Kom jong, Hebbu je eigen zeer gedaan? Daar gaat moeders dan even wat aan doen. Trek die kleren maar uut. Hangen we boven de kachel. Kannen ze lekker drogen.”
-“Oh ja, dank u. Ik wilde eigenlijk...”
–“Kom jong, niet zo lanterfantren. Hier met die natte zooi!” Beval ze me bijna. Ik trok m’n jas dus maar uit en zag toen pas dat de mouw helemaal gescheurd was.
De warmte van de houtkachel in de achterkamer was wel lekker maar maakte dat ik me nog natter voelde. En die elleboog deed toch wel zeer...
Nog stram van de kou en de klap daarstraks bukte ik me moeizaam en frunnikte aan m’n doorweekte veters. Die wilden niet meewerken.
-“Toedemaar!” Drong moeders aan en tegelijk duwde ze me resoluut naar achteren zodat ik pardoes op de stoel viel die daar stond. Zij hield van opschieten en in een mum van tijd werden mijn trui, T-shirt en broek van mijn lijf getrokken. Ik had er niks tegenin te brengen. Mijn sokken moest ik ook inleveren. Die werden uitgewrongen en ernaast gehangen.
Er klonk een bel.

-“Oh jong, blijf jij maar effe lekker zitten waar je zit. Ik moe even in de winkel helpen.” Ze schonk nog snel wat thee voor me in en verdween de winkel in.
Zat ik zomaar ineens alleen in een vreemde woonkeuken in m’n onderbroek. Met de hete beker in mijn handen keek ik de ruimte rond.
Een te grote klok boven de deur tikte de seconden weg. Ik kreeg het koud. Dichterbij de houtkachel stond een oude bank. Daar ging ik maar eens op zitten.
Dat was beter...
Ik sloot mijn ogen en genoot van de warmte...

Een harde klap deed me van schrik naar de deur kijken. Het was een natte, zwaar bepakte gedaante die naar binnen kwam zetten. De deur klapte weer dicht. Net zo nat als ik was geweest, liep die gedaante in een rechte lijn mij voorbij naar de kachel. De tas ging op de vloer, de sjaal en jas aan het rekje. Pas toen herkende ik haar als de dochter des huizes. Die had ik al wel vaker in het winkeltje gezien.
Ze leek me niet op te merken, want van haar jas gingen haar handen in één beweging naar haar taille en trokken haar natte trui omhoog.
Ik liet daarom maar gauw een “Hallo” horen.
Niettemin zag ik haar rug bloter worden en haar behabandjes verschijnen toen ze de trui met moeite over haar hoofd trok.
Pas toen die naast de mijne aan het rekje boven de kachel hing, draaide ze zich om.
–“Héé, ho, Wie ben jij!? Ik dacht dat je Bertje was! Mijn broertje.”, riep ze meer verrast dan geschrokken. Ze sloeg haar armen over haar borsten toen ze mijn dwalende blikken opving.
–“Nee, ik ben niet Bert. En ook niet ‘Heeho’. Maar zomaar een voorbijganger die hier voor de deur op z’n muil ging.” Zei ik haar met een glimlach aankijkend.
-“O, en toen heeft m’n moeder je zeker opgeraapt en voor de kachel gezet.” vulde ze me aan.
-“Zoiets ja.”
-“En dus zit jij hier in je onderbroek op een vreemde bank.”
-“Ja, voelt wel beetje vreemd, maar is toch wel beter dan met kleren aan op het koude wegdek liggen.”
Ze keek me even wat langer aan dan nodig was.
-“Ja dat geloof ik. Ik ben ook helemaal zeikens nat. M’n broek ook. Moet je zien! Wat een pokkeweer! Ik hoop dat je het niet erg vindt als ik die ook te drogen hang.”
Nou, dat vond ik helemaal niet erg! Beetje verrast door haar vrijpostigheid.
-“Nee hoor, ga je gang. Doe maar alsof je thuis ben.” Grapte ik.
Ze bleef me aankijken en ze stroopte d’r spijkerbroek al van d’r billen omlaag. Oeps! Het slipje mocht aan blijven...
Nou... die mochten er wezen. Die billen in dat witte slippie. Ze mocht er helemaal wel wezen eigenlijk. Niet heel slank, maar ook niet dik. Lekker ruim in d’r vel, dat was ze.
Ze was toch wel een paar jaartjes ouder dan ik.

Ze plofte in de fauteuil schuin achter haar, ontspande zich en liet de warmte van de kachel even op haar inwerken. Zo kon ik haar blanke vrouwelijk vormen, alleen verhuld door slip en beha, rustig bewonderen. Haar benen met die ronde dijen die lichtjes uiteen lagen. Door haar slipje heen zag ik iets donkers schemeren. Mijn ogen gingen omhoog over d’r buik en kwamen bij die indrukwekkende borsten die zachtjes op haar ademhaling deinden. Ook haar hals kwam mooi uit boven haar sleutelbeenderen.
Ik voelde een duidelijke kriebeling in mijn onderbuik opwellen bij deze aanschouwing.
-“Ja, lekker hè, die kachel.” Zuchtte ze en opende de ogen. Steels keek ze me schuin uit haar ogen aan en haar mond kreeg iets brutaals. “Heerlijk, die warmte.” Zei ze zachtjes terwijl ze zich voorover boog naar de kachel toe. –“Hm hmm.” Deed ik. Ik moest wel naar die borsten kijken. Die leken nog groter te worden. Ik kreeg respect voor die beha. Dat die dat allemaal in bedwang kon houden!
Mijn eigen slipje begon het ook al wat moeilijker te krijgen.
Ik was blij dat ik die beker thee nog beet had. Die kon ik er een beetje voor houden.
-“Is dat jouw fiets, die daar aan de kant lag?” Vroeg ze, mij op haar beurt opnemende. Ze knielde voor de kachel om er wat hout in te stoppen. Haar borsten werden fel geel gekleurd door de hete schijnsel.
Enigszins ongemakkelijk antwoordde ik: “Ja, die dee het voor geen meter meer, dus...” –“Ha, een bakkie thee!” Onderbrak ze me. “Dat lust ik ook wel.” En met een paar huppels was ze bij het aanrecht en kwam snel weer met een dampende beker terug. En ze kwam vlak voor me staan, de beker opheffend. Ik hief mijn beker naar haar op. Onze bekers klonken tegen elkaar en ik zag haar ogen die zich op mijn kruis richten. “Shit” dacht ik “Ze is nog slim ook.”
–“Proost, toevallige voorbijganger.” Zei ze. Me uitdagend aankijkend. Ze kwam naast me zitten.
-“Proost, mooie dame. Ik moet zeggen: je ziet er prachtig uit vandaag.”
-“Ja, ik geef me niet altijd zo gauw bloot, maar voor jou maak ik een uitzondering.” Ging zij op directe toer over.
-“Meen je dat nou?”
Ze nam een slokje van de thee. Ze had toch wel een leuk gezichtje. Niet echt knap, maar wel leuk, met de frisheid van het platteland in haar blik. Zo met haar neus in de damp... Haar ogen waren groenig.
Die keken mij aan, en ik keek in haar.
-“Ja, het gebeurt echt niet dagelijks dat ik zo’n mooie jongen bijna naakt bij ons op de bank vind... Zeker niet terwijl ik mezelf ook nog sta uit te kleden.” Tijdens die zin was haar gezicht steeds dichter bij de mijne gekomen. Ik moest even slikken. –“Nee eh...” Ik voelde haar warmte. Mijn hart begon sneller te kloppen. Ik bleef haar zolang ik kon aankijken. -“Dus laat ik maar...” En haar lippen raakten de mijne. Gulzig beantwoordde ik haar zoen. Een nog niet helemaal warme hand landde op mijn buik en zwierf over mijn borst. Op de tast zette ik mijn beker op de armleuning en eindelijk was mijn hand vrij om die geweldige borsten te voelen. Wauw! Dat was nog eens van de regen in de roomboter!

Ik krulde mijn tong om de hare en stortte me vol overgave op het zachte gevecht van tongen en lippen.
M’n piemel begon zich nu echt op te richten en te groeien. Haar hand streelde mijn buik, ging steeds lager en raakte door de strak staande stof heen mijn toppie aan. Een geile rilling trok door mijn lijf. Alle kou was ineens uit mijn lijf verdwenen.
Een seconde later voelde ik de hand zachtjes op mijn beklede paal neerdalen. Haar mond maakte zich van mij los en fluisterde veelbelovend: “Hmmmm, eens kijken watvoor lekker ding jij daar hebt.”
-“Ehm,” stribbelde ik tegen, “Maar, je moeder...”
-“Oh maak je maar geen zorgen. Die is voorlopig nog wel bezig met de overbuurvrouw. Wees maar gerust.”
-“Oké, dan is het goed. Jij zal het wel weten. Kijk dan maar eens wat je in handen hebt...”

Nou dat hoefde ik niet te zeggen, want gelijk bevrijdde dit geile wijffie mijn paal uit zijn te strakke tentje. Ik slaakte een zucht van verlichting en heerlijkheid toen dezelfde hand mijn nu blote paal opnieuw omvatte. In reflex bewoog mijn heup zich omhoog en ik zag mijn blote eikel uit haar hand omhoog rijzen. Zij zag het ook en neuriede goedkeurend. “Hmmm, Dat is echt wel een lekker ding.” Ze begon me langzaam lekker af te trekken. D’r hand ging om m’n eikel heen en langzaam weer naar benee. Zo ging ze lekker door tot m’n piel echt keihard was en fier overeind stond. “Ja meissie, dat is lekker. Ga zo door.” Zei ik haar terwijl ik in haar tiet kneep.
Ze zat een beetje voorover, dus ging mijn vrije rechterhand naar de sluiting van haar beha, die ik met enige inspanning los kreeg.
Een weldaad aan warm vlees kwam vrij. Vrij om gewogen, gestreeld en beknepen te worden... Beiden in één hand voelde ik hun warmte en zachte veerkracht. De roze tepels zwelden op toen ik ze tussen duim en wijsvinger liet rollen. Ik liet ze beiden langs de binnenkant van m’n arm wrijven. “Hmmmm” zuchtte het meisje. “Wat is je lul lekker hard en heet. Net zo heet als de kachel.”
En ze boog zich verder naar voren over me heen. –“ Jah. Dat komt door jou. Want jij bent nog veel heter dan die kachel.”
Ik sloot m’n ogen om me beter te concentreren op die heerlijke warme vleesballen in m’n handen.
Ineens voelde ik iets heel warms om mijn eikel. Haar mond! Ze had mijn eikel in haar mond! Waaah... van verrukking hield ik m’n adem in. En wachtte af wat die mond verder deed...
Die ging eerst en stukje terug maar zakte daarna verder over mijn lul omlaag. Weer ging mijn heup als vanzelf omhoog zodat ik verder in haar mond ging. Een kreun ontsnapte aan mijn keel, toen mijn lul weer omlaag ging en haar mond omhoog. Maar ik stootte meteen weer omhoog en haar geile mond zakte weer om m’n lul heen. Zo neukte ik haar mond traagjes en losjes. En zij zoog aan mijn eikel. “Waah... wat geil wordt ik hiervan!” Kreunde ik. Mijn hand greep naar haar billen, maar ik kon er niet goed bij. “Je maakt me zo geil! Ik wil je kutje voelen, je kutje proeven... ik wil je neuken. Aah yes!” Riep ik bijna.
-”Oja?” riep ze vrolijk. “Wil je mijn kutje proeven?” Ze stond even op om zich te ontdoen van het laatste stukje kledij. Ik nam van de gelegenheid gebruik om languit op de bank te gaan liggen.

-“Ja graag. Dus als je het niet erg vindt...” Zei ik vol verwachting.
-“Dat komt dan mooi uit, want die is al een tijdje rijp om beroerd en belikt te worden.”
-“Lijkt mij buitengewoon interessant om dat eens van heel dichtbij te bekijken.” En ik wenkte haar met mijn vinger.
-“Goed, vriendelijke vreemdeling. Steek je vreemde snuit maar in mijn zaakje.” Daar kwam ze over me heen liggen. Haar kutje kwam een paar centimeter boven mijn neus hangen. Die was inderdaad al helemaal opgezwollen van geilheid. De binnenste schaamlippen puilden naar buiten en er glinsterde al van alles. “Mamma mia!” Kon ik nog net uitbrengen, voordat ze haar sappige vlezigheid giechelend tegen mijn mond duwde. Wow, dat ging wat ongecontroleerd. Dus sloeg ik mijn armen om haar dijen heen om die billen van haar vast te pakken. Die waren al net zo mals als haar borsten waren. Ik tilde haar gelijk een beetje op. Daardoor kon ik die heerlijk kut goed van dichtbij bekijken. Mijn vingers strekten zich naar die zachte, vlezige schaamlippen die geen enkele weerstand boden toen ik ze langzaam uit elkaar trok. Daarbinnen was het roze. Heel mooi roze, als frambozenvla. Waar haar holletje begon, glinsterde het vocht. Dat roze vloeide over in de wat donkerdere flapjes die als twee blaadjes naar buiten krulden. Wauw wat een lekkere kut was dat. En dat zei ik ook.
-“Man, wat een lekker kutje heb jij!” En zij antwoordde waarderend door mijn lul weer vast te pakken en weer te masseren als daarnet, omhoog en weer neer...

Dat waardeerde ik ook weer, want dat lekkere gevoel in mijn lul was weer terug. Extra aangespoord doopte ik een vingertopje in haar holletje. Daar was het heel erg nat. Het was net of ik een kraantje had opengezet, want een klein stroompje helder sap stroomde langs m’n vinger over haar roze binnenste naar beneden richting haar klitje, die zich nu onderaan liet zien. Daar kon ik natuurlijk niet vanaf blijven, dus lichtte ik m’n hoofd op en likte over het hutje van d’r klitje. Ze draaide d’r kutje iets beter naar m’n mond toe en toen voelde ik haar sap die m’n lippen nat maakte. Ik snoof haar geur op. Wauw wat rook ze lekker. Lekker naar seks!
Die donkerroze blaadjes zoog ik m’n mond in en ik proefde haar geile sap. “Hmmmm”.
Tegelijk voelde ik ook haar warme mond mijn lul weer omhelzen... dat maakte het allemaal nóg geiler...
WauW! Dit was de zevende hemel!

Ik duwde mijn vinger dieper haar holletje in en er weer uit. Hij was drijfnat. Ik smeerde de rest van haar kutje in met haar eigen sap zodat alles mooi glinsterde en blonk. Mijn middelvinger kwam erbij en met z’n tweeën gingen ze naar binnen en ik voelde haar zachte plooitjes die zich om mijn vingers sloten... Wauw wat een hitte kwam daar vanaf!
Zachtjes begonnen mijn vingers haar te neuken. Mijn tong wist haar klit te vinden en die kietelde ik, rondjes draaiend. Dat vond ze lekker, want haar keel liet een grommende kreun horen. Die ik weer in mijn pik voelde doortrillen. Maar die liet ze even gaan want met een klein gilletje perste ze haar klitje tussen mijn lippen, zodat ik er vol geilheid aan kon zuigen.
Mijn vrije linkerhand kneep in haar bil en gaf haar een tik. Pets! Een gilletje weerklonk. “AH!” Ik kneep weer en gaf nog een tik. “AH!” Hoorde ik weer. : Tof!
Haar kutje ging steeds rijker stromen en ik dronk zoveel mogelijk. Sneller gingen mijn vingers naar binnen en naar buiten. Naar binnen en naar buiten. Draaide ze een beetje en weer naar binnen. Steeds sneller.
Een licht gesop klonk me als muziek in de oren. En dat klitje zoog ik weer naar binnen. “Hmmmm, Hmmmm, Hmmm!” Stootte ze uit en ik neuriede met haar mee...

Haar onderlijf begon te trillen en ze schokte haar kutje tegen me aan. Mijn neus prikte in haar natte holletje, maar ik zoog gewoon door! En kneep in haar billen. Ze trilde en rilde en ze hijgde en kermde het uit! Een stuiptrekking schokte haar lijf!! Een stroom geil spoelde uit haar kut over mijn neus en wangen. Het droop zelfs m’n oor in! “Yeah!” Kermde ze. Ik zette nu mijn mond over d’r kutje en ving zo haar volgende stroom geil op.
Ze schokte nog beetje na, nog een keertje en ze kwam toen weer tot bedaren. Ik liefkoosde d’r kutje nog een beetje met m’n tong.
-“Oeh,” zei ze “Ik ben daar nu erg gevoelig.”, en ze trok zich een stukje terug.
Ze draaide zich om en kwam napuffend op me liggen.
-“Dat was erg lekker. Dankjewel, vreemdeling.” Ik zei niks maar sprak met m’n wenkbrauwen. Ze zoende me weer en ik haar. Het scheen haar niet te storen dat ik helemaal nat van haar was. Ik voelde een gevoel van verliefdheid in me opkomen. Zoende haar met liefde terug.

-“Het was inderdaad erg interessant, dat zaakje van jou.” Glimlachte ik haar toe. Ze moest lachen.
-“Ha, ja dat heb ik wel gemerkt, gekkie.” Ze kuste me weer.
-“Maar nou”, kus, “ben ik wel benieuwd”, kus, “of er nog wat anders in kan dan mijn vingers.” , Kus.
-“Oh zeker wel.” Zei ze. “Voel zelf maar...”
Ze richtte zich een beetje op en draaide met haar kont totdat mijn tamploeris tegen haar vallei kwam te liggen. Die pakte ze vast en richtte hem op haar natte holletje. Tussen haar borsten door, zag ik mijn stammetje achter haar begroeide heuveltje verdwijnen terwijl het topje ervan gegrepen werd door een ontzaggelijk warme, hete, natte en alles omvattende omhelzing. En de omhelzing werd groter en groter naar mate ze over me heen zakte.
-”Waah mamma-meisje Wat lekker! Wat voel jij lekker. Laat me binnen komen.” Hijgde ik. Maar in plaats daarvan trok ze zich weer een stukje terug.
-“Ja? Vind jij m’n kutje lekker??” Treiterde ze.
-“Ja! Kom terug met die hete kut van jou. Die is echt wáánzinnig!” Zei ik krachtiger.
-“Oké, komt ie.” En daar daalde ze helemaal op me af en zat mijn pik tot op de wortel in d’r kut!
-“Yeah, Hou hem daar. Laat zitten. Beweeg je niet. Daar wil ie zijn. Daar wil ik blijven. Oh lekker ding!” ... Wat ik allemaal niet uitkraamde!

Die geile meid bovenop mij vond het wel grappig, geloof ik. Want die begon giechelend haar kontje te bewegen en op me te rijden. Dat was eigenlijk toch wel nóg lekkerder. Ze zette haar handen op mijn borst en zette zich aan tot een lekker drafje. Haar kutje heerlijk op en neer over mijn lul en ik hoefde er niks voor te doen. Onderwijl keek ze me aan met een geile blik in d’r ogen. Mijn ogen daalden af naar die grote borsten van haar die op het ritme meebewogen.
-“Pak ze dan.” Moedigde ze me aan.
Gelijk waren mijn handen om die warme borsten en speelden ermee. De amazone versnelde haar ritme en ging me nu echt serieus neuken. Nu neukte ik haar terug en stootte omhoog zover mogelijk die kut in. En weer eruit en weer erin. Yes! Ik greep haar bij d’r billen en stootte harder omhoog die kut in. Het meisje liet zich op me vallen en ik hoorde in m’n oor: “Ja jongen, neuk me... neuk me hard... jah.” En dus ging ik nog harder te keer en neukte haar en neukte haar kut.
Mijn linkerbeen zette zich af en we rolden tegelijk van de bank op het tapijtje. Ik bleef haar neuken. Mij nu steunend op de vloer ging dat nog een stuk beter. Mijn lul ploegde in het hete vlees van haar kutje. De hitte van de kachel brandde in m’n zij, maar dat deerde me niet. Mijn lul wilde niets anders meer dan die kut voelen pulseren en knijpen. Haar borsten schokten als puddingen bij elke stoot die ik maakte. Zij greep ze zelf vast en trok aan haar eigen tepels van geilheid. “Yes.. YES.. YES..” Stootte ze uit. Ojee ik voelde aan m’n pik dat ie bijna ging spuiten! Zo lekker vond die het!
Ik vertraagde even. Liet mijn kloppende lul bijna uit haar hete holletje glijden. –“Waar ga je naar toe, zei ze zachtjes, hier blijven...” En bewoog haar kutje omhoog zodat mijn eikel weer naar binnen ging. -”Maar ik kom bijna.” Zei ik even zachtjes. -“Dat geeft niet,” zegt ze, “neuk me en spuit me vol,” zegt ze.

En mijn lul dook weer in haar warme kutje. Helemaal tot mijn eikel haar baarmoeder kuste. En met lange halen voelde ik die goddelijke plooitjes van haar langs mijn eikel en boomstam strelen. Met beide handen pakte ze me bij m’n kaken beet, trok me naar zich toe en zoende me hmmmm. “Neuk me en kom maar lekker klaar.” Fluisterde ze. Eén van haar handen greep mijn bil vast en kneep erin om me aan te sporen. Ik voerde het tempo weer op en mijn lul ging steeds sneller in haar kut tekeer! Steeds sneller en harder. En zij neukte kreunend met me mee. Het zweet brak me uit, maar ik ging keihard door. De spanning en genot in mijn pik werd heftiger en heftiger! Mijn keel gromde; alle spieren in mijn lijf spanden zich. Nog even, nog even, nog een stoot, nog één... nóg één... Mijn pik begroef zich in haar! In een énórme uitbarsting stootte ALLE passie en spanning in één keer door mijn ontploffende lul naar buiten!! In volle kracht spoot mijn zaad haar baarmoeder in! Ik greep en kneep hard in haar tiet terwijl mijn lul zich leegstortte in de hete omhelzing van haar kut!

Toen plofte ik uitgeput op haar neer en zij sloeg haar armen om me heen.
Ze liet me weer helemaal tot bedaren komen.
-“Zo, dat was heftig zeg.” Zei ze me zachtjes –“Ja” zei ik kort.
-“Maar wel lekker.” Zei ze. –“Ja” zei ik kort.
-“Maar weet je dat ik niet eens weet hoe je heet?”
-“Oja, da’s waar ook!” Zei ik met een hoog stemmetje. “Hoe heet jij dan?”
-“Mijn naam is...

En ik schrok weer wakker uit mijn herinnering en zag nog net hoe mijn pik trillend mijn zaad tegen de spiegel spoot.
Dit sexverhaal is geplaatst op 21 Jan 2009 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 ?>