]>
Commit | Line | Data |
---|---|---|
f45a286b AD |
1 | <?php |
2 | ||
3 | /** | |
4 | * Converts HTMLPurifier_ConfigSchema_Interchange to an XML format, | |
5 | * which can be further processed to generate documentation. | |
6 | */ | |
7 | class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter | |
8 | { | |
9 | ||
10 | protected $interchange; | |
f4f0f80d | 11 | private $namespace; |
f45a286b AD |
12 | |
13 | protected function writeHTMLDiv($html) { | |
14 | $this->startElement('div'); | |
15 | ||
16 | $purifier = HTMLPurifier::getInstance(); | |
17 | $html = $purifier->purify($html); | |
18 | $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); | |
19 | $this->writeRaw($html); | |
20 | ||
21 | $this->endElement(); // div | |
22 | } | |
23 | ||
24 | protected function export($var) { | |
25 | if ($var === array()) return 'array()'; | |
26 | return var_export($var, true); | |
27 | } | |
28 | ||
29 | public function build($interchange) { | |
30 | // global access, only use as last resort | |
31 | $this->interchange = $interchange; | |
32 | ||
33 | $this->setIndent(true); | |
34 | $this->startDocument('1.0', 'UTF-8'); | |
35 | $this->startElement('configdoc'); | |
36 | $this->writeElement('title', $interchange->name); | |
37 | ||
f4f0f80d AD |
38 | foreach ($interchange->directives as $directive) { |
39 | $this->buildDirective($directive); | |
f45a286b AD |
40 | } |
41 | ||
f4f0f80d AD |
42 | if ($this->namespace) $this->endElement(); // namespace |
43 | ||
f45a286b AD |
44 | $this->endElement(); // configdoc |
45 | $this->flush(); | |
46 | } | |
47 | ||
f4f0f80d | 48 | public function buildDirective($directive) { |
f45a286b | 49 | |
f4f0f80d AD |
50 | // Kludge, although I suppose having a notion of a "root namespace" |
51 | // certainly makes things look nicer when documentation is built. | |
52 | // Depends on things being sorted. | |
53 | if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { | |
54 | if ($this->namespace) $this->endElement(); // namespace | |
55 | $this->namespace = $directive->id->getRootNamespace(); | |
56 | $this->startElement('namespace'); | |
57 | $this->writeAttribute('id', $this->namespace); | |
58 | $this->writeElement('name', $this->namespace); | |
f45a286b AD |
59 | } |
60 | ||
f45a286b AD |
61 | $this->startElement('directive'); |
62 | $this->writeAttribute('id', $directive->id->toString()); | |
63 | ||
f4f0f80d | 64 | $this->writeElement('name', $directive->id->getDirective()); |
f45a286b AD |
65 | |
66 | $this->startElement('aliases'); | |
67 | foreach ($directive->aliases as $alias) $this->writeElement('alias', $alias->toString()); | |
68 | $this->endElement(); // aliases | |
69 | ||
70 | $this->startElement('constraints'); | |
71 | if ($directive->version) $this->writeElement('version', $directive->version); | |
72 | $this->startElement('type'); | |
73 | if ($directive->typeAllowsNull) $this->writeAttribute('allow-null', 'yes'); | |
74 | $this->text($directive->type); | |
75 | $this->endElement(); // type | |
76 | if ($directive->allowed) { | |
77 | $this->startElement('allowed'); | |
78 | foreach ($directive->allowed as $value => $x) $this->writeElement('value', $value); | |
79 | $this->endElement(); // allowed | |
80 | } | |
81 | $this->writeElement('default', $this->export($directive->default)); | |
82 | $this->writeAttribute('xml:space', 'preserve'); | |
83 | if ($directive->external) { | |
84 | $this->startElement('external'); | |
85 | foreach ($directive->external as $project) $this->writeElement('project', $project); | |
86 | $this->endElement(); | |
87 | } | |
88 | $this->endElement(); // constraints | |
89 | ||
90 | if ($directive->deprecatedVersion) { | |
91 | $this->startElement('deprecated'); | |
92 | $this->writeElement('version', $directive->deprecatedVersion); | |
93 | $this->writeElement('use', $directive->deprecatedUse->toString()); | |
94 | $this->endElement(); // deprecated | |
95 | } | |
96 | ||
97 | $this->startElement('description'); | |
98 | $this->writeHTMLDiv($directive->description); | |
99 | $this->endElement(); // description | |
100 | ||
101 | $this->endElement(); // directive | |
102 | } | |
103 | ||
104 | } | |
105 | ||
106 | // vim: et sw=4 sts=4 |