| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | <?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
 |