1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| <?
$ext = ".lmx";
$header_xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"."\n"."<individu>"."\n";
$footer_xml = "</individu>";
function id($val_ligne)
{
return intval(substr($val_ligne,0,1));
}
function tag($val_ligne)
{
$result = substr(substr($val_ligne,2),0,strpos(substr($val_ligne,2)," "));
if ($result == null)
{
$result = trim(substr(substr($val_ligne,2),0,strpos(substr($val_ligne,2),"\n")));
}
return $result;
}
function descript($val_ligne)
{
if (strstr(substr($val_ligne,2)," "))
{
return trim(strstr(substr($val_ligne,2)," "));
}
else {return null;}
}
function ExtractChamp($chaine,$entier,$sep)
{
if($entier > 0)
{
$res=strtok($chaine,$sep); //découpe la chaine en segment avec le séparateur $sep.
if($res!="") //si la chaîne comporte au moins une fois le séparateur alors
{
for($i=1;$i<$entier;$i++)
{
$res=strtok($sep);//passe au segment suivant
}
}
}else
{
$res=false;
}
return($res);//retourne le résultat
}
// Je récupère mon fichier txt dans un tableau
$handle = @fopen("./gedcom/gedcom_light.ged", "r" );
if ($handle)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
$tableau[] = $buffer;
}
fclose($handle);
}
for ($i=0;$i<sizeof($tableau);$i++)
{
$id_ligne =id($tableau[$i]); // 1er caractère de la ligne courante.
$tag_ligne = tag($tableau[$i]);
$descript = descript($tableau[$i]);
if ($id_ligne == "0" && ereg("INDI",$descript)) // si le 1er caractère de la ligne est un 0 cela veut dire que j'arrive sur un nouvel indi
{
if ($flag_edition_en_cours) // si j'étais en cours d'édition d'un indi
{
fputs($Current_acces, $footer_xml); // j'écris dans le fichier le footer
fclose($Current_acces); // et je ferme le fichier de l'indi
$flag_edition_en_cours = false; // j'indique par le flag que j'ai finis l'edition de l'indi
}
$Current_Ind = ExtractChamp($tag_ligne,1,"@"); // je récupère l'identifiant de l'indi
$Current_xml = "./fiches/".$Current_Ind.$ext ; // je créé le fichier de l'indi
$Current_acces = fopen($Current_xml,"w"); // je l'ouvre en écriture
fputs($Current_acces, $header_xml); // j'y écris l'header
$flag_edition_en_cours = true; // j'indique par le flag que je suis en cours d'edition de l'indi
}
//Mon bout de code qui pose problème
// si le premier caractère de la ligne courante est < au premier caractère de la ligne suivante,
// le tag de la ligne courante sera parent du tag de la ligne suivante
if ($id_ligne < id($tableau[$i+1]))
{
fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."\r\n");
$tag_tableau[count($tag_tableau)][0] = $tag_ligne; // permet de garder l'historique des tags parents
$tag_tableau[count($tag_tableau)][1] = $id_ligne; // permet de garder l'historique des tabulations des tags parents
}
// si le premier caractère de la ligne courante est = au premier caractère de la ligne suivante,
// le tag de la ligne courante doit être au même niveau que le tag de la ligne suivante
if ($id_ligne == id($tableau[$i+1]))
{
fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."valeur"."</".$tag_ligne.">"."\r\n");
}
// si le premier caractère de la ligne courante est > au premier caractère de la ligne suivante,
// le tag de la ligne courante doit revenir au niveau supérieure
if ($id_ligne > id($tableau[$i+1]))
{
fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."valeur"."</".$tag_ligne.">"."\r\n");
// fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."\r\n");
// $tag_tableau[count($tag_tableau)][0] = $tag_ligne; // permet de garder l'historique des tags parents
// $tag_tableau[count($tag_tableau)][1] = $id_ligne; // permet de garder l'historique des tabulations des tags parents
}
}
fputs($Current_acces, $footer_xml);
fclose($Current_acces);
?> |
Partager