Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Faire un diff en php

Posted by galves on 08/25/2006 22:43

Je cherche un code php libre qui ferait quelque-chose d'équivalent au diff de xul fr , avec le moins de dépendnaces possibles sur des choses non déjà comprises dans jelix. Tout ce que je trouve est soit très gros et complexe à sortir d'un environnement existant, soit ne travaille que ligne à ligne.

  [Opened] Re: Faire un diff en php

Reply #1 Posted by laurentj on 08/26/2006 19:03

Ça m'interresse aussi, pour l'inclure dans la distribution jelix. Je compte m'en servir pour mon futur CMS basé sur jelix (je recherche des contributeurs à ce propos).

J'avais justement regardé la lib diff de phpwiki utilisé sur xulfr justement. Et c'est en fait assez indépendant.

Il y a une lib, qui fonctionne de façon totalement autonome, dans le fichier difflib.php. Il s'agit de quelques classes. Par défaut, ça sort le diff en format texte. Si tu veux un autre format (html par exemple), il faut faire d'autres classes héritant des originales. Et là tu as des exemples dans le fichier diff.php. Mais il commence ici à y avoir des dépendances à phpwiki.

Cependant, même si je n'ai pas tenté de comprendre le fonctionnement en détails, je pense que tu peux t'inspirer de ces classes pour en faire ton propre diff autonome basé sur la difflib.

Et aprés, quand tu auras fini, tu les proposeras au projet Jelix ;-) (ou pas...).

  [Opened] Re: Faire un diff en php

Reply #2 Posted by galves on 08/28/2006 22:04

D'ailleurs on pourrait pousser le vice jusqu'à faire ensuite un diff caractère par caractère, ce serait classe je trouve ...

  [Opened] Re: Faire un diff en php

Reply #3 Posted by laurentj on 08/29/2006 10:22

Cool ta classe.

Cependant, il ne faudrait pas faire de echo, mais stocker dans une propriété le contenu généré. Essentiel pour Jelix (utilisation dans une zone, etc..).

Pour une intégration dans Jelix, je te propose maintenant de faire une class jDiff (qui sera dans lib/utils). Voici son interface :

 class jDiff {
   /**
    * différence entre deux fichiers. Appelle la classe diff.
    * @param string $fic1 chemin fichier 
    * @param string $fic2 chemin fichier 
    * @param string $formater  un code qui indique le type de formatage à utiliser : 'html', 'text', 'diff' (renvoi simplement objet diff)
    * @return string|diff   chaine avec le contenu formater, ou l'objet diff si formater='diff'
    */
   public static function files($fic1, $fic2, $formater = 'html');
 
   /**
    *  idem que diffFile, mais on passe directement les contenus
    */
   public static function strings($str1, $str2, $formater = 'html');
 
 }

Donc dans cette classe, tu appelle la classe diff, et utilise le formateur indiqué.

Sachant que la classe diff sera dans un repertoire lib/phpwikidiff, avec licence et tout..

Et tu n'as qu'à mettre ton formater html dans une fichier lib/jelix/utils/jDiffHtmlFormater.class.php (donc tu renommeras ta classe en jDiffHtmlFormater), qui ne sera inclus par jDiff bien sûr, que si on choisi 'html'. (ne pas oublier les commentaires entêtes comportant copyright et tout, comme sur tout les fichiers jelix)

Que penses-tu de tout ça ? Tu peux nous faire ça pour inclure tout ça dans Jelix ? (tu me proposeras alors le tout en le mettant dans http://developer.berlios.de/patch/?group_id=5643 )

  [Opened] Re: Faire un diff en php

Reply #4 Posted by galves on 08/29/2006 21:58

Les echo ne devraient pas poser de problème à jelix, il sont envoyés dans l'output buffer . Cependant, je ne serais pas contre changer l'interface du DiffFormatter pour virer ça et stocker le résultat dans une propriété. Ca m'avait d'ailleurs posé des problèmes de ré-entrance pour faire un diff dans le diff: il faut arréter de bufferiser, récupérer l'output buffer, et redémarrer le bouzin à la sortie du format(), en n'oubliant pas de faire un echo e ce qui a été stocké dans l'ob précédemment.

Bref, pas de pb, j'essaye de faire ça pour la fin de la semaine.

 
Page
  1. Faire un diff en php