<?php
// xml_to_html.php
// RJM Programming
// September, 2015
// Via http://www.w3schools.com/php/php_ref_simplexml.asp ... thanks

$inxml="";
$typeslist=",";
$attribslist=",";

function analyze($ixml) {
 global $typeslist, $attribslist;
 $nextbit='<div data-subtype="">';
 $eattribbit='$attribbit = ' . "'';";
 $attribbit="";
 $enonattribbit='$nonattribbit = ' . "'';";
 $nonattribbit="";
 $trythese=false;
 $firstone="";
 $firstset="";
 $typeslist=",";
 $attribslist=",";
 $xbits=explode("<?xml", $ixml);
 if (sizeof($xbits) > 1) {
   $prexbits=explode("?>", $xbits[1]);
   $ixml=str_replace("<?xml" . $prexbits[0] . "?>", "", $ixml);
 }
 $parts=explode("<", $ixml);
 for ($i=1; $i<sizeof($parts); $i++) {
   $presubparts=explode(" ", $parts[$i]);
   $subpart=explode(" ", str_replace(">", " ", $parts[$i]));
   if (strpos($typeslist, "," . $subpart[0] . ",") === false) {
     if ($trythese) {
       if (strpos($ixml, "<" . $subpart[0] . ">") !== false && strpos($ixml, "</" . $subpart[0] . ">") !== false) {
         $one=strpos($ixml, "<" . $subpart[0] . ">");
         $one++;
         $two=strpos($ixml, "</" . $subpart[0] . ">");
         $two--;
         if (strpos(substr($ixml, $one, ($two - $one)), "<") !== false) {
           $firstset .= "/" . $subpart[0];
           $nextbit=str_replace('">', $subpart[0] . '">', $nextbit);
         } else {
           $trythese=false;
         }
       } else if (strpos($ixml, "<" . $subpart[0] . " ") !== false && strpos($ixml, "</" . $subpart[0] . ">") !== false) {
         $one=strpos($ixml, "<" . $subpart[0] . " ");
         $one++;
         $two=strpos($ixml, "</" . $subpart[0] . ">");
         $two--;
         if (strpos(substr($ixml, $one, ($two - $one)), "<") !== false) {
           $firstset .= "/" . $subpart[0];
           $nextbit=str_replace('">', $subpart[0] . '">', $nextbit);
         } else {
           $trythese=false;
         }
       }
     }
     if ($firstone == "") {
       $firstone=$subpart[0];
       $firstset=$firstone;
       $trythese=true;
     } else if ($trythese == false && strpos($subpart[0], "/") === false) {
       //if (strpos($enonattribbit, $subpart[0]) === false) $enonattribbit=str_replace(" = ", " = ' data-" . $subpart[0] . '="' . "'" . ' . $concept->' . $subpart[0] . " . " . "'" . '"' . "'" . ' . ', $enonattribbit);
       if (strpos($enonattribbit, $subpart[0]) === false) $enonattribbit=str_replace(";", " . ' data-" . $subpart[0] . '="' . "'" . ' . $concept->' . $subpart[0] . " . " . "'" . '"' . "'" . ' . ' . "'';", $enonattribbit);
     }
     $typeslist .= $subpart[0] . ",";
   }
   $ok=true;
   for ($j=0; $j<sizeof($presubparts); $j++) {
     if ($ok) {
       if (strpos($presubparts[$j], "=") !== false) {
        $pep=explode("=", $presubparts[$j]);
        if (strpos($attribslist, "," . $subpart[0] . ":" . $pep[0] . ",") === false) {
          $attribslist .= $subpart[0] . ":" . $pep[0] . ",";
          if (strpos($attribbit, $pep[0]) === false) {
           if (strtolower($pep[0]) != "id" && strtolower($pep[0]) != "title" && strtolower($pep[0]) != "alt" && strtolower($pep[0]) != "style") {
            if (strpos($enonattribbit, $pep[0]) === false) $enonattribbit=str_replace(";", " . ' data-" . $pep[0] . '="' . "'" . ' . $concept[' . "'" . $pep[0] . "']" . " . " . "'" . '"' . "'" . ' . ' . "'';", $enonattribbit);
           } else {
          if ($attribbit == "") {
            $eattribbit='$attribbit = ' . "'>';";
            $attribbit=">";
          }
            $eattribbit=str_replace(" = ", " = '" . $pep[0] . '="' . "'" . ' . $concept[' . "'" . $pep[0] . "']" . " . " . "'" . '"' . "'" . ' . ', $eattribbit);
            if (strpos($nextbit, '"' . $subpart[0] . '"') !== false) $nextbit=str_replace('">', '" ', $nextbit);
           }
          }
        }
       }
       if (strpos($presubparts[$j], ">") !== false) {
        $ok=false;
       } 
     }
   }
 }
 file_put_contents($firstone . ".xml", str_replace("&lt;", "<", str_replace("&gt;", ">", $ixml)));
 $xml=simplexml_load_file($firstone . ".xml") or die("Error: Cannot create object");
 $outhtml='<DIV  id="' . $firstone . '1" data-type="' . $firstset . '"></DIV>';
 foreach($xml->children() as $concept) {
  //$outhtml=str_replace('</DIV>', ' ' . $firstset . ' <div data-subtype="note" id="' . $concept['id'] . '"> data-to="' . $concept->to . '" data-from="' . $concept->from . '" data-heading="' . $concept->heading . '" data-body="' . $concept->body . '"  </div></DIV>', $outhtml);
    eval($eattribbit);
    eval($enonattribbit);
    $outhtml=str_replace('</DIV>', ' ' . $firstset . ' ' . $nextbit . $attribbit . $nonattribbit . '  </div></DIV>', $outhtml);
 }
 $outhtml=str_replace("DIV", "div", $outhtml);
 return $outhtml;
}

