From b5946f6ee9e1a8374312b91e0d3fd277bcf76156 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 10 Apr 2004 11:19:33 +0000 Subject: [PATCH] Cleanup on Metadata (indentation, escaping of output). Put title attributes on the Creative Commons and Dublin Core links so they can be identified by humans in Mozilla's navigation bar. Add a as well if $wgRightsPage or $wgRightsUrl is set. Fix metadata links for MonoBook. Disable Smarty skins. --- includes/Metadata.php | 365 ++++++++++++++++++++-------------------- includes/OutputPage.php | 28 +-- includes/Skin.php | 55 +++--- includes/SkinPHPTal.php | 20 +-- 4 files changed, 247 insertions(+), 221 deletions(-) diff --git a/includes/Metadata.php b/includes/Metadata.php index 2e396faefb..ebc7164dc2 100644 --- a/includes/Metadata.php +++ b/includes/Metadata.php @@ -20,65 +20,67 @@ 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(); - } + + $url = dcReallyFullUrl($article->mTitle); + + if (rdfSetup()) { + dcPrologue($url); + dcBasics($article); + dcEpilogue(); + } } function wfCreativeCommonsRdf($article) { - - if (rdfSetup()) { - global $wgRightsUrl; - - $url = dcReallyFullUrl($article->mTitle); - - ccPrologue(); - ccSubPrologue('Work', $url); - dcBasics($article); - if (isset($wgRightsUrl)) { - print " \n"; - } - - ccSubEpilogue('Work'); - - if (isset($wgRightsUrl)) { - $terms = ccGetTerms($wgRightsUrl); - if ($terms) { - ccSubPrologue('License', $wgRightsUrl); - ccLicense($terms); - ccSubEpilogue('License'); - } - } - } - - ccEpilogue(); + + if (rdfSetup()) { + global $wgRightsUrl; + + $url = dcReallyFullUrl($article->mTitle); + + ccPrologue(); + ccSubPrologue('Work', $url); + dcBasics($article); + if (isset($wgRightsUrl)) { + $url = htmlspecialchars( $wgRightsUrl ); + print " \n"; + } + + ccSubEpilogue('Work'); + + if (isset($wgRightsUrl)) { + $terms = ccGetTerms($wgRightsUrl); + if ($terms) { + ccSubPrologue('License', $wgRightsUrl); + ccLicense($terms); + ccSubEpilogue('License'); + } + } + } + + ccEpilogue(); } /* private */ function rdfSetup() { - global $wgOut, $wgRdfMimeType, $_SERVER; - - $rdftype = wfNegotiateType(wfAcceptToPrefs($_SERVER['HTTP_ACCEPT']), wfAcceptToPrefs(RDF_TYPE_PREFS)); - - if (!$rdftype) { - wfHttpError(406, "Not Acceptable", wfMsg("notacceptable")); - return false; - } else { - $wgOut->disable(); - header( "Content-type: {$rdftype}" ); - $wgOut->sendCacheControl(); - return true; - } + global $wgOut, $wgRdfMimeType, $_SERVER; + + $rdftype = wfNegotiateType(wfAcceptToPrefs($_SERVER['HTTP_ACCEPT']), wfAcceptToPrefs(RDF_TYPE_PREFS)); + + if (!$rdftype) { + wfHttpError(406, "Not Acceptable", wfMsg("notacceptable")); + return false; + } else { + $wgOut->disable(); + header( "Content-type: {$rdftype}" ); + $wgOut->sendCacheControl(); + return true; + } } /* private */ function dcPrologue($url) { - global $wgOutputEncoding; - - print " + global $wgOutputEncoding; + + $url = htmlspecialchars( $url ); + print "<" . "?xml version=\"1.0\" encoding=\"{$wgOutputEncoding}\" ?" . "> @@ -89,37 +91,37 @@ function wfCreativeCommonsRdf($article) { } /* private */ function dcEpilogue() { - print " + print " "; } /* private */ function dcBasics($article) { - global $wgLanguageCode, $wgSitename; - - dcElement('title', $article->mTitle->getText()); - dcPageOrString('publisher', wfMsg('aboutpage'), $wgSitename); - dcElement('language', $wgLanguageCode); - dcElement('type', 'Text'); - dcElement('format', 'text/html'); - dcElement('identifier', dcReallyFullUrl($article->mTitle)); - dcElement('date', dcDate($article->getTimestamp())); - dcPerson('creator', $article->getUser()); - - $contributors = dcContributors($article->mTitle); - - foreach ($contributors as $cid) { - dcPerson('contributor', $cid); - } - - dcRights($article); + global $wgLanguageCode, $wgSitename; + + dcElement('title', $article->mTitle->getText()); + dcPageOrString('publisher', wfMsg('aboutpage'), $wgSitename); + dcElement('language', $wgLanguageCode); + dcElement('type', 'Text'); + dcElement('format', 'text/html'); + dcElement('identifier', dcReallyFullUrl($article->mTitle)); + dcElement('date', dcDate($article->getTimestamp())); + dcPerson('creator', $article->getUser()); + + $contributors = dcContributors($article->mTitle); + + foreach ($contributors as $cid) { + dcPerson('contributor', $cid); + } + + dcRights($article); } /* private */ function ccPrologue() { - global $wgOutputEncoding; - - echo " + global $wgOutputEncoding; + + echo "<" . "?xml version='1.0' encoding='{$wgOutputEncoding}' ?" . "> \n"; + $url = htmlspecialchars( $url ); + echo " \n"; } /* private */ function ccSubEpilogue($type) { - echo " \n"; + echo " \n"; } /* 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; - } - } + + 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; + } + } } /* private */ function ccTerm($term, $name) { - print " \n"; + print " \n"; } /* private */ function ccEpilogue() { - echo "\n"; + echo "\n"; } /* private */ function dcElement($name, $value) { - print " {$value}\n"; + $value = htmlspecialchars( $value ); + print " {$value}\n"; } /* private */ function dcDate($timestamp) { - return substr($timestamp, 0, 4) . "-" - . substr($timestamp, 4, 2) . "-" - . substr($timestamp, 6, 2); + return substr($timestamp, 0, 4) . "-" + . substr($timestamp, 4, 2) . "-" + . substr($timestamp, 6, 2); } /* private */ function dcReallyFullUrl($title) { - $title->getFullURL(); + return $title->getFullURL(); } /* private */ function dcPageOrString($name, $page, $str) { - $nt = Title::newFromText($page); - - if (!$nt || $nt->getArticleID() == 0) { - dcElement($name, $str); - } else { - dcPage($name, $nt); - } + $nt = Title::newFromText($page); + + if (!$nt || $nt->getArticleID() == 0) { + dcElement($name, $str); + } else { + dcPage($name, $nt); + } } /* private */ function dcPage($name, $title) { - dcUrl($name, dcReallyFullUrl($title)); + dcUrl($name, dcReallyFullUrl($title)); } /* private */ function dcUrl($name, $url) { - print " \n"; + $url = htmlspecialchars( $url ); + print " \n"; } /* private */ function dcPerson($name, $id) { - global $wgLang; - - if ($id == 0) { - dcElement($name, wfMsg("anonymous")); - } else { - $user_name = User::whoIs($id); - dcPageOrString($name, $wgLang->getNsText(NS_USER) . ":" . $user_name, $user_name); - } + global $wgLang; + + if ($id == 0) { + dcElement($name, wfMsg("anonymous")); + } else { + $user_name = User::whoIs($id); + dcPageOrString($name, $wgLang->getNsText(NS_USER) . ":" . $user_name, $user_name); + } } /* private */ function dcContributors($title) { - - $contribs = array(); - - $res = wfQuery("SELECT DISTINCT old_user" . - " FROM old " . - " WHERE old_namespace = " . $title->getNamespace() . - " AND old_title = '" . $title->getDBkey() . "'", DB_READ); - - while ( $line = wfFetchObject( $res ) ) { - $contribs[] = $line->old_user; - } - - return $contribs; + + $contribs = array(); + + $res = wfQuery("SELECT DISTINCT old_user" . + " FROM old " . + " WHERE old_namespace = " . $title->getNamespace() . + " AND old_title = '" . $title->getDBkey() . "'", DB_READ); + + while ( $line = wfFetchObject( $res ) ) { + $contribs[] = $line->old_user; + } + + return $contribs; } /* Takes an arg, for future enhancement with different rights for different pages. */ /* private */ function dcRights($article) { - - 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); - } + + 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); + } } /* private */ function ccGetTerms($url) { - global $wgLicenseTerms; - - if (isset($wgLicenseTerms)) { - return $wgLicenseTerms; - } else { - $known = getKnownLicenses(); - return $known[$url]; - } + global $wgLicenseTerms; + + if (isset($wgLicenseTerms)) { + return $wgLicenseTerms; + } else { + $known = getKnownLicenses(); + return $known[$url]; + } } /* private */ function getKnownLicenses() { - - $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc', - 'by-nc-sa', 'by-sa', 'nd', 'nd-nc', - 'nc', 'nc-sa', 'sa'); - - $knownLicenses = array(); - - foreach ($ccLicenses as $license) { - $lurl = "http://creativecommons.org/licenses/{$license}/1.0/"; - $knownLicenses[$lurl] = explode('-', $license); - $knownLicenses[$lurl][] = 're'; - $knownLicenses[$lurl][] = 'di'; - $knownLicenses[$lurl][] = 'no'; - if (!in_array('nd', $knownLicenses[$lurl])) { - $knownLicenses[$lurl][] = 'de'; - } - } - - /* 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'); - - return $knownLicenses; + + $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc', + 'by-nc-sa', 'by-sa', 'nd', 'nd-nc', + 'nc', 'nc-sa', 'sa'); + + $knownLicenses = array(); + + foreach ($ccLicenses as $license) { + $lurl = "http://creativecommons.org/licenses/{$license}/1.0/"; + $knownLicenses[$lurl] = explode('-', $license); + $knownLicenses[$lurl][] = 're'; + $knownLicenses[$lurl][] = 'di'; + $knownLicenses[$lurl][] = 'no'; + if (!in_array('nd', $knownLicenses[$lurl])) { + $knownLicenses[$lurl][] = 'de'; + } + } + + /* 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'); + + return $knownLicenses; } ?> diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 89ac0a9ab5..a1a96aad18 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -44,11 +44,17 @@ class OutputPage { # To add an http-equiv meta tag, precede the name with "http:" function addMeta( $name, $val ) { array_push( $this->mMetatags, array( $name, $val ) ); } function addKeyword( $text ) { array_push( $this->mKeywords, $text ); } - function addLink( $rel, $rev, $target, $type="", $media="" ) { array_push( $this->mLinktags, array( $rel, $rev, $target, $type, $media ) ); } + + function addLink( $linkarr ) { + # $linkarr should be an associative array of attributes. We'll escape on output. + array_push( $this->mLinktags, $linkarr ); + } - function addMetadataLink( $type, $target ) { + function addMetadataLink( $linkarr ) { + # note: buggy CC software only reads first "meta" link static $haveMeta = false; - $this->addLink( ($haveMeta) ? "alternate meta" : "meta", "", $target, $type ); + $linkarr["rel"] = ($haveMeta) ? "alternate meta" : "meta"; + $this->addLink( $linkarr ); $haveMeta = true; } @@ -621,7 +627,7 @@ class OutputPage { } function getHeadLinks() { - global $wgRequest; + global $wgRequest, $wgStyleSheetPath; $ret = ""; foreach ( $this->mMetatags as $tag ) { if ( 0 == strcasecmp( "http:", substr( $tag[0], 0, 5 ) ) ) { @@ -641,17 +647,19 @@ class OutputPage { implode( ",", $this->mKeywords ) . "\" />\n"; } foreach ( $this->mLinktags as $tag ) { - $ret .= "\n"; + $ret .= " $val ) { + $ret .= " $attr=\"" . htmlspecialchars( $val ) . "\""; + } + $ret .= " />\n"; } if( $this->isSyndicated() ) { $link = $wgRequest->escapeAppendQuery( "feed=rss" ); $ret .= "\n"; } + # FIXME: get these working + # $fix = htmlspecialchars( $wgStyleSheetPath . "/ie-png-fix.js" ); + # $ret .= ""; return $ret; } } diff --git a/includes/Skin.php b/includes/Skin.php index 20b98b7f62..7c5b78eea9 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -13,10 +13,6 @@ include_once( "Feed.php" ); 'nostalgia' => "Nostalgia", 'cologneblue' => "CologneBlue" ); -if( $wgUseSmarty ) { - $wgValidSkinNames['smarty'] = "Smarty"; - $wgValidSkinNames['montparnasse'] = "Montparnasse"; -} if( $wgUsePHPTal ) { #$wgValidSkinNames[] = "PHPTal"; #$wgValidSkinNames['davinci'] = "DaVinci"; @@ -97,25 +93,47 @@ class Skin { $fname = "Skin::initPage"; wfProfileIn( $fname ); - $out->addLink( "shortcut icon", "", "/favicon.ico" ); - - $this->addMetadataLinks($out); + $out->addLink( array( "rel" => "shortcut icon", "href" => "/favicon.ico" ) ); + + $this->addMetadataLinks($out); wfProfileOut( $fname ); } - function addMetadataLinks( &$out ) { - global $wgTitle, $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgRdfMimeType, $action; - - if ($action == 'view') { - # note: buggy CC software only reads first "meta" link - if ($wgEnableCreativeCommonsRdf) { - $out->addMetadataLink('application/rdf+xml', wfLocalUrl($wgTitle->getPrefixedURL(), "action=creativecommons")); + function addMetadataLinks( &$out ) { + global $wgTitle, $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgRdfMimeType, $action; + global $wgRightsPage, $wgRightsUrl; + + if( $out->isArticleRelated() ) { + # note: buggy CC software only reads first "meta" link + if( $wgEnableCreativeCommonsRdf ) { + $out->addMetadataLink( array( + 'title' => 'Creative Commons', + 'type' => 'application/rdf+xml', + 'href' => $wgTitle->getLocalURL( "action=creativecommons") ) ); + } + if( $wgEnableDublinCoreRdf ) { + $out->addMetadataLink( array( + 'title' => 'Dublin Core', + 'type' => 'application/rdf+xml', + 'href' => $wgTitle->getLocalURL( "action=dublincore" ) ) ); + } + } + $copyright = ""; + if( $wgRightsPage ) { + $copy = Title::newFromText( $wgRightsPage ); + if( $copy ) { + $copyright = $copy->getLocalURL(); + } } - if ($wgEnableDublinCoreRdf) { - $out->addMetadataLink('application/rdf+xml', wfLocalUrl($wgTitle->getPrefixedURL(), "action=dublincore")); + if( !$copyright && $wgRightsUrl ) { + $copyright = $wgRightsUrl; + } + if( $copyright ) { + $out->addLink( array( + "rel" => "copyright", + "href" => $copyright ) ); } - } } function outputPage( &$out ) { @@ -2501,9 +2519,6 @@ include_once( "SkinStandard.php" ); include_once( "SkinNostalgia.php" ); include_once( "SkinCologneBlue.php" ); -if( $wgUseSmarty ) { - include_once( "SkinSmarty.php" ); -} if( $wgUsePHPTal ) { include_once( "SkinPHPTal.php" ); } diff --git a/includes/SkinPHPTal.php b/includes/SkinPHPTal.php index 4bc016125b..c85ee325e8 100644 --- a/includes/SkinPHPTal.php +++ b/includes/SkinPHPTal.php @@ -54,7 +54,8 @@ class SkinPHPTal extends Skin { var $template; - function initPage() { + function initPage( &$out ) { + parent::initPage( $out ); $this->skinname = "davinci"; $this->template = "xhtml_slim"; } @@ -71,7 +72,7 @@ $this->titletxt = $wgTitle->getPrefixedText(); - $this->initPage(); + $this->initPage( $out ); $tpl = new PHPTAL($this->template . '.pt', 'templates'); #if ( $wgUseDatabaseMessages ) { // uncomment this to fall back to GetText @@ -403,26 +404,23 @@ } class SkinDaVinci extends SkinPHPTal { - function initPage() { - SkinPHPTal::initPage(); + function initPage( &$out ) { + SkinPHPTal::initPage( $out ); $this->skinname = "davinci"; - $this->template = "xhtml_slim"; } } class SkinMono extends SkinPHPTal { - function initPage() { - SkinPHPTal::initPage(); + function initPage( &$out ) { + SkinPHPTal::initPage( $out ); $this->skinname = "mono"; - $this->template = "xhtml_slim"; } } class SkinMonoBook extends SkinPHPTal { - function initPage() { - SkinPHPTal::initPage(); + function initPage( &$out ) { + SkinPHPTal::initPage( $out ); $this->skinname = "monobook"; - $this->template = "xhtml_slim"; } } -- 2.20.1