![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.214
|
Wie sicherlich einige schon wissen, bastle ich gerne immer wieder mal PDF zusammen. Am liebsten dann natürlich mit der PHP-Klasse fpdf. Dafür existieren auch eine Menge Add-Ons, jedoch leider keine, die BBCodes (z.B. aus einer db) so in Form bringt, dass man sie mit der Klasse verarbeiten könnte. Genau daran möchte ich mich nun versuchen! Ich bin leider noch nicht sehr geübt, wenn es darum geht aus dem nichts eine neue Klasse zu zaubern, daher hier der thread. Meine Frage lautet: Wie kann/muss/sollte/... ich anfangen? Die BBCodes müssen erkannt werden; das ist kein Problem (denke ich). Doch im Gegensatz zur Verarbeitung durch HTML, wo alles einfach als ein langer string anschließend ausgegeben wird, bedarf es hier der Verarbeitung durch die Klasse fpdf. Daher bin ich da gerade völlig ideenlos, wie man da anfangen könnte.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #2 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Na ja. Üblicherweise geht man bei solchen Problemen wie folgt vor: Du schreibst einen Lexer, der zwischen BBCodes und normalem Text unterscheiden kann und passende Token produziert. Die fütterst du an einen Parser, der überprüft, ob die Tags in der richtigen Reihenfolge sind und alles hübsch valide ist und am besten gleichzeitig einen AST (Abstract Syntax Tree) baut, den du schließlich und letztlich über einen TreeWalker abarbeitest und dabei Aktionen ausführst, um dein PDF zu generieren. Für Java würde ich dir nun antlr empfehlen, aber der PHP-Port davon ist nicht besonders weit (d.h. nichtmal ansatzweise fertig...), von daher müsstest du das von Hand schreiben. Ist nicht so schwierig, wenn man's denn kann. Ich hab nen Teil der antlr-API nach PHP portiert, den könnte ich dir zukommen lassen, wenn du's versuchen willst (da ist'n Beispiel bei). Ist halt relativ schwierig, wenn man's nicht kann. Eventuell kannst du auch'n Quick'n Dirty-Approach nehmen und via preg_match_all sowas ähnliches aufbauen. Könnte theoretisch funktionieren. Vielleicht reicht auch preg_split (oder wie das hieß). |
| | |
| | Nach oben #4 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Lies nochmal, was ich geschrieben habe, und gewöhn dir an, nicht nach dem ersten Satz abzubrechen... dann stellst du vielleicht fest, dass ich nicht die Variante beschrieben habe, bei der man bbcodes durch reguläre Ausdrücke in HTML umwandelt, sondern eine, die den Weg über Parser und AST geht und den Text "interpretiert", um die Ausgabe zu erzeugen...
|
| | |
| | Nach oben #5 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Ich würde vorschlagen du nimmst PEAR Text_Wiki mit BBCode Erweiterung. Mit Text_Wiki kann man seine eigenen Parser und Renderer schreiben. Du müsstest vielleicht garkeinen Parser für BBCode schreiben, sondern lediglich die entsprechenden Renderer Klassen. In den Renderern Klassen zu jeder Formatierung, stehen dir dann die einzelnen Inhalte zur Verfügung. Text_Wiki ist schon so gebaut das man den Wiki Code später in irgendwas beliebiges rendern wie PDF oder Latex. Die Weichen sind zwar gestellt aber gemacht wurde bisher glaube ich nur XHTML. |
| | |
| | Nach oben #6 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Es geht nur darum, einen Text mit BBcode (wie hier im Forum) durch eine Klasse zu schicken, um aus dem Text ein PDF zu erzeugen. Es gibt ähnliche Klassen wie z.B. HTML2PDF, aber die arbeiten nicht so toll. Und es wäre Schwachsinn ersten den Text von BBcode in HTML umzuwandeln und dann in PDF auszugeben. Eine Lösung von BBcode zu FPDF ist gesucht, und das ohne zusätzliche Umwege.
|
| | |
| | Nach oben #7 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
In den Rendereren stehen doch die einzelnen String Bausteine zur Verfügung und dort nutzt man cell() Befehle. Da ist kein Umweg über HTML. Wahrscheinlich muss das alles irgendwie gewrapped werden damit das FPDF Objekt an jeden Renderer übergeben wird. |
| | |
| | Nach oben #8 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Naja die Befehle mit Cell() nutzen nicht soviel. Mein Grundgedanke sieht jetzt so aus: http://www.mediacix.de/code/BBcode-m...-136-code.html (ist nicht perfekt, nur wilde zusammen gehackt) Dabei wird die benutze Klasse auf die bisherige von FPDF aufgesetzt. |
| | |
| | Nach oben #9 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Dir ist klar, das wir hier Vorschläge zur Implementierung der Klasse machen und nicht zu der API, mit der die hinterher angesprochen wird, oder? Davon abgesehen: "Favor composition over inheritance". Wenn ich ex3 richtig interpretiere ist ihm ne API bekannt, die das, was ich vorgeschlagen habe (Lexer,Parser,AST) übernimmt, so das man nur noch die Ausgabe erledigen muss. |
| | |
| | Nach oben #10 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Habt ihr euch mal die bisherige FPDF-Klasse angeschaut ? Und mit der muss es laufen. Wer eine Lösung hat, kann diese gern posten - wahrscheinlich, eventuell führen zu keiner Lösung. Die Sache mit Text_Wiki muss ich selber erstmal austesten, um darüber mir eine Meinung zu bilden. Da aber eh alles angepasst werden muss, kann ich auch gleich selber ne Klasse tippen. Wenn es so einfach wäre wie in HTML gäbe es diesen Thread gar nicht |
| | |
| | Nach oben #11 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Die Doku zum bauen eigener Parser und Renderer ist etwas dürftig. Aber wenn man das Prinzip verstanden hat und sich an den einfachen HTML Parser und Renderer orientiert (strong, img, h1, etc.) kann man gut seine eigenen Wiki Code entwerfen. Statt in den Renderern return $str zu machen macht man halt die jeweiligen FPDF Befehle die man braucht. Man erstellt das Text_Wiki Objekt und macht dann setRenderConf(). Statt einer CSS Klasse wie es da üblich ist übergibt man stattdessen das FPDF Objekt, was dann in jedem Renderer verfügbar ist. Ich würde es mal antesten, wenn da nämlich was gescheites dabei rauskommt kann man sich die ganze (wohl erforderlichen) Dinge von Pago sparen. |
| | |
| | Nach oben #13 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.214
|
@pago: dein Weg klingt so, als wäre er ziemlich aufwendig, auch wenn das was ex³ geschrieben so klingen soll, wie das, was du geschrieben hast. Mir wäre das derzeit noch eine Nummer zu heftig. btw: ich habe natürlich vorher im fpdf-Forum gefragt: http://www.fpdf.de/forum/showthread.php?t=2009 das will ich euch nicht vorenthalten.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [url] BBCode | Garnele | PHP-Programmierung | 11 | 03.12.2007 18:52 |
| BBCode "noparse" | Jann Hendrik | PHP-Programmierung | 14 | 03.12.2007 18:48 |
| FPDF / eMail mit PDF verschicken | Error123 | PEAR, PECL und Frameworks | 11 | 16.08.2007 16:51 |
| FPDF 3 Klassen für 3 Dokumente-Arten | ex³ | PHP-Programmierung | 9 | 21.02.2006 19:15 |
| Problem mit dem verlinken innerhalb von pdf-Dokumenten wegen der Nutzung von BBCode | Jann Hendrik | PHP-Programmierung | 3 | 10.02.2006 16:27 |