Index: trunk/phase3/skins/MonoBook.php |
— | — | @@ -115,7 +115,7 @@ |
116 | 116 | <div id="content"> |
117 | 117 | <a name="top" id="top"></a> |
118 | 118 | <?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?> |
119 | | - <h1 class="firstHeading"><?php $this->data['displaytitle']!=""?$this->html('title'):$this->text('title') ?></h1> |
| 119 | + <h1 class="firstHeading"><?php $this->html('title'); ?></h1> |
120 | 120 | <div id="bodyContent"> |
121 | 121 | <h3 id="siteSub"><?php $this->msg('tagline') ?></h3> |
122 | 122 | <div id="contentSub"><?php $this->html('subtitle') ?></div> |
Index: trunk/phase3/skins/Modern.php |
— | — | @@ -102,7 +102,7 @@ |
103 | 103 | class="mediawiki <?php $this->text('dir') ?> <?php $this->text('pageclass') ?> <?php $this->text('skinnameclass') ?>"> |
104 | 104 | |
105 | 105 | <!-- heading --> |
106 | | - <div id="mw_header"><h1 id="firstHeading"><?php $this->data['displaytitle']!=""?$this->html('title'):$this->text('title') ?></h1></div> |
| 106 | + <div id="mw_header"><h1 id="firstHeading"><?php $this->html('title') ?></h1></div> |
107 | 107 | |
108 | 108 | <div id="mw_main"> |
109 | 109 | <div id="mw_contentwrapper"> |
Index: trunk/phase3/includes/parser/ParserOutput.php |
— | — | @@ -29,7 +29,8 @@ |
30 | 30 | /** |
31 | 31 | * Overridden title for display |
32 | 32 | */ |
33 | | - private $displayTitle = false; |
| 33 | + private $displayTitle = false; #for use in the <title> tag |
| 34 | + private $displayTitleH1 = false; #for use in the <h1> tag, may contain further HTML tags |
34 | 35 | |
35 | 36 | function ParserOutput( $text = '', $languageLinks = array(), $categoryLinks = array(), |
36 | 37 | $containsOldMagic = false, $titletext = '' ) |
— | — | @@ -145,6 +146,15 @@ |
146 | 147 | } |
147 | 148 | |
148 | 149 | /** |
| 150 | + * Get the title to be used for display |
| 151 | + * |
| 152 | + * @return string |
| 153 | + */ |
| 154 | + public function getDisplayTitle() { |
| 155 | + return $this->displayTitle; |
| 156 | + } |
| 157 | + |
| 158 | + /** |
149 | 159 | * Override the title to be used for display |
150 | 160 | * -- this is assumed to have been validated |
151 | 161 | * (check equal normalisation, etc.) |
— | — | @@ -154,15 +164,14 @@ |
155 | 165 | public function setDisplayTitle( $text ) { |
156 | 166 | $this->displayTitle = $text; |
157 | 167 | } |
158 | | - |
159 | | - /** |
160 | | - * Get the title to be used for display |
161 | | - * |
162 | | - * @return string |
163 | | - */ |
164 | | - public function getDisplayTitle() { |
165 | | - return $this->displayTitle; |
| 168 | + |
| 169 | + public function getDisplayTitleH1() { |
| 170 | + return $this->displayTitleH1; |
166 | 171 | } |
| 172 | + |
| 173 | + public function setDisplayTitleH1( $html ) { |
| 174 | + $this->displayTitleH1 = $html; |
| 175 | + } |
167 | 176 | |
168 | 177 | /** |
169 | 178 | * Fairly generic flag setter thingy. |
Index: trunk/phase3/includes/parser/CoreParserFunctions.php |
— | — | @@ -164,17 +164,32 @@ |
165 | 165 | * @param string $text Desired title text |
166 | 166 | * @return string |
167 | 167 | */ |
168 | | - static function displaytitle( $parser, $text = '' ) { |
| 168 | + static function displaytitle( $parser, $displayTitleH1 = '', $displayTitleTitle = '' ) { |
169 | 169 | global $wgRestrictDisplayTitle; |
170 | | - $text = trim( Sanitizer::decodeCharReferences( $text ) ); |
171 | | - |
| 170 | + |
| 171 | + $titleHTML = Sanitizer::removeHTMLtags( $displayTitleH1 ); #escape the bad tags |
| 172 | + $titleText = trim( Sanitizer::stripAllTags( $titleHTML ) ); #remove the good tags, leaving the bad tags escaped, and trim it to make sure it comes out pretty |
| 173 | + |
| 174 | + #the user can put any sanitized text into the page title used in the <title> attribute, since it is not copy-pasteable like the <h1> tag |
| 175 | + if ($displayTitleTitle == '') { |
| 176 | + $parser->mOutput->setDisplayTitle( $titleText ); #use the stripped contents of <h1> |
| 177 | + } else { |
| 178 | + $parser->mOutput->setDisplayTitle( $displayTitleTitle ); #use what the user explicitly requested, MediaWiki escapes this automatically before it is served out |
| 179 | + } |
| 180 | + |
172 | 181 | if ( !$wgRestrictDisplayTitle ) { |
173 | | - $parser->mOutput->setDisplayTitle( $text ); |
| 182 | + $parser->mOutput->setDisplayTitleH1( $titleHTML ); |
174 | 183 | } else { |
175 | | - $title = Title::newFromText( $text ); |
176 | | - if( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) |
177 | | - $parser->mOutput->setDisplayTitle( $text ); |
| 184 | + #only titles that normalize to the same title are allowed in the <h1> tag |
| 185 | + $title = Title::newFromText( $titleText ); |
| 186 | + |
| 187 | + if ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) { |
| 188 | + $parser->mOutput->setDisplayTitleH1( $titleHTML ); |
| 189 | + } else { |
| 190 | + $parser->mOutput->setDisplayTitleH1( $parser->mTitle ); |
| 191 | + } |
178 | 192 | } |
| 193 | + |
179 | 194 | return ''; |
180 | 195 | } |
181 | 196 | |
Index: trunk/phase3/includes/EditPage.php |
— | — | @@ -1083,11 +1083,11 @@ |
1084 | 1084 | # Use the title defined by DISPLAYTITLE magic word when present |
1085 | 1085 | if ( isset($this->mParserOutput) |
1086 | 1086 | && ( $dt = $this->mParserOutput->getDisplayTitle() ) !== false ) { |
1087 | | - $title = $dt; |
| 1087 | + $wgOut->setPageTitle( wfMsg( 'editing', $this->mParserOutput->getDisplayTitleH1() ) ); |
| 1088 | + $wgOut->setHTMLTitle( wfMsg( 'editing', $dt ) ); #override the HTML that setPageTitle slated for inclusion in the <title> |
1088 | 1089 | } else { |
1089 | | - $title = $wgTitle->getPrefixedText(); |
| 1090 | + $wgOut->setPageTitle( wfMsg( 'editing', $wgTitle->getPrefixedText() ) ); |
1090 | 1091 | } |
1091 | | - $wgOut->setPageTitle( wfMsg( 'editing', $title ) ); |
1092 | 1092 | } |
1093 | 1093 | } |
1094 | 1094 | |
Index: trunk/phase3/includes/OutputPage.php |
— | — | @@ -309,7 +309,10 @@ |
310 | 310 | } |
311 | 311 | } |
312 | 312 | |
313 | | - public function setHTMLTitle( $name ) {$this->mHTMLtitle = $name; } |
| 313 | + # "HTML title" means <title> |
| 314 | + public function setHTMLTitle( $name ) { $this->mHTMLtitle = $name; } |
| 315 | + |
| 316 | + # "Page title" means <h1> |
314 | 317 | public function setPageTitle( $name ) { |
315 | 318 | global $action, $wgContLang; |
316 | 319 | $name = $wgContLang->convert($name, true); |
— | — | @@ -320,7 +323,7 @@ |
321 | 324 | $name .= ' - '.$taction; |
322 | 325 | } |
323 | 326 | } |
324 | | - |
| 327 | + |
325 | 328 | $this->setHTMLTitle( wfMsg( 'pagetitle', $name ) ); |
326 | 329 | } |
327 | 330 | public function getHTMLTitle() { return $this->mHTMLtitle; } |
— | — | @@ -539,8 +542,10 @@ |
540 | 543 | } |
541 | 544 | } |
542 | 545 | // Display title |
543 | | - if( ( $dt = $parserOutput->getDisplayTitle() ) !== false ) |
544 | | - $this->setPageTitle( $dt ); |
| 546 | + if( ( $displayTitleText = $parserOutput->getDisplayTitle() ) !== false ) { |
| 547 | + $this->setPageTitle( $parserOutput->getDisplayTitleH1() ); |
| 548 | + $this->setHTMLTitle( wfMsg( 'pagetitle', $displayTitleText ) ); #override the HTML that setPageTitle slated for inclusion in the <title> |
| 549 | + } |
545 | 550 | |
546 | 551 | // Hooks registered in the object |
547 | 552 | global $wgParserOutputHooks; |
Index: trunk/phase3/includes/Skin.php |
— | — | @@ -1013,7 +1013,7 @@ |
1014 | 1014 | |
1015 | 1015 | function pageTitle() { |
1016 | 1016 | global $wgOut; |
1017 | | - $s = '<h1 class="pagetitle">' . htmlspecialchars( $wgOut->getPageTitle() ) . '</h1>'; |
| 1017 | + $s = '<h1 class="pagetitle">' . $wgOut->getPageTitle() . '</h1>'; |
1018 | 1018 | return $s; |
1019 | 1019 | } |
1020 | 1020 | |