Page 1 of 1

2nl2p gesucht

Posted: Wed Sep 19, 2007 3:07 pm
by Dr. Love
Hallo,

nach sehr schlechten Erfahrungen mit Textile (s.u.) habe ich nun alle meine Blogeinträge als HTML kodiert und jegliche Textformatierung abgeschaltet. Ich habe kein Problem mit der Auszeichnung als HTML, es ist mir sogar recht, weil es so schön unmissverständlich ist. Nur: Ständig <p>-Tags um meine Absätze zu schreiben ist mir dann doch etwas lästig.

Frage nun: Gibt es ein Plugin, das (nur!) folgende Funktionen erfüllt:

- Erkennung von Absätzen (zwei oder mehr Newlines dazwischen), die dann in <p> gesetzt werden
- Erkennung von Blockelementen (plus <script> und evtl. andere), die kein <p> bekommen
- Alle(!) anderen Eingaben werden in Ruhe gelassen

Mit Textile hatte ich immer wieder wirklich lästige Seiteneffekte. Beispielsweise:

"Stadtrat und -teil sind zwei Paar Schuh,[egal, wieviel Text hier noch steht] genau wie Real- und Hauptschule."
wurde umgesetzt in:
"Stadtrat und <del>teil sind zwei Paar Schuh,[egal, wieviel Text hier nochsteht] genau wie Real</del> und Hauptschule."

Die Einbindung von Flash via SWFObject war gar nicht möglich, weil Textile den dafür nötigen HTML-Code unabstellbar gefressen hat.

Im Prinzip würde Markdown genau mein Problem lösen, aber wegen der schlechten Erfahrungen mit dem unstoppbaren Textile bin ich kein Fan mehr von automatischen Textformatierungen.

Eigentlich würde doch das RegEx-Plugin mit einer klugen Regex mein Problem lösen können, oder? Leider bin ich ein RegEx-Loser und hoffe auf eine fertige Lösung :)

Re: 2nl2p gesucht

Posted: Wed Sep 19, 2007 5:00 pm
by garvinhicking
Hi!

Ein solches Plugin ist mir leider nicht bekannt.

Das Hauptproblem ist halt die Erkennugn von Absatzen, das ist alles andere als trivial und nicht mit einer einzelnen RegExp zu lösen, da man jeden Textteil für sich mit callbacks etc. prüfen muss und auch nach jedem vorkommen von \n\n dafür sorgen muss, dass das anfangs-p-tag auch an die richtige stelle kommt. Noch schwieriger wirds dann, wenn man mal 4 zeilenumbrüche aufeinander hat, was will man dann? Ein leeres <p></p>? Und was ist mit drei Zeilenumbrüchen?

Soll

Code: Select all

blabla


lieber zu

Code: Select all

<p>blabla</p>
<br />
werden, oder eher zu

Code: Select all

<p>blabla<br /></p>?
Insgesamt ist das schon etwas, das man mit PHP lösen kann, aber ich befürchte, dass es durchaus zeit verschlingt.

Wenn jemand einen Stück PHP-Code hat, der das macht, dann baue ich so etwas gerne in ein s9y plugin um, das wäre kein problem.

Grüße,
Garvin

Posted: Wed Sep 19, 2007 5:41 pm
by Dr. Love
Hmm, im Prinzip ist diese Funktion eine sehr geringe Teilmenge von Textile und auch Markdown. Sollte also nicht all zu schwer sein, den Rest rauszuwerfen. Hat doch sicher schon mal jemand gemacht.

Aber eine RegEx-Lösung müsste doch auch gehen:

"\n\n[Wasuachimmer]" (oder der Anfang des Dokuments) bis zum nächsten "[EndeWasauchimmer]\n\n" (oder das Ende des Dokuments) bekommt <p></p> drum rum, es sei denn es beginnt mit "<" und nicht "<[Liste der erlaubten Inline-Elemente]"

Man könnte auch auf Block-Elemente filtern (wie Markdown das macht), aber etwa <script> ist kein Blockelement und soll trotzdem nicht umschlossen werden. Die Liste der erlaubten Elemente für den Absatzanfang könnte der User in den Plugin-Einstellungen pflegen.

Mehr als zwei \n werden ignoriert (bzw. erfüllen einmal die Regel "\n\n[Wasuachimmer]") , für Inline-Umbrüche und alles andere benutzt man explizit <br />

Oder habe ich einen Denkfehler?

Posted: Wed Sep 19, 2007 7:13 pm
by garvinhicking
Hi!

Wenn das jemand gemacht hat, würde ich mich über den Code freuen. Textile ist ein einzigesStück bloat, da etwas rauszunehmen finde ich sehr schwer, der Code ist nahezu unüberschaubar.

Markdown istauch sehr komplex, aber damit habe ich mich nie beschäftigt. Es ist jedenfalls zu komplex, um da mal eben den entsprechenden Codeteil zu finden.

Code: Select all

Aber eine RegEx-Lösung müsste doch auch gehen:
Ich glaube das geht nur mitLogik und Callbacks.Andernfalls kriegst Du sonderFälle nicht raus um die script-container zu entfernen.Aber ich lasse mich gerne des Gegenteils überzeugen, nur kann ich eine entsprechende regexp nicht aus dem ärmel zaubern.

Grüße,
Garvin

Posted: Wed Oct 24, 2007 6:05 pm
by Dr. Love
So, da habe ich doch tatsächlich eine Lösung gefunden. Und zwar im Wordpress-Code. Die entsprechende Funktion wpautop() habe ich mal geschnappt und eine Testseite drumrum gebastelt:

