ModificationPageHTML.java

import java.net.URL;
import java.io.*;
import java.lang.*;
import java.net.*;

public class ModificationPageHTML
{
     private String adressePage;
     private StringBuffer donneesOriginelles;
     private String donnees;

/*********************************************************************************************************/     
     public ModificationPageHTML(ConnectionUrl URLPage)
          {
          adressePage=URLPage.getAdressePage();
          donneesOriginelles=URLPage.getDonnees();
          donnees=donneesOriginelles.toString();
          }
/*********************************************************************************************************/     
          
     public StringBuffer getPage()
          {
           return(donneesOriginelles);
          }
/*********************************************************************************************************/     

     public StringBuffer getPageModifiee()
          {
          int positionPoint=0;
          int existCss=0;
          String pageModifiee=null;     
          
          
          positionPoint=adressePage.lastIndexOf(".");  //on cherche le dernier point de l'adresse
          existCss=adressePage.toLowerCase().indexOf("css",positionPoint); // onregarde si la page est un .css
          
          if(existCss==positionPoint+1)
               {
               pageModifiee=this.rechercheLien("url",donnees,"(",")"," ");
               }
          else     
               {
               pageModifiee=this.rechercheLien("<base",donnees,"href=",">"," ");
               pageModifiee=this.rechercheLien("<a",pageModifiee,"href=",">"," ");
                   pageModifiee=this.rechercheLien("<img",pageModifiee,"src=",">"," ");
                   pageModifiee=this.rechercheLien("<frame",pageModifiee,"src=",">"," ");
               pageModifiee=this.rechercheLien("<form",pageModifiee,"action=",">"," ");
               pageModifiee=this.rechercheLien("<body",pageModifiee,"background=",">"," ");
               pageModifiee=this.rechercheLien("<link",pageModifiee,"href=",">"," ");
                    
               }     
               
          return(new StringBuffer(pageModifiee));
          }          
/**********************************************************************************************************/     