function server_remote_addr() {
    $rma = $_SERVER['REMOTE_ADDR'];
    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    // you can add different browsers with the same way ..
    if(preg_match('/(chromium)[ \/]([\w.]+)/', $ua))
            $rma = '000000'.$rma;
    elseif(preg_match('/(chrome)[ \/]([\w.]+)/', $ua))
            $rma = '00000'.$rma;
    elseif(preg_match('/(safari)[ \/]([\w.]+)/', $ua))
            $rma = '0000'.$rma;
    elseif(preg_match('/(opera)[ \/]([\w.]+)/', $ua))
            $rma = '000'.$rma;
    elseif(preg_match('/(msie)[ \/]([\w.]+)/', $ua))
            $rma = '00'.$rma;
    elseif(preg_match('/(mozilla)[ \/]([\w.]+)/', $ua))
            $rma = '0'.$rma;
    return str_replace(":", "_", $rma);
}

if (isset($_GET['inxml']) && file_exists("xml_to_html.html")) {
  $inxml=urldecode($_GET['inxml']);
  if (strpos($_SERVER['HTTP_REFERER'], "xml_to_html.html") !== false && strpos($_SERVER['HTTP_REFERER'], "rjmprogramming.com.au") !== false) {
   header("Location: ./xml_to_html.html?inxml=" . $_GET['inxml']);
   exit;
  }
} else if (isset($_POST['inxml']) && file_exists("xml_to_html.html")) {
  $inxml=urldecode($_POST['inxml']);
  if (strpos($_SERVER['HTTP_REFERER'], "xml_to_html.html") !== false && strpos($_SERVER['HTTP_REFERER'], "rjmprogramming.com.au") !== false) {
  $pinxml=$_POST['inxml'];
  $xbits=explode("<?xml", $pinxml);
  if (sizeof($xbits) > 1) {
   $prexbits=explode("?>", $xbits[1]);
   $pinxml=str_replace("<?xml" . $prexbits[0] . "?>", "", $pinxml);
  }
  $okhtml=@file_get_contents("xml_to_html.html");
  $bits=explode('var preinxml="', $okhtml);
  if (sizeof($bits) > 1) {
    $subbits=explode('"', $bits[1]);
    $newhtml=str_replace($subbits[0], str_replace("\n", " ", str_replace("\r", " ", str_replace('"', '\"', str_replace("<","&lt;",str_replace(">","&gt;",urldecode($pinxml)))))), $okhtml);
    file_put_contents("xmltohtml" . server_remote_addr() . ".html", $newhtml);
    header("Location: xmltohtml" . server_remote_addr() . ".html");
    exit;
  } else {
    header("Location: ./xml_to_html.html?inxml=" . $_POST['inxml']);
    exit;
  }
  }
} else if (isset($_POST['inxml'])) {
  $inxml=urldecode($_POST['inxml']);
  if (1 == 2) {
  $pinxml=$_POST['inxml'];
  $xbits=explode("<?xml", $pinxml);
  if (sizeof($xbits) > 1) {
   $prexbits=explode("?>", $xbits[1]);
   $pinxml=str_replace("<?xml" . $prexbits[0] . "?>", "", $pinxml);
  }
  }
}

