Nachtrag zum doppelten Minus-Problem von WordPress – andere Lösung
Ich wurde darauf hingewiesen, dass mit meinem Ansatz die doppelten Minus-Zeichen zu unterbinden die Typografie leiden könnte. Das ist auch nicht ideal und deswegen habe ich noch mal genauer nachgesehen.
Ich benutze für das Code-Highlighting ein recht altes Plugin: Dean’s Code Highlighter. Es basiert auf Geshi und funktioniert nach wie vor – auch wenn es schon seit zwei Jahren kein Update mehr gegeben hat.
Die Syntax davon ist einfach. Man nimmt ein <pre lang=”php”> code code code</pre> und dann wird der Code schön farbig dargestellt. Für etwas anderes verwende ich <pre> so oder so nicht. Bei <pre> würden die doppelten Minuszeichen oder andere Zeichen auch nicht umgewandelt. Das Problem ist nur, dass Dean’s Code Highlighter das <pre lang=…> in <div> <ol> und <li> wandelt.
Ich wusste das bisher nicht und nun könnte man natürlich einfach künftig das <pre lang=…> in <code> einpacken. Ich will aber nicht alle meine Beiträge nach solchen Code-Schnipsseln durchstöbern und lassen <pre> einfach durch <code><pre> ersetzen (functions.php).
add_filter( 'the_content' , 'mh_un_en_dash' , 1 );
function mh_un_en_dash( $content ) {
$old_stuff = array("<pre lang", "<pre>", "</pre>");
$new_stuff = array("<code><pre lang", "<code><pre>", "</pre></code>");
$content = str_replace($old_stuff, $new_stuff, $content);
return $content;
}
Ein Problem könnte noch sein, dass Dean’s Code Highlighter sehr früh aufgerufen wird.
add_filter('the_content',array(&$this, 'ch_the_content_filter'),1);
das lassen wir einfach etwas später durchlaufen:
add_filter('the_content',array(&$this, 'ch_the_content_filter'),10);
Hmmm Moment mal … wenn der Filter von Dean’s Code Highlighter später läuft, wird das <pre> vielleicht sogar in Ruhe gelassen. Genau so ist es. Das Problem war, dass der Code Highlighter zu früh umgewandelt hat und deswegen die doppelten Minus-Zeichen verschwanden. Somit kann ich mir den Filter am Anfang des Beitrags komplett sparen. Die Abwandlung von der 1 in eine 50 hat mein spezielles Problem aber nur fast gelöst.
Nun wurde allerdings aus dem & ein & … es ist zum Haare raufen … auch das lässt sich im Plugin selbst lösen. Die Zeilen:
$text = str_replace('<', '<', $text);
$text = str_replace('>', '>', $text);
wurde um das hier ergänzt …
$text = str_replace('&', '&', $text);
Das war es nun – hoffe ich und künftig verhalten sich die Code-Blöcke, wie sie sollen. Diese Konstellation läuft nun aktuell und ich sehe mal, wie weit ich damit komme. So langsam aber sicher trägt mein hauseigener WordPress-Frühjahrsputz Früchte …
Wie gesagt ich finde, dass wäre in einem Plugin besser aufgehoben, das das keine Funktion des Template ist.
und soweit ich das sehe, hätte eventuell:
remove_action('the_content', 'convert_chars');
remove_action('the_content', 'wptexturize');
die meisten deiner Probleme auf einen Schlag gelöst.
Ich packe es irgendwann in ein Plugin, aber so lange ich damit experimentiere ...
Mein Problem ist dieser Code-Highlighter. Deaktivere ich diesen, habe ich eigentlich gar kein Problem. Ich will ihn aber nicht deaktivieren, weil das einfach schöner und übersichtlicher ist.
Das mit den convert_chars hatte ich ausprobiert, hat aber nichts gebracht, weil der Highlighter an sich auch Zeichen umwandelt.
Es ist wohl ein sehr spezielles Problem in meinem Fall.
so jetzt nochmal als Code damit man das auch versteht 🙂
Hallo,
ich bekomme das mit dem highlighter nicht ganz hin. Wenn ich im Texteditor schreibe:
1. ">" wirds im visuell wieder umgewandelt in ">"
2. ">" wird umgewandelt in ">"
3. "
>
" wird umgewandelt in ">
"gibts da irgendein trick wie ich die umwandlung umgehen kann? ich will das ">" 1zu1 dargesellt wird ohne sonstige zeichen.
Vielen dank
gruß stephan
PS:
habe auch deine Lösung aus einem anderen Beitrag mit der erweiterung der Functions.php versucht. auch das leider ohne erfolg 🙁
habe ">", ">", ">" in dem array ergänzt um ">" zu bekommen leider kommt immer noch ">" raus......
function mh_un_en_dash( $content ) {
$old_stuff = array("–", "—", "‘", "’", ">", ">", ">");
$new_stuff = array("--", "-", "'", "'", ">", ">", ">");
$content = str_replace($old_stuff, $new_stuff, $content);
return $content;
}