danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2 /*
|
danielebarchiesi@4
|
3 homepage: http://arc.semsol.org/
|
danielebarchiesi@4
|
4 license: http://arc.semsol.org/license
|
danielebarchiesi@4
|
5
|
danielebarchiesi@4
|
6 class: ARC2 Legacy XML Serializer
|
danielebarchiesi@4
|
7 author: Benjamin Nowack
|
danielebarchiesi@4
|
8 version: 2010-11-16
|
danielebarchiesi@4
|
9 */
|
danielebarchiesi@4
|
10
|
danielebarchiesi@4
|
11 ARC2::inc('Class');
|
danielebarchiesi@4
|
12
|
danielebarchiesi@4
|
13 class ARC2_LegacyHTMLSerializer extends ARC2_Class {
|
danielebarchiesi@4
|
14
|
danielebarchiesi@4
|
15 function __construct($a, &$caller) {
|
danielebarchiesi@4
|
16 parent::__construct($a, $caller);
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18
|
danielebarchiesi@4
|
19 function __init() {
|
danielebarchiesi@4
|
20 parent::__init();
|
danielebarchiesi@4
|
21 $this->content_header = 'text/html';
|
danielebarchiesi@4
|
22 }
|
danielebarchiesi@4
|
23
|
danielebarchiesi@4
|
24 /* */
|
danielebarchiesi@4
|
25
|
danielebarchiesi@4
|
26 function getSerializedArray($struct, $root = 1, $ind = ' ') {
|
danielebarchiesi@4
|
27 $n = "\n";
|
danielebarchiesi@4
|
28 $r = '';
|
danielebarchiesi@4
|
29 $is_flat = $this->isAssociativeArray($struct) ? 0 : 1;
|
danielebarchiesi@4
|
30 foreach ($struct as $k => $v) {
|
danielebarchiesi@4
|
31 if (!$is_flat) $r .= $n . $ind . $ind . '<dt>' . $k . '</dt>';
|
danielebarchiesi@4
|
32 $r .= $n . $ind . $ind . '<dd>' . (is_array($v) ? $this->getSerializedArray($v, 0, $ind . $ind . $ind) . $n . $ind . $ind : htmlspecialchars($v)) . '</dd>';
|
danielebarchiesi@4
|
33 }
|
danielebarchiesi@4
|
34 return $n . $ind . '<dl>' . $r . $n . $ind . '</dl>';
|
danielebarchiesi@4
|
35 }
|
danielebarchiesi@4
|
36
|
danielebarchiesi@4
|
37 /* */
|
danielebarchiesi@4
|
38
|
danielebarchiesi@4
|
39 function isAssociativeArray($v) {
|
danielebarchiesi@4
|
40 foreach (array_keys($v) as $k => $val) {
|
danielebarchiesi@4
|
41 if ($k !== $val) return 1;
|
danielebarchiesi@4
|
42 }
|
danielebarchiesi@4
|
43 return 0;
|
danielebarchiesi@4
|
44 }
|
danielebarchiesi@4
|
45
|
danielebarchiesi@4
|
46 /* */
|
danielebarchiesi@4
|
47
|
danielebarchiesi@4
|
48 function getSerializedNode($index, $node, $level = 0, $raw = 0) {
|
danielebarchiesi@4
|
49 $r = '';
|
danielebarchiesi@4
|
50 $tag = $this->v('tag', '', $node);
|
danielebarchiesi@4
|
51 if (preg_match('/^(comment|script)$/', $tag)) {
|
danielebarchiesi@4
|
52 }
|
danielebarchiesi@4
|
53 elseif ($tag == 'cdata') {
|
danielebarchiesi@4
|
54 $r .= $this->v('cdata', '', $node);
|
danielebarchiesi@4
|
55 $r .= $this->v('value', '', $node['a']);
|
danielebarchiesi@4
|
56 }
|
danielebarchiesi@4
|
57 else {
|
danielebarchiesi@4
|
58 /* open tag */
|
danielebarchiesi@4
|
59 if (preg_match('/^(div|form|p|section)$/', $tag)) {
|
danielebarchiesi@4
|
60 $r .= str_pad("\n", $level + 1, " ");
|
danielebarchiesi@4
|
61 }
|
danielebarchiesi@4
|
62 $r .= '<' . $tag;
|
danielebarchiesi@4
|
63 $attrs = $this->v('a', array(), $node);
|
danielebarchiesi@4
|
64 foreach ($attrs as $k => $v) {
|
danielebarchiesi@4
|
65 /* use uri, if detected */
|
danielebarchiesi@4
|
66 if ($k != 'id') {
|
danielebarchiesi@4
|
67 $v = $this->v($k . ' uri', $v, $attrs);
|
danielebarchiesi@4
|
68 }
|
danielebarchiesi@4
|
69 /* skip arrays and other derived attrs */
|
danielebarchiesi@4
|
70 if (preg_match('/\s/s', $k)) continue;
|
danielebarchiesi@4
|
71 $r .= ' ' . $k . '="' . $v . '"';
|
danielebarchiesi@4
|
72 }
|
danielebarchiesi@4
|
73 if ($node['empty']) {
|
danielebarchiesi@4
|
74 $r .= '/>';
|
danielebarchiesi@4
|
75 }
|
danielebarchiesi@4
|
76 else {
|
danielebarchiesi@4
|
77 $r .= '>';
|
danielebarchiesi@4
|
78 /* cdata */
|
danielebarchiesi@4
|
79 $r .= $this->v('cdata', '', $node);
|
danielebarchiesi@4
|
80 /* sub-nodes */
|
danielebarchiesi@4
|
81 $sub_nodes = $this->v($node['id'], array(), $index);
|
danielebarchiesi@4
|
82 foreach ($sub_nodes as $sub_node) {
|
danielebarchiesi@4
|
83 $r .= $this->getSerializedNode($index, $sub_node, $level + 1, 1);
|
danielebarchiesi@4
|
84 }
|
danielebarchiesi@4
|
85 /* close tag */
|
danielebarchiesi@4
|
86 //$r .= str_pad("\n", $level + 1, " ") . '</' . $tag . '>';
|
danielebarchiesi@4
|
87 $r .= '</' . $tag . '>';
|
danielebarchiesi@4
|
88 if (preg_match('/^(div|form|p|section)$/', $tag)) {
|
danielebarchiesi@4
|
89 $r .= str_pad("\n", $level + 1, " ");
|
danielebarchiesi@4
|
90 }
|
danielebarchiesi@4
|
91 }
|
danielebarchiesi@4
|
92 }
|
danielebarchiesi@4
|
93 /* doc envelope, in case of sub-structure serializing */
|
danielebarchiesi@4
|
94 if (!$raw && ($level == 0) && ($node['level'] > 1)) {
|
danielebarchiesi@4
|
95 $r = '<!DOCTYPE html>
|
danielebarchiesi@4
|
96 <html xmlns="http://www.w3.org/1999/xhtml">
|
danielebarchiesi@4
|
97 <head>
|
danielebarchiesi@4
|
98 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
danielebarchiesi@4
|
99 <head>
|
danielebarchiesi@4
|
100 <body>
|
danielebarchiesi@4
|
101 ' . $r . '
|
danielebarchiesi@4
|
102 </body>
|
danielebarchiesi@4
|
103 </html>
|
danielebarchiesi@4
|
104 ';
|
danielebarchiesi@4
|
105 }
|
danielebarchiesi@4
|
106 return $r;
|
danielebarchiesi@4
|
107 }
|
danielebarchiesi@4
|
108
|
danielebarchiesi@4
|
109 /* */
|
danielebarchiesi@4
|
110 }
|
danielebarchiesi@4
|
111
|