Un convertisseur PHP pour des balises personnalisées en HTML
Posté : 16 janv. 2006, 17:07
Voici, une solution pour simplifier l'insertion des listes déroulantes et des tables HTML avec un contenu issu d'une source externe exactement comme c'est le cas des images, des frames, des iframe et autres.
L'idée est de pouvoir écrire les listes et tables comme suit:
1. Pour une liste : <Select src="data_list.txt" name= "list1" caption= "List 1">
2. Pour une table : <table src="data_table.txt" name= "table1" caption= "Table 1">
Exemple.htm :
Pour transformer ces formats personnalisés en balises HTML, un convertisseur PHP est développé et se présente comme suit:
html_parser.php?file=exemple.htm
ce programme transforme le fichier HTML de base en fichier HTML/PHP prêt à l'emploi.
Le fichier "mois.txt" pour remplir la liste
L'idée est de pouvoir écrire les listes et tables comme suit:
1. Pour une liste : <Select src="data_list.txt" name= "list1" caption= "List 1">
2. Pour une table : <table src="data_table.txt" name= "table1" caption= "Table 1">
Exemple.htm :
Code : Tout sélectionner
<html>
<form name="f" onSubmit="return validate();">
<p><SELECT id="js_id" src="mois.txt" name="mois" caption="Mois" onChange="f.submit();">
<p><TABLE src="agenda.txt" name= "agenda" caption= "Agenda" onClick="f.submit();">
</form>
</html>
html_parser.php?file=exemple.htm
ce programme transforme le fichier HTML de base en fichier HTML/PHP prêt à l'emploi.
<?php
//Programme d'interprétation de balises HTML modifiées
//PRINCIPAL (exige un fichier HTML en entrée)
if (!$_GET[file]) {
echo "<p>Aucun fichier à traiter!";
exit;
};
//Les balises recherchées
$tags = array("SELECT", "TABLE");
//Traitement du fichier en entrée
$file = file_get_contents($_GET[file]);
$file = str_replace("\r\n", " ", $file);
foreach ($tags as $tag) $file = parse($file, $tag);
//Affichage en tantque fichier PHP
showAs_PHP($file);
//FONCTIONS
function showAs_PHP($file){
$file = "<?php \n \t extract(\$_GET); \n \t echo \"".str_replace("\\'","'", addslashes($file))."\"; \n?>";
file_put_contents("temp.php", $file);
header("location: temp.php");
}
function parse($file, $tag){
//Format :
//<select src="data_list.txt" name="list1" caption="List 1">
//<table src="data_table.txt" name="table1" caption="Table 1">
//Recherche du tag
preg_match("#<$tag\s+[^>]+>#", $file, $résultat);
$ligne_origine = trim($résultat[0]);
$ligne_recherche = str_replace("<$tag", "", str_replace(">", "", $ligne_origine));
//Recherche de l'attribut src
preg_match('#(src\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
$src = trim($résultat[0]);
//Recherche de l'attribut name
preg_match('#(name\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
$name = trim($résultat[0]);
$clé = $name;
//Recherche de l'attribut caption
preg_match('#(caption\s*=(\s|"|\')*[^"]*("|\')\s)#', $ligne_recherche, $résultat);
$caption = trim($résultat[0]);
//Recherche des autres attributs
$other_attrib = str_replace($src,"",str_replace($name, "", str_replace($caption, "", $ligne_recherche)));
//Extraction des valeurs
$src = trim(preg_replace('/(^src\s*=(\s|"|\')*)|("|\')$/', "", $src));
$name = trim(preg_replace('/(^name\s*=(\s|"|\')*)|("|\')$/', "", $name));
$caption = trim(preg_replace('/(^caption\s*=(\s|"|\')*)|("|\')$/', "", $caption));
//Construction du HTML
$html = write ($tag, $src, $name, $caption, $other_attrib);
$file = str_replace($ligne_origine, $html, $file);
return $file;
}
function write ($tag=null, $src=null, $name="", $caption="", $other_attrib=null){
if ($tag == null || $src == null) return null;
switch (strtoupper($tag)){
case "SELECT":
$résultat = "<b>$caption</b> <SELECT name=\"$name\" $other_attrib><OPTION value=\"\">-- Choisissez --</OPTION>";
$options = @file($src);
if ($options)
foreach ($options as $i=>$ligne){
$ligne = explode(",", $ligne);
if ($ligne[0]){
$valeur = $ligne[0]&&$ligne[1]?$ligne[0]:$i;
$texte = $ligne[0]&&$ligne[1]?$ligne[1]:$ligne[0];
$résultat.= "<OPTION value=\"$valeur\">$texte</OPTION>";
}
}
$résultat.= "</SELECT>
<script>
for (i=0; i<document.all[\"$name\"].options.length; i++){
if (document.all[\"$name\"].options[i].value == \"$$name\"){
document.all[\"$name\"].options[i].selected = true;
break;
}
}
</script>
";
return $résultat;
case "TABLE":
$résultat = "<TABLE border name=\"$name\" $other_attrib><LEGEND><b>$caption</b></LEGEND>";
$contenu = @file($src);
if ($contenu)
foreach ($contenu as $i=>$ligne){
$ligne = explode(",", $ligne);
$résultat.= "<TR id=\"ligne_$i\" onClick=\"select(this);\">";
foreach ($ligne as $j=>$col)
if ($i == 0) $résultat.= "<TH>$col <input type=hidden name=\"$name"."["."$i][$j]\" value=\"$col\">";
else $résultat.= "<TD>$col <input type=hidden name=\"$name"."["."$i][$j]\" value=\"$col\">";
}
$résultat.= "</TABLE><input type=hidden name=\"ligne\" value=\"\$ligne\">
<script>
//Global
var id_last = \"\$ligne\";
var last_selected_in_$name = id_last?document.all[id_last]:null;
//Default: Select last
if (last_selected_in_$name){
last_selected_in_$name.style.background = \"silver\";
last_selected_in_$name.style.color = \"white\";
}
function select(me){
//unSelect last selected
if (last_selected_in_$name && last_selected_in_$name.style){
last_selected_in_$name.style.background = \"\";
last_selected_in_$name.style.color = \"\";
}
//Select me
me.style.background = \"silver\";
me.style.color = \"white\";
//Store me as last selected
last_selected_in_$name = me;
document.all[\"ligne\"].value = me.id;
}
</script>
";
return $résultat;
default : return null;
}
}
?>
Extrait d'exemple des fichiers de données utilisés pour les source des lists et tables :Le fichier "mois.txt" pour remplir la liste
- 1,Janvier
2,Février
3,Mars
- Date,Heure,Durée,Note
16-01-06,08:30,2,Préparer le cours PHP/HTML
16-01-06,13:30,3,Cours PHP/HTML
16-02-06,08:30,2,Préparer le cours PHP/HTML
16-02-06,13:30,3,Cours PHP/HTML