danielebarchiesi@4: danielebarchiesi@4: * @homepage danielebarchiesi@4: * @package ARC2 danielebarchiesi@4: * @version 2010-11-16 danielebarchiesi@4: */ danielebarchiesi@4: danielebarchiesi@4: ARC2::inc('RDFSerializer'); danielebarchiesi@4: danielebarchiesi@4: class ARC2_RDFXMLSerializer extends ARC2_RDFSerializer { danielebarchiesi@4: danielebarchiesi@4: function __construct($a, &$caller) { danielebarchiesi@4: parent::__construct($a, $caller); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function __init() { danielebarchiesi@4: parent::__init(); danielebarchiesi@4: $this->content_header = 'application/rdf+xml'; danielebarchiesi@4: $this->pp_containers = $this->v('serializer_prettyprint_containers', 0, $this->a); danielebarchiesi@4: $this->default_ns = $this->v('serializer_default_ns', '', $this->a); danielebarchiesi@4: $this->type_nodes = $this->v('serializer_type_nodes', 0, $this->a); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function getTerm($v, $type) { danielebarchiesi@4: if (!is_array($v)) {/* uri or bnode */ danielebarchiesi@4: if (preg_match('/^\_\:(.*)$/', $v, $m)) { danielebarchiesi@4: return ' rdf:nodeID="' . $m[1] . '"'; danielebarchiesi@4: } danielebarchiesi@4: if ($type == 's') { danielebarchiesi@4: return ' rdf:about="' . htmlspecialchars($v) . '"'; danielebarchiesi@4: } danielebarchiesi@4: if ($type == 'p') { danielebarchiesi@4: $pn = $this->getPName($v); danielebarchiesi@4: return $pn ? $pn : 0; danielebarchiesi@4: } danielebarchiesi@4: if ($type == 'o') { danielebarchiesi@4: $v = $this->expandPName($v); danielebarchiesi@4: if (!preg_match('/^[a-z0-9]{2,}\:[^\s]+$/is', $v)) return $this->getTerm(array('value' => $v, 'type' => 'literal'), $type); danielebarchiesi@4: return ' rdf:resource="' . htmlspecialchars($v) . '"'; danielebarchiesi@4: } danielebarchiesi@4: if ($type == 'datatype') { danielebarchiesi@4: $v = $this->expandPName($v); danielebarchiesi@4: return ' rdf:datatype="' . htmlspecialchars($v) . '"'; danielebarchiesi@4: } danielebarchiesi@4: if ($type == 'lang') { danielebarchiesi@4: return ' xml:lang="' . htmlspecialchars($v) . '"'; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if ($this->v('type', '', $v) != 'literal') { danielebarchiesi@4: return $this->getTerm($v['value'], 'o'); danielebarchiesi@4: } danielebarchiesi@4: /* literal */ danielebarchiesi@4: $dt = isset($v['datatype']) ? $v['datatype'] : ''; danielebarchiesi@4: $lang = isset($v['lang']) ? $v['lang'] : ''; danielebarchiesi@4: if ($dt == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral') { danielebarchiesi@4: return ' rdf:parseType="Literal">' . $v['value']; danielebarchiesi@4: } danielebarchiesi@4: elseif ($dt) { danielebarchiesi@4: return $this->getTerm($dt, 'datatype') . '>' . htmlspecialchars($v['value']); danielebarchiesi@4: } danielebarchiesi@4: elseif ($lang) { danielebarchiesi@4: return $this->getTerm($lang, 'lang') . '>' . htmlspecialchars($v['value']); danielebarchiesi@4: } danielebarchiesi@4: return '>' . htmlspecialchars($this->v('value', '', $v)); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getPName($v, $connector = ':') { danielebarchiesi@4: if ($this->default_ns && (strpos($v, $this->default_ns) === 0)) { danielebarchiesi@4: $pname = substr($v, strlen($this->default_ns)); danielebarchiesi@4: if (!preg_match('/\//', $pname)) return $pname; danielebarchiesi@4: } danielebarchiesi@4: return parent::getPName($v, $connector); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getHead() { danielebarchiesi@4: $r = ''; danielebarchiesi@4: $nl = "\n"; danielebarchiesi@4: $r .= ''; danielebarchiesi@4: $r .= $nl . 'used_ns as $v) { danielebarchiesi@4: $r .= $first_ns ? ' ' : $nl . ' '; danielebarchiesi@4: foreach ($this->ns as $prefix => $ns) { danielebarchiesi@4: if ($ns != $v) continue; danielebarchiesi@4: $r .= 'xmlns:' . $prefix . '="' .$v. '"'; danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: $first_ns = 0; danielebarchiesi@4: } danielebarchiesi@4: if ($this->default_ns) { danielebarchiesi@4: $r .= $first_ns ? ' ' : $nl . ' '; danielebarchiesi@4: $r .= 'xmlns="' . $this->default_ns . '"'; danielebarchiesi@4: } danielebarchiesi@4: $r .= '>'; danielebarchiesi@4: return $r; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getFooter() { danielebarchiesi@4: $r = ''; danielebarchiesi@4: $nl = "\n"; danielebarchiesi@4: $r .= $nl . $nl . ''; danielebarchiesi@4: return $r; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getSerializedIndex($index, $raw = 0) { danielebarchiesi@4: $r = ''; danielebarchiesi@4: $nl = "\n"; danielebarchiesi@4: foreach ($index as $raw_s => $ps) { danielebarchiesi@4: $r .= $r ? $nl . $nl : ''; danielebarchiesi@4: $s = $this->getTerm($raw_s, 's'); danielebarchiesi@4: $tag = 'rdf:Description'; danielebarchiesi@4: list($tag, $ps) = $this->getNodeTag($ps); danielebarchiesi@4: $sub_ps = 0; danielebarchiesi@4: /* pretty containers */ danielebarchiesi@4: if ($this->pp_containers && ($ctag = $this->getContainerTag($ps))) { danielebarchiesi@4: $tag = 'rdf:' . $ctag; danielebarchiesi@4: list($ps, $sub_ps) = $this->splitContainerEntries($ps); danielebarchiesi@4: } danielebarchiesi@4: $r .= ' <' . $tag . '' .$s . '>'; danielebarchiesi@4: $first_p = 1; danielebarchiesi@4: foreach ($ps as $p => $os) { danielebarchiesi@4: if (!$os) continue; danielebarchiesi@4: $p = $this->getTerm($p, 'p'); danielebarchiesi@4: if ($p) { danielebarchiesi@4: $r .= $nl . str_pad('', 4); danielebarchiesi@4: $first_o = 1; danielebarchiesi@4: if (!is_array($os)) {/* single literal o */ danielebarchiesi@4: $os = array(array('value' => $os, 'type' => 'literal')); danielebarchiesi@4: } danielebarchiesi@4: foreach ($os as $o) { danielebarchiesi@4: $o = $this->getTerm($o, 'o'); danielebarchiesi@4: $r .= $first_o ? '' : $nl . ' '; danielebarchiesi@4: $r .= '<' . $p; danielebarchiesi@4: $r .= $o; danielebarchiesi@4: $r .= preg_match('/\>/', $o) ? '' : '/>'; danielebarchiesi@4: $first_o = 0; danielebarchiesi@4: } danielebarchiesi@4: $first_p = 0; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $r .= $r ? $nl . ' ' : ''; danielebarchiesi@4: if ($sub_ps) $r .= $nl . $nl . $this->getSerializedIndex(array($raw_s => $sub_ps), 1); danielebarchiesi@4: } danielebarchiesi@4: if ($raw) { danielebarchiesi@4: return $r; danielebarchiesi@4: } danielebarchiesi@4: return $this->getHead() . $nl . $nl . $r . $this->getFooter(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getNodeTag($ps) { danielebarchiesi@4: if (!$this->type_nodes) return array('rdf:Description', $ps); danielebarchiesi@4: $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; danielebarchiesi@4: $types = $this->v($rdf . 'type', array(), $ps); danielebarchiesi@4: if (!$types) return array('rdf:Description', $ps); danielebarchiesi@4: $type = array_shift($types); danielebarchiesi@4: $ps[$rdf . 'type'] = $types; danielebarchiesi@4: if (!is_array($type)) $type = array('value' => $type); danielebarchiesi@4: return array($this->getPName($type['value']), $ps); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function getContainerTag($ps) { danielebarchiesi@4: $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; danielebarchiesi@4: if (!isset($ps[$rdf . 'type'])) return ''; danielebarchiesi@4: $types = $ps[$rdf . 'type']; danielebarchiesi@4: foreach ($types as $type) { danielebarchiesi@4: if (!in_array($type['value'], array($rdf . 'Bag', $rdf . 'Seq', $rdf . 'Alt'))) return ''; danielebarchiesi@4: return str_replace($rdf, '', $type['value']); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function splitContainerEntries($ps) { danielebarchiesi@4: $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; danielebarchiesi@4: $items = array(); danielebarchiesi@4: $rest = array(); danielebarchiesi@4: foreach ($ps as $p => $os) { danielebarchiesi@4: $p_short = str_replace($rdf, '', $p); danielebarchiesi@4: if ($p_short === 'type') continue; danielebarchiesi@4: if (preg_match('/^\_([0-9]+)$/', $p_short, $m)) { danielebarchiesi@4: $items = array_merge($items, $os); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $rest[$p] = $os; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if ($items) return array(array($rdf . 'li' => $items), $rest); danielebarchiesi@4: return array($rest, 0); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: }