view index.php @ 19:ee2c31392ea3

Merge Regression, fast cache-checking has been removed.
author Tom Fredrik "BFG" Klaussen <bfg@blenning.no>
date Wed, 19 Sep 2012 15:50:18 +0200
parents a64e8f968e7e a20bb1b51aad
children ac24b41a12ad
line wrap: on
line source

<?php
define(DEBUG,0);
define(MAX_RECURSE,50);
define(CACHING,0);

/*
var_dump($_SERVER);
exit;
*/

function include_with_mtime($file) {
  global $newest;
  $mtime = filemtime($file);
  if ($mtime > $newest) {
    $newest = $mtime;
  }
  include $file;
}

if (DEBUG) {
  error_reporting(E_ALL);
  ini_set("display_errors", 1);
}

$SCRIPT_FILENAME=$_SERVER['SCRIPT_FILENAME'];
$newest = filemtime($SCRIPT_FILENAME);
$cachable = true;

<<<<<<< local
include_with_mtime('php/cache_check.inc');
include_with_mtime('php/accept-language.inc');
include_with_mtime('php/filters.inc');
include_with_mtime('php/common-functions.inc');
=======
if(CACHING) {
include 'php/cache_check.inc';
}
include 'php/accept-language.inc';
include 'php/filters.inc';
include 'php/common-functions.inc';
>>>>>>> other

$URL_PARAMS=array('name', 'lang');

#Globals
$name = $_GET['name'];
$lang = $_GET['lang'];

if(!$name) {
  $name="home";
}

if(!$lang) {
  $lang="no";
  $langs=acceptedLanguages();
  if ($langs) {
    foreach ($langs as $l => $val) {
      if (file_exists($l)) {
        $lang=$l;
        break;
      }
    }
  }
}

<<<<<<< local
$title="Dummy title";

$config=loadFile("${lang}/${name}.xml");

$confFile="${lang}/${name}.xml";
if (!file_exists($confFile)) {
   errorPage("Resource not available");
}
$doc = new DOMDocument();
$doc->load($confFile);
  
$includes=$doc->getElementsByTagName("include");
$recurse=0;

while($includes->length > 0) {
  if(++$recurse > MAX_RECURSE) {
    errorPage('Recursion limit exceeded', 500);
  }
  foreach ($includes as $include) {
	$src=$include->getAttribute("src");
	$subdoc = new DOMDocument();
	$fname = "${lang}/${src}";
	$subdoc->load($fname);
	$mtime = filemtime($fname);
	if ($mtime > $newest) {
	  $newest = $mtime;
	}
	$parent=$include->parentNode;
	$xml=getElementByTagName($subdoc,"xml");
	foreach($xml->childNodes as $child) {
		$text=$subdoc->saveXml($child);
		$clonedChild=$doc->importNode($child,true);
		$parent->insertBefore($clonedChild,$include);
	}
	$parent->removeChild($include);	
  }
  $includes=$doc->getElementsByTagName("include");
}

$head=getElementByTagName($doc,"head");
$title=$head->getAttribute("title");

$css=getElementByTagName($head,"css");
$css=$doc->saveXML($css);
$css=preg_replace('/\s*<\/?\s*css\s*>\s*/s', '', $css);

$body=getElementByTagName($doc,"body");
$files=$body->getElementsByTagName("file");


$out= '<?xml version="1.0" encoding="UTF-8"?>';

$out.= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
                      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>';

$out.= "$title";
$out.= '
	</title>
';
$out.= "$css";
$out.= '
    </head>
    <body>
      <div id="container">
';

=======
>>>>>>> other
function getParam($param) {
  $param_type=$param->getAttribute("type");
  $param_value;
  if (!$param_type)
    $param_type="scalar";

  if($param_type == "scalar") {
    $param_subst=$param->getAttribute("subst");
    $param_value=$param->getAttribute("value");
    if ($param_subst) {
      /*
      $param_value=preg_replace("/name/", $name, $param_subst);
      $param_value=preg_replace('/lang/', $lang, $param_value);
      */
    }
  }
  elseif($param_type == "array") {
	  $params=$param->getElementsByTagName("param");
	  $param_value=array();
	  foreach ($param->childNodes as $param) {
	    if ($param->nodeType == XML_ELEMENT_NODE)
	    {
	      array_push($param_value, getParam($param));            
	    }
	  }
  }
  return $param_value;
}

