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("---------------------------------------------------------------------");
}
}