Page 1 sur 1

Indentation code PHP

Publié : mar. 05/avr./2005 22:56
par Le Soldat Inconnu
Salut,

je vous mets ici un code tout bête qui permet d'indenter le code PHP des fichiers d'un site. Je l'ai utilisé sur PWSPHP, le CMS de mon futur site.

le code est commenté donc bon amusement :)

Code : Tout sélectionner

Global DossierSite.s

NewList Ligne.s()

Procedure Analyse(Fichier.s, Deboguage)
  ;{ on charge
  DansTexte = 0
  ClearList(Ligne())
  If ReadFile(0, Fichier)
    Repeat
      Txt.s = ReadString()
      AddElement(Ligne())
      Ligne() = Txt
    Until Eof(0)
    CloseFile(0)
  EndIf
  ;}
  
  ;- Analyse
  Tab = 0
  ForEach Ligne() ; pour chaque ligne
    Ligne() = Trim(ReplaceString(Ligne(), Chr(9), " ")) ; On retire les espaces et les tabulations
    Tab_D = CountString(Ligne(), "{") ; On compte le nombre de { , indentation en plus
    Tab_G = CountString(Ligne(), "}") ; On compte le nombre de } , indentation en moins
    If Tab_D > 0 And Tab_G > 0 ; si j'ai des { et des } sur la même ligne
      If FindString(Ligne(), "}", 1) < FindString(Ligne(), "{", 1) ; si le premier est un }
        ; un { annule un } sauf le premier } que l'on ne peut pas annuler
        ; c'est pour les codes de ce type qu'on ne retire pas le premier }
        ; if (x==0) {
        ;   Blabla
        ; } else {
        ;   Blabla
        ; }
        If Tab_D > Tab_G
          Tab_D - Tab_G + 1
          Tab_G = 1
        Else
          Tab_G - Tab_D + 1
          Tab_D = 1
        EndIf
      Else ; sinon, le premier est un {
        ; un { annule un }
        If Tab_D > Tab_G
          Tab_D - Tab_G
          Tab_G = 0
        Else
          Tab_G - Tab_D
          Tab_D = 0
        EndIf
      EndIf
    EndIf
    
    If Tab_G Or Tab_D ; déboguage
      Debug Ligne()
      Debug Tab_G
      Debug Tab_D
    EndIf
      
    Tab - Tab_G ; on retire des tabulations en fonction du nombre de }
    ; On retire avant d'ajouter les tabulations au texte
    
    If Fin = 0 Or Left(Ligne(), 1) <> "'" ; si la ligne ne commence pas par ' et que la ligne précédente ne finit pas par '
      
      ; On ajoute les tabulations
      For n = 1 To Tab
        Ligne() = Chr(9) + Ligne()
      Next
      
    EndIf
    
    If Right(Ligne(), 1) = "'" ; si la ligne finit par '
      Fin = 1
    Else
      Fin = 0
    EndIf
    
    Tab + Tab_D ; on ajoute des tabulations en fonction du nombre de {
    ; On ajoute après avoir ajouter les tabulations au texte
    
  Next
  
  ;{ on enregistre
  If Deboguage = 0
    If CreateFile(0, Fichier)
      ForEach Ligne()
        WriteStringN(Ligne())
      Next
      CloseFile(0)
    EndIf
  Else
    If CreateFile(0, "test2.php")
      ForEach Ligne()
        WriteStringN(Ligne())
      Next
      CloseFile(0)
    EndIf
  EndIf
  ;}
EndProcedure

Procedure Dossier(Num, Dossier.s)
  
  If ExamineDirectory(Num, Dossier, "*.*")
    Repeat
      FileType = NextDirectoryEntry()
      
      If FileType = 1
        Fichier.s = DirectoryEntryName()
        If LCase(GetExtensionPart(Fichier)) = "php"
          Analyse(Dossier + Fichier, 0)
          AddGadgetItem(0, -1, RemoveString(Dossier, DossierSite) + Fichier)
          SetGadgetState(0, CountGadgetItems(0) - 1)
          UpdateWindow_(WindowID())
        EndIf
      ElseIf FileType = 2
        Fichier.s = DirectoryEntryName()
        If Fichier <> "." And Fichier <> ".."
          Dossier(Num + 1, Dossier + Fichier + "\")
          UseDirectory(Num)
        EndIf
      EndIf
      
      While WindowEvent()
      Wend
      
    Until FileType = 0
  EndIf
EndProcedure

Procedure.s GetProgramDirectory2() ; Récupère le dossier d'exécution
  Protected Dossier.s
  Dossier = Space(255)
  GetCurrentDirectory_(255, @Dossier)
  If Right(Dossier, 1) <> "\" ; si l'adresse ne finit pas par "\"
    Dossier = Dossier + "\" ; on rajoute le "\"
  EndIf
  ProcedureReturn Dossier
EndProcedure



;/ Debut

; mettre 0 dans le test ci-dessous pour tester le programme sur un fichier "Test.php" placé dans le même du programme
; le résultat sera sauvé dans "Test2.php"
CompilerIf 1
  OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "PHP")
  CreateGadgetList(WindowID())
  StringGadget(2, 0, 0, 270, 20, "", #PB_String_ReadOnly | #PB_String_BorderLess)
  ButtonGadget(3, 270, 0, 30, 20, "...")
  GadgetToolTip(3, "Choisir le dossier à traiter")
  ListViewGadget(0, 0, 20, 300, 260)
  ButtonGadget(1, 0, 280, 300, 20, "Lancer la mise en forme du code")
  UpdateWindow_(WindowID())
  
  DossierSite.s = PathRequester("Choissisez le dossier contenant votre site", GetProgramDirectory2())
  SetGadgetText(2, DossierSite)
    
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_EventGadget
      Select EventGadgetID()
        Case 1
          If FileSize(DossierSite) = -2
            ClearGadgetItemList(0)
            Dossier(0, DossierSite)
            MessageRequester("PHP", "Fin du traitement." + Chr(10) + Chr(10) + "Logiciel réalisé sous PureBasic par LSI Développements (Le Soldat Inconnu)", 0) 
          Else
            MessageRequester("Erreur", "Vous devez choisir un dossier")
          EndIf
        
        Case 3
          If DossierSite = "" : DossierSite = GetProgramDirectory2() : EndIf
          DossierSite.s = PathRequester("Choissisez le dossier contenant votre site", DossierSite)
      EndSelect
    EndIf
    
  Until Event = #PB_Event_CloseWindow
    
CompilerElse
  Analyse("test.php", 1)
CompilerEndIf