_context = array();
}
function get($key) {
if(isset($this->_context[$key]))
return $this->_context[$key];
else
return false;
}
function set($key, $val) {
$this->_context[$key] = $val;
}
}
abstract class FO_Object {
var $_children;
var $_container;
var $_context;
var $_localContext;
var $_pdf;
var $_parent;
const NODE_TYPE_ELEMENT = 1;
const NODE_TYPE_TEXT = 3;
function __construct(FO_Container $container, FPDF $pdf,
FO_Context $context) {
//echo "New:$this:$context
";
$this->_container = $container;
$this->_pdf = $pdf;
$this->_context = $context;
$this->_localContext = new FO_Context();
}
/**
* Check unit of value and scale to internal value, if needed
* Internal values are stored in mm
**/
function calcInternalValue($value, $to = "mm", $from="mm") {
sscanf($value, "%f%s", $value, $unit);
if (!$unit) {
$unit = $from;
}
//calculate to default value in mm
switch ($to) {
case "mm":
switch ($unit) {
case "mm":
return $value;
case "cm":
return $value*10;
case "in":
return $value/25.4;
case "pt":
return $value*25.4/72;
default:
$this->NotYetSupported("Unit:$unit");
}
break;
case "cm":
switch ($unit) {
case "mm":
return $value/10;
case "cm":
return $value;
case "in":
return $value/2.54;
case "pt":
return $value*2.54/72;
default:
$this->NotYetSupported("Unit:$unit");
}
break;
case "in":
switch ($unit) {
case "mm":
return $value*25.4;
case "cm":
return $value*2.54;
case "in":
return $value;
case "pt":
return $value*72;
default:
$this->NotYetSupported("Unit:$unit");
}
break;
case "pt":
switch ($unit) {
case "mm":
return $value*72/25.4;
case "cm":
return $value*72/2.54;
case "in":
return $value/72;
case "pt":
return $value;
default:
$this->NotYetSupported("Unit:$unit");
}
break;
default:
$this->NotYetSupported("Default Unit:$default");
}
}
function addReference($category, $name) {
if ($category && $name) {
$this->_container->addReference($category, $name, $this);
}
}
function resolveReference($category, $name) {
return $this->_container->resolveReference($category, $name);
}
function setParent($parent) {
$this->_parent = $parent;
}
function handleEvent($event) {
if ($event == "sync-position") {
$pdf = $this->getPdf();
$this->setContext("y", $pdf->GetY());
$this->setContext("x", $pdf->GetX());
}
if ($this->_parent) {
$this->_parent->handleEvent($event);
}
}
/**
* Get from current context informations
*/
function getContext($key) {
$val = $this->_localContext->get($key);
if (!$val) {
$val = $this->_context->get($key);
}
return $val;
}
/**
* Set a context information for child nodes and current node as well
*/
function setContext($key, $value) {
$this->_context->set($key, $value);
}
function setLocalContext($key, $value) {
$this->_localContext->set($key, $value);
}
function getAttribute(DOMNode $node, $key) {
if($node->attributes->getNamedItem($key)!=null)
return $node->attributes->getNamedItem($key)->nodeValue;
else
return false;
}
function getSizeAttribute(DOMNode $node, $key, $to="mm", $from="mm") {
if($node->attributes->getNamedItem($key)!=null)
$val = $node->attributes->getNamedItem($key)->nodeValue;
else
$val=false;
return $this->calcInternalValue($val, $to, $from);
}
function initSizeAttribute(DOMNode $node, $key, $to="mm", $from="mm") {
$val = $this->getSizeAttribute($node, $key, $to, $from);
if ($val) {
$this->setContext($key, $val);
}
}
function initAttribute(DOMNode $node, $key) {
$val = $this->getAttribute($node, $key);
if ($val) {
$this->setContext($key, $val);
}
}
function initLocalSizeAttribute(DOMNode $node, $key, $to="mm", $from="mm"){
$val = $this->getSizeAttribute($node, $key, $to, $from);
if ($val) {
$this->_localContext->set($key, $val);
}
}
function initLocalAttribute(DOMNode $node, $key) {
$val = $this->getAttribute($node, $key);
if ($val) {
$this->_localContext->set($key, $val);
}
}
function processChildNodes(DOMNode $node, $filter) {
foreach($node->childNodes as $child) {
$this->processChildNode($child, $filter);
}
}
function processChildNode(DOMNode $node, $filter) {
$subcontext = clone $this->_context;
$next =
FO_Factory::createFOObject($node, $this->_container,
$this->_pdf, $subcontext, $filter);
if ($next != null) {
$next->setParent($this);
$this->initFOObject($next);
$this->_children[$node->nodeName] = $next;
$this->preParse($next);
$next->parse($node);
$this->postParse($next);
}
}
function initFOObject(FO_Object $obj) {
}
function preParse(FO_Object $obj) {
}
function postParse(FO_Object $obj) {
}
function processContents(DOMNode $node) {
foreach($node->childNodes as $child) {
if ($child->nodeType == self::NODE_TYPE_TEXT) {
$this->processContent($child->textContent);
}
}
}
function processContent($content) {
//do nothing per default
}
function getPdf() {
return $this->_pdf;
}
function NotYetSupported($msg=0) {
echo "Not Yet Supported[".get_class($this)."]:$msg
";
}
function children() {
return $this->_children;
}
/**
* Parse the color from either xml attribute value or FPDF
* internal representation
**/
function parseColor($color) {
if (sscanf($color, "#%2x%2x%2x", $r, $g, $b) == 3) {
//parse RGB color
$r = sprintf("%d", $r);
$g = sprintf("%d", $g);
$b = sprintf("%d", $b);
}
else if(sscanf($color, "rgb(%d,%d,%d)", $r, $g, $b) == 3) {
}
else if (sscanf($color, "%f %f %f RG", $r, $g, $b) == 3) {
}
else if (sscanf($color, "%f G", $g) == 1) {
}
else {
//get color from word
switch ($color) {
case "white":
$r=255; $g=255; $b=255;
break;
case "red":
$r=255; $g=0; $b=0;
break;
case "green":
$r=0; $g=255; $b=0;
break;
case "blue":
$r=0; $g=0; $b=255;
break;
case "yellow":
$r=255; $g=255; $b=0;
break;
case "magenta":
$r=0; $g=255; $b=255;
break;
case "cyan":
$r=255; $g=0; $b=255;
break;
case "black":
default:
$r=0; $g=0; $b=0;
break;
}
}
return array($r, $g, $b);
}
function parse(DOMNode $node)
{
}
}
/**
*
*
*
*/
class FO_Root extends FO_Object{
function __construct(FPDF $pdf) {
$container = new FO_Context();
parent::__construct(new FO_Container(), $pdf, $container);
$this->setContext("acceptPageBreak", true);
}
static $CHILDNODES = array (
'FO_LayoutMasterSet',
'FO_PageSequence'
);
function parse(DOMNode $node) {
//no attrbutes which concerns us
$_children[$node->nodeName] =
$this->processChildNodes($node, self::$CHILDNODES);
}
function setContext($key, $value) {
parent::setContext($key, $value);
}
}
?>