/** * Check if this element encodes an RDF list, and if yes return an * array of SMWExpElements corresponding to the collection elements in * the specified order. Otherwise return false. * The method only returns lists that can be encoded using * parseType="Collection" in RDF/XML, i.e. only lists of non-literal * resources. * * @return mixed array of SMWExpElement (but not SMWExpLiteral) or false */ public function getCollection() { $rdftypeUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'type')->getUri(); $rdffirstUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'first')->getUri(); $rdfrestUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'rest')->getUri(); $rdfnilUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'nil')->getUri(); // first check if we are basically an RDF List: if ($this->m_subject->isBlankNode() && count($this->m_children) == 3 && array_key_exists($rdftypeUri, $this->m_children) && count($this->m_children[$rdftypeUri]) == 1 && array_key_exists($rdffirstUri, $this->m_children) && count($this->m_children[$rdffirstUri]) == 1 && !end($this->m_children[$rdffirstUri]) instanceof SMWExpLiteral && array_key_exists($rdfrestUri, $this->m_children) && count($this->m_children[$rdfrestUri]) == 1) { $typedata = end($this->m_children[$rdftypeUri]); $rdflistUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'List')->getUri(); if ($typedata->getSubject()->getUri() == $rdflistUri) { $first = end($this->m_children[$rdffirstUri]); $rest = end($this->m_children[$rdfrestUri]); if ($rest instanceof SMWExpData) { $restlist = $rest->getCollection(); if ($restlist === false) { return false; } else { array_unshift($restlist, $first); return $restlist; } } elseif ($rest instanceof SMWExpResource && $rest->getUri() == $rdfnilUri) { return array($first); } else { return false; } } else { return false; } } elseif (count($this->m_children) == 0 && $this->m_subject->getUri() == $rdfnilUri) { return array(); } else { return false; } }
/** * Add to the output a serialization of a property assignment where an * SMWExpResource is the object. It is assumed that a suitable subject * block has already been openend. * * @param $expResourceProperty SMWExpNsResource the property to use * @param $expResource SMWExpResource the data value to use * @param $indent string specifying a prefix for indentation (usually a sequence of tabs) * @param $isClassTypeProp boolean whether the resource must be declared as a class */ protected function serializeExpResource(SMWExpNsResource $expResourceProperty, SMWExpResource $expResource, $indent, $isClassTypeProp) { $this->post_ns_buffer .= $indent . '<' . $expResourceProperty->getQName(); if (!$expResource->isBlankNode()) { if ($expResource instanceof SMWExpNsResource && $expResource->getNamespaceID() == 'wiki') { // very common case, reduce bandwidth $this->post_ns_buffer .= ' rdf:resource="&wiki;' . $expResource->getLocalName() . '"'; } else { $uriValue = $this->makeAttributeValueString($expResource->getUri()); $this->post_ns_buffer .= ' rdf:resource="' . $uriValue . '"'; } } $this->post_ns_buffer .= "/>\n"; if ($isClassTypeProp) { $this->requireDeclaration($expResource, SMW_SERIALIZER_DECL_CLASS); } }
/** * Update the declaration "todo" and "done" lists to reflect the fact that * the given element has been declared to has the given type. * * @param $element SMWExpResource specifying the element to update * @param $typeflag integer specifying the type (e.g. SMW_SERIALIZER_DECL_CLASS) */ protected function declarationDone(SMWExpResource $element, $typeflag) { $name = $element->getUri(); $curdone = array_key_exists($name, $this->decl_done) ? $this->decl_done[$name] : 0; $this->decl_done[$name] = $curdone | $typeflag; if (array_key_exists($name, $this->decl_todo)) { $this->decl_todo[$name] = $this->decl_todo[$name] & ~$typeflag; if ($this->decl_todo[$name] == 0) { unset($this->decl_todo[$name]); } } }