PHP Classes
elePHPant
Icontem

File: lib/Process.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of David N. Q. Duong  >  XIRE  >  lib/Process.class.php  >  Download  
File: lib/Process.class.php
Role: Class source
Content type: text/plain
Description: Process Class
Class: XIRE
Template engine extensible with plug-in classes
Author: By
Last change:
Date: 8 years ago
Size: 4,189 bytes
 

Contents

Class file image Download
<?php
/* --------------------------------------------------------------------------
 * XIRE - eXtendable Information Rendering Engine
 * --------------------------------------------------------------------------
 * LICENSE
 * Copyright (C) 2006 David Duong
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 * -------------------------------------------------------------------------- */
require_once 'PluginManager.class.php';

/**
 * A process that performs a breadth first traversal processing any XIRL nodes found. There
 * can be multiple processes created by one template. Should only be created by
 * {@see XIRE_Template::createProcess}.
 */
class XIRE_Process {
    private
$id;
    private
$template;
    private
$queue;
    private static
$pluginManager;
    private static
$lastId = 0;

    public function
__construct (XIRE_Template $template) {
        isset(
self::$pluginManager) or self::$pluginManager = new XIRE_PluginManager;
       
$this->id = self::$lastId++; // Generate process id
       
$this->template = $template;
       
$this->queue = array(); // Initiate queue
   
}

    public function
__get ($name) {
        if (
$name === 'template') {
            return
$this->template;
        }
    }

   
/**
     * Adds a node to the processor's queue
     * @throws DOM_WRONG_DOCUMENT_ERR if the given node does not belong to the template's
     * document
     */
   
public function enqueue (DOMNode $node) {
        if (
$node->ownerDocument !== $this->template->document) {
            throw new
DOM_WRONG_DOCUMENT_ERR;
        }
       
$this->queue[] = $node;
    }

   
/**
     * Performs breadth-first traversal on DOM and search for translatable elements, ie.
     * those with the xire namespace, and calls the plugin that corresponds with the node's
     * local name, ie. the name without the prefix. This will let the plugin deal with the
     * child nodes so they will not be processed. Note: attributes are also considered
     * nodes.
     *
     * This does not check for loops (which should not exist).
     */
   
public function process () {
        while (!empty(
$this->queue)) {
           
$node = array_shift($this->queue);
            if (
$node->parentNode !== null) {
                if (
$node->namespaceURI === XIRL_NAMESPACE) {
                   
self::$pluginManager->call($node, $this);
                } else {
                    if (
$node->childNodes instanceof DOMNodelist) {
                        foreach (
$node->childNodes as $child) {
                           
$this->queue[] = $child;
                        }
                    }
                    if (
$node->attributes instanceof DOMNodelist) {
                        foreach (
$node->attributes as $child) {
                           
$this->queue[] = $child;
                        }
                    }
                }
            }
        }
    }
}
/**
 * An exception that occured during the processing of the template
 */
class XIRE_ProcessingNodeException extends XIRE_Exception {
    private
$node;

    public function
__construct($message = 'Node processing exception', DOMNode $node = null, $code = 0) {
       
$this->node = $node;
       
parent::__construct($message, $code);
    }

   
/**
     * @return the node that caused the processing error
     */
   
public function getNode () {
        return
$this->node;
    }
}

?>