     private String rechercheLien(String balise, String donnees, String chainedebut, String chainefin1, String chainefin2)
          {
          // recherche la chaine comprise entre chainedebut et le premier de chainefin1 ou chainefin2
          URLConnection conn;
          int port=8080;
          int test=1;
          int position=0;  // position du debut de "chainedebut" dans une ligne
          int positionfin=0; // position du derneir "chainedebut" dans une ligne
          int position2=0; // position de la premiere balise '>' apres un "chainedebut"
          int taille=0; // longueur du lien
          int position_blanc=0; // position d'un espace " "
          String newPage="";  // contiendra toute la nouvelle page avec les liens modifies
          int position_debutbalise=0;
          int position_finbalise=0;
          int positionDebutPre=0;
          int positionFinPre=0;
          boolean css=false;
     //     int positionPoint=0;
     //     int existCss=0;
          
          try  {     
               int i=0;
               int temp=0;
               
          //     URL url=new URL(adressePage);
          //     conn=url.openConnection();      //creation d'une connexion à l'URL spécifiée
          //     DataInputStream dis= new DataInputStream(conn.getInputStream());  //recuperation du flux d'entrée
               String inputLine=donnees.toString();
               char[] chaineChar= inputLine.toCharArray(); //on convertit la ligne en un char[]
               
               
               
               while(test>0)     // on passe dans la boucle dès qu'on rencontre un nouveau lien (ou une image...)
                              // dans la page HTML a traitée                         
                    {
                    
                    positionDebutPre=inputLine.toLowerCase().indexOf("<pre>",position);
                    if(positionDebutPre!=-1)
                         {
                         //System.out.println("Balise <PRE> ------------------------------------");
                         positionFinPre=inputLine.toLowerCase().indexOf("</pre>",positionDebutPre);
                         position_finbalise=positionFinPre;
                         }
               //     else System.out.println("Pas de <pre> trouvee");
                    position_debutbalise=inputLine.toLowerCase().indexOf(balise,position_finbalise+1);
                                   // on repere la position du debut de la balise
                    if(position_debutbalise==-1) return(donnees);     // si pas de balise, on modifie pas la page
                    if(position_debutbalise!=-1)  // si on a une balise...
                          {     
                         position_finbalise=inputLine.toLowerCase().indexOf(chainefin1,position_debutbalise);
                                   // on repere la fin de la balise
                         int taille_balise=position_finbalise-position_debutbalise;
                                   // on calcule la taille de la balise
                         String Inbalise=inputLine.copyValueOf(chaineChar,position_debutbalise,taille_balise+1);
                                   // on copie la balise dans "balise"
               
                         position=Inbalise.toLowerCase().indexOf(chainedebut,0);
                               // on cherche la position de l'attibut "chainedebut" dans la balise (par ex "src=" ou "href=")  
                         position2=Inbalise.toLowerCase().indexOf(chainefin1,position);  
                              // on cherche la position du premier caractere de fin 
                           position_blanc=Inbalise.toLowerCase().indexOf(chainefin2,position);
                              // on cherche la position du premier blanc apres l'attribut
                              
                                        
                         int fin_balise=-1; // utilisé pour savoir s'il y a un blanc entre l'attribut et la fin de la balise
                    
                         if ((position_blanc!=-1)&&(position_blanc<position2)) // s'il y a un blanc avant la balise '>'
                                   {
                                   taille=position_blanc-position;          //on calcule la taille du lien
                                   fin_balise=0;  // le lien se termeine par un blanc
                                   }
                         if ((position2<position_blanc)&&(position2!=-1))
                                       {
                                        taille=position2-position;
                                        fin_balise=1;  // le lien se termine par '>'
                              
                                        }
                         if ((position2>0)&&(position_blanc==-1)) 
                              {
                              taille=position2-position;
                               fin_balise=1;
                              }                 
                         positionfin=inputLine.toLowerCase().lastIndexOf(balise);//on cherche la derniere balise
                              // on cherche la position de la derneire balise de la page
               
                         if (position!=-1)  // si on trouve "chainedebut" dans la balise
                              {
                              char[] chaineChar2= Inbalise.toCharArray(); //on convertit le contenu de la balise  en un char[]

                              String buffer=Inbalise.copyValueOf(chaineChar2,position,taille); 
                                    //on copie le lien dans buffer
                              int taille_buffer=buffer.length();  //taille du lien
                              int taille_chainedebut=chainedebut.length();     
                              int taille_buffer_tronque=taille_buffer-taille_chainedebut;
                              char[] bufferchar=buffer.toCharArray(); 
                              String buffer_tronque="";
                              String buffer_tronque2="";
                              if((taille_chainedebut!=-1)&&(taille_buffer_tronque!=-1))
                                   { 
                                   buffer_tronque=buffer.copyValueOf(bufferchar,taille_chainedebut,taille_buffer_tronque);
                                   // on tronque le buffer pour enlever le "href=" ou "src="
                                   } 
                         
                                //ci dessous, on regarde s'il y a des guillemets ou des apostrophes en debut et fin de chaine     
                              boolean test_guillemet_debut=buffer_tronque.startsWith("\"");
                              boolean test_guillemet_fin=buffer_tronque.endsWith("\"");
                              boolean test_apostrophe_debut=buffer_tronque.startsWith("\'");
                              boolean test_apostrophe_fin=buffer_tronque.startsWith("\'");
                              
                              if((test_guillemet_debut==true)&&(test_guillemet_fin==true)&&(taille_buffer_tronque>1))
                                   { //si le lien est entre guillemets
                                   char[] buffer_tronquechar=buffer_tronque.toCharArray();
                                   buffer_tronque2=buffer_tronque.copyValueOf(buffer_tronquechar,1,taille_buffer_tronque-2);
                                   }  // on tronque encore le buffer pour enlever les guillemets, s'il y en a
                              if((test_guillemet_debut==false)&&(test_guillemet_fin==false)&&(taille_buffer_tronque>1))
                                   {  
                                   buffer_tronque2=buffer_tronque;
                                   }  // si pas de guillemet, rien à tronquer...     
                              if((test_apostrophe_debut==true)&&(test_apostrophe_fin==true)&&(taille_buffer_tronque>1))
                                   { //si le lien est entre apostrophes
                                   char[] buffer_tronquechar=buffer_tronque.toCharArray();
                                   buffer_tronque2=buffer_tronque.copyValueOf(buffer_tronquechar,1,taille_buffer_tronque-2);
                                   } // on tronque encore le buffer pour enlever les apostrophes, s'il y en a                                   
                              
                              
                              String newLien=""; // contiendra le nouveau lien, une fois transformee
                              URLAbsolue URLModifiee=null;
                              if(balise.equalsIgnoreCase("<base"))
                                   {
                                   URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,false);
                                   newLien=URLModifiee.getAbsoluteURL();
                              //     System.out.println(newLien);
                                   adressePage=newLien;
                         //          System.out.println("On passse dans balise adressepage= "+adressePage);                         
                                   }
                         /*     if(balise.equalsIgnoreCase("<link"))
                                   {
                                   URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,true);
                                   newLien=URLModifiee.getAbsoluteURL();
                              
                                   }*/
                              if(balise.equalsIgnoreCase("url"))
                                   {
                                   URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,false);
                                   newLien=URLModifiee.getAbsoluteURL();
                                   css=true;
                                   }
                              if((balise.equalsIgnoreCase("<link"))||(balise.equalsIgnoreCase("<a")))
                                   {  // on modifie le lien à l'aide de la classe URLAbsolue
                              //     System.out.println("*******");
                              //     System.out.println("adresse page dans <a :" + adressePage);
                                   URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,true);
                                   newLien=URLModifiee.getAbsoluteURL();
                              //     System.out.println("Lien initial :"+buffer_tronque2);
                              //     System.out.println("nv lien apres URLabsolue : "+newLien);
                                   }
                              if(balise.equalsIgnoreCase("<img"))
                                   { // on modifie le lien à l'aide de la classe URLAbsolue
                                    
                                    URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,false);
                                    newLien=URLModifiee.getAbsoluteURL();
                                   }
                              
                              if(balise.equalsIgnoreCase("<frame"))
                                   { // on modifie le lien à l'aide de la classe URLAbsolue
                                    URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,true);
                                    newLien=URLModifiee.getAbsoluteURL();
                                   }
                         
