fluminis | Domage !
Text_Diff a en plus la facheuse tendance de ne pas respecter les standards php5 et leve des erreurs de codage. Donc pas moyen de l'utiliser tel quel si on a mis l'option E_ALL.
Il faut modifier les "&new UneClasse" par "new UneClasse" dans tous les fichiers de la librairie Text_Diff.
Pour le "patch", j'ai du recoder une fonction maison a partir du format rendu par Text_Diff :
Code :
- //appel de diff pour obtenir un $patch
- function diff($original, $final) {
- $diff = new Text_Diff(split("\n",str_replace( "\r\n", "\n",$original)), split("\n",str_replace( "\r\n", "\n",$final)));
- $renderer = new Text_Diff_Renderer();
- return $renderer->render($diff);
- }
|
Code :
- //application d'un patch sur un text
- function patch($original, $patch) {
- $new = array();
- $current = 0;
- $original_array = explode( "\n", str_replace( "\r\n", "\n", $original ) );
- $patch_array = explode( "\n", $patch );
- $countOriginal = count($original_array);
- foreach($patch_array as $line ) {
- if (!empty($line)) {
- if ($line[0] == '>') { //add
- $new[] = substr( $line, 2 );
- } else if (preg_match("/^([0-9]+)(?:,([0-9]+))?(a|d|c)/", $line, $matches)) {
- $l_start = $matches[1] - 1;
- $l_end = $matches[2] != "" ? $matches[2] - 1 : $l_start;
- $action = $matches[3];
- for(; $current < $l_start; $current++) {
- $new[] = $original_array[$current];
- }
- if ($action == "d" ) {
- $current = $l_end + 1;
- } else if ($action == "a" ) {
- $new[] = $original_array[$current++];
- } else if ($action == "c" ) {
- $current += $l_end - $l_start + 1;
- }
- }
- }
- }
- for(; $current < $countOriginal; $current++) {
- $new[] = $original_array[$current];
- }
- return implode( "\n", $new );
- }
|
Mais bon reinventer la roue n'est pas forcement une bonne solution. Si il existait une librairie robuste et testée par un plus grand nombre, ça m'aurait pas deplus.
---------------
http://poemes.iceteapeche.com - http://www.simuland.net
|