Ik ben bezig met een BBcode parser. Nu heb ik het zo gedaan dat de text eerst wordt geparsed en een soort van look-a-like DOM-tree wordt opgebouwd bestaande uit tag-nodes en tekst-nodes.
Daarna wordt deze tree doorlopen en via callback functies gerendered in html.
Maar dat is allemaal geen probleem, werkt allemaal prima. Ik wilde gewoon ff om wat suggesties vragen hoe ik dit het beste in objecten kan verdelen.
parsen (tree opbouwen) en renderen (tree omzetten in output-string) samen in een class of apart...
Apart heeft denk ik wel mijn voorkeur, omdat je dan zo'n tree met verschillende renderclasses kunt renderen. En behalve dat zijn het parsen en renderen natuurlijk ook 2 aparte processen.
Aan de andere kant wordt het misschien te veel opdelen.
En hoe zou ik dat dan moeten indelen? parser extenden met renderer? en deze weer als parent voor de class waarin je je tags e.d. instelt?
Of dat je eerst een parser-object met een tree moet maken welke je dan als argument aan een renderer-object (eventueel een child-class ge-extend met de standaard renderer-class) moet doorgeven die die tree dan kan renderen? (is het netst, of niet?)
De callback-functies voor de verschillende tags bestaan niet, die kun je zelf maken door de functies renderElement($tag, $attributes, $contents) (een tag-node) en renderText($text, $pElements) (text-node) via een child class te overschrijven.
Die renderText heb ik maar zo gedaan omdat je bij text-nodes op het laagste niveau anders geen callback zou hebben behalve bij de callback voor de hele tekst.
Maar je krijgt nu dus wel dat je bij text-nodes binnen tag-nodes eigenlijk dubbel rendered.
Iemand misschien een idee hoe ik dit beter kan oplossen?
Ik zou graag willen horen wat anderen hierover denken.
p.s. Als jullie het op prijs stellen wil ik mijn script - als hij af is - hier wel posten.
986 views