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.
144 lines
4.3 KiB
144 lines
4.3 KiB
<?php |
|
|
|
/** |
|
* Converts HTMLPurifier_ConfigSchema_Interchange to an XML format, |
|
* which can be further processed to generate documentation. |
|
*/ |
|
class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter |
|
{ |
|
|
|
/** |
|
* @type HTMLPurifier_ConfigSchema_Interchange |
|
*/ |
|
protected $interchange; |
|
|
|
/** |
|
* @type string |
|
*/ |
|
private $namespace; |
|
|
|
/** |
|
* @param string $html |
|
*/ |
|
protected function writeHTMLDiv($html) |
|
{ |
|
$this->startElement('div'); |
|
|
|
$purifier = HTMLPurifier::getInstance(); |
|
$html = $purifier->purify($html); |
|
$this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); |
|
$this->writeRaw($html); |
|
|
|
$this->endElement(); // div |
|
} |
|
|
|
/** |
|
* @param mixed $var |
|
* @return string |
|
*/ |
|
protected function export($var) |
|
{ |
|
if ($var === array()) { |
|
return 'array()'; |
|
} |
|
return var_export($var, true); |
|
} |
|
|
|
/** |
|
* @param HTMLPurifier_ConfigSchema_Interchange $interchange |
|
*/ |
|
public function build($interchange) |
|
{ |
|
// global access, only use as last resort |
|
$this->interchange = $interchange; |
|
|
|
$this->setIndent(true); |
|
$this->startDocument('1.0', 'UTF-8'); |
|
$this->startElement('configdoc'); |
|
$this->writeElement('title', $interchange->name); |
|
|
|
foreach ($interchange->directives as $directive) { |
|
$this->buildDirective($directive); |
|
} |
|
|
|
if ($this->namespace) { |
|
$this->endElement(); |
|
} // namespace |
|
|
|
$this->endElement(); // configdoc |
|
$this->flush(); |
|
} |
|
|
|
/** |
|
* @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive |
|
*/ |
|
public function buildDirective($directive) |
|
{ |
|
// Kludge, although I suppose having a notion of a "root namespace" |
|
// certainly makes things look nicer when documentation is built. |
|
// Depends on things being sorted. |
|
if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { |
|
if ($this->namespace) { |
|
$this->endElement(); |
|
} // namespace |
|
$this->namespace = $directive->id->getRootNamespace(); |
|
$this->startElement('namespace'); |
|
$this->writeAttribute('id', $this->namespace); |
|
$this->writeElement('name', $this->namespace); |
|
} |
|
|
|
$this->startElement('directive'); |
|
$this->writeAttribute('id', $directive->id->toString()); |
|
|
|
$this->writeElement('name', $directive->id->getDirective()); |
|
|
|
$this->startElement('aliases'); |
|
foreach ($directive->aliases as $alias) { |
|
$this->writeElement('alias', $alias->toString()); |
|
} |
|
$this->endElement(); // aliases |
|
|
|
$this->startElement('constraints'); |
|
if ($directive->version) { |
|
$this->writeElement('version', $directive->version); |
|
} |
|
$this->startElement('type'); |
|
if ($directive->typeAllowsNull) { |
|
$this->writeAttribute('allow-null', 'yes'); |
|
} |
|
$this->text($directive->type); |
|
$this->endElement(); // type |
|
if ($directive->allowed) { |
|
$this->startElement('allowed'); |
|
foreach ($directive->allowed as $value => $x) { |
|
$this->writeElement('value', $value); |
|
} |
|
$this->endElement(); // allowed |
|
} |
|
$this->writeElement('default', $this->export($directive->default)); |
|
$this->writeAttribute('xml:space', 'preserve'); |
|
if ($directive->external) { |
|
$this->startElement('external'); |
|
foreach ($directive->external as $project) { |
|
$this->writeElement('project', $project); |
|
} |
|
$this->endElement(); |
|
} |
|
$this->endElement(); // constraints |
|
|
|
if ($directive->deprecatedVersion) { |
|
$this->startElement('deprecated'); |
|
$this->writeElement('version', $directive->deprecatedVersion); |
|
$this->writeElement('use', $directive->deprecatedUse->toString()); |
|
$this->endElement(); // deprecated |
|
} |
|
|
|
$this->startElement('description'); |
|
$this->writeHTMLDiv($directive->description); |
|
$this->endElement(); // description |
|
|
|
$this->endElement(); // directive |
|
} |
|
} |
|
|
|
// vim: et sw=4 sts=4
|
|
|