|  | @@ -1,651 +1,66 @@
 | 
	
		
			
				|  |  |  <?php
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * Wrapper around php tidy class.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param string $html
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @return void
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -function applyTidy (&$html) {
 | 
	
		
			
				|  |  | -  $config = array(
 | 
	
		
			
				|  |  | -      'indent'          => TRUE,
 | 
	
		
			
				|  |  | -      'output-xhtml'    => TRUE,
 | 
	
		
			
				|  |  | -      'sort-attributes' => 'alpha',
 | 
	
		
			
				|  |  | -      'wrap'            => 200,
 | 
	
		
			
				|  |  | -  );
 | 
	
		
			
				|  |  | -  $tidy = new tidy();
 | 
	
		
			
				|  |  | -  $tidy->parseString($html, $config, 'utf8');
 | 
	
		
			
				|  |  | -  $tidy->cleanRepair();
 | 
	
		
			
				|  |  | -  $html = (string) $tidy;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class Context {
 | 
	
		
			
				|  |  | -  protected $logLevelClasses = NULL;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Base URL for the script.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var string
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $base;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Graphics context
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var GraphicsContext
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $gc = NULL;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Logging level, as per RFC5424
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @link http://php.net/network.constants.php
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var integer
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $logLevel = NULL;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Messages for display.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $messages = array();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Requested path: <$PHP_SELF>?q=a/b/c
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var string
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $path = NULL;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Tidy the output ?
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var boolean
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $tidy = NULL;
 | 
	
		
			
				|  |  | +namespace Memcache_UI {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /**
 | 
	
		
			
				|  |  | -   * User information: logged or not ?
 | 
	
		
			
				|  |  | +   * Wrapper around php tidy class.
 | 
	
		
			
				|  |  |     *
 | 
	
		
			
				|  |  | -   * @var boolean
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $user = FALSE;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  function __construct() {
 | 
	
		
			
				|  |  | -    $this->getTidy(); // Needed to check extension
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  function __destruct() {
 | 
	
		
			
				|  |  | -    if (!empty($this->messages)) {
 | 
	
		
			
				|  |  | -      $ret = (string) new Element('pre', array('class' => array('messages')),
 | 
	
		
			
				|  |  | -        implode("\n", $this->getMessage(TRUE)));
 | 
	
		
			
				|  |  | -      echo $ret;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  function __toString() {
 | 
	
		
			
				|  |  | -    $ret = '<pre>' . print_r($this, TRUE) . '</pre>';
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Get the base path where the script is located.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * This is helpful to locate other files using paths relative to the install.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public function getBase() {
 | 
	
		
			
				|  |  | -    if (!isset($this->base)) {
 | 
	
		
			
				|  |  | -      $this->base = dirname($_SERVER['SCRIPT_NAME']);
 | 
	
		
			
				|  |  | -      if ($this->base == '/') {
 | 
	
		
			
				|  |  | -        $this->base = '';
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $this->base;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getLogLevel() {
 | 
	
		
			
				|  |  | -    if (!isset($this->logLevel)) {
 | 
	
		
			
				|  |  | -      $usLogLevel = NULL;
 | 
	
		
			
				|  |  | -      foreach ($_GET as $key => $value) {
 | 
	
		
			
				|  |  | -        if (strtolower($key) === 'loglevel') {
 | 
	
		
			
				|  |  | -          $usLogLevel = (int) $value;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      if (!isset($usLogLevel)) {
 | 
	
		
			
				|  |  | -        $usLogLevel = LOG_NOTICE;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      if ($usLogLevel < LOG_EMERG) {
 | 
	
		
			
				|  |  | -        $this->logLevel = LOG_EMERG;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      elseif ($usLogLevel > LOG_DEBUG) {
 | 
	
		
			
				|  |  | -        $this->logLevel = LOG_DEBUG;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      else {
 | 
	
		
			
				|  |  | -        $this->logLevel = $usLogLevel; // We now know it to be safe
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $this->logLevel;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getLogLevelClass($logLevel) {
 | 
	
		
			
				|  |  | -    if (!isset($this->logLevelClasses)) {
 | 
	
		
			
				|  |  | -      $this->logLevelClasses = array(
 | 
	
		
			
				|  |  | -        LOG_EMERG   => 'error',
 | 
	
		
			
				|  |  | -        LOG_ALERT   => 'error',
 | 
	
		
			
				|  |  | -        LOG_CRIT    => 'error',
 | 
	
		
			
				|  |  | -        LOG_ERR     => 'error',
 | 
	
		
			
				|  |  | -        LOG_WARNING => 'warning',
 | 
	
		
			
				|  |  | -        LOG_NOTICE  => 'warning',
 | 
	
		
			
				|  |  | -        LOG_INFO    => 'status',
 | 
	
		
			
				|  |  | -        LOG_DEBUG   => 'status',
 | 
	
		
			
				|  |  | -      );
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if ($logLevel < LOG_EMERG) {
 | 
	
		
			
				|  |  | -      $logLevel = LOG_EMERG;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    elseif ($logLevel > LOG_DEBUG) {
 | 
	
		
			
				|  |  | -      $logLevel = LOG_DEBUG;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return $this->logLevelClasses[$logLevel];
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getMessage($clear = FALSE) {
 | 
	
		
			
				|  |  | -    $ret = $this->messages;
 | 
	
		
			
				|  |  | -    if ($clear) {
 | 
	
		
			
				|  |  | -      $this->messages = array();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Return the requested path.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @param string $path
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public function getPath() {
 | 
	
		
			
				|  |  | -    if (!isset($this->path)) {
 | 
	
		
			
				|  |  | -      $this->path = empty($_GET['q']) ? '' : $_GET['q'];
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $this->path;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Return the "tidy" status.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * Will only be TRUE if requested (possibly by default) and extension is
 | 
	
		
			
				|  |  | -   * loaded. A warning will be generated if tidy is requested but extension is
 | 
	
		
			
				|  |  | -   * not loaded.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public function getTidy() {
 | 
	
		
			
				|  |  | -    static $notified = FALSE;
 | 
	
		
			
				|  |  | -    if (!isset($this->tidy)) {
 | 
	
		
			
				|  |  | -      $this->tidy = TRUE;
 | 
	
		
			
				|  |  | -      foreach ($_GET as $key => $value) {
 | 
	
		
			
				|  |  | -        if (strtolower($key) === 'tidy') {
 | 
	
		
			
				|  |  | -          $this->tidy = !!$value;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      if (!$notified && $this->tidy && !extension_loaded('tidy')) {
 | 
	
		
			
				|  |  | -        $this->setMessage(strtr('Extension @tidy requested but missing: skipping', array(
 | 
	
		
			
				|  |  | -          '@tidy' => 'tidy',
 | 
	
		
			
				|  |  | -        )), LOG_WARNING);
 | 
	
		
			
				|  |  | -        $notified = TRUE;
 | 
	
		
			
				|  |  | -        $this->tidy = FALSE;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $this->tidy;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Add a message to the messages list if it is above the current logging level.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @param string $text
 | 
	
		
			
				|  |  | -   * @param integer $logLevel
 | 
	
		
			
				|  |  | +   * @param string $html
 | 
	
		
			
				|  |  |     *
 | 
	
		
			
				|  |  |     * @return void
 | 
	
		
			
				|  |  |     */
 | 
	
		
			
				|  |  | -  public function setMessage($text, $logLevel = LOG_NOTICE) {
 | 
	
		
			
				|  |  | -    if ($logLevel <= $this->getlogLevel()) {
 | 
	
		
			
				|  |  | -      if (is_array($text) || (is_object($text) && !method_exists($text, '__toString'))) {
 | 
	
		
			
				|  |  | -        $this->messages[] = array('<pre>' . print_r($text, TRUE) . '</pre>', $logLevel);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      else {
 | 
	
		
			
				|  |  | -        $this->messages[] = array((string) $text, $logLevel);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * A wrapper for XML elements.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -class Element {
 | 
	
		
			
				|  |  | -  public $attributes = array();
 | 
	
		
			
				|  |  | -  public $name = NULL;
 | 
	
		
			
				|  |  | -  public $new_line; // Add a new line after element
 | 
	
		
			
				|  |  | -  public $value = NULL;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function __construct($name, $attr = NULL, $value = NULL) {
 | 
	
		
			
				|  |  | -    $this->name = $name;
 | 
	
		
			
				|  |  | -    $this->attributes = $attr;
 | 
	
		
			
				|  |  | -    $this->value = $value;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @link drupal7/includes/common.inc#check_plain()
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public static function check_plain($text) {
 | 
	
		
			
				|  |  | -    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @link drupal7/includes/common.inc#drupal_attributes()
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public static function getSerializedAttributes(array $attributes = array()) {
 | 
	
		
			
				|  |  | -    foreach ($attributes as $attribute => &$data) {
 | 
	
		
			
				|  |  | -      $data = implode(' ', (array) $data);
 | 
	
		
			
				|  |  | -      $data = $attribute . '="' . self::check_plain($data) . '"';
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  return $attributes ? ' ' . implode(' ', $attributes) : '';
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function __toString() {
 | 
	
		
			
				|  |  | -    $ret = '<'. $this->name;
 | 
	
		
			
				|  |  | -    if (!empty($this->attributes) && is_array($this->attributes)) {
 | 
	
		
			
				|  |  | -      $ret .= self::getSerializedAttributes($this->attributes);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (empty($this->value)) {
 | 
	
		
			
				|  |  | -      $ret .= ' />';
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    else {
 | 
	
		
			
				|  |  | -      $ret .= '>';
 | 
	
		
			
				|  |  | -      if ($this->value instanceof Element) {
 | 
	
		
			
				|  |  | -        $ret .= (string) $this->value; // force __toString()
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      elseif (is_array($this->value)) {
 | 
	
		
			
				|  |  | -        $ret .= implode("\n", $this->value);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      else {
 | 
	
		
			
				|  |  | -        $ret .= $this->value;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      $ret .= "</$this->name>";
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class GraphicsContext {
 | 
	
		
			
				|  |  | -  protected $palette = array();
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -abstract class Page extends Element {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * The HTML body element of the page.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $body;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * The MIME content type with charset
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var string
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $contentType = 'text/html; charset=utf8';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @var Context
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $context;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * The HTML head element of the page.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $head;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * The array of HTTP headers
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $headers = array();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $finalized = array();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @var array
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected $styles;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Page constructor.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @param Context $context
 | 
	
		
			
				|  |  | -   * @param array $item
 | 
	
		
			
				|  |  | -   *   A router info array.
 | 
	
		
			
				|  |  | -   *
 | 
	
		
			
				|  |  | -   * @see Router::getInfo()
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  public function __construct(Context $context, array $item) {
 | 
	
		
			
				|  |  | -    parent::__construct('html');
 | 
	
		
			
				|  |  | -    $context->setMessage($item, LOG_DEBUG);
 | 
	
		
			
				|  |  | -    $this->context = $context;
 | 
	
		
			
				|  |  | -    $this->initializeHead();
 | 
	
		
			
				|  |  | -    $this->initializeBody();
 | 
	
		
			
				|  |  | -    // Will fail if not reimplemented as a concrete method in a child class
 | 
	
		
			
				|  |  | -    $this->build();
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function __toString() {
 | 
	
		
			
				|  |  | -    $this->finalizeHeader();
 | 
	
		
			
				|  |  | -    $html = new Element('html', NULL, $this->getHead() . $this->getBody());
 | 
	
		
			
				|  |  | -    return (string) $html;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public abstract function build();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function emitHeaders() {
 | 
	
		
			
				|  |  | -    $this->finalizeHeader();
 | 
	
		
			
				|  |  | -    foreach ($this->headers as $name => $value) {
 | 
	
		
			
				|  |  | -      header("$name: $value");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function finalizeBody() {
 | 
	
		
			
				|  |  | -    if (isset($this->finalized['body'])) {
 | 
	
		
			
				|  |  | -      throw new Exception('Attempt to finalize already finalized body');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if ($message = $this->context->getMessage(TRUE)) {
 | 
	
		
			
				|  |  | -      $items = array();
 | 
	
		
			
				|  |  | -      foreach ($message as $row) {
 | 
	
		
			
				|  |  | -        $items[] = new Element('li', array(
 | 
	
		
			
				|  |  | -          'class' => array($this->context->getLogLevelClass($row[1])),
 | 
	
		
			
				|  |  | -        ), $row[0]);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      $this->setBody(new Element('div', array('class' => array('messages')), $items), 'messages');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    foreach ($this->getRegions() as $region) {
 | 
	
		
			
				|  |  | -      $this->body[$region] = implode('', $this->body[$region]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    $this->finalized['body'] = TRUE;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function finalizeHead() {
 | 
	
		
			
				|  |  | -    if (isset($this->finalized['head'])) {
 | 
	
		
			
				|  |  | -      throw new Exception('Attempt to finalize already finalized head');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    $cssLink = new Element('link', array(
 | 
	
		
			
				|  |  | -      'rel' => 'stylesheet',
 | 
	
		
			
				|  |  | -      'type' => 'text/css',
 | 
	
		
			
				|  |  | -      'href' => $this->context->getBase() .'/memcache_ui.css',
 | 
	
		
			
				|  |  | -    ));
 | 
	
		
			
				|  |  | -    $this->setHead($cssLink);
 | 
	
		
			
				|  |  | -    $this->finalized['head'] = TRUE;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function finalizeHeader() {
 | 
	
		
			
				|  |  | -    $contentType = $this->getHeader('content-type');
 | 
	
		
			
				|  |  | -    if (empty($contentType)) {
 | 
	
		
			
				|  |  | -      $this->setHeader('content-type', $this->contentType);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getBody() {
 | 
	
		
			
				|  |  | -    $this->finalizeBody();
 | 
	
		
			
				|  |  | -    $body = new Element('body', NULL, $this->body);
 | 
	
		
			
				|  |  | -    $ret = (string) $body;
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getHead() {
 | 
	
		
			
				|  |  | -    $this->finalizeHead();
 | 
	
		
			
				|  |  | -    $head = new Element('head', NULL, $this->head);
 | 
	
		
			
				|  |  | -    $ret = (string) $head;
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getHeader($name) {
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function getRegions() {
 | 
	
		
			
				|  |  | -    $ret = array(
 | 
	
		
			
				|  |  | -      'header',
 | 
	
		
			
				|  |  | -      'first sidebar',
 | 
	
		
			
				|  |  | -      'content top',
 | 
	
		
			
				|  |  | -      'messages',
 | 
	
		
			
				|  |  | -      'help',
 | 
	
		
			
				|  |  | -      'content',
 | 
	
		
			
				|  |  | -      'content bottom',
 | 
	
		
			
				|  |  | -      'second sidebar',
 | 
	
		
			
				|  |  | -      'footer',
 | 
	
		
			
				|  |  | +  function applyTidy (&$html) {
 | 
	
		
			
				|  |  | +    $config = array(
 | 
	
		
			
				|  |  | +        'indent'          => TRUE,
 | 
	
		
			
				|  |  | +        'output-xhtml'    => TRUE,
 | 
	
		
			
				|  |  | +        'sort-attributes' => 'alpha',
 | 
	
		
			
				|  |  | +        'wrap'            => 200,
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | +    $tidy = new tidy();
 | 
	
		
			
				|  |  | +    $tidy->parseString($html, $config, 'utf8');
 | 
	
		
			
				|  |  | +    $tidy->cleanRepair();
 | 
	
		
			
				|  |  | +    $html = (string) $tidy;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  public function initializeBody() {
 | 
	
		
			
				|  |  | -    foreach ($this->getRegions() as $region) {
 | 
	
		
			
				|  |  | -      $this->body[$region] = array();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  function main() {
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      ob_start();
 | 
	
		
			
				|  |  | +      //echo '<pre>';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  public function initializeHead() {
 | 
	
		
			
				|  |  | -    $this->setHead(new Element('title', NULL, 'Memcache info'));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +      // Set-up autoloader: it cannot autoload itself.
 | 
	
		
			
				|  |  | +      $package = 'Memcache_UI';
 | 
	
		
			
				|  |  | +      require "$package/Core/Autoloader.inc";
 | 
	
		
			
				|  |  | +      $classLoader = new \SplClassLoader($package, dirname(__FILE__));
 | 
	
		
			
				|  |  | +      $classLoader->setFileExtension('.inc');
 | 
	
		
			
				|  |  | +      $classLoader->register();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  public function setBody($fragment, $region = 'content') {
 | 
	
		
			
				|  |  | -    if (!in_array($region, $this->getRegions())) {
 | 
	
		
			
				|  |  | -      $this->context->setMessage(strtr('Attempted to insert data in nonexistent region @region', array(
 | 
	
		
			
				|  |  | -        '@region' => self::check_plain($region),
 | 
	
		
			
				|  |  | -      )), LOG_WARNING);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    $this->body[$region][] = $fragment;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +      // Set up the context
 | 
	
		
			
				|  |  | +      $context = new Core\Context();
 | 
	
		
			
				|  |  | +      $context->setMessage("Dirname: [". $context->getBase() . "]", LOG_DEBUG);
 | 
	
		
			
				|  |  | +      $context->setMessage("Path: [". $context->getPath() . "]", LOG_DEBUG);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  public function setHead($item) {
 | 
	
		
			
				|  |  | -    $this->head[] = $item;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  public function setHeader($name, $value) {
 | 
	
		
			
				|  |  | -    $this->headers[$name] = $value;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +      // Obtain the routing information
 | 
	
		
			
				|  |  | +      $router = new Core\Router($context);
 | 
	
		
			
				|  |  | +      $item = $router->getRoute();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +      $page = new $item['page class']($context, $item);
 | 
	
		
			
				|  |  | +      $page->emitHeaders();
 | 
	
		
			
				|  |  | +      echo $page;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * Provide common layout elements to child classes.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * - header
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -abstract class Page_Memcache_Base extends Page {
 | 
	
		
			
				|  |  | -  function build() {
 | 
	
		
			
				|  |  | -    $this->setBody(
 | 
	
		
			
				|  |  | -      new Element('div', array('class' => array('head')),
 | 
	
		
			
				|  |  | -        new Element('h1', array('class' => array('memcache')), array(
 | 
	
		
			
				|  |  | -          new Element('span', array('class' => array('logo')),
 | 
	
		
			
				|  |  | -            new Element('a', array('href' => 'http://pecl.php.net/package/memcache'), 'memcache')
 | 
	
		
			
				|  |  | -          ),
 | 
	
		
			
				|  |  | -          new Element('span', array('class' => array('nameinfo')), 'memcache_ui.php from an idea by <a href="http://livebookmark.net">Harun Yayli</a>'),
 | 
	
		
			
				|  |  | -        ))),
 | 
	
		
			
				|  |  | -      'header'
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class Page_Memcache_Main extends Page_Memcache_Base {
 | 
	
		
			
				|  |  | -  function build() {
 | 
	
		
			
				|  |  | -    parent::build();
 | 
	
		
			
				|  |  | -    $this->setBody(new Element('p', NULL, 'Hello world'));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class Page_Memcache_Server_Flush extends Page_Memcache_Base {
 | 
	
		
			
				|  |  | -  function build() {
 | 
	
		
			
				|  |  | -    parent::build();
 | 
	
		
			
				|  |  | -    $this->setBody(new Element('p', NULL, 'Flush server'));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +      $html = ob_get_clean();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class Page_Memcache_Slab_Overview extends Page_Memcache_Base {
 | 
	
		
			
				|  |  | -  function build() {
 | 
	
		
			
				|  |  | -    parent::build();
 | 
	
		
			
				|  |  | -    $this->setBody(new Element('p', NULL, 'Slabs'));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class Router {
 | 
	
		
			
				|  |  | -  function __construct(Context $context) {
 | 
	
		
			
				|  |  | -    $this->context = $context;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  function getInfo() {
 | 
	
		
			
				|  |  | -    $ret = array(
 | 
	
		
			
				|  |  | -      '^server/(\w+)/flush/(\w+)$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_server_flush',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_server',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -      '^server/(\w+)/flush$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'Page_Memcache_Server_Flush',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_server',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      '^server/(\w+)/slab/(\d+)$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_slab_view',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_slab',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      '^server/(\w+)/key/(.+)/delete/(\w+)$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_variable_delete_confirm',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2', '$3'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_variable',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -      '^server/(\w+)/key/(.+)/delete$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_variable_delete_form',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_variable',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      '^server/(\w+)/key/(.+)/dump$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_variable_view_php',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_variable',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -      '^server/(\w+)/key/(.+)/php$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_variable_view_php',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_variable',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -      '^server/(\w+)/key/(.+)$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'page_variable_view_text',
 | 
	
		
			
				|  |  | -        'page arguments' => array('$1', '$2'),
 | 
	
		
			
				|  |  | -        'title callback' => 'title_variable',
 | 
	
		
			
				|  |  | -        'title arguments' => 'page arguments',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      '^slabs$' => array(
 | 
	
		
			
				|  |  | -        'page class' => 'Page_Memcache_Slab_Overview',
 | 
	
		
			
				|  |  | -        'title' => 'Slabs per server',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      '' => array( // Catch-all regex
 | 
	
		
			
				|  |  | -        'page class' => 'Page_Memcache_Main',
 | 
	
		
			
				|  |  | -        'title' => 'Overview',
 | 
	
		
			
				|  |  | -      ),
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $ret;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  function getRoute() {
 | 
	
		
			
				|  |  | -    $found = FALSE;
 | 
	
		
			
				|  |  | -    $path = $this->context->getPath();
 | 
	
		
			
				|  |  | -    $matches = array();
 | 
	
		
			
				|  |  | -    $infoDefaults = array(
 | 
	
		
			
				|  |  | -      'page arguments' => array(),
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -    foreach ($this->getInfo() as $regex => $info) {
 | 
	
		
			
				|  |  | -      $regex = "@$regex@";
 | 
	
		
			
				|  |  | -      $count = preg_match($regex, $path, $matches);
 | 
	
		
			
				|  |  | -      if ($count) {
 | 
	
		
			
				|  |  | -        $found = TRUE;
 | 
	
		
			
				|  |  | -        break;
 | 
	
		
			
				|  |  | +      // Filter it on output
 | 
	
		
			
				|  |  | +      if ($context->getTidy()) {
 | 
	
		
			
				|  |  | +        applyTidy($html);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | +      echo $html;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if ($found) {
 | 
	
		
			
				|  |  | -      $this->context->setMessage("Menu hit on $regex", LOG_DEBUG);
 | 
	
		
			
				|  |  | -      $info = array_merge($infoDefaults, $info);
 | 
	
		
			
				|  |  | -      $this->context->setMessage("Info: ". print_r($info, TRUE), LOG_DEBUG);
 | 
	
		
			
				|  |  | -      if (!empty($info['page arguments'])) {
 | 
	
		
			
				|  |  | -        $regexes = array_fill(0, count($info['page arguments']), $regex);
 | 
	
		
			
				|  |  | -        $paths = array_fill(0, count($info['page arguments']), $path);
 | 
	
		
			
				|  |  | -        $info['page arguments'] = preg_replace($regexes, $info['page arguments'], $paths);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      if ($info['title arguments'] == 'page arguments') {
 | 
	
		
			
				|  |  | -        $info['title arguments'] = &$info['page arguments'];
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      $this->context->setMessage("Info resolved: ". print_r($info, TRUE), LOG_DEBUG);
 | 
	
		
			
				|  |  | +    catch (Exception $e) {
 | 
	
		
			
				|  |  | +      echo '<pre>';
 | 
	
		
			
				|  |  | +      echo $e->getMessage() . PHP_EOL;
 | 
	
		
			
				|  |  | +      echo $e->getTraceAsString();
 | 
	
		
			
				|  |  | +      echo "</pre>";
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    else {
 | 
	
		
			
				|  |  | -      $info = NULL;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return $info;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -function main() {
 | 
	
		
			
				|  |  | -  try {
 | 
	
		
			
				|  |  | -    ob_start();
 | 
	
		
			
				|  |  | -    $context = new Context();
 | 
	
		
			
				|  |  | -    $context->setMessage("Dirname: [". $context->getBase() . "]", LOG_DEBUG);
 | 
	
		
			
				|  |  | -    $context->setMessage("Path: [". $context->getPath() . "]", LOG_DEBUG);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $router = new Router($context);
 | 
	
		
			
				|  |  | -    $item = $router->getRoute();
 | 
	
		
			
				|  |  | -    $page = new $item['page class']($context, $item);
 | 
	
		
			
				|  |  | -    $page->emitHeaders();
 | 
	
		
			
				|  |  | -    echo $page;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $html = ob_get_clean();
 | 
	
		
			
				|  |  | -    if ($context->getTidy()) {
 | 
	
		
			
				|  |  | -      applyTidy($html);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    echo $html;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  catch (Exception $e) {
 | 
	
		
			
				|  |  | -    echo '<pre>';
 | 
	
		
			
				|  |  | -    echo $e->getMessage() . PHP_EOL;
 | 
	
		
			
				|  |  | -    echo $e->getTraceAsString();
 | 
	
		
			
				|  |  | -    echo "</pre>";
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +main();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -main();
 |