diff options
Diffstat (limited to 'SemanticMediaWiki/includes/export/SMW_Exporter.php')
-rw-r--r-- | SemanticMediaWiki/includes/export/SMW_Exporter.php | 737 |
1 files changed, 0 insertions, 737 deletions
diff --git a/SemanticMediaWiki/includes/export/SMW_Exporter.php b/SemanticMediaWiki/includes/export/SMW_Exporter.php deleted file mode 100644 index c8ec2835..00000000 --- a/SemanticMediaWiki/includes/export/SMW_Exporter.php +++ /dev/null @@ -1,737 +0,0 @@ -<?php - -use SMW\DataTypeRegistry; -use SMW\DataValueFactory; -use SMW\DIProperty; -use SMW\DIWikiPage; - -/** - * SMWExporter is a class for converting internal page-based data (SMWSemanticData) into - * a format for easy serialisation in OWL or RDF. - * - * @author Markus Krötzsch - * @ingroup SMW - */ -class SMWExporter { - - /** - * @var SMWExporter - */ - private static $instance = null; - - static protected $m_exporturl = false; - static protected $m_ent_wiki = false; - static protected $m_ent_property = false; - static protected $m_ent_wikiurl = false; - - /** - * @since 2.0 - * - * @return SMWExporter - */ - public static function getInstance() { - - if ( self::$instance === null ) { - - self::$instance = new self(); - self::$instance->initBaseURIs(); - } - - return self::$instance; - } - - /** - * @since 2.0 - */ - public static function clear() { - self::$instance = null; - } - - /** - * Make sure that necessary base URIs are initialised properly. - */ - static public function initBaseURIs() { - if ( self::$m_exporturl !== false ) return; - global $wgContLang, $wgServer, $wgArticlePath; - - global $smwgNamespace; // complete namespace for URIs (with protocol, usually http://) - if ( '' == $smwgNamespace ) { - $resolver = SpecialPage::getTitleFor( 'URIResolver' ); - $smwgNamespace = $resolver->getFullURL() . '/'; - } elseif ( $smwgNamespace[0] == '.' ) { - $resolver = SpecialPage::getTitleFor( 'URIResolver' ); - $smwgNamespace = "http://" . substr( $smwgNamespace, 1 ) . $resolver->getLocalURL() . '/'; - } - - // The article name must be the last part of wiki URLs for proper OWL/RDF export: - self::$m_ent_wikiurl = $wgServer . str_replace( '$1', '', $wgArticlePath ); - self::$m_ent_wiki = $smwgNamespace; - self::$m_ent_property = self::$m_ent_wiki . self::encodeURI( urlencode( str_replace( ' ', '_', $wgContLang->getNsText( SMW_NS_PROPERTY ) . ':' ) ) ); - $title = SpecialPage::getTitleFor( 'ExportRDF' ); - self::$m_exporturl = self::$m_ent_wikiurl . $title->getPrefixedURL(); - } - - /** - * @since 2.0 - * - * @return string - */ - public function getEncodedPropertyNamespace() { - return $this->encodeURI( urlencode( str_replace( ' ', '_', $GLOBALS['wgContLang']->getNsText( SMW_NS_PROPERTY ) . ':' ) ) ); - } - - /** - * Create exportable data from a given semantic data record. - * - * @param $semdata SMWSemanticData - * @return SMWExpData - */ - static public function makeExportData( SMWSemanticData $semdata ) { - self::initBaseURIs(); - $subject = $semdata->getSubject(); - if ( $subject->getNamespace() == SMW_NS_PROPERTY ) { - $types = $semdata->getPropertyValues( new SMWDIProperty( '_TYPE' ) ); - } else { - $types = array(); - } - $result = self::makeExportDataForSubject( $subject, end( $types ) ); - foreach ( $semdata->getProperties() as $property ) { - self::addPropertyValues( $property, $semdata->getPropertyValues( $property ), $result, $subject ); - } - return $result; - } - - /** - * Make an SMWExpData object for the given page, and include the basic - * properties about this subject that are not directly represented by - * SMW property values. The optional parameter $typevalueforproperty - * can be used to pass a particular SMWTypesValue object that is used - * for determining the OWL type for property pages. - * - * @todo Take into account whether the wiki page belongs to a builtin property, and ensure URI alignment/type declaration in this case. - * - * @param $diWikiPage SMWDIWikiPage - * @param $typesvalueforproperty mixed either an SMWTypesValue or null - * @param $addStubData boolean to indicate if additional data should be added to make a stub entry for this page - * @return SMWExpData - */ - static public function makeExportDataForSubject( SMWDIWikiPage $diWikiPage, $typesvalueforproperty = null, $addStubData = false ) { - global $wgContLang; - $wikiPageExpElement = self::getDataItemExpElement( $diWikiPage ); - $result = new SMWExpData( $wikiPageExpElement ); - - if ( $diWikiPage->getSubobjectName() !== '' ) { - $result->addPropertyObjectValue( self::getSpecialNsResource( 'rdf', 'type' ), self::getSpecialNsResource( 'swivt', 'Subject' ) ); - $masterPage = new SMWDIWikiPage( $diWikiPage->getDBkey(), $diWikiPage->getNamespace(), $diWikiPage->getInterwiki() ); - $masterExpElement = self::getDataItemExpElement( $masterPage ); - $result->addPropertyObjectValue( self::getSpecialNsResource( 'swivt', 'masterPage' ), $masterExpElement ); - // Add a sortkey: subobjects do not get this during parsing (they are no pages), - // but it is needed to query for them (e.g., to get a defined order for result pages) - $subObjectLabel = $diWikiPage->getDBkey() . '#' . $diWikiPage->getSubobjectName(); - $sortkey = new SMWExpLiteral( str_replace( '_', ' ', $subObjectLabel ) ); - $result->addPropertyObjectValue( self::getSpecialPropertyResource( '_SKEY' ), $sortkey ); - } else { - $pageTitle = str_replace( '_', ' ', $diWikiPage->getDBkey() ); - if ( $diWikiPage->getNamespace() !== 0 ) { - $prefixedSubjectTitle = $wgContLang->getNsText( $diWikiPage->getNamespace()) . ":" . $pageTitle; - } else { - $prefixedSubjectTitle = $pageTitle; - } - $prefixedSubjectUrl = wfUrlencode( str_replace( ' ', '_', $prefixedSubjectTitle ) ); - - switch ( $diWikiPage->getNamespace() ) { - case NS_CATEGORY: case SMW_NS_CONCEPT: - $maintype_pe = self::getSpecialNsResource( 'owl', 'Class' ); - $label = $pageTitle; - break; - case SMW_NS_PROPERTY: - if ( $typesvalueforproperty == null ) { - $types = \SMW\StoreFactory::getStore()->getPropertyValues( $diWikiPage, new SMWDIProperty( '_TYPE' ) ); - $typesvalueforproperty = end( $types ); - } - $maintype_pe = self::getSpecialNsResource( 'owl', self::getOWLPropertyType( $typesvalueforproperty ) ); - $label = $pageTitle; - break; - default: - $label = $prefixedSubjectTitle; - $maintype_pe = self::getSpecialNsResource( 'swivt', 'Subject' ); - } - - $result->addPropertyObjectValue( self::getSpecialNsResource( 'rdf', 'type' ), $maintype_pe ); - - if ( !$wikiPageExpElement->isBlankNode() ) { - $ed = new SMWExpLiteral( $label ); - $result->addPropertyObjectValue( self::getSpecialNsResource( 'rdfs', 'label' ), $ed ); - $ed = new SMWExpResource( self::getNamespaceUri( 'wikiurl' ) . $prefixedSubjectUrl ); - $result->addPropertyObjectValue( self::getSpecialNsResource( 'swivt', 'page' ), $ed ); - $ed = new SMWExpResource( self::$m_exporturl . '/' . $prefixedSubjectUrl ); - $result->addPropertyObjectValue( self::getSpecialNsResource( 'rdfs', 'isDefinedBy' ), $ed ); - $ed = new SMWExpLiteral( strval( $diWikiPage->getNamespace() ), 'http://www.w3.org/2001/XMLSchema#integer' ); - $result->addPropertyObjectValue( self::getSpecialNsResource( 'swivt', 'wikiNamespace' ), $ed ); - if ( $addStubData ) { - // Add a default sort key; for pages that exist in the wiki, - // this is set during parsing - $defaultSortkey = new SMWExpLiteral( str_replace( '_', ' ', $diWikiPage->getDBkey() ) ); - $result->addPropertyObjectValue( self::getSpecialPropertyResource( '_SKEY' ), $defaultSortkey ); - } - } - } - - return $result; - } - - /** - * Extend a given SMWExpData element by adding export data for the - * specified property data itme. This method is called when - * constructing export data structures from SMWSemanticData objects. - * - * @param $property SMWDIProperty - * @param $dataItems array of SMWDataItem objects for the given property - * @param $data SMWExpData to add the data to - */ - static public function addPropertyValues( SMWDIProperty $property, array $dataItems, SMWExpData &$expData ) { - if ( $property->isUserDefined() ) { - $pe = self::getResourceElementForProperty( $property ); - $peHelper = self::getResourceElementForProperty( $property, true ); - - foreach ( $dataItems as $dataItem ) { - $ed = self::getDataItemExpElement( $dataItem ); - if ( !is_null( $ed ) ) { - $expData->addPropertyObjectValue( $pe, $ed ); - } - - $edHelper = self::getDataItemHelperExpElement( $dataItem ); - if ( !is_null( $edHelper ) ) { - $expData->addPropertyObjectValue( $peHelper, $edHelper ); - } - } - } else { // pre-defined property, only exported if known - $diSubject = $expData->getSubject()->getDataItem(); - // subject wikipage required for disambiguating special properties: - if ( is_null( $diSubject ) || - $diSubject->getDIType() != SMWDataItem::TYPE_WIKIPAGE ) { - return; - } - - $pe = self::getSpecialPropertyResource( $property->getKey(), $diSubject->getNamespace() ); - if ( is_null( $pe ) ) return; // unknown special property, not exported - // have helper property ready before entering the for loop, even if not needed: - $peHelper = self::getResourceElementForProperty( $property, true ); - - $filterNamespace = ( $property->getKey() == '_REDI' || $property->getKey() == '_URI' ); - - foreach ( $dataItems as $dataItem ) { - // Basic namespace filtering to ensure that types match for redirects etc. - /// TODO: currently no full check for avoiding OWL DL illegal redirects is done (OWL property type ignored) - if ( $filterNamespace && !( $dataItem instanceof SMWDIUri ) && - ( !( $dataItem instanceof SMWDIWikiPage ) || - ( $dataItem->getNamespace() != $diSubject->getNamespace() ) ) ) { - continue; - } - - $ed = self::getDataItemExpElement( $dataItem ); - - if ( !is_null( $ed ) ) { - if ( $property->getKey() == '_CONC' && - $ed->getSubject()->getUri() === '' ) { - // equivalent to anonymous class -> simplify description - foreach ( $ed->getProperties() as $subp ) { - if ( $subp->getUri() != self::getSpecialNsResource( 'rdf', 'type' )->getUri() ) { - foreach ( $ed->getValues( $subp ) as $subval ) { - $expData->addPropertyObjectValue( $subp, $subval ); - } - } - } - } elseif ( $property->getKey() == '_REDI' ) { - $expData->addPropertyObjectValue( $pe, $ed ); - $peUri = self::getSpecialPropertyResource( '_URI' ); - $expData->addPropertyObjectValue( $peUri, $ed ); - } elseif ( !$property->isUserDefined() && !self::hasSpecialPropertyResource( $property ) ) { - $expData->addPropertyObjectValue( - self::getResourceElementForWikiPage( $property->getDiWikiPage(), 'aux' ), - $ed - ); - } else { - $expData->addPropertyObjectValue( $pe, $ed ); - } - } - - $edHelper = self::getDataItemHelperExpElement( $dataItem ); - if ( !is_null( $edHelper ) ) { - $expData->addPropertyObjectValue( $peHelper, $edHelper ); - } - } - } - } - - /** - * Create an SMWExpElement for some internal resource, given by an - * SMWDIProperty object. - * This code is only applied to user-defined properties, since the - * code for special properties in - * SMWExporter::getSpecialPropertyResource() may require information - * about the namespace in which some special property is used. - * - * @param $diProperty SMWDIProperty - * @param $helperProperty boolean determines if an auxiliary property resource to store a helper value (see SMWExporter::getDataItemHelperExpElement()) should be generated - * @return SMWExpResource - */ - static public function getResourceElementForProperty( SMWDIProperty $diProperty, $helperProperty = false ) { - $diWikiPage = $diProperty->getDiWikiPage(); - if ( is_null( $diWikiPage ) ) { - throw new Exception( 'SMWExporter::getResourceElementForProperty() can only be used for non-inverse, user-defined properties.' ); - } elseif ( $helperProperty ) { - return self::getResourceElementForWikiPage( $diWikiPage, 'aux' ); - } else { - return self::getResourceElementForWikiPage( $diWikiPage ); - } - } - - /** - * Create an SMWExpElement for some internal resource, given by an - * SMWDIWikiPage object. This is the one place in the code where URIs - * of wiki pages and user-defined properties are determined. A modifier - * can be given to make variants of a URI, typically done for - * auxiliary properties. In this case, the URI is modiied by appending - * "-23$modifier" where "-23" is the URI encoding of "#" (a symbol not - * occuring in MW titles). - * - * @param $diWikiPage SMWDIWikiPage or SMWDIProperty - * @param $modifier string, using only Latin letters and numbers - * @return SMWExpResource - */ - static public function getResourceElementForWikiPage( SMWDIWikiPage $diWikiPage, $modifier = '' ) { - global $wgContLang; - - if ( $diWikiPage->getNamespace() == NS_MEDIA ) { // special handling for linking media files directly (object only) - $title = Title::makeTitle( $diWikiPage->getNamespace(), $diWikiPage->getDBkey() ) ; - $file = wfFindFile( $title ); - if ( $file !== false ) { - return new SMWExpResource( $file->getFullURL() ); - } // else: Medialink to non-existing file :-/ fall through - } - - if ( $diWikiPage->getSubobjectName() !== '' ) { - $modifier = $diWikiPage->getSubobjectName(); - } - - if ( $modifier === '' ) { - $importProperty = new SMWDIProperty( '_IMPO' ); - $importDis = \SMW\StoreFactory::getStore()->getPropertyValues( $diWikiPage, $importProperty ); - $importURI = ( count( $importDis ) > 0 ); - } else { - $importURI = false; - } - - if ( $importURI ) { - $importValue = DataValueFactory::getInstance()->newDataItemValue( current( $importDis ), $importProperty ); - $namespace = $importValue->getNS(); - $namespaceId = $importValue->getNSID(); - $localName = $importValue->getLocalName(); - } else { - $localName = ''; - - if ( $diWikiPage->getNamespace() == SMW_NS_PROPERTY ) { - $namespace = self::getNamespaceUri( 'property' ); - $namespaceId = 'property'; - $localName = self::encodeURI( rawurlencode( $diWikiPage->getDBkey() ) ); - } - - if ( ( $localName === '' ) || - ( in_array( $localName{0}, array( '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) ) ) ) { - $namespace = self::getNamespaceUri( 'wiki' ); - $namespaceId = 'wiki'; - $localName = self::getEncodedPageName( $diWikiPage ); - } - - if ( $modifier !== '' ) { - $localName .= '-23' . $modifier; - } - } - - return new SMWExpNsResource( $localName, $namespace, $namespaceId, $diWikiPage ); - } - - /** - * Try to find an SMWDataItem that the given SMWExpElement might - * represent. Returns null if this attempt failed. - * - * @param SMWExpElement $expElement - * @return SMWDataItem or null - */ - static public function findDataItemForExpElement( SMWExpElement $expElement ) { - global $wgContLang; - - $dataItem = null; - if ( $expElement instanceof SMWExpResource ) { - $uri = $expElement->getUri(); - $wikiNamespace = self::getNamespaceUri( 'wiki' ); - - if ( strpos( $uri, $wikiNamespace ) === 0 ) { - $localName = substr( $uri, strlen( $wikiNamespace ) ); - $dbKey = rawurldecode( self::decodeURI( $localName ) ); - - $parts = explode( '#', $dbKey, 2 ); - if ( count( $parts ) == 2 ) { - $dbKey = $parts[0]; - $subobjectname = $parts[1]; - } else { - $subobjectname = ''; - } - - $parts = explode( ':', $dbKey, 2 ); - if ( count( $parts ) == 1 ) { - $dataItem = new SMWDIWikiPage( $dbKey, NS_MAIN, '', $subobjectname ); - } else { - // try the by far most common cases directly before using Title - $namespaceName = str_replace( '_', ' ', $parts[0] ); - $namespaceId = -1; - foreach ( array( SMW_NS_PROPERTY, NS_CATEGORY, NS_USER, NS_HELP ) as $nsId ) { - if ( $namespaceName == $wgContLang->getNsText( $nsId ) ) { - $namespaceId = $nsId; - break; - } - } - - if ( $namespaceId != -1 ) { - $dataItem = new SMWDIWikiPage( $parts[1], $namespaceId, '', $subobjectname ); - } else { - $title = Title::newFromDBkey( $dbKey ); - - if ( !is_null( $title ) ) { - $dataItem = new SMWDIWikiPage( $title->getDBkey(), $title->getNamespace(), $title->getInterwiki(), $subobjectname ); - } - } - } - } // else: not in wiki namespace -- TODO: this could be an imported URI - } else { - // TODO (currently not needed, but will be useful for displaying external SPARQL results) - } - return $dataItem; - } - - /** - * Determine what kind of OWL property some SMW property should be exported as. - * The input is an SMWTypesValue object, a typeid string, or empty (use default) - * @todo An improved mechanism for selecting property types here is needed. - */ - static public function getOWLPropertyType( $type = '' ) { - if ( $type instanceof SMWDIWikiPage ) { - $type = DataTypeRegistry::getInstance()->findTypeId( str_replace( '_', ' ', $type->getDBkey() ) ); - } elseif ( $type == false ) { - $type = ''; - } // else keep $type - switch ( $type ) { - case '_anu': return 'AnnotationProperty'; - case '': case '_wpg': case '_wpp': case '_wpc': case '_wpf': - case '_uri': case '_ema': case '_tel': case '_rec': case '__typ': - case '__red': case '__spf': case '__spu': - return 'ObjectProperty'; - default: return 'DatatypeProperty'; - } - } - - /** - * Get an SMWExpNsResource for a special property of SMW, or null if - * no resource is assigned to the given property key. The optional - * namespace is used to select the proper resource for properties that - * must take the type of the annotated object into account for some - * reason. - * - * @param $propertyKey string the Id of the special property - * @param $forNamespace integer the namespace of the page which has a value for this property - * @return SMWExpNsResource or null - */ - static public function getSpecialPropertyResource( $propertyKey, $forNamespace = NS_MAIN ) { - switch ( $propertyKey ) { - case '_INST': - return self::getSpecialNsResource( 'rdf', 'type' ); - case '_SUBC': - return self::getSpecialNsResource( 'rdfs', 'subClassOf' ); - case '_CONC': - return self::getSpecialNsResource( 'owl', 'equivalentClass' ); - case '_URI': - if ( $forNamespace == NS_CATEGORY || $forNamespace == SMW_NS_CONCEPT ) { - return self::getSpecialNsResource( 'owl', 'equivalentClass' ); - } elseif ( $forNamespace == SMW_NS_PROPERTY ) { - return self::getSpecialNsResource( 'owl', 'equivalentProperty' ); - } else { - return self::getSpecialNsResource( 'owl', 'sameAs' ); - } - case '_REDI': - return self::getSpecialNsResource( 'swivt', 'redirectsTo' ); - case '_SUBP': - if ( $forNamespace == SMW_NS_PROPERTY ) { - return self::getSpecialNsResource( 'rdfs', 'subPropertyOf' ); - } else { - return null; - } - case '_MDAT': - return self::getSpecialNsResource( 'swivt', 'wikiPageModificationDate' ); - case '_CDAT': - return self::getSpecialNsResource( 'swivt', 'wikiPageCreationDate' ); - case '_LEDT': - return self::getSpecialNsResource( 'swivt', 'wikiPageLastEditor' ); - case '_NEWP': - return self::getSpecialNsResource( 'swivt', 'wikiPageIsNew' ); - case '_SKEY': - return self::getSpecialNsResource( 'swivt', 'wikiPageSortKey' ); - case '_TYPE': - return self::getSpecialNsResource( 'swivt', 'type' ); - case '_IMPO': - return self::getSpecialNsResource( 'swivt', 'specialImportedFrom' ); - default: - return self::getSpecialNsResource( 'swivt', 'specialProperty' . $propertyKey ); - } - } - - - /** - * Create an SMWExpNsResource for some special element that belongs to - * a known vocabulary. An exception is generated when given parameters - * that do not fit any known vocabulary. - * - * @param $namespaceId string (e.g. "rdf") - * @param $localName string (e.g. "type") - * @return SMWExpNsResource - */ - static public function getSpecialNsResource( $namespaceId, $localName ) { - $namespace = self::getNamespaceUri( $namespaceId ); - if ( $namespace !== '' ) { - return new SMWExpNsResource( $localName, $namespace, $namespaceId ); - } else { - throw new InvalidArgumentException( "The vocabulary '$namespaceId' is not a known special vocabulary." ); - } - } - - /** - * This function escapes symbols that might be problematic in XML in a uniform - * and injective way. It is used to encode URIs. - */ - static public function encodeURI( $uri ) { - $uri = str_replace( '-', '-2D', $uri ); - // $uri = str_replace( '_', '-5F', $uri); //not necessary - $uri = str_replace( array( ':', '"', '#', '&', "'", '+', '!', '%' ), - array( '-3A', '-22', '-23', '-26', '-27', '-2B', '-21', '-' ), - $uri ); - return $uri; - } - - /** - * This function unescapes URIs generated with SMWExporter::encodeURI. This - * allows services that receive a URI to extract e.g. the according wiki page. - */ - static public function decodeURI( $uri ) { - $uri = str_replace( array( '-3A', '-22', '-23', '-26', '-27', '-2B', '-21', '-' ), - array( ':', '"', '#', '&', "'", '+', '!', '%' ), - $uri ); - $uri = str_replace( '%2D', '-', $uri ); - return $uri; - } - - /** - * This function expands standard XML entities used in some generated - * URIs. Given a string with such entities, it returns a string with - * all entities properly replaced. - * - * @note The function SMWExporter::getNamespaceUri() is often more - * suitable. This XML-specific method might become obsolete. - * - * @param $uri string of the URI to be expanded - * @return string of the expanded URI - */ - static public function expandURI( $uri ) { - self::initBaseURIs(); - $uri = str_replace( array( '&wiki;', '&wikiurl;', '&property;', '&owl;', '&rdf;', '&rdfs;', '&swivt;', '&export;' ), - array( self::$m_ent_wiki, self::$m_ent_wikiurl, self::$m_ent_property, 'http://www.w3.org/2002/07/owl#', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'http://www.w3.org/2000/01/rdf-schema#', 'http://semantic-mediawiki.org/swivt/1.0#', - self::$m_exporturl ), - $uri ); - return $uri; - } - - /** - * Get the URI of a standard namespace prefix used in SMW, or the empty - * string if the prefix is not known. - * - * @param $shortName string id (prefix) of the namespace - * @return string of the expanded URI - */ - static public function getNamespaceUri( $shortName ) { - self::initBaseURIs(); - switch ( $shortName ) { - case 'wiki': return self::$m_ent_wiki; - case 'wikiurl': return self::$m_ent_wikiurl; - case 'property': return self::$m_ent_property; - case 'export': return self::$m_exporturl; - case 'owl': return 'http://www.w3.org/2002/07/owl#'; - case 'rdf': return 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; - case 'rdfs': return 'http://www.w3.org/2000/01/rdf-schema#'; - case 'swivt': return 'http://semantic-mediawiki.org/swivt/1.0#'; - case 'xsd': return 'http://www.w3.org/2001/XMLSchema#'; - default: return ''; - } - } - - /** - * Create an SMWExpData container that encodes the ontology header for an - * SMW exported OWL file. - * - * @param string $ontologyuri specifying the URI of the ontology, possibly - * empty - */ - static public function getOntologyExpData( $ontologyuri ) { - $data = new SMWExpData( new SMWExpResource( $ontologyuri ) ); - $ed = self::getSpecialNsResource( 'owl', 'Ontology' ); - $data->addPropertyObjectValue( self::getSpecialNsResource( 'rdf', 'type' ), $ed ); - $ed = new SMWExpLiteral( date( DATE_W3C ), 'http://www.w3.org/2001/XMLSchema#dateTime' ); - $data->addPropertyObjectValue( self::getSpecialNsResource( 'swivt', 'creationDate' ), $ed ); - $ed = new SMWExpResource( 'http://semantic-mediawiki.org/swivt/1.0' ); - $data->addPropertyObjectValue( self::getSpecialNsResource( 'owl', 'imports' ), $ed ); - return $data; - } - - /** - * Create an SWMExpElement that encodes the data of the given - * dataitem object. This method is meant to be used when exporting a - * dataitem as a subject or object. To get the URI of a property, use - * SMWExporter::getResourceElementForProperty() or - * SMWExporter::getSpecialPropertyResource(). - * - * @param $dataItem SMWDataItem - * @return SMWExpElement - */ - static public function getDataItemExpElement( SMWDataItem $dataItem ) { - switch ( $dataItem->getDIType() ) { - case SMWDataItem::TYPE_NUMBER: - $lit = new SMWExpLiteral( strval( $dataItem->getNumber() ), 'http://www.w3.org/2001/XMLSchema#double', $dataItem ); - return $lit; - case SMWDataItem::TYPE_BLOB: - $lit = new SMWExpLiteral( smwfHTMLtoUTF8( $dataItem->getString() ), 'http://www.w3.org/2001/XMLSchema#string', $dataItem ); - return $lit; - case SMWDataItem::TYPE_BOOLEAN: - $xsdvalue = $dataItem->getBoolean() ? 'true' : 'false'; - $lit = new SMWExpLiteral( $xsdvalue, 'http://www.w3.org/2001/XMLSchema#boolean', $dataItem ); - return $lit; - case SMWDataItem::TYPE_URI: - $res = new SMWExpResource( $dataItem->getURI(), $dataItem ); - return $res; - case SMWDataItem::TYPE_TIME: - $gregorianTime = $dataItem->getForCalendarModel( SMWDITime::CM_GREGORIAN ); - if ( $gregorianTime->getYear() > 0 ) { - $xsdvalue = str_pad( $gregorianTime->getYear(), 4, "0", STR_PAD_LEFT ); - } else { - $xsdvalue = '-' . str_pad( 1 - $gregorianTime->getYear(), 4, "0", STR_PAD_LEFT ); - } - $xsdtype = 'http://www.w3.org/2001/XMLSchema#gYear'; - if ( $gregorianTime->getPrecision() >= SMWDITime::PREC_YM ) { - $xsdtype = 'http://www.w3.org/2001/XMLSchema#gYearMonth'; - $xsdvalue .= '-' . str_pad( $gregorianTime->getMonth(), 2, "0", STR_PAD_LEFT ); - if ( $gregorianTime->getPrecision() >= SMWDITime::PREC_YMD ) { - $xsdtype = 'http://www.w3.org/2001/XMLSchema#date'; - $xsdvalue .= '-' . str_pad( $gregorianTime->getDay(), 2, "0", STR_PAD_LEFT ); - if ( $gregorianTime->getPrecision() == SMWDITime::PREC_YMDT ) { - $xsdtype = 'http://www.w3.org/2001/XMLSchema#dateTime'; - $xsdvalue .= 'T' . - sprintf( "%02d", $gregorianTime->getHour() ) . ':' . - sprintf( "%02d", $gregorianTime->getMinute()) . ':' . - sprintf( "%02d", $gregorianTime->getSecond() ); - } - } - } - $xsdvalue .= 'Z'; - $lit = new SMWExpLiteral( $xsdvalue, $xsdtype, $gregorianTime ); - return $lit; - case SMWDataItem::TYPE_GEO: - /// TODO - return null; - case SMWDataItem::TYPE_CONTAINER: - return self::makeExportData( $dataItem->getSemanticData() ); - case SMWDataItem::TYPE_WIKIPAGE: - return self::getResourceElementForWikiPage( $dataItem ); - case SMWDataItem::TYPE_CONCEPT: - /// TODO - return null; - case SMWDataItem::TYPE_PROPERTY: - return self::getResourceElementForProperty( $dataItem ); - } - } - - /** - * Create an SWMExpElement that encodes auxiliary data for representing - * values of the specified dataitem object in a simplified fashion. - * This is done for types of dataitems that are not supported very well - * in current systems, or that do not match a standard datatype in RDF. - * For example, time points (DITime) are encoded as numbers. The number - * can replace the actual time for all query and ordering purposes (the - * order in either case is linear and maps to the real number line). - * Only data retrieval should better use the real values to avoid that - * rounding errors lead to unfaithful recovery of data. Note that the - * helper values do not maintain any association with their original - * values -- they are a fully redundant alternative representation, not - * an additional piece of information for the main values. Even if - * decoding is difficult, they must be in one-to-one correspondence to - * the original value. - * - * For dataitems that do not have such a simplification, the method - * returns null. - * - * @note If a helper element is used, then it must be the same as - * getDataItemHelperExpElement( $dataItem->getSortKeyDataItem() ). - * Query conditions like ">" use sortkeys for values, and helper - * elements are always preferred in query answering. - * - * @param $dataItem SMWDataItem - * @return SMWExpElement or null - */ - static public function getDataItemHelperExpElement( SMWDataItem $dataItem ) { - if ( $dataItem->getDIType() == SMWDataItem::TYPE_TIME ) { - $lit = new SMWExpLiteral( (string)$dataItem->getSortKey(), 'http://www.w3.org/2001/XMLSchema#double', $dataItem ); - return $lit; - } else { - return null; - } - } - - /** - * Check whether the values of a given type of dataitem have helper - * values in the sense of SMWExporter::getDataItemHelperExpElement(). - * - * @param DIProperty $property - * - * @return boolean - */ - static public function hasHelperExpElement( DIProperty $property ) { - return ( $property->findPropertyTypeID() === '_dat' ) || ( !$property->isUserDefined() && !self::hasSpecialPropertyResource( $property ) ); - } - - static protected function hasSpecialPropertyResource( DIProperty $property ) { - return $property->getKey() === '_SKEY' || - $property->getKey() === '_INST' || - $property->getKey() === '_MDAT' || - $property->getKey() === '_SUBC' || - $property->getKey() === '_SUBP' || - $property->getKey() === '_TYPE' || - $property->getKey() === '_IMPO' || - $property->getKey() === '_URI'; - } - - /** - * @since 2.0 - * - * @param DIWikiPage $diWikiPage - * @return string - */ - static public function getEncodedPageName( DIWikiPage $diWikiPage ) { - - $localName = ''; - - if ( $diWikiPage->getNamespace() !== 0 ) { - $localName = str_replace( ' ', '_', $GLOBALS['wgContLang']->getNSText( $diWikiPage->getNamespace() ) ) . ':' . $diWikiPage->getDBkey(); - } else { - $localName = $diWikiPage->getDBkey(); - } - - return self::encodeURI( wfUrlencode( $localName ) ); - } - -} |