diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2009-02-22 13:37:51 +0100 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2009-02-22 13:37:51 +0100 |
commit | b9b85843572bf283f48285001e276ba7e61b63f6 (patch) | |
tree | 4c6f4571552ada9ccfb4030481dcf77308f8b254 /includes/Metadata.php | |
parent | d9a20acc4e789cca747ad360d87ee3f3e7aa58c1 (diff) |
updated to MediaWiki 1.14.0
Diffstat (limited to 'includes/Metadata.php')
-rw-r--r-- | includes/Metadata.php | 528 |
1 files changed, 240 insertions, 288 deletions
diff --git a/includes/Metadata.php b/includes/Metadata.php index a543c73c..0b4fbf8c 100644 --- a/includes/Metadata.php +++ b/includes/Metadata.php @@ -20,347 +20,299 @@ * @author Evan Prodromou <evan@wikitravel.org> */ -/** - * TODO: Perhaps make this file into a Metadata class, with static methods (declared - * as private where indicated), to move these functions out of the global namespace? - */ -define('RDF_TYPE_PREFS', "application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1"); - -function wfDublinCoreRdf($article) { - - $url = dcReallyFullUrl($article->mTitle); - - if (rdfSetup()) { - dcPrologue($url); - dcBasics($article); - dcEpilogue(); +abstract class RdfMetaData { + const RDF_TYPE_PREFS = 'application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1'; + + /** + * Constructor + * @param $article Article object + */ + public function __construct( Article $article ){ + $this->mArticle = $article; } -} -function wfCreativeCommonsRdf($article) { + public abstract function show(); - if (rdfSetup()) { - global $wgRightsUrl; + /** + * + */ + protected function setup() { + global $wgOut, $wgRequest; - $url = dcReallyFullUrl($article->mTitle); + $httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null; + $rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) ); - ccPrologue(); - ccSubPrologue('Work', $url); - dcBasics($article); - if (isset($wgRightsUrl)) { - $url = htmlspecialchars( $wgRightsUrl ); - print " <cc:license rdf:resource=\"$url\" />\n"; + if( !$rdftype ){ + wfHttpError( 406, 'Not Acceptable', wfMsg( 'notacceptable' ) ); + return false; + } else { + $wgOut->disable(); + $wgRequest->response()->header( "Content-type: {$rdftype}; charset=utf-8" ); + $wgOut->sendCacheControl(); + return true; } + } - ccSubEpilogue('Work'); - - if (isset($wgRightsUrl)) { - $terms = ccGetTerms($wgRightsUrl); - if ($terms) { - ccSubPrologue('License', $wgRightsUrl); - ccLicense($terms); - ccSubEpilogue('License'); - } - } + /** + * + */ + protected function reallyFullUrl() { + return $this->mArticle->getTitle()->getFullURL(); } - ccEpilogue(); -} + protected function basics() { + global $wgContLanguageCode, $wgSitename; -/** - * @private - */ -function rdfSetup() { - global $wgOut, $_SERVER; + $this->element( 'title', $this->mArticle->mTitle->getText() ); + $this->pageOrString( 'publisher', wfMsg( 'aboutpage' ), $wgSitename ); + $this->element( 'language', $wgContLanguageCode ); + $this->element( 'type', 'Text' ); + $this->element( 'format', 'text/html' ); + $this->element( 'identifier', $this->reallyFullUrl() ); + $this->element( 'date', $this->date( $this->mArticle->getTimestamp() ) ); - $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null; + $lastEditor = User::newFromId( $this->mArticle->getUser() ); + $this->person( 'creator', $lastEditor ); - $rdftype = wfNegotiateType(wfAcceptToPrefs($httpaccept), wfAcceptToPrefs(RDF_TYPE_PREFS)); + foreach( $this->mArticle->getContributors() as $user ){ + $this->person( 'contributor', $user ); + } - if (!$rdftype) { - wfHttpError(406, "Not Acceptable", wfMsg("notacceptable")); - return false; - } else { - $wgOut->disable(); - header( "Content-type: {$rdftype}; charset=utf-8" ); - $wgOut->sendCacheControl(); - return true; + $this->rights(); } -} -/** - * @private - */ -function dcPrologue($url) { - global $wgOutputEncoding; + protected function element( $name, $value ) { + $value = htmlspecialchars( $value ); + print "\t\t<dc:{$name}>{$value}</dc:{$name}>\n"; + } - $url = htmlspecialchars( $url ); - print "<" . "?xml version=\"1.0\" encoding=\"{$wgOutputEncoding}\" ?" . "> + protected function date($timestamp) { + return substr($timestamp, 0, 4) . '-' + . substr($timestamp, 4, 2) . '-' + . substr($timestamp, 6, 2); + } - <!DOCTYPE rdf:RDF PUBLIC \"-//DUBLIN CORE//DCMES DTD 2002/07/31//EN\" \"http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd\"> + protected function pageOrString( $name, $page, $str ){ + if( $page instanceof Title ) + $nt = $page; + else + $nt = Title::newFromText( $page ); - <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" - xmlns:dc=\"http://purl.org/dc/elements/1.1/\"> - <rdf:Description rdf:about=\"$url\"> - "; -} + if( !$nt || $nt->getArticleID() == 0 ){ + $this->element( $name, $str ); + } else { + $this->page( $name, $nt ); + } + } -/** - * @private - */ -function dcEpilogue() { - print " - </rdf:Description> - </rdf:RDF> - "; -} + protected function page( $name, $title ){ + $this->url( $name, $title->getFullUrl() ); + } -/** - * @private - */ -function dcBasics($article) { - global $wgContLanguageCode, $wgSitename; - - dcElement('title', $article->mTitle->getText()); - dcPageOrString('publisher', wfMsg('aboutpage'), $wgSitename); - dcElement('language', $wgContLanguageCode); - dcElement('type', 'Text'); - dcElement('format', 'text/html'); - dcElement('identifier', dcReallyFullUrl($article->mTitle)); - dcElement('date', dcDate($article->getTimestamp())); - - $last_editor = $article->getUser(); - - if ($last_editor == 0) { - dcPerson('creator', 0); - } else { - dcPerson('creator', $last_editor, $article->getUserText(), - User::whoIsReal($last_editor)); + protected function url($name, $url) { + $url = htmlspecialchars( $url ); + print "\t\t<dc:{$name} rdf:resource=\"{$url}\" />\n"; } - $contributors = $article->getContributors(); + protected function person($name, User $user ){ + global $wgContLang; - foreach ($contributors as $user_parts) { - dcPerson('contributor', $user_parts[0], $user_parts[1], $user_parts[2]); + if( $user->isAnon() ){ + $this->element( $name, wfMsgExt( 'anonymous', array( 'parsemag' ), 1 ) ); + } else if( $real = $user->getRealName() ) { + $this->element( $name, $real ); + } else { + $this->pageOrString( $name, $user->getUserPage(), wfMsg( 'siteuser', $user->getName() ) ); + } } - dcRights(); -} + /** + * Takes an arg, for future enhancement with different rights for + * different pages. + */ + protected function rights() { + global $wgRightsPage, $wgRightsUrl, $wgRightsText; + + if( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) ) + && ($nt->getArticleID() != 0)) { + $this->page('rights', $nt); + } else if( $wgRightsUrl ){ + $this->url('rights', $wgRightsUrl); + } else if( $wgRightsText ){ + $this->element( 'rights', $wgRightsText ); + } + } -/** - * @private - */ -function ccPrologue() { - global $wgOutputEncoding; + protected function getTerms( $url ){ + global $wgLicenseTerms; - echo "<" . "?xml version='1.0' encoding='{$wgOutputEncoding}' ?" . "> + if( $wgLicenseTerms ){ + return $wgLicenseTerms; + } else { + $known = $this->getKnownLicenses(); + if( isset( $known[$url] ) ) { + return $known[$url]; + } else { + return array(); + } + } + } - <rdf:RDF xmlns:cc=\"http://web.resource.org/cc/\" - xmlns:dc=\"http://purl.org/dc/elements/1.1/\" - xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> - "; -} + protected function getKnownLicenses() { + $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc', + 'by-nc-sa', 'by-sa'); + $ccVersions = array('1.0', '2.0'); + $knownLicenses = array(); + + foreach ($ccVersions as $version) { + foreach ($ccLicenses as $license) { + if( $version == '2.0' && substr( $license, 0, 2) != 'by' ) { + # 2.0 dropped the non-attribs licenses + continue; + } + $lurl = "http://creativecommons.org/licenses/{$license}/{$version}/"; + $knownLicenses[$lurl] = explode('-', $license); + $knownLicenses[$lurl][] = 're'; + $knownLicenses[$lurl][] = 'di'; + $knownLicenses[$lurl][] = 'no'; + if (!in_array('nd', $knownLicenses[$lurl])) { + $knownLicenses[$lurl][] = 'de'; + } + } + } -/** - * @private - */ -function ccSubPrologue($type, $url) { - $url = htmlspecialchars( $url ); - echo " <cc:{$type} rdf:about=\"{$url}\">\n"; -} + /* Handle the GPL and LGPL, too. */ -/** - * @private - */ -function ccSubEpilogue($type) { - echo " </cc:{$type}>\n"; -} + $knownLicenses['http://creativecommons.org/licenses/GPL/2.0/'] = + array('de', 're', 'di', 'no', 'sa', 'sc'); + $knownLicenses['http://creativecommons.org/licenses/LGPL/2.1/'] = + array('de', 're', 'di', 'no', 'sa', 'sc'); + $knownLicenses['http://www.gnu.org/copyleft/fdl.html'] = + array('de', 're', 'di', 'no', 'sa', 'sc'); -/** - * @private - */ -function ccLicense($terms) { - - foreach ($terms as $term) { - switch ($term) { - case 're': - ccTerm('permits', 'Reproduction'); break; - case 'di': - ccTerm('permits', 'Distribution'); break; - case 'de': - ccTerm('permits', 'DerivativeWorks'); break; - case 'nc': - ccTerm('prohibits', 'CommercialUse'); break; - case 'no': - ccTerm('requires', 'Notice'); break; - case 'by': - ccTerm('requires', 'Attribution'); break; - case 'sa': - ccTerm('requires', 'ShareAlike'); break; - case 'sc': - ccTerm('requires', 'SourceCode'); break; - } + return $knownLicenses; } } -/** - * @private - */ -function ccTerm($term, $name) { - print " <cc:{$term} rdf:resource=\"http://web.resource.org/cc/{$name}\" />\n"; -} +class DublinCoreRdf extends RdfMetaData { -/** - * @private - */ -function ccEpilogue() { - echo "</rdf:RDF>\n"; -} + public function show(){ + if( $this->setup() ){ + $this->prologue(); + $this->basics(); + $this->epilogue(); + } + } -/** - * @private - */ -function dcElement($name, $value) { - $value = htmlspecialchars( $value ); - print " <dc:{$name}>{$value}</dc:{$name}>\n"; -} + /** + * begin of the page + */ + protected function prologue() { + global $wgOutputEncoding; + + $url = htmlspecialchars( $this->reallyFullUrl() ); + print <<<PROLOGUE +<?xml version="1.0" encoding="{$wgOutputEncoding}" ?> +<!DOCTYPE rdf:RDF PUBLIC "-//DUBLIN CORE//DCMES DTD 2002/07/31//EN" "http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd"> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <rdf:Description rdf:about="{$url}"> + +PROLOGUE; + } -/** - * @private - */ -function dcDate($timestamp) { - return substr($timestamp, 0, 4) . '-' - . substr($timestamp, 4, 2) . '-' - . substr($timestamp, 6, 2); + /** + * end of the page + */ + protected function epilogue() { + print <<<EPILOGUE + </rdf:Description> +</rdf:RDF> +EPILOGUE; + } } -/** - * @private - */ -function dcReallyFullUrl($title) { - return $title->getFullURL(); -} +class CreativeCommonsRdf extends RdfMetaData { -/** - * @private - */ -function dcPageOrString($name, $page, $str) { - $nt = Title::newFromText($page); + public function show(){ + if( $this->setup() ){ + global $wgRightsUrl; - if (!$nt || $nt->getArticleID() == 0) { - dcElement($name, $str); - } else { - dcPage($name, $nt); - } -} + $url = $this->reallyFullUrl(); -/** - * @private - */ -function dcPage($name, $title) { - dcUrl($name, dcReallyFullUrl($title)); -} + $this->prologue(); + $this->subPrologue('Work', $url); -/** - * @private - */ -function dcUrl($name, $url) { - $url = htmlspecialchars( $url ); - print " <dc:{$name} rdf:resource=\"{$url}\" />\n"; -} + $this->basics(); + if( $wgRightsUrl ){ + $url = htmlspecialchars( $wgRightsUrl ); + print "\t\t<cc:license rdf:resource=\"$url\" />\n"; + } -/** - * @private - */ -function dcPerson($name, $id, $user_name='', $user_real_name='') { - global $wgContLang; - - if ($id == 0) { - dcElement($name, wfMsg('anonymous')); - } else if ( !empty($user_real_name) ) { - dcElement($name, $user_real_name); - } else { - # XXX: This shouldn't happen. - if( empty( $user_name ) ) { - $user_name = User::whoIs($id); + $this->subEpilogue('Work'); + + if( $wgRightsUrl ){ + $terms = $this->getTerms( $wgRightsUrl ); + if( $terms ){ + $this->subPrologue( 'License', $wgRightsUrl ); + $this->license( $terms ); + $this->subEpilogue( 'License' ); + } + } } - dcPageOrString($name, $wgContLang->getNsText(NS_USER) . ':' . $user_name, wfMsg('siteuser', $user_name)); + + $this->epilogue(); } -} -/** - * Takes an arg, for future enhancement with different rights for - * different pages. - * @private - */ -function dcRights() { - - global $wgRightsPage, $wgRightsUrl, $wgRightsText; - - if (isset($wgRightsPage) && - ($nt = Title::newFromText($wgRightsPage)) - && ($nt->getArticleID() != 0)) { - dcPage('rights', $nt); - } else if (isset($wgRightsUrl)) { - dcUrl('rights', $wgRightsUrl); - } else if (isset($wgRightsText)) { - dcElement('rights', $wgRightsText); + protected function prologue() { + global $wgOutputEncoding; + echo <<<PROLOGUE +<?xml version='1.0' encoding="{$wgOutputEncoding}" ?> +<rdf:RDF xmlns:cc="http://web.resource.org/cc/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + +PROLOGUE; } -} -/** - * @private - */ -function ccGetTerms($url) { - global $wgLicenseTerms; - - if (isset($wgLicenseTerms)) { - return $wgLicenseTerms; - } else { - $known = getKnownLicenses(); - if( isset( $known[$url] ) ) { - return $known[$url]; - } else { - return array(); - } + protected function subPrologue( $type, $url ){ + $url = htmlspecialchars( $url ); + echo "\t<cc:{$type} rdf:about=\"{$url}\">\n"; } -} -/** - * @private - */ -function getKnownLicenses() { - - $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc', - 'by-nc-sa', 'by-sa'); - $ccVersions = array('1.0', '2.0'); - $knownLicenses = array(); - - foreach ($ccVersions as $version) { - foreach ($ccLicenses as $license) { - if( $version == '2.0' && substr( $license, 0, 2) != 'by' ) { - # 2.0 dropped the non-attribs licenses - continue; - } - $lurl = "http://creativecommons.org/licenses/{$license}/{$version}/"; - $knownLicenses[$lurl] = explode('-', $license); - $knownLicenses[$lurl][] = 're'; - $knownLicenses[$lurl][] = 'di'; - $knownLicenses[$lurl][] = 'no'; - if (!in_array('nd', $knownLicenses[$lurl])) { - $knownLicenses[$lurl][] = 'de'; + protected function subEpilogue($type) { + echo "\t</cc:{$type}>\n"; + } + + protected function license($terms) { + + foreach( $terms as $term ){ + switch( $term ) { + case 're': + $this->term('permits', 'Reproduction'); break; + case 'di': + $this->term('permits', 'Distribution'); break; + case 'de': + $this->term('permits', 'DerivativeWorks'); break; + case 'nc': + $this->term('prohibits', 'CommercialUse'); break; + case 'no': + $this->term('requires', 'Notice'); break; + case 'by': + $this->term('requires', 'Attribution'); break; + case 'sa': + $this->term('requires', 'ShareAlike'); break; + case 'sc': + $this->term('requires', 'SourceCode'); break; } } } - /* Handle the GPL and LGPL, too. */ - - $knownLicenses['http://creativecommons.org/licenses/GPL/2.0/'] = - array('de', 're', 'di', 'no', 'sa', 'sc'); - $knownLicenses['http://creativecommons.org/licenses/LGPL/2.1/'] = - array('de', 're', 'di', 'no', 'sa', 'sc'); - $knownLicenses['http://www.gnu.org/copyleft/fdl.html'] = - array('de', 're', 'di', 'no', 'sa', 'sc'); + protected function term( $term, $name ){ + print "\t\t<cc:{$term} rdf:resource=\"http://web.resource.org/cc/{$name}\" />\n"; + } - return $knownLicenses; -} + protected function epilogue() { + echo "</rdf:RDF>\n"; + } +}
\ No newline at end of file |