Mercurial > hg > rr-repo
diff sites/all/libraries/ARC2/arc/serializers/ARC2_RDFXMLSerializer.php @ 4:ce11bbd8f642
added modules
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Thu, 19 Sep 2013 10:38:44 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/libraries/ARC2/arc/serializers/ARC2_RDFXMLSerializer.php Thu Sep 19 10:38:44 2013 +0100 @@ -0,0 +1,198 @@ +<?php +/** + * ARC2 RDF/XML Serializer + * + * @author Benjamin Nowack + * @license <http://arc.semsol.org/license> + * @homepage <http://arc.semsol.org/> + * @package ARC2 + * @version 2010-11-16 +*/ + +ARC2::inc('RDFSerializer'); + +class ARC2_RDFXMLSerializer extends ARC2_RDFSerializer { + + function __construct($a, &$caller) { + parent::__construct($a, $caller); + } + + function __init() { + parent::__init(); + $this->content_header = 'application/rdf+xml'; + $this->pp_containers = $this->v('serializer_prettyprint_containers', 0, $this->a); + $this->default_ns = $this->v('serializer_default_ns', '', $this->a); + $this->type_nodes = $this->v('serializer_type_nodes', 0, $this->a); + } + + /* */ + + function getTerm($v, $type) { + if (!is_array($v)) {/* uri or bnode */ + if (preg_match('/^\_\:(.*)$/', $v, $m)) { + return ' rdf:nodeID="' . $m[1] . '"'; + } + if ($type == 's') { + return ' rdf:about="' . htmlspecialchars($v) . '"'; + } + if ($type == 'p') { + $pn = $this->getPName($v); + return $pn ? $pn : 0; + } + if ($type == 'o') { + $v = $this->expandPName($v); + if (!preg_match('/^[a-z0-9]{2,}\:[^\s]+$/is', $v)) return $this->getTerm(array('value' => $v, 'type' => 'literal'), $type); + return ' rdf:resource="' . htmlspecialchars($v) . '"'; + } + if ($type == 'datatype') { + $v = $this->expandPName($v); + return ' rdf:datatype="' . htmlspecialchars($v) . '"'; + } + if ($type == 'lang') { + return ' xml:lang="' . htmlspecialchars($v) . '"'; + } + } + if ($this->v('type', '', $v) != 'literal') { + return $this->getTerm($v['value'], 'o'); + } + /* literal */ + $dt = isset($v['datatype']) ? $v['datatype'] : ''; + $lang = isset($v['lang']) ? $v['lang'] : ''; + if ($dt == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral') { + return ' rdf:parseType="Literal">' . $v['value']; + } + elseif ($dt) { + return $this->getTerm($dt, 'datatype') . '>' . htmlspecialchars($v['value']); + } + elseif ($lang) { + return $this->getTerm($lang, 'lang') . '>' . htmlspecialchars($v['value']); + } + return '>' . htmlspecialchars($this->v('value', '', $v)); + } + + function getPName($v, $connector = ':') { + if ($this->default_ns && (strpos($v, $this->default_ns) === 0)) { + $pname = substr($v, strlen($this->default_ns)); + if (!preg_match('/\//', $pname)) return $pname; + } + return parent::getPName($v, $connector); + } + + function getHead() { + $r = ''; + $nl = "\n"; + $r .= '<?xml version="1.0" encoding="UTF-8"?>'; + $r .= $nl . '<rdf:RDF'; + $first_ns = 1; + foreach ($this->used_ns as $v) { + $r .= $first_ns ? ' ' : $nl . ' '; + foreach ($this->ns as $prefix => $ns) { + if ($ns != $v) continue; + $r .= 'xmlns:' . $prefix . '="' .$v. '"'; + break; + } + $first_ns = 0; + } + if ($this->default_ns) { + $r .= $first_ns ? ' ' : $nl . ' '; + $r .= 'xmlns="' . $this->default_ns . '"'; + } + $r .= '>'; + return $r; + } + + function getFooter() { + $r = ''; + $nl = "\n"; + $r .= $nl . $nl . '</rdf:RDF>'; + return $r; + } + + function getSerializedIndex($index, $raw = 0) { + $r = ''; + $nl = "\n"; + foreach ($index as $raw_s => $ps) { + $r .= $r ? $nl . $nl : ''; + $s = $this->getTerm($raw_s, 's'); + $tag = 'rdf:Description'; + list($tag, $ps) = $this->getNodeTag($ps); + $sub_ps = 0; + /* pretty containers */ + if ($this->pp_containers && ($ctag = $this->getContainerTag($ps))) { + $tag = 'rdf:' . $ctag; + list($ps, $sub_ps) = $this->splitContainerEntries($ps); + } + $r .= ' <' . $tag . '' .$s . '>'; + $first_p = 1; + foreach ($ps as $p => $os) { + if (!$os) continue; + $p = $this->getTerm($p, 'p'); + if ($p) { + $r .= $nl . str_pad('', 4); + $first_o = 1; + if (!is_array($os)) {/* single literal o */ + $os = array(array('value' => $os, 'type' => 'literal')); + } + foreach ($os as $o) { + $o = $this->getTerm($o, 'o'); + $r .= $first_o ? '' : $nl . ' '; + $r .= '<' . $p; + $r .= $o; + $r .= preg_match('/\>/', $o) ? '</' . $p . '>' : '/>'; + $first_o = 0; + } + $first_p = 0; + } + } + $r .= $r ? $nl . ' </' . $tag . '>' : ''; + if ($sub_ps) $r .= $nl . $nl . $this->getSerializedIndex(array($raw_s => $sub_ps), 1); + } + if ($raw) { + return $r; + } + return $this->getHead() . $nl . $nl . $r . $this->getFooter(); + } + + function getNodeTag($ps) { + if (!$this->type_nodes) return array('rdf:Description', $ps); + $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; + $types = $this->v($rdf . 'type', array(), $ps); + if (!$types) return array('rdf:Description', $ps); + $type = array_shift($types); + $ps[$rdf . 'type'] = $types; + if (!is_array($type)) $type = array('value' => $type); + return array($this->getPName($type['value']), $ps); + } + + /* */ + + function getContainerTag($ps) { + $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; + if (!isset($ps[$rdf . 'type'])) return ''; + $types = $ps[$rdf . 'type']; + foreach ($types as $type) { + if (!in_array($type['value'], array($rdf . 'Bag', $rdf . 'Seq', $rdf . 'Alt'))) return ''; + return str_replace($rdf, '', $type['value']); + } + } + + function splitContainerEntries($ps) { + $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; + $items = array(); + $rest = array(); + foreach ($ps as $p => $os) { + $p_short = str_replace($rdf, '', $p); + if ($p_short === 'type') continue; + if (preg_match('/^\_([0-9]+)$/', $p_short, $m)) { + $items = array_merge($items, $os); + } + else { + $rest[$p] = $os; + } + } + if ($items) return array(array($rdf . 'li' => $items), $rest); + return array($rest, 0); + } + + /* */ +}