<?php 
 
class HTMLPurifier_DoctypeRegistry 
{ 
 
    /** 
     * Hash of doctype names to doctype objects 
     */ 
    protected $doctypes; 
 
    /** 
     * Lookup table of aliases to real doctype names 
     */ 
    protected $aliases; 
 
    /** 
     * Registers a doctype to the registry 
     * @note Accepts a fully-formed doctype object, or the 
     *       parameters for constructing a doctype object 
     * @param $doctype Name of doctype or literal doctype object 
     * @param $modules Modules doctype will load 
     * @param $modules_for_modes Modules doctype will load for certain modes 
     * @param $aliases Alias names for doctype 
     * @return Editable registered doctype 
     */ 
    public function register($doctype, $xml = true, $modules = array(), 
        $tidy_modules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null 
    ) { 
        if (!is_array($modules)) $modules = array($modules); 
        if (!is_array($tidy_modules)) $tidy_modules = array($tidy_modules); 
        if (!is_array($aliases)) $aliases = array($aliases); 
        if (!is_object($doctype)) { 
            $doctype = new HTMLPurifier_Doctype( 
                $doctype, $xml, $modules, $tidy_modules, $aliases, $dtd_public, $dtd_system 
            ); 
        } 
        $this->doctypes[$doctype->name] = $doctype; 
        $name = $doctype->name; 
        // hookup aliases 
        foreach ($doctype->aliases as $alias) { 
            if (isset($this->doctypes[$alias])) continue; 
            $this->aliases[$alias] = $name; 
        } 
        // remove old aliases 
        if (isset($this->aliases[$name])) unset($this->aliases[$name]); 
        return $doctype; 
    } 
 
    /** 
     * Retrieves reference to a doctype of a certain name 
     * @note This function resolves aliases 
     * @note When possible, use the more fully-featured make() 
     * @param $doctype Name of doctype 
     * @return Editable doctype object 
     */ 
    public function get($doctype) { 
        if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; 
        if (!isset($this->doctypes[$doctype])) { 
            trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); 
            $anon = new HTMLPurifier_Doctype($doctype); 
            return $anon; 
        } 
        return $this->doctypes[$doctype]; 
    } 
 
    /** 
     * Creates a doctype based on a configuration object, 
     * will perform initialization on the doctype 
     * @note Use this function to get a copy of doctype that config 
     *       can hold on to (this is necessary in order to tell 
     *       Generator whether or not the current document is XML 
     *       based or not). 
     */ 
    public function make($config) { 
        return clone $this->get($this->getDoctypeFromConfig($config)); 
    } 
 
    /** 
     * Retrieves the doctype from the configuration object 
     */ 
    public function getDoctypeFromConfig($config) { 
        // recommended test 
        $doctype = $config->get('HTML.Doctype'); 
        if (!empty($doctype)) return $doctype; 
        $doctype = $config->get('HTML.CustomDoctype'); 
        if (!empty($doctype)) return $doctype; 
        // backwards-compatibility 
        if ($config->get('HTML.XHTML')) { 
            $doctype = 'XHTML 1.0'; 
        } else { 
            $doctype = 'HTML 4.01'; 
        } 
        if ($config->get('HTML.Strict')) { 
            $doctype .= ' Strict'; 
        } else { 
            $doctype .= ' Transitional'; 
        } 
        return $doctype; 
    } 
 
} 
 
// vim: et sw=4 sts=4 
 
 |