                              if(chainedebut.equalsIgnoreCase("action="))
                                   { // on modifie le lien à l'aide de la classe URLAbsolue
                                    URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,false);
                                    newLien=URLModifiee.getAbsoluteURL();
                                   }
                                   
                              if(chainedebut.equalsIgnoreCase("background="))
                                   { // on modifie le lien à l'aide de la classe URLAbsolue
                                    URLModifiee=new URLAbsolue(adressePage,buffer_tronque2,false);
                                    newLien=URLModifiee.getAbsoluteURL();
                                   }
                              
                              if(css==true) newLien=chainedebut+newLien;
                              else     newLien=chainedebut+"\""+newLien+"\"";  // permet de réinserer "href=" ou "src="
                         
                                             
                              int tailleEntreLien=(position+position_debutbalise)-temp;
                                                       
                              newPage=newPage+inputLine.copyValueOf(chaineChar,temp,tailleEntreLien);
                                   // on concatene la partie entre deux liens dans le nouveau string
                              newPage=newPage+newLien;          // on concatene le lien au niveau string
                                   //ces deux concatenations permettent de recuperer la nouvelle page avec les liens modifiées
                                   //comme voulu
                              if (fin_balise==1)  temp=position2+position_debutbalise;  // on memorise la position de la fin du dernier lien pour concatener à partir du bon 
                              if (fin_balise==0)  temp=position_blanc+position_debutbalise;  // endroit lors du prochain passage dans la boucle
                         
                              test++;  // on incremente le nombre de fois où on est passé dans la boucle
                              } //fin if
                         
                              
                         } //fin if(position_debutbalise!=-1) 
                         else test=0;  // si pas de balise trouvee, on sort de la boucle
                    
                         if(position_debutbalise==positionfin) 
                              { //quand c'est le dernier passage (ie le dernier lien), on concatene la fin de la page
                              test=0;  // on arrete la boucle car pas d'autres liens
                              int tailleTotaleLigne=inputLine.length(); // taille totale de la page
                              newPage=newPage+inputLine.copyValueOf(chaineChar,temp,(tailleTotaleLigne-temp));
                         //     System.out.println(inputLine.copyValueOf(chaineChar,temp,(tailleTotaleLigne-temp)));
                              }
                    
                    }// fin while
          
                    
                         
               }//fin try
     //     catch(IOException e) {System.out.println("Erreur d'entrée/Sortie");}
          catch(ArrayIndexOutOfBoundsException e) {System.out.println("Erreur Array Index Out of Bounds");}
          catch(Exception e) {System.out.println("Erreur");}
           
                return(newPage);
          
          }
/****************************************************************************************************************/
     


     public static void main(String[] args)
          {
          int positionPoint=0;
          int existCss=0;
          
     //     ConnectionUrl ad=new ConnectionUrl("http://www.tf1.fr");
          ConnectionUrl ad=new ConnectionUrl("http://membres.lycos.fr/ndailly/citations/style.css");
     
          ModificationPageHTML page= new ModificationPageHTML(ad);
     //     page.donnees=page.donneesOriginelles.toString();
          
          
          
          
     //     page.connectUrl();
          System.out.println("---------------------------------------------------------------------");
          System.out.println(page.getPageModifiee());  
          System.out.println("---------------------------------------------------------------------");
     }
          
     
          
}