Hallo!
Ich melde mich mal wieder, diesmal mit etwas relativ wichtigem. Vor kurzem wurde WordPress 2.6 freigegeben, im Zuge des Updates musste ich mal wieder den wpautop()-Fix einspielen.
Dabei sind mir einige Unzulänglichkeiten aufgefallen, unter anderem dass er sinnlos kompliziert ist 😉
Die neue Version kommt mit grade mal 7 neuen und einer geänderten Zeile aus.
Hier die Diff (wir sind wieder in wp-includes/formatting.php):
@@ -65,10 +65,15 @@ } function wpautop($pee, $br = 1) { + $preserving = strpos($pee, '<preserve>') !== false; + if ($preserving) { + $pee = preg_replace_callback('!<preserve>(.*?)</preserve>!is', create_function('$matches', 'return "<revert>".base64_encode($matches[1])."</revert>";'), $pee); + } + $pee = $pee . "n"; // just to make things a little easier, pad the end $pee = preg_replace('|<br />s*<br />|', "nn", $pee); // Space things out a little - $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)'; + $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|revert)'; $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "n$1", $pee); $pee = preg_replace('!(</' . $allblocks . '>)!', "$1nn", $pee); $pee = str_replace(array("rn", "r"), "n", $pee); // cross-platform newlines @@ -99,6 +104,9 @@ $pee = preg_replace( "|n</p>$|", '</p>', $pee ); $pee = preg_replace('/<p>s*?(' . get_shortcode_regex() . ')s*</p>/s', '$1', $pee); // don't auto-p wrap shortcodes that stand alone + if ($preserving) { + $pee = preg_replace_callback('!<revert>(.*?)</revert>!is', create_function('$matches', 'return base64_decode($matches[1]);'), $pee); + } return $pee; } |
Bei der Gelegenheit habe ich den Tag von <nowpautop> in <preserve> geändert, hier gegebenfalls betreffende Posts/Seiten anpassen.
Die angesprochenen anderen Unzulänglichkeiten hatten damit zu tun, dass nur p und br-Tags verhindert wurden. Alles andere wurde trotzdem munter verändert. Jetzt ist das Verhalten das erwartete: per php generierter HTML-Code wird genau so übernommen wie er aus dem Interpreter kommt. Technisch liegt das daran, dass ich jetzt nicht mehr einzelne Zeichen schütze, sondern alles, indem der Code base64-Codiert vor wpautop() versteckt wird.
Viel Spaß damit 😉
Martok