diff --git a/TimelessTemplate.php b/TimelessTemplate.php index 6141da5..c66e5a3 100644 --- a/TimelessTemplate.php +++ b/TimelessTemplate.php @@ -7,7 +7,7 @@ class TimelessTemplate extends BaseTemplate { /** @var array */ - private $pileOfTools; + protected $pileOfTools; /** * Outputs the entire contents of the page @@ -27,7 +27,7 @@ class TimelessTemplate extends BaseTemplate { $this->getLogo( 'p-logo-text', 'text' ) . $this->getSearch() ) . - $this->clear() + $this->getClear() ); $html .= $this->getHeaderHack(); @@ -43,7 +43,7 @@ class TimelessTemplate extends BaseTemplate { 'site-tools', 'timeless-sitetools', $this->getPortlet( - 'tbx', + 'tb', $this->pileOfTools['general'], 'timeless-sitetools' ) @@ -79,16 +79,16 @@ class TimelessTemplate extends BaseTemplate { 'timeless-pagetools' ) ) . - $this->clear() . + $this->getClear() . Html::rawElement( 'div', [ 'class' => 'mw-body-content', 'id' => 'bodyContent' ], $this->getContentSub() . $this->get( 'bodytext' ) . - $this->clear() + $this->getClear() ) ) ) . $this->getAfterContent() . - $this->clear() + $this->getClear() ) ); @@ -114,22 +114,26 @@ class TimelessTemplate extends BaseTemplate { } /** - * A list of navigation links (portlet) + * Generates a block of navigation links with a header * * @param string $name - * @param array|string $content array of links or block of text + * @param array|string $content array of links for use with makeListItem, or a block of text * Expected array format: - [ - $name => [ - 'links' => [ '0' => [ 'href' => ..., 'single-id' => ..., 'text' => ... ] ], - 'id' => ..., - 'active' => ... - ], - ... - ] + * [ + * $name => [ + * 'links' => [ '0' => + * [ 'href' => ..., 'single-id' => ..., 'text' => ... ] + * ], + * 'id' => ..., + * 'active' => ... + * ], + * ... + * ] * @param null|string|array|bool $msg + * @param string $class cssclass for the portal * - * @return $html + * @return string html + * @since 1.29 */ protected function getPortlet( $name, $content, $msg = null ) { if ( $msg === null ) { @@ -150,13 +154,38 @@ class TimelessTemplate extends BaseTemplate { $msgString = htmlspecialchars( $msg ); } + // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd + $hookContents = ''; + if ( $name == 'tb' ) { + if ( isset( $boxes['TOOLBOX'] ) ) { + ob_start(); + // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox + // can abort and avoid outputting double toolbox links + // Avoid PHP 7.1 warning from passing $this by reference + $template = $this; + Hooks::run( 'SkinTemplateToolboxEnd', [ &$template, true ] ); + $hookContents = ob_get_contents(); + ob_end_clean(); + if ( !trim( $hookContents ) ) { + $hookContents = ''; + } + } + } + // END hack + $labelId = Sanitizer::escapeId( "p-$name-label" ); if ( is_array( $content ) ) { $contentText = Html::openElement( 'ul' ); foreach ( $content as $key => $item ) { - $contentText .= $this->makeListItem( $key, $item, [ 'text-wrapper' => [ 'tag' => 'span' ] ] ); + $contentText .= $this->makeListItem( + $key, + $item, + [ 'text-wrapper' => [ 'tag' => 'span' ] ] + ); } + // Add in SkinTemplateToolboxEnd, if any + $contentText .= $hookContents; $contentText .= Html::closeElement( 'ul' ); } else { $contentText = $content; @@ -176,9 +205,9 @@ class TimelessTemplate extends BaseTemplate { ], $msgString ) . - Html::rawElement( 'div', [ 'class' => 'p-body' ], + Html::rawElement( 'div', [ 'class' => 'mw-portlet-body' ], $contentText . - $this->getAfterPortlet( $name ) + $this->renderAfterPortlet( $name ) ) ); @@ -391,7 +420,7 @@ class TimelessTemplate extends BaseTemplate { /** * Personal/user links portlet for header * - * @return array [ html, class], where class is an extra class to apply to surrounding objects + * @return array [ html, class ], where class is an extra class to apply to surrounding objects * (for width adjustments) */ protected function getUserLinks() { @@ -592,7 +621,8 @@ class TimelessTemplate extends BaseTemplate { ]; } - // This is really dumb, and you're an idiot for doing it this way + // This is really dumb, and you're an idiot for doing it this way. + // Obviously if you're not the idiot who did this, I don't mean you. foreach ( $pileOfEditTools as $navKey => $navBlock ) { $currentSet = null; @@ -808,86 +838,4 @@ class TimelessTemplate extends BaseTemplate { return $html; } - - /** - * Page footer - * - * @return string html - */ - protected function getFooter( $iconStyle = 'icononly', $linkStyle = 'flat' ) { - $validFooterIcons = $this->getFooterIcons( $iconStyle ); - $validFooterLinks = $this->getFooterLinks( $linkStyle ); - - $html = ''; - - if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { - $html .= Html::openElement( 'div', [ - 'id' => 'footer-bottom', - 'role' => 'contentinfo', - 'lang' => $this->get( 'userlang' ), - 'dir' => $this->get( 'dir' ) - ] ); - $footerEnd = Html::closeElement( 'div' ); - } else { - $footerEnd = ''; - } - foreach ( $validFooterIcons as $blockName => $footerIcons ) { - $html .= Html::openElement( 'div', [ - 'id' => 'f-' . Sanitizer::escapeId( $blockName ) . 'ico', - 'class' => 'footer-icons' - ] ); - foreach ( $footerIcons as $icon ) { - $html .= $this->getSkin()->makeFooterIcon( $icon ); - } - $html .= Html::closeElement( 'div' ); - } - if ( count( $validFooterLinks ) > 0 ) { - $html .= Html::openElement( 'ul', [ 'id' => 'f-list', 'class' => 'footer-places' ] ); - foreach ( $validFooterLinks as $aLink ) { - $html .= Html::rawElement( - 'li', - [ 'id' => Sanitizer::escapeId( $aLink ) ], - $this->get( $aLink ) - ); - } - $html .= Html::closeElement( 'ul' ); - } - - $html .= $this->clear() . $footerEnd; - - return $html; - } - - /** - * BaseTemplate::renderAfterPortlet, but sans immediate pooping - * Allows extensions to hook into known portlets and add stuff to them, - * probably causing hideous explosions in this. - * - * @param string $name - * - * @return string html - */ - protected function getAfterPortlet( $name ) { - $content = ''; - Hooks::run( 'BaseTemplateAfterPortlet', [ $this, $name, &$content ] ); - - if ( $content !== '' ) { - return Html::rawElement( - 'div', - [ 'class' => [ 'after-portlet', 'after-portlet-' . $name ] ], - $content - ); - } - - return $content; - } - - /** - * Core visualClear class - * - * @return string html - */ - protected function clear() { - return Html::element( 'div', [ 'class' => 'visualClear' ] ); - } }