![]() |
Konzept - BBCode Parser
Moin!
Ich plane momentan eine Komponente zu erstellen, die mit BBCode zurechtkommt und diesen auch erwartungsgemäß darstellen kann. Was ich mich diesen Thread erreichen will ist, ob das, was ich bis jetzt geplant habe, überhaupt Sinn ergibt, verbesserungswürdig ist, oder tatsächlich gut ist. Meine Überlegungen: Zitat:
Gruß, Max |
Re: Konzept - BBCode Parser
Hi,
an sich würde ich Dir erstmal den Tipp geben, dass Du Dich ein wenig mit den Grundlagen des Parser-/Compilerbaus beschäftigst. Da gibt es bestimmte Vorgehensweisen, die sich als sehr nützlich erwiesen haben und im Prinzip für alle Parser verwendet werden können. An sich kannst Du hier front- und Backend unterscheiden und bis einschließlich der Parser kann eigentlich immer alles auf gleiche Art und Weise gemacht werden. Je nach Grammatik sind bestimmte Parser dabei dann sicherlich effizienter als andere und je nach Implementierung gilt das dann auch noch mal, aber das ist egal (kannst Du leicht ergooglen, wenn Du nach ![]() Jedenfalls arbeitet man häufig nach einem sehr einfachen Prinzip, Du gehst in mehreren Stufen durch. Du hast Code der geparst werden soll, die Eingabe. Die Eingabe wird erstmal durch einen Scanner bearbeitet. Ein solcher Scanner zerlegt die Eingabe in Token. Ein Token ist dabei ein Teil der Eingabe, der um eine Qualifizierung erweitert wird. Das heißt, dass wenn Du ein BBCode-Tag findest, Du einfach ein Record (o.Ä.) hast, wo Du einen Wert und seine Eigenschaft speichern kannst. Findest Du einen String
Code:
So kannst Du den hier den BBCode ([i]) einfach qualifizieren, Dir also merken, dass es ein öffnendes und ein schließendes i-Tag gibt. Der Rest ist dann einfach normaler Text (ebenfalls eine Qualifizierung). Der Scanner erstellt Dir also aus einer Eingabe einfach eine Liste von Token (Typ + Wert).
"Ein Test String mit [i]BBCode[/i]"
Hast Du jetzt diese Liste von Token, kannst Du diese einfach an einen Parser weiterreichen. Ein Parser hat in der Regel auch zwei einfache Aufgaben, er erstellt aus der Liste von Token einen Syntaxbaum und kann dabei die Korrektheit der Eingabe überprüfen. Hier hast Du dann die Möglichkeit, dass Du Top-Down oder Bottom-Up arbeitest. I.d.R. dürfte Bottom up effizienter zu realisieren sein, allerdings gibt es auch funktionale, monadische Parser, die einen anderen Weg gehen (und auch ordentlich flink arbeiten!). Jedenfalls solltest Du Dir hier überlegen, wie streng Du sein möchtest, je strenger desto leichter lässt sich so ein Parser realisieren. Statt einer Matrix solltest Du übrigens wirklich lieber zu einem Baum greifen, da kannst Du die Verschachtelung der Tags leichter abbilden. Das Hauptproblem hier ist dann eine unsaubere Verschachtelung, bei der man Tags nicht in der Reihenfolge schließt, in der sie geöffnet wurden (ich würde das erstmal einfach nicht zulassen/ignorieren). Ein solcher Baum könnte dann die Form haben: [code] |-(TEXT) |-- Ein Test String mit |-- (Italic) |-- BBCode |-- (END ITALIC) [code] Den eigentlichen Sinn erkennt man vielleicht eher bei stärkerer Verschachtelung, allerdings kannst Du halt sehr einfach eine solche Struktur traversieren und nach festen Regeln auf jeden Knoten im Baum reagieren und die Formatierung entsprechend anpassen. Gruß Der Unwissende |
Re: Konzept - BBCode Parser
Beschäftige Dich einfach mal mit der grundlegenden Funktionsweise eines Scanners und eines Parsers. Dann klappt der Rest von Alleine.
Ein Scanner zerlegt einen Inputstring in seine Sprachbestandteile ('Wörter'). Bei BBCode (Kenn nich nicht, aber egal) wären das z.B. 'BeginTag', 'EndTag' und 'String'. Der Parser nimmt nun diese Wort-Sequenz und erstellt einen sog. Syntaxbaum. Immer wenn eine logischer Block abgearbeitet wird, kann dieser Baum dann von einem 'Compiler' in die Zielsprache (z.B. RTF) übersetzt werden. Wenn man die Theore richtig umsetzt, kann gar nichts schiefgehen. [Edit] Der_Unwissende ist auch Der_Schnellere[/edit] |
Re: Konzept - BBCode Parser
Und ein bißchen kommts auch noch auf das Format an, in dem die Sachen weiterverarbeitet werden sollen. Ginge es beispielsweise um eine TMemo/TRichEdit-ähnliche Komponente zu gestalten, würds ja schon fast ausreichen, die BBCodes einfach stumpfsinnig mit RTF-Anweisungen auszutauschen.
|
Re: Konzept - BBCode Parser
Zitat:
|
Re: Konzept - BBCode Parser
Moin!
Ok. Wow. Dazu wirkt mein Routinchen ja geradezu erschreckend primitiv. Hmm, ich werde mich dann wohl mit dem von euch genannten Thema weiter auseinandersetzen. Ich nehme an, sowas wird hier (Weiterführende Erklärungen usw.) im Forum zu finden sein. Dennoch ermutige ich euch gutes Material auch hier zu posten ;). CCRDude, das ganze wird, wie bereits oben erwähnt, per Canvas ausgegeben, ich selbst zeichne den Text, also ist leider nichts mit primitivem Anweisungs-ersetzen. Leider :( Alzaimar, BBCodes sind dieses, welche du (auch hier im Forum) dazu verwenden kannst Text zu formatieren. [ b] Foo [ /b] wird also zu Foo. Ok, dann mache ich mich mal auf die Suche, dennoch bitte fleißig weiterposen ;) Gruß, Max Edit: BBCode korrigiert -.- Da schreibt man einmal BBCode um was zu erklären und es funktioniert nicht. :mrgreen: Edit 2: Ok, ich bin mehr als erschlagen von den komplexen Strukturen und begreife langsam was ich da machen muss um an mein Ziel zu gelangen. (Eigentlich begreife ich (noch) gar nichts, aber ich denke ich kann den Aufwand sehr grob abschätzen) Hilfe :pale: |
Re: Konzept - BBCode Parser
Moin,
Habe ich zumindest das Prinzip des Token-Parsers richtig verstanden? Hier mal wie ich mir das vorstelle, anhand eines Beispiels:
Code:
wird dann verarbeitet zu folgender Tokenlist:
Test 1, 2
[b]Hallo[/b] ich heiße Tokenizer. [u]Meine Aufgabe ist es [i]Tokens[/i] zu erstellen.[/u] Das war's schon wieder.
Code:
Habe ich zumindest das Prinzip dieses (zugegebenermaßen kleinen) Abschnitts von Parsern verstanden?
Lexer-Begin
"Test 1, 2": String [b]: Identifier [Begin] "Hallo": String [/b]: Identifier [End] " ich heiße Tokenizer.": String [u]: Identifier [Begin] "Meine Aufgabe ist es ": String [i]: Identifier [Begin] "Tokens": String [/i]: Identifier [End] "zu erstellen.": String [/u]: Identifier [End] "Das war's schon wieder.": String Lexer-End Gruß, Max |
Re: Konzept - BBCode Parser
Liste der Anhänge anzeigen (Anzahl: 2)
ich hänge mal mein Soruce dran... der ist unter Lazarus geschrieben und getestet.
ich habe aber die [] zu <> ausgetauscht, weil unter Linux können Font Namen diese [] Zeichen Enthalten. Das ganze war nur ein "einfacher" Test. der Paser kann folgende beispiel Texte Problemlos anzeigen: Zitat:
es gibt leider noch den einen anderen anderen Anzeige Fehler, aber im Prinzip geht das schon ganz gut. Der Paser kann folgendes im Moment: b = Text Fett Dastellen i = Text Kusif Dastellen u = Text Unterstriechen Dastellen* fg = wert foder grund Farbe setzten** bg = wert Hintergrund Farbe setzten** size=Text größe liste = fängt eine Liste an die auch verschatelt werden kann code = Zeigt einen Soruce an, so wie er geschrieben wurde, später soll er gehiglietet angezeigt werden. link = kann ein einfacher Link erzeugt werden. * Durchgestriechen geht leider nicht, weil das unter Linux bei den Font-Stylen noch nicht unterstütz wird ** werte werden immer mit red oder blue angeben. der Paser hängt auto pl_ vorne dran. Die dise Konstasen habe ich erstellt und in eine eigene Unit gepackt, weil mir 16 Farben etwas wenig vorkommen, so habe ich jetzt 641 Farben. *G*. Du/ihr könnt es auch ja mal anschauen und sagen, was ihr davon haltet. mein Ziel war es eigentlich ein eigenen Hilfesystem für Anwendungen zu schreiben das Plottform übergreifend arbeitet. und auch Soruce Beispiele richtig anzeigen kann also in mehrer Farben und so. Später sollen halt noch einfache und Komplxere Tabellen hinzukommen. Grafiken, und Text Boxen. evlt. habt ihr ja noch Vorschläge.... oder findet noch Fehler..... im Anahngt befindet sich zwei Units und ein Bild. Die Form1.pas enhält alles notwendiger, mit etwas anpassung müsstest du es unter Delphi Komplieren können Nocheinmal: Das ganze Projekt habe ich unter Lazarus, Ubuntu angefangen... daher poste ich auch nur einzelne units und nicht das ganze Projekt.... weil das würde euch wenig weiter Helfen... da ihr es erst anpassen müsst, so ist das meine ich einfacher..... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz