Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PHPCODE INDENTER


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : indenter, indentation, forme Niveau : Débutant Date de création : 04/03/2008 Date de mise à jour : 05/03/2008 15:27:12 Vu / téléchargé: 3 385 / 89

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

avec cette classe vous pouvez mettre en forme(indenter) n'importe quel script php, pour que ça soit lisible :)
pour l'utiliser c'est très simple :)
pour utiliser cette classe :
<?php
require 'indenter.class.php';
$test=new indenter;
$test->indent('','mon_fichier.php');
?>
apres avoir créé une instance de la classe "indenter" vous appelez la méthodes "indent()" qui accepte deux paramètres la directoire et le nom du fichier à indenter

merci  
 

Source

  • <?php
  • /**
  • * @author: AMEZGHAL abdelilah <amezghal@msn.com>
  • */
  • class Indenter {
  • public function __construct(){
  • }
  • private $is_string1 = false;
  • private $is_string2 = false;
  • private $is_comment1 = false;
  • private $is_comment2 = false;
  • public function valid(){
  • return (
  • $this->is_string1 == false && $this->is_string2 == false &&
  • $this->is_comment1 == false && $this->is_comment2 == false
  • );
  • }
  • public function indent($dir, $file){
  • $string=trim(file_get_contents($dir.$file));
  • if(substr($string,0,5)=='<?php'){
  • $string=substr($string,5,strlen($string)-7);
  • }else{
  • $string=substr($string,2,strlen($string)-4);
  • }
  • $out = "<?php\n";
  • $arc = 0;
  • $semilicon = false;
  • $space = true;
  • $tab='';
  • $is_condition = false;
  • $update=true;
  • for($i = 0; $i < strlen( $string ); $i++) {
  • $char = substr($string, $i, 1);
  • switch($char) {
  • case '"':
  • if($this->is_comment1 == false && $this->is_comment2 == false) {
  • if($this->is_string1) {
  • if(substr($string,$i-1,1)!='\\') {
  • $this->is_string1=false;
  • }
  • }else{
  • if($this->is_string2==false){
  • $this->is_string1=true;
  • }
  • }
  • }
  • $out .= $char;
  • break;
  • case '\'':
  • if($this->is_comment1 == false && $this->is_comment2 == false) {
  • if($this->is_string2) {
  • if(substr($string,$i-1,1)!='\\'){
  • $this->is_string2=false;
  • }
  • }else{
  • if($this->is_string1==false){
  • $this->is_string2=true;
  • }
  • }
  • }
  • $out .= $char;
  • break;
  • case '/':
  • if($this->is_string1 == false && $this->is_string2 == false) {
  • if(substr($string, $i-1, 1)=='/'){
  • $this->is_comment1=true;
  • $semilicon=false;
  • }
  • if($this->is_comment2){
  • if(substr($string, $i-1, 1)=='*'){
  • $this->is_comment2=false;
  • $out .= $char."\n".$tab;
  • $update=false;
  • }
  • }
  • }
  • if($update) {
  • $out .= $char;
  • }else{
  • $update = true;
  • }
  • break;
  • case '*':
  • if($this->valid()) {
  • if(substr($string,$i-1,1)=='/'){
  • $this->is_comment2=true;
  • $out = substr($out,0,strlen($out)-1);
  • $out .=$tab.'/*';
  • }
  • }else{
  • $out .= $char;
  • }
  • break;
  • case '(':
  • if($this->valid()) {
  • $arc++;
  • if($is_condition==false) {
  • $is_condition=true;
  • }
  • }
  • $out .= $char;
  • break;
  • case ')':
  • if($this->valid()) {
  • $arc--;
  • if($arc==0){
  • $is_condition=false;
  • }
  • }
  • $out .= $char;
  • break;
  • case ';':
  • if($this->valid()) {
  • if($is_condition){
  • $out .= $char.' ';
  • $space = false;
  • }else{
  • $semilicon = true;
  • $out .= $char;
  • }
  • }else{
  • $out .= $char;
  • }
  • break;
  • case '{':
  • if($this->valid()) {
  • $out .= "\n" . $tab . $char . "\n";
  • $tab .= "\t";
  • $out .= $tab;
  • }else{
  • $out .= $char;
  • }
  • break;
  • case '}':
  • if($this->valid()) {
  • $tab = substr($tab, 0, strlen($tab)-1);
  • $out .="\n".$tab.$char."\n";
  • }else{
  • $out .= $char;
  • }
  • break;
  • case ':':
  • if($this->valid()) {
  • $out .= $char."\n".$tab;
  • }
  • break;
  • case "\n":
  • if($this->is_comment1){
  • $out .= $char.$tab;;
  • $this->is_comment1=false;
  • }elseif($this->is_comment2){
  • $out .= $char.$tab;
  • }
  • break;
  • case "\r":
  • case "\t":
  • if($this->is_string1==true || $this->is_string2==true) {
  • $out .= $char;
  • }
  • break;
  • case ' ':
  • if($this->valid()) {
  • if($space) {
  • $out .= $char;
  • $space = false;
  • }
  • }else{
  • $out .= $char;
  • }
  • break;
  • default:
  • $space=true;
  • if($semilicon) {
  • $out .= "\n".$tab.$char;
  • $semilicon = false;
  • } else {
  • $out .= $char;
  • }
  • }
  • }
  • $out."\n?>";
  • file_put_contents($dir.'back_'.$file, $out);
  • }
  • }
  • ?>
<?php
/**
* @author: AMEZGHAL abdelilah <amezghal@msn.com>
*/
class Indenter {

	public function __construct(){
	}
	
	private $is_string1 = false;
	private $is_string2 = false;
	private $is_comment1 = false;
	private $is_comment2 = false;
	public function valid(){
		return  (
				$this->is_string1 == false && $this->is_string2 == false &&
				$this->is_comment1 == false && $this->is_comment2 == false
				);
	}
	public function indent($dir, $file){
		$string=trim(file_get_contents($dir.$file));
		if(substr($string,0,5)=='<?php'){
			$string=substr($string,5,strlen($string)-7);
		}else{
			$string=substr($string,2,strlen($string)-4);
		}
		$out = "<?php\n";
		$arc = 0;
		$semilicon = false;
		$space = true;
		$tab='';
		$is_condition = false;
		$update=true;
		for($i = 0; $i < strlen( $string ); $i++) {
			$char = substr($string, $i, 1);
			switch($char) {
				case '"':
					if($this->is_comment1 == false && $this->is_comment2 == false) {
						if($this->is_string1) {
							if(substr($string,$i-1,1)!='\\') {
								$this->is_string1=false;
							}
						}else{
							if($this->is_string2==false){
								$this->is_string1=true;
							}
						}
					}
					$out .= $char;
					break;

				case '\'':
					if($this->is_comment1 == false && $this->is_comment2 == false) {
						if($this->is_string2) {
							if(substr($string,$i-1,1)!='\\'){
								$this->is_string2=false;
							}
						}else{
							if($this->is_string1==false){
								$this->is_string2=true;
							}
						}
					}
					$out .= $char;
					break;

				case '/':
					if($this->is_string1 == false && $this->is_string2 == false) {
						if(substr($string, $i-1, 1)=='/'){
							$this->is_comment1=true;
							$semilicon=false;
						}
						if($this->is_comment2){
							if(substr($string, $i-1, 1)=='*'){
								$this->is_comment2=false;
								$out .= $char."\n".$tab;
								$update=false;
							}
						}
					}
					if($update) {
						$out .= $char;
					}else{
						$update = true;
					}
					break;

				case '*':
					if($this->valid()) {
						if(substr($string,$i-1,1)=='/'){
							$this->is_comment2=true;
							$out = substr($out,0,strlen($out)-1);
							$out .=$tab.'/*';
						}
					}else{
						$out .= $char;
					}
					break;
				case '(':
					if($this->valid()) {
						$arc++;
						if($is_condition==false) {
							$is_condition=true;
						}
					}
					$out .= $char;
					break;

				case ')':
					if($this->valid()) {
						$arc--;
						if($arc==0){
							$is_condition=false;
						}
					}
					$out .= $char;
					break;

				case ';':
					if($this->valid()) {
						if($is_condition){
							$out .= $char.' ';
							$space = false;
						}else{
							$semilicon = true;
							$out .= $char;
						}
					}else{
						$out .= $char;
					}
					break;

				case '{':
					if($this->valid()) {
						$out .= "\n" . $tab . $char . "\n";
						$tab .= "\t";
						$out .= $tab;
					}else{
						$out .= $char;
					}
					break;

				case '}':
					if($this->valid()) {
						$tab = substr($tab, 0, strlen($tab)-1);
						$out .="\n".$tab.$char."\n";
					}else{
						$out .= $char;
					}
					break;
				case ':':
					if($this->valid()) {
						$out .= $char."\n".$tab;
					}
					break;
				case "\n":
					if($this->is_comment1){
						$out .= $char.$tab;;
						$this->is_comment1=false;
					}elseif($this->is_comment2){
						$out .= $char.$tab;
					}
					break;
				case "\r":
				case "\t":
					if($this->is_string1==true || $this->is_string2==true) {
						$out .= $char;
					}
					break;

				case ' ':
					if($this->valid()) {
						if($space) {
							$out .= $char;
							$space = false;
						}
					}else{
						$out .= $char;
					}
					break;

				default:
					$space=true;
					if($semilicon) {
						$out .= "\n".$tab.$char;
						$semilicon = false;
					} else {
						$out .= $char;
					}
			}

		}
		$out."\n?>";
		file_put_contents($dir.'back_'.$file, $out);
	}
}
?>

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

05 mars 2008 15:27:12 :
ptite maj

Commentaires et avis

signaler à un administrateur
Commentaire de Mizuka le 04/03/2008 15:53:55

Bonjour,

L'idée est sympathique,

Critiques :
_ Des commentaires seraient les bienvenues;
_ Une documentation également;
_ Des noms de variables plus explicites;

Après, j'suis pas motivé pour lire quand j'dois déchiffrer le fonctionnement,

Cordialement,

signaler à un administrateur
Commentaire de jlf5808 le 05/03/2008 10:57:11

Bonjour,
En quelques lignes.
Quelle est la procedure pour en forme mon nouveau programme PHP.
que je viens de terminer.
Je voudrais avoir  une methode pour mettre en forme tous les codes.php que j'ai pour les  relire facilement  .
Salutations.

signaler à un administrateur
Commentaire de amezghal le 05/03/2008 15:35:08

salut et merci
@Mizuka:
le fonctionnement est très simple, une boucle sur tous les char du script puis un switch suivant les cas, par exemple si c'est un '{' ça nécessite un retour a la ligne puis une tabulation pour ce qui suis ';' retour à la ligne....ainsi de suite  
je crois que mes var sont explicites! sinon
$is_string1; pas une chaine du type "string"
$is_string2: pas une chaine du type 'string'
deux type de commentaire //comment et /*comment */
voilà :)

@jlf5808
relis la description j'ai expliqué comment faire :)

signaler à un administrateur
Commentaire de BaFM le 10/03/2008 10:35:52

Bonjour,

Votre code ne gère pas la syntaxe HereDoc supportée par php.

Une méthode plus propre est d'utiliser lexer et parser pour régénérer le code indenté en gérant complètement la grammaire du langage, ce qui évite de tomber dans des cas limites.

signaler à un administrateur
Commentaire de Eregon le 10/03/2008 18:13:01 5/10

Moi je dit vive l'indent personnel^^
Car il y a toujours des exceptions, genre des conditions qu'on veux à peine mentionner et qu'on met sur une ligne, un texte que l'on met directement contre le bord(toujours le cas en heredoc), un saut à la ligne pour repérer des CR ou LF, une arborescence où l'on veut l'élément racine contre la marge, ...

Mais sinon ça doit surement être un bon exercice de parsing :p
Bon codage
P.S.:'deux paramètres la directoire et le nom du fichier' -> '2 paramètres : le dossier et le fichier' ;) (pourquoi séparer ces paramètres?)

signaler à un administrateur
Commentaire de amezghal le 10/03/2008 19:05:07

salut, et merci =),
en fait j'avais pas fais attention au cas de heredoc..donc merci pour la remarque,(bug fix dans la prochaine maj :D)

@BaFm, si tu connais un lexer qui produit du code pour php je serais pronneur...(car je connais que ceux qui produisent du code pour C, C++, C#, java),

merci :)


signaler à un administrateur
Commentaire de BaFM le 10/03/2008 20:04:52

Le Lexer (analyseur lexical) il ne produit pas de code, il produit un flux de jetons qui sont utilisés par un Parser (analyseur syntaxique) qui produit un arbre AST. C'est cet arbre que tu retransformera en chaîne pour le formatage.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Convertir une Date au format Timestamp [ par Touf ] Salut !J'ai un petit pb : j'accède à une Date stockée dans une bdd mysql sous la forme (timestamp) "YmdHis" : 20020608105031J'aimerais l'afficher sous comment afficher sous forme de tableau [ par Xime ] bonjourvoila j'aimerais savoir comment afficher mes données que je recupere de ma base de données sous forme de tableau (la taille sera en fonction du Mise en Forme HTML [ par CouB ] Je m'explique :J'ai un script qui doit me permettre de mettre a jour du text et des images sur une page php.Les données sont saisies via un formulaire conversion de date [ par Joez ] voila je récupère la date de mysql sous la forme 2002-01-02 10:43:32 et je voudrais afficher cette date sous la forme Lundi 02 janvier 2002 à 10h4 du MultiPlayer dans l'aire [ par Nestor ] SalutJe voudrais me faire sous forme de tableau un listing d'adresse ip, du ping, date, heure.....pour mon site mais je sauré jamais faire cela en php lecteur de donnée dans iframe [ par SupTOny2000 ] Bonsoir à tous Depuis une semaine je cherche des infos concernant un méchant formulaire avec mise forme et tout! (en référence je peux cité le formula Extraires les URLs de fichiers sous forme CSV [ par spectroman ] J'aurai besoin d'un script en PHP qui parse une page (HTML) pour en extraire les liens et leurs noms dans un fichier texte...sous la forme :nomdulien1 exporter mysql vers excel sous forme de tableau [ par delaide ] bonjour! je cherche un script qui permet d'exporter les données mysql vers un fichier excel sous forme de tableau.j'ai déjà trouvé 1 (XLS MAGIQUE) mai Mise en forme de texte dans GD 1.6/2.0 [ par bartart ] Bonjour, je voulais savoir si quelqu'un connaissait une astuce pour mettre du texte en gras et/ou en italique sur un imagestring dans la bibliothèque mise en forme phpbb [ par mozrat ] Bonjour,je cherche à insérer phpbb dans mon site :je m'explique, j'aimerais avoir la page du forum sous la forme :&lt;table&gt;&lt;tr&gt;&lt;td&gt;inc


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.