function getInput($master, $param) {
  $out='';

  $lang=$GLOBALS['lang'];
  $name=$param->getAttribute("id");
  $conf=$_GET[$name];
  $GLOBALS[$name]=$conf;
  if (!$conf)
    $conf=$param->getAttribute("default");
  $config=loadFile("${lang}/${conf}.xml");

  $confFile="${lang}/${conf}.xml";
  if (!file_exists($confFile)) {
     errorPage("Resource not available");
  }
  $doc = new DOMDocument();
  $doc->load($confFile);
  
  $includes=$doc->getElementsByTagName("include");
  $recurse=0;

  while($includes->length>0) {
    if(++$recurse>MAX_RECURSE) {
      errorPage('Recursion limit exceeded', 500);
    }
    foreach ($includes as $include) {
	$src=$include->getAttribute("src");
	$subdoc = new DOMDocument();
	$subdoc->load("${lang}/${src}");
	$parent=$include->parentNode;
	$xml=getElementByTagName($subdoc,"xml");
	foreach($xml->childNodes as $child) {
		$text=$subdoc->saveXml($child);
		$clonedChild=$doc->importNode($child,true);
		$parent->insertBefore($clonedChild,$include);
	}
	$parent->removeChild($include);	
    }
    $includes=$doc->getElementsByTagName("include");
  }

  $head=getElementByTagName($doc,"head");
  $title=$head->getAttribute("title");

  if($title) {
    $values=$master->getElementsByTagName("param");
    foreach ($values as $value) {
      if ($value->getAttribute("type")=="input_config") {
        if ($value->getAttribute("id")=="title") {
          $tmp = new DOMDocument();
          $tmp->loadXml("<xml>${title}</xml>");
	  $parent=$value->parentNode;
	  $parent->removeChild($value);
	  $parent->appendChild(new DOMText($tmp->textContent));
        }
      }
    }
  }

  $css=getElementByTagName($head,"css");
  $css=$doc->saveXML($css);
  $css=preg_replace('/\s*<\/?\s*css\s*>\s*/s', '', $css);

  if($css) {
    $values=$master->getElementsByTagName("param");
    foreach ($values as $value) {
      if ($value->getAttribute("type")=="input_config") {
        if ($value->getAttribute("id")=="css") {
          $tmp = new DOMDocument();
          $tmp->loadXml("<xml>${css}</xml>");
	  $parent=$value->parentNode;
	  foreach($tmp->firstChild->childNodes as $node) {
		$clonedChild=$master->importNode($node,true);
		$parent->insertBefore($clonedChild,$value);
          }
	  $parent->removeChild($value);
        }
      }
    }
  }


  $body=getElementByTagName($doc,"body");
  $files=$body->getElementsByTagName("file");

foreach ($files as $file) {
  if ($file->getAttribute("script")) {
    $cachable = false;
    break;
  }
  else {
    $src = $file->getAttribute("src");
    $fname = "${lang}/${src}";
    if (!file_exists($fname)) {
      errorPage("Resource not found '${fname}'");
    }
    cache_time($fname);
  }
}

if ($cachable)
  cache_check($newest);

foreach ($files as $file) {
	$script = $file->getAttribute("script");
	if ($script) {
	  $src = "";
	  $cwd = getcwd();

	  $matches=array();
	  preg_match('/(.*\/)/', $script, $matches);
	  $dirname=$matches[0];
	  preg_match('/([^\/]*)$/', $script, $matches);
	  $filename=$matches[0];
	  chdir("${lang}/${dirname}");
	  $pipe=popen("php ${filename}","r");
	  $file_content = stream_get_contents($pipe);
	  chdir("${cwd}");
	}
	else {
	  $src = $file->getAttribute("src");
	  $fname = "${lang}/${src}";
	  $file_content = loadFile($fname);
	}
	if(floatval($file_content) < 0) {
	  errorPage("Resource not found '${lang}/${src}'");
	}

	$filters=$file->getElementsByTagName("filter");
	foreach($filters as $filter) {
	  $func=$filter->getAttribute("function");
	  $params=$filter->getElementsByTagName("param");
	  $callString="\$file_content=${func}(\$file_content";
	  $param_values=array();
	  $i=0;
	  foreach ($filter->childNodes as $param) {
	    if ($param->nodeType == XML_ELEMENT_NODE)
	    {
	      $param_value[$i]=getParam($param);
	      $callString.=",\$param_value[$i]";
	      $i++;
	    }
	  }
	  $callString.=");";
	  eval($callString);
        }
        $out.= $file_content;
}

<<<<<<< local


$out.='
      </div>
    </body>
</html>
';
=======
  $doc = new DOMDocument();
  $doc->loadXml("<xml>${out}</xml>");
>>>>>>> other

  return $doc;
}

$master = new DOMDocument();
$master->load("master.xml");

$params=$master->getElementsByTagName("param");
foreach ($params as $param) {
  if ($param->getAttribute("type") == "input") {
    $doc=getInput($master,$param);

    $parent=$param->parentNode;
    foreach ($doc->firstChild->childNodes as $child) {
      $clonedChild=$master->importNode($child,true);
      $parent->insertBefore($clonedChild,$param);
    }
    $parent->removeChild($param);	

  }
}

print $master->saveXml($master);

?>