<?php
class Transform {
static $proc;
static $xsl;
static $xml;
public static $done;
public static $message;
static function xsl($src, $xsl, $destFile, $params=array(), $deps=array(), $force=false) {
self::
$message=null;
self::
$done=false;
if ($destFile) {
if(!is_dir(dirname($destFile))) mkdir(dirname($destFile), 0775
, true);
if(is_writable($destFile)); else if (!is_writable(dirname($destFile))) return touch($destFile); }
$lockFile=$destFile.".lock"
;
if (!is_writable($destFile) &&
file_exists($lockFile) &&
is_writable($lockFile)) unlink($lockFile); if (file_exists($lockFile)) {
date_default_timezone_set("Europe/Paris"
);
print "\n<!-- $lockFile, transformation started ".date ("Y-m-d H:i:sP"
, filemtime($lockFile)) . " -->"
;
return;
}
if ($destFile &&
file_exists($destFile)) $destMtime=filemtime($destFile);
else $destMtime=0
;
if (file_exists($src)) $deps[]=$src;
if (!count($deps)) $force=true;
else {
if (is_file($xsl)) $deps[]=$xsl;
foreach($deps as $file) {
if ($destMtime < filemtime($file)) {
$force=true;
break;
}
}
if (!$force) return $destFile;
}
self::
$done=true;
if (file_exists($src)) self::
$xml->
load($src, LIBXML_NOERROR
| LIBXML_NOWARNING
);
else self::
$xml->
loadXML($src);
if (strpos($xsl, "\n"
) !==
false) self::
$xsl->
loadXML($xsl);
else self::
$xsl->
load($xsl);
if(class_exists("Diple"
)) {
foreach(self::
$xsl->
getElementsByTagName ("import"
) as $node) {
$node->
setAttribute('href'
, preg_replace('@^(../)*diple/@'
, strtr(Diple::
$dipleDir, array('\\'
=>"/"
)), $node->
getAttribute('href'
)));
}
}
self::
$proc->
importStyleSheet(self::
$xsl);
if(isset($params) &&
count($params)) foreach ($params as $key => $value) self::
$proc->
setParameter(''
, $key, $value);
$result=$destFile;
$oldError=set_error_handler(array(__CLASS__
,"xsl_message"
), E_WARNING
);
if (!$destFile) $result = self::
$proc->
transformToXML(self::
$xml);
else {
@touch($lockFile);
@chmod($lockFile, 0666
);
self::
$proc->
transformToUri(self::
$xml, $destFile);
chmod($destFile, 0664
); if (file_exists($lockFile)) unlink($lockFile);
}
if (self::
$message) print"\n-->"
;
restore_error_handler();
return $result;
}
static function xsl_message( $errno, $errstr, $errfile, $errline, $errcontext) {
if (!self::
$message) print "\n<!--"
;
self::
$message=preg_replace("/XSLTProcessor::transformToUri[^:]*:/"
, ""
, $errstr);
print "\n"
.self::
$message;
}
}
Transform::
$proc=new XSLTProcessor();
if (version_compare(PHP_VERSION
,'5.4'
,"<"
)) $oldval = ini_set("xsl.security_prefs"
,0
);
else $oldval = Transform::
$proc->
setSecurityPreferences(0
);
Transform::
$proc->
registerPHPFunctions();
Transform::
$xsl=new DOMDocument();
Transform::
$xml=new DOMDocument();
?>