Friendica Communications Platform
(please note that this is a clone of the repository at github, issues are handled there)
https://friendi.ca
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.4 KiB
103 lines
3.4 KiB
<?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
|
|
|