http://spackmat.de/test/formatting.php
und
http://spackmat.de/test/formatting.txt

Da ist noch Wordpress-spezifischer Code drin und es gibt ein Problem mit <pre>-Tags
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'clean_pre', to be a valid callback in formatting.php

Ich werde mir das in den nächsten Tagen noch mal näher ansehen und vielleicht schaffe ich es sogar mein erstes Plugin zu basteln.

Bis dann, Nathanael

Posted: Wed Oct 24, 2007 8:00 pm
by garvinhicking
Hi!

Ich bin gespannt :) Aufgrund des WP-Ursprungs wirdman den Code jedoch nur als GPL-lizensiertes Zusatzplugin rausgeben können.

Wg. der preg-Meldung: Dir fehlt wohl noch die PHP Funktion "clean_pre()" die musst du auch noch "rippen":)

Grüße,
Garvin

Posted: Wed Oct 24, 2007 9:44 pm
by Dr. Love
Ja GPL-PlugIn, anders wirds nicht gehen. Oder habt ihr ein generelles Problem mit von WP abgegucktem Code?

Ich habe mal meinen Bruder gefragt (der an XINHA mitentwickelt) der schaut mal, ob er das auf die Schnelle nach JavaScript portiert bekommt. Mir schwebt ein Button vor, mit dem man diese Formatierung bereits beim Verfassen bei Bedarf auf die textarea anwenden kann.

Das clean_pre-Problem hab ich inzwischen auch schon verstanden. Jetzt schau ich mir aber erst mal die PlugIn Schnittstelle an, also ab in die Doku...

Posted: Wed Oct 24, 2007 11:20 pm
by garvinhicking
Hi!
Dr. Love wrote:Ja GPL-PlugIn, anders wirds nicht gehen. Oder habt ihr ein generelles Problem mit von WP abgegucktem Code?
Nö, das is schon okay. Wir können das plugin dann halt nur in spartacus packen, nicht mit ins normale s9y release.

Grüße,
Garvin

Posted: Thu Oct 25, 2007 1:37 am
by Dr. Love
So, ich habe einfach mal das S9Y Markup Plugin genommen und zurecht gebastelt:

http://spackmat.de/test/serendipity_eve ... p_v001.zip

Im Prinzip hab ich nur ein paar Config-Werte angepasst und die entscheidende Funktion samt Aufruf ersetzt, sehr primitiv. Ist ja auch mein erstes Plugin. Auch irgendwie reichlich anmaßend mich als Autor da rein zu schreiben. Wie wird das denn hier gehandhabt?

Das Ding macht jetzt immerhin das was es soll (pre_clean und die WP Spezifika habe ich ganz entfernt). Nur finde ich es etwas blöd, dass das jetzt bei jedem Aufuf des Inhalts geparst wird und nicht nur einmal beim Erstellen des Inhalts. Ich will ja eigentlich kein Markup-Plugin sondern nur nen Helper für die Eingabe. Für Kommentare ist das eh nix, weil das ja HTML-Tags behält.

Mein erster Lösungsansatz mit einem JavaScript, das per Button auf den Inhalt beim Verfassen angewendet wird ist erst mal daran gescheitert, dass laut meinem Bruder die einfache Portierung der Regexes auf JavaScript an einem fehlenden Feature in der JavaScript Regex-Implementierung scheitert:

Code: Select all

$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee)
In JavaScript gibt es wohl weder \s (schlimm) noch \z (weniger schlimm). Mist. Vielleicht hat ja auch jemand ne Idee, wie man ohne \s und \z die gleiche Funktionalität hinbekommt. Problem ist wohl, dass in JavaScript ohne \s entweder nur je eine Zeile gematcht wird oder über alle Zeilen aber ohne Beachtung der Zeilenumbrüche.

JavaScript anyone?


Nächster Ansatz wäre nun, dass der Button den Inhalt der Textarea per AJAX an den Server sendet und formatiert zurück bekommt. Zweitbeste Lösung finde ich.

Gute Nacht, Nathanael

Posted: Thu Oct 25, 2007 9:15 am
by garvinhicking
Hi!

Das "\s" ist nicht ausschlaggebend dafür, dass mehrere Zeilen gematched werden, sondern der "/s" pattern modifier. Das gibts für JS auch, heißt da aber /m:

http://javascript.about.com/library/blre18.htm
http://developer.mozilla.org/en/docs/Co ... line_Input

Hilft das weiter?

Viele Grüße,
Garvin

Posted: Thu Oct 25, 2007 10:23 am
by Dr. Love
Ah, mein Fehler, natürlich /s und nicht \s.

Mein Bruder sagte, dass /m anders arbeitet und man damit gerade nicht mehr zwei Newlines matchen kann, weil mit /m ausgerechnet die Newlines ignoriert werden. Er hatte das ausprobiert, wenn ich ihn richtig verstanden habe. Ich konnte das leider mangels JavaScript-Know-How nicht überprüfen.


Was sagst Du zu dem Plugin?

Gruß, Nathanael

Posted: Thu Oct 25, 2007 11:06 am
by garvinhicking
Hi!

Plugin konnte ich mir noch niht ansehen, dazu komm ich auch erst frühestens Dienstag.

Gürße,
Garvin

Posted: Tue Oct 30, 2007 10:01 am
by Dr. Love
So, wir kämpfen noch etwas mit dem JavaScript, das noch nicht ganz rund läuft (wurde from the scratch neu geschrieben). Aber das PlugIn für den Button ist soweit startklar. Ich denke am Wochenende werde ich das Plugin mal zur Begutachtung vorlegen.

Gruß, Nathanael