Bug wordpress solucionado

Como comentaba en mi último post, wordpress (el sistema de blog que utilizo) tiene un pequeño fallo, por defecto añade etiquetas de nueva linea “br” a todos los finales de linea del texto, de forma que cuando escribes un post no hace falta indicarlo manualmente. El inconveniente es que realiza también esa modificación el texto que se encuentra entre tags “pre”, cosa que es incorrecta ya que visualmente genera más lineas en blanco de las que realmente hay. Además de los “br” también añade “p” para indicar cada parrafo, pero de nuevo dentro de un “pre” esto no debe hacerse.

Después de haber tenido éxito arreglando el bug de squirrelmail me he lanzado a mirar el código de wordpress y finalmente he solucionado el error. Ha sido algo más complicado de todas formas. La solución está en substituir la función wpauto(…) del fichero “wp-includes/functions.php” por:

function wpautop($pee, $br = 1) {
        $pee = $pee . "\n"; // just to make things a little easier, pad the end
        $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
        $pee = preg_replace('!(<(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!', "\n$1", $pee); // Space things out a little
        $pee = preg_replace('!(</(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])>)!', "$1\n", $pee); // Space things out a little
        $pee = preg_replace("/(\r\n|\r)/", "\n", $pee); // cross-platform newlines
        $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
        //$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "\t<p>$1</p>\n", $pee); // make paragraphs, including one at the end
        $pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
    $pee = preg_replace('!<p>\s*(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
        $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
        $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
        $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
        $pee = preg_replace('!<p>\s*(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!', "$1", $pee);
        $pee = preg_replace('!(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee);
        //if ($br) $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
                                                                                                                                         
        // Don't add <br> between <pre></pre>
        $result_pee = '';
        $split_pee = preg_split('/(<pre>|<\/pre>)/', $pee, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
	foreach ($split_pee as $partial_pee) {
		if (preg_match('/(<pre>)/', $partial_pee)) {
			$result_pee = $result_pee . $partial_pee; // Just <pre>
			$open_pre_tag = 1;
		} else if (preg_match('/(<\/pre>)/', $partial_pee)) {
			$result_pee = $result_pee . $partial_pee; // Just </pre>
			$open_pre_tag = 0;
		} else {
                        // make paragraphs, including one at the end
                        if ($open_pre_tag == 0) {
                                $partial_pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "\t<p>$1</p>\n", $partial_pee);
                                // optionally make line breaks unless we are in a <pre></pre>
                                if ($br) {
                                        $partial_pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $partial_pee);
                                }
                        }
                        $result_pee = $result_pee . $partial_pee;
                }
	}
	$pee = $result_pee;
                                                                                                                                         
        $pee = preg_replace('!(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)\s*<br />!', "$1", $pee);
        $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $pee);
        $pee = preg_replace('/&([^#])(?![a-z]{1,8};)/', '&$1', $pee);
                                                                                                                                         
        return $pee;
}

He observado que la versión 1.2 beta de wordpress también tiene el mismo problema así que he puesto un post en el foro de wordpress a ver si añaden esta solución o hacen otra mejor.

Leave a Reply

Your email address will not be published. Required fields are marked *