diff options
Diffstat (limited to 'www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php')
-rw-r--r-- | www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php | 543 |
1 files changed, 273 insertions, 270 deletions
diff --git a/www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php b/www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php index 0769213d..6ca75fad 100644 --- a/www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php +++ b/www/wiki/extensions/SemanticResultFormats/src/vCard/vCardFileExportPrinter.php @@ -22,6 +22,7 @@ use WikiPage; * @author Markus Krötzsch * @author Denny Vrandecic * @author Frank Dengler + * @author mwjames */ class vCardFileExportPrinter extends FileExportPrinter { @@ -56,7 +57,14 @@ class vCardFileExportPrinter extends FileExportPrinter { */ public function getFileName( QueryResult $queryResult ) { - if ( $this->getSearchLabel( SMW_OUTPUT_WIKI ) != '' ) { + if ( $this->params['filename'] !== '' ) { + + if ( strpos( $this->params['filename'], '.vcf' ) === false ) { + $this->params['filename'] .= '.vcf'; + } + + return str_replace( ' ', '_', $this->params['filename'] ); + } elseif ( $this->getSearchLabel( SMW_OUTPUT_WIKI ) != '' ) { return str_replace( ' ', '_', $this->getSearchLabel( SMW_OUTPUT_WIKI ) ) . '.vcf'; } @@ -75,44 +83,71 @@ class vCardFileExportPrinter extends FileExportPrinter { } /** + * @see ResultPrinter::getParamDefinitions + * + * @since 1.8 + * + * {@inheritDoc} + */ + public function getParamDefinitions( array $definitions ) { + $params = parent::getParamDefinitions( $definitions ); + + $params['filename'] = [ + 'message' => 'smw-paramdesc-filename', + 'default' => 'vCard.vcf', + ]; + + return $params; + } + + /** * @see ResultPrinter::getResultText */ - protected function getResultText( QueryResult $res, $outputmode ) { + protected function getResultText( QueryResult $res, $outputMode ) { - $result = ''; + // Always return a link for when the output mode is not a file request, + // a file request is normally only initiated when resolving the query + // via Special:Ask + if ( $outputMode !== SMW_OUTPUT_FILE ) { + return $this->getVCardLink( $res, $outputMode ); + } - if ( $outputmode == SMW_OUTPUT_FILE ) { // make vCard file - $result = $this->getVCardContent( $res ); - } else { // just make link to vcard + return $this->getVCardContent( $res ); + } - if ( $this->getSearchLabel( $outputmode ) ) { - $label = $this->getSearchLabel( $outputmode ); - } else { - $label = wfMessage( 'srf_vcard_link' )->inContentLanguage()->text(); - } + private function getVCardLink( QueryResult $res, $outputMode ) { - $link = $res->getQueryLink( $label ); - $link->setParameter( 'vcard', 'format' ); + // Can be viewed as HTML if requested, no more parsing needed + $this->isHTML = $outputMode == SMW_OUTPUT_HTML; - if ( $this->getSearchLabel( SMW_OUTPUT_WIKI ) != '' ) { - $link->setParameter( $this->getSearchLabel( SMW_OUTPUT_WIKI ), 'searchlabel' ); - } + if ( $this->getSearchLabel( $outputMode ) ) { + $label = $this->getSearchLabel( $outputMode ); + } else { + $label = wfMessage( 'srf_vcard_link' )->inContentLanguage()->text(); + } - if ( array_key_exists( 'limit', $this->params ) ) { - $link->setParameter( $this->params['limit'], 'limit' ); - } else { // use a reasonable default limit - $link->setParameter( 20, 'limit' ); - } + $link = $res->getQueryLink( $label ); + $link->setParameter( 'vcard', 'format' ); - $result .= $link->getText( $outputmode, $this->mLinker ); + if ( $this->getSearchLabel( SMW_OUTPUT_WIKI ) != '' ) { + $link->setParameter( $this->getSearchLabel( SMW_OUTPUT_WIKI ), 'searchlabel' ); + } - // yes, our code can be viewed as HTML if requested, no more parsing needed - $this->isHTML = ( $outputmode == SMW_OUTPUT_HTML ); + if ( array_key_exists( 'limit', $this->params ) ) { + $link->setParameter( $this->params['limit'], 'limit' ); + } else { // use a reasonable default limit + $link->setParameter( 20, 'limit' ); } - return $result; + return $link->getText( $outputMode, $this->mLinker ); } + /** + * @param QueryResult $res + * + * @return string + * @throws \MWException + */ private function getVCardContent( $res ) { $result = ''; @@ -147,250 +182,232 @@ class vCardFileExportPrinter extends FileExportPrinter { private function newVCard( $row, $uri, $text, $timestamp, $isPublic ) { - // name - $prefix = ''; // something like 'Dr.' - $firstname = ''; // given name - $additionalname = ''; // typically the "middle" name (second first name) - $lastname = ''; // family name - $suffix = ''; // things like "jun." or "sen." - $fullname = ''; // the "formatted name", may be independent from first/lastname & co. - // contacts - $emails = []; - $tels = []; - $addresses = []; - // organisational details: - $organization = ''; // any string - $jobtitle = ''; - $role = ''; - $department = ''; - // other stuff - $category = ''; - $birthday = ''; // a date - $url = ''; // homepage, a legal URL - $note = ''; // any text - $workaddress = false; - $homeaddress = false; - - $workpostofficebox = ''; - $workextendedaddress = ''; - $workstreet = ''; - $worklocality = ''; - $workregion = ''; - $workpostalcode = ''; - $workcountry = ''; - - $homepostofficebox = ''; - $homeextendedaddress = ''; - $homestreet = ''; - $homelocality = ''; - $homeregion = ''; - $homepostalcode = ''; - $homecountry = ''; - - foreach ( $row as $field ) { - // later we may add more things like a generic - // mechanism to add non-standard vCard properties as well - // (could include funny things like geo, description etc.) - $req = $field->getPrintRequest(); - - switch ( strtolower( $req->getLabel() ) ) { - case "name": - $fullname = $this->getFieldValue( $field ); - break; - case "prefix": - $prefix = $this->getFieldCommaList( $field ); - break; - case "suffix": - $suffix = $this->getFieldCommaList( $field ); - break; - case "firstname": - // save only the first - $firstname = $this->getFieldValue( $field ); - break; - case "extraname": - $additionalname = $this->getFieldCommaList( $field ); - break; - case "lastname": - // save only the first - $lastname = $this->getFieldValue( $field ); - break; - case "note": - $note = $this->getFieldCommaList( $field ); - break; - case "category": - $category = $this->getFieldCommaList( $field ); - case "email": - while ( $value = $field->getNextDataValue() ) { - $emails[] = new Email( 'INTERNET', $value->getShortWikiText() ); - } - break; - case "workphone": - while ( $value = $field->getNextDataValue() ) { - $tels[] = new Tel( 'WORK', $value->getShortWikiText() ); - } - break; - case "cellphone": - while ( $value = $field->getNextDataValue() ) { - $tels[] = new Tel( 'CELL', $value->getShortWikiText() ); - } - break; - case "homephone": - while ( $value = $field->getNextDataValue() ) { - $tels[] = new Tel( 'HOME', $value->getShortWikiText() ); - } - break; - case "organization": - $organization = $this->getFieldValue( $field ); - break; - case "workpostofficebox": - if ( ( $workpostofficebox = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "workextendedaddress": - if ( ( $workextendedaddress = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "workstreet": - if ( ( $workstreet = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "worklocality": - if ( ( $worklocality = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "workregion": - if ( ( $workregion = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "workpostalcode": - if ( ( $workpostalcode = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "workcountry": - if ( ( $workcountry = $this->getFieldValue( $field ) ) !== '' ) { - $workaddress = true; - } - break; - case "homepostofficebox": - if ( ( $homepostofficebox = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homeextendedaddress": - if ( ( $homeextendedaddress = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homestreet": - if ( ( $homestreet = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homelocality": - if ( ( $homelocality = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homeregion": - if ( ( $homeregion = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homepostalcode": - if ( ( $homepostalcode = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "homecountry": - if ( ( $homecountry = $this->getFieldValue( $field ) ) !== '' ) { - $homeaddress = true; - } - break; - case "birthday": - if ( $req->getTypeID() == TimeValue::TYPE_ID ) { - $value = $field->getNextDataValue(); - if ( $value !== false ) { - $birthday = $value->getISO8601Date(); - } - } - break; - case "homepage": - if ( $req->getTypeID() == "_uri" ) { - $value = $field->getNextDataValue(); - if ( $value !== false ) { - $url = $value->getWikiValue(); - } - } - break; - } - } - - if ( $workaddress ) { - $addresses[] = new Address ( - 'WORK', - [ - 'pobox' => $workpostofficebox, - 'ext' => $workextendedaddress, - 'street' => $workstreet, - 'locality' => $worklocality, - 'region' => $workregion, - 'code' => $workpostalcode, - 'country' => $workcountry - ] - ); - } - - if ( $homeaddress ) { - $addresses[] = new Address ( - 'HOME', - [ - 'pobox' => $homepostofficebox, - 'ext' => $homeextendedaddress, - 'street' => $homestreet, - 'locality' => $homelocality, - 'region' => $homeregion, - 'code' => $homepostalcode, - 'country' => $homecountry - ] - ); - } - $vCard = new vCard( $uri, $text, [ - 'prefix' => $prefix, - 'firstname' => $firstname, - 'lastname' => $lastname, - 'additionalname' => $additionalname, - 'suffix' => $suffix, - 'fullname' => $fullname, - 'tel' => $tels, - 'address' => $addresses, - 'email' => $emails, - 'birthday' => $birthday, - 'title' => $jobtitle, - 'role' => $role, - 'organization' => $organization, - 'department' => $department, - 'category' => $category, - 'url' => $url, - 'note' => $note + + // something like 'Dr.' + 'prefix' => '', + + // given name + 'firstname' => '', + + // family name + 'lastname' => '', + + // typically the "middle" name (second first name) + 'additionalname' => '', + + // things like "jun." or "sen." + 'suffix' => '', + + // the "formatted name", may be independent from + // first/lastname & co. + 'fullname' => '', + + 'tel' => [], + 'address' => [], + 'email' => [], + // a date + 'birthday' => '', + + // organisational details + 'organization' => '', + 'department' => '', + 'title' => '', + 'role' => '', + 'category' => '', + + // homepage, a legal URL + 'url' => '', + + // any text + 'note' => '' ] ); + $tels = []; + $emails = []; + + $addresses['work'] = new Address( 'WORK' ); + $addresses['home'] = new Address( 'HOME' ); + + foreach ( $row as $field ) { + $this->mapField( $field, $vCard, $tels, $addresses, $emails ); + } + + $vCard->set( 'tel', $tels ); + $vCard->set( 'address', $addresses ); + $vCard->set( 'email', $emails ); + $vCard->isPublic( $isPublic ); $vCard->setTimestamp( $timestamp ); return $vCard; } + private function isPublic() { + // heuristic for setting confidentiality level of vCard: + global $wgGroupPermissions; + + if ( ( array_key_exists( '*', $wgGroupPermissions ) ) && ( array_key_exists( + 'read', + $wgGroupPermissions['*'] + ) ) ) { + return $wgGroupPermissions['*']['read']; + } + + return true; + } + + private function mapField( $field, $vCard, &$tels, &$addresses, &$emails ) { + + $printRequest = $field->getPrintRequest(); + + switch ( strtolower( $printRequest->getLabel() ) ) { + case "name": + $vCard->set( 'fullname', $this->getFieldValue( $field ) ); + break; + case "prefix": + $vCard->set( 'prefix', $this->getFieldCommaList( $field ) ); + break; + case "suffix": + $vCard->set( 'suffix', $this->getFieldCommaList( $field ) ); + break; + case "firstname": + // save only the first + $vCard->set( 'firstname', $this->getFieldValue( $field ) ); + break; + case "additionalname": + case "extraname": + $vCard->set( 'additionalname', $this->getFieldCommaList( $field ) ); + break; + case "lastname": + // save only the first + $vCard->set( 'lastname', $this->getFieldValue( $field ) ); + break; + case "note": + $vCard->set( 'note', $this->getFieldCommaList( $field ) ); + break; + case "category": + $vCard->set( 'category', $this->getFieldCommaList( $field ) ); + case "email": + while ( $value = $field->getNextDataValue() ) { + $emails[] = new Email( 'INTERNET', $value->getShortWikiText() ); + } + break; + case "workphone": + while ( $value = $field->getNextDataValue() ) { + $tels[] = new Tel( 'WORK', $value->getShortWikiText() ); + } + break; + case "cellphone": + while ( $value = $field->getNextDataValue() ) { + $tels[] = new Tel( 'CELL', $value->getShortWikiText() ); + } + break; + case "homephone": + while ( $value = $field->getNextDataValue() ) { + $tels[] = new Tel( 'HOME', $value->getShortWikiText() ); + } + break; + case "organization": + $vCard->set( 'organization', $this->getFieldValue( $field ) ); + break; + case "workpostofficebox": + if ( ( $workpostofficebox = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'pobox', $workpostofficebox ); + } + break; + case "workextendedaddress": + if ( ( $workextendedaddress = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'ext', $workextendedaddress ); + } + break; + case "workstreet": + if ( ( $workstreet = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'street', $workstreet ); + } + break; + case "worklocality": + if ( ( $worklocality = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'locality', $worklocality ); + } + break; + case "workregion": + if ( ( $workregion = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'region', $workregion ); + } + break; + case "workpostalcode": + if ( ( $workpostalcode = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'code', $workpostalcode ); + } + break; + case "workcountry": + if ( ( $workcountry = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['work']->set( 'country', $workcountry ); + } + break; + case "homepostofficebox": + if ( ( $homepostofficebox = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'pobox', $homepostofficebox ); + } + break; + case "homeextendedaddress": + if ( ( $homeextendedaddress = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'ext', $homeextendedaddress ); + } + break; + case "homestreet": + if ( ( $homestreet = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'street', $homestreet ); + } + break; + case "homelocality": + if ( ( $homelocality = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'locality', $homelocality ); + } + break; + case "homeregion": + if ( ( $homeregion = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'region', $homeregion ); + } + break; + case "homepostalcode": + if ( ( $homepostalcode = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'code', $homepostalcode ); + } + break; + case "homecountry": + if ( ( $homecountry = $this->getFieldValue( $field ) ) !== '' ) { + $addresses['home']->set( 'country', $homecountry ); + } + break; + case "birthday": + if ( $printRequest->getTypeID() == TimeValue::TYPE_ID ) { + $value = $field->getNextDataValue(); + + if ( $value !== false ) { + $birthday = $value->getISO8601Date(); + $vCard->set( 'birthday', $birthday ); + } + } + break; + case "homepage": + if ( $printRequest->getTypeID() == "_uri" ) { + $value = $field->getNextDataValue(); + + if ( $value !== false ) { + $url = $value->getWikiValue(); + $vCard->set( 'url', $url ); + } + } + break; + } + } + private function getFieldCommaList( $field ) { $list = ''; @@ -413,18 +430,4 @@ class vCardFileExportPrinter extends FileExportPrinter { return $v; } - private function isPublic() { - // heuristic for setting confidentiality level of vCard: - global $wgGroupPermissions; - - if ( ( array_key_exists( '*', $wgGroupPermissions ) ) && ( array_key_exists( - 'read', - $wgGroupPermissions['*'] - ) ) ) { - return $wgGroupPermissions['*']['read']; - } - - return true; - } - } |