if ($inxml != "") {
$outhtml=analyze($inxml);
} else {
$inxml="&lt;messages&gt;  &lt;note id='501'&gt;    &lt;to&gt;Tove&lt;/to&gt;    &lt;from&gt;Jani&lt;/from&gt;    &lt;heading&gt;Reminder&lt;/heading&gt;    &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;  &lt;/note&gt;  &lt;note id='502'&gt;    &lt;to&gt;Jani&lt;/to&gt;    &lt;from&gt;Tove&lt;/from&gt;    &lt;heading&gt;Re: Reminder&lt;/heading&gt;    &lt;body&gt;I will not&lt;/body&gt;  &lt;/note&gt;&lt;/messages&gt;";
file_put_contents("messages.xml", str_replace("&lt;", "<", str_replace("&gt;", ">", $inxml)));
$xml=simplexml_load_file("messages.xml") or die("Error: Cannot create object");
$outhtml='<DIV id="messages1" data-type="messages/note"></DIV>';
foreach($xml->children() as $note) {
    $outhtml=str_replace('</DIV>', ' messages/note <div data-subtype="note" id="' . $note['id'] . '"> data-to="' . $note->to . '" data-from="' . $note->from . '" data-heading="' . $note->heading . '" data-body="' . $note->body . '"  </div></DIV>', $outhtml);
}
$outhtml=str_replace("DIV", "div", $outhtml);
}

$thehtml="<!doctype html>
<html>
<head>
<link href='//www.rjmprogramming.com.au/PHP/emboss_h1.css' rel='stylesheet' type='text/css'>
<title>XML to HTML - PHP via simplexml - RJM Programming - September, 2015 - via http://www.w3schools.com/xml/xml_attributes.asp</title>
</head>
<body style='background-color:teal;'>
<h1 align='center'>XML to HTML - PHP via simplexml - RJM Programming - September, 2015</h1>
<div align='center'><table><tr><th>XML</th><th> <a target=_blank title='Where the XML on left came from ... http://www.w3schools.com/xml/xml_attributes.asp ... thanks' href='http://www.w3schools.com/xml/xml_attributes.asp'>----</a>&gt; Display <a target=_blank title='PHP simplexml functionality information from w3schools' href='http://www.w3schools.com/php/php_ref_simplexml.asp'>----</a>&gt; </th><th>HTML<font size=0>5</font></th></tr><tr><td><textarea style='background-color:silver;' rows=10 cols=80>" . str_replace("&lt;", "<", str_replace("&gt;", ">", $inxml)) . "</textarea></td><td> ----&gt; " . $outhtml . " ----&gt; </td><td><textarea style='background-color:lightblue;' rows=10 cols=80>" . str_replace("<","&lt;", str_replace(">","&gt;", $outhtml)) . "</textarea></td></tr></table></div>" . "
<br><br><br><br><br><form method='POST' action='./xml_to_html.php' id='myform'><input type='submit' value='Translate XML to HTML' style='valign:top;'><br><textarea cols='120' rows='50' name='inxml'></textarea></form>
</body>
</html>
";

echo $thehtml;
?> 