X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkin.php;h=f000fbfffe82dd7dc28bbc8de6232f360e1cbc2c;hb=4074968ddfebc6dee917b95114a428673b6e7bac;hp=866493f03d26e13f1a80fac08c94513bc164d6ec;hpb=22fabc32e58409542f2d13efc3b65796c4419389;p=lhc%2Fweb%2Fwiklou.git
diff --git a/includes/Skin.php b/includes/Skin.php
index 866493f03d..f000fbfffe 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -3,8 +3,9 @@
* @defgroup Skins Skins
*/
-if ( ! defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
die( 1 );
+}
/**
* The main skin class that provide methods and properties for all other skins.
@@ -24,16 +25,17 @@ class Skin extends Linker {
/**#@-*/
protected $mRevisionId; // The revision ID we're looking at, null if not applicable.
protected $skinname = 'standard';
- // @fixme Should be protected :-\
+ // @todo Fixme: should be protected :-\
var $mTitle = null;
/** Constructor, call parent constructor */
- function Skin() { parent::__construct(); }
+ function __construct() {
+ parent::__construct();
+ }
/**
* Fetch the set of available skins.
* @return array of strings
- * @static
*/
static function getSkinNames() {
global $wgValidSkinNames;
@@ -53,7 +55,7 @@ class Skin extends Linker {
$matches = array();
if( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
$aSkin = $matches[1];
- $wgValidSkinNames[strtolower($aSkin)] = $aSkin;
+ $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
}
}
$skinDir->close();
@@ -62,7 +64,7 @@ class Skin extends Linker {
}
return $wgValidSkinNames;
}
-
+
/**
* Fetch the list of usable skins in regards to $wgSkipSkins.
* Useful for Special:Preferences and other places where you
@@ -82,9 +84,8 @@ class Skin extends Linker {
* Normalize a skin preference value to a form that can be loaded.
* If a skin can't be found, it will fall back to the configured
* default (or the old 'Classic' skin if that's broken).
- * @param string $key
+ * @param $key String: 'monobook', 'standard', etc.
* @return string
- * @static
*/
static function normalizeKey( $key ) {
global $wgDefaultSkin;
@@ -105,24 +106,26 @@ class Skin extends Linker {
$fallback = array(
0 => $wgDefaultSkin,
1 => 'nostalgia',
- 2 => 'cologneblue' );
+ 2 => 'cologneblue'
+ );
- if( isset( $fallback[$key] ) ){
+ if( isset( $fallback[$key] ) ) {
$key = $fallback[$key];
}
if( isset( $skinNames[$key] ) ) {
return $key;
+ } else if( isset( $skinNames[$wgDefaultSkin] ) ) {
+ return $wgDefaultSkin;
} else {
- return 'monobook';
+ return 'vector';
}
}
/**
* Factory method for loading a skin of a given type
- * @param string $key 'monobook', 'standard', etc
+ * @param $key String: 'monobook', 'standard', etc.
* @return Skin
- * @static
*/
static function &newFromKey( $key ) {
global $wgStyleDirectory;
@@ -131,13 +134,15 @@ class Skin extends Linker {
$skinNames = Skin::getSkinNames();
$skinName = $skinNames[$key];
- $className = 'Skin'.ucfirst($key);
+ $className = 'Skin' . ucfirst( $key );
# Grab the skin class and initialise it.
if ( !class_exists( $className ) ) {
// Preload base classes to work around APC/PHP5 bug
$deps = "{$wgStyleDirectory}/{$skinName}.deps.php";
- if( file_exists( $deps ) ) include_once( $deps );
+ if( file_exists( $deps ) ) {
+ include_once( $deps );
+ }
require_once( "{$wgStyleDirectory}/{$skinName}.php" );
# Check if we got if not failback to default skin
@@ -147,8 +152,8 @@ class Skin extends Linker {
# except by SQL manipulation if a previously valid skin name
# is no longer valid.
wfDebug( "Skin class does not exist: $className\n" );
- $className = 'SkinMonobook';
- require_once( "{$wgStyleDirectory}/MonoBook.php" );
+ $className = 'SkinVector';
+ require_once( "{$wgStyleDirectory}/Vector.php" );
}
}
$skin = new $className;
@@ -168,7 +173,9 @@ class Skin extends Linker {
function qbSetting() {
global $wgOut, $wgUser;
- if ( $wgOut->isQuickbarSuppressed() ) { return 0; }
+ if ( $wgOut->isQuickbarSuppressed() ) {
+ return 0;
+ }
$q = $wgUser->getOption( 'quickbar', 0 );
return $q;
}
@@ -180,7 +187,7 @@ class Skin extends Linker {
# Generally the order of the favicon and apple-touch-icon links
# should not matter, but Konqueror (3.5.9 at least) incorrectly
- # uses whichever one appears later in the HTML source. Make sure
+ # uses whichever one appears later in the HTML source. Make sure
# apple-touch-icon is specified first to avoid this.
if( false !== $wgAppleTouchIcon ) {
$out->addLink( array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
@@ -229,6 +236,11 @@ class Skin extends Linker {
$lb->execute();
}
+ /**
+ * Adds metadata links (Creative Commons/Dublin Core/copyright) to the HTML
+ * output.
+ * @param $out Object: instance of OutputPage
+ */
function addMetadataLinks( OutputPage $out ) {
global $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf;
global $wgRightsPage, $wgRightsUrl;
@@ -271,26 +283,30 @@ class Skin extends Linker {
/**
* Set some local variables
*/
- protected function setMembers(){
+ protected function setMembers() {
global $wgUser;
$this->mUser = $wgUser;
$this->userpage = $wgUser->getUserPage()->getPrefixedText();
$this->usercss = false;
}
-
+
/**
* Set the title
- * @param Title $t The title to use
+ * @param $t Title object to use
*/
public function setTitle( $t ) {
$this->mTitle = $t;
}
-
+
/** Get the title */
public function getTitle() {
return $this->mTitle;
}
+ /**
+ * Outputs the HTML generated by other functions.
+ * @param $out Object: instance of OutputPage
+ */
function outputPage( OutputPage $out ) {
global $wgDebugComments;
wfProfileIn( __METHOD__ );
@@ -303,12 +319,6 @@ class Skin extends Linker {
$out->out( $out->headElement( $this ) );
- $out->out( "\n
getBodyOptions();
- foreach ( $ops as $name => $val ) {
- $out->out( " $name='$val'" );
- }
- $out->out( ">\n" );
if ( $wgDebugComments ) {
$out->out( "\n" );
@@ -319,7 +329,7 @@ class Skin extends Linker {
$out->out( $out->mBodytext . "\n" );
$out->out( $this->afterContent() );
-
+
$out->out( $afterContent );
$out->out( $this->bottomScripts() );
@@ -331,37 +341,42 @@ class Skin extends Linker {
}
static function makeVariablesScript( $data ) {
- global $wgJsMimeType;
-
- $r = array( "\n";
-
- return implode( "\n\t\t", $r );
}
/**
* Make a " );
- global $wgUseSiteJs;
- if( $wgUseSiteJs ) {
- $jsCache = $wgUser->isLoggedIn() ? '&smaxage=0' : '';
- $r[] = "";
- }
- if( $allowUserJs && $wgUser->isLoggedIn() ) {
- $userpage = $wgUser->getUserPage();
- $userjs = htmlspecialchars( self::makeUrl(
- $userpage->getPrefixedText().'/'.$this->getSkinName().'.js',
- 'action=raw&ctype='.$wgJsMimeType ) );
- $r[] = '";
- }
- return $vars . "\t\t" . implode ( "\n\t\t", $r );
- }
-
/**
* To make it harder for someone to slip a user a fake
* user-JavaScript or user-CSS preview, a random token
@@ -472,25 +471,30 @@ class Skin extends Linker {
* passed back with the preview request, we won't render
* the code.
*
- * @param string $action
+ * @param $action String: 'edit', 'submit' etc.
* @return bool
- * @private
*/
- function userCanPreview( $action ) {
+ public function userCanPreview( $action ) {
global $wgRequest, $wgUser;
- if( $action != 'submit' )
+ if( $action != 'submit' ) {
+ return false;
+ }
+ if( !$wgRequest->wasPosted() ) {
return false;
- if( !$wgRequest->wasPosted() )
+ }
+ if( !$this->mTitle->userCanEditCssSubpage() ) {
return false;
- if( !$this->mTitle->userCanEditCssJsSubpage() )
+ }
+ if( !$this->mTitle->userCanEditJsSubpage() ) {
return false;
+ }
return $wgUser->matchEditToken(
$wgRequest->getVal( 'wpEditToken' ) );
}
/**
- * generated JavaScript action=raw&gen=js
+ * Generated JavaScript action=raw&gen=js
* This returns MediaWiki:Common.js and MediaWiki:[Skinname].js concate-
* nated together. For some bizarre reason, it does *not* return any
* custom user JS from subpages. Huh?
@@ -500,27 +504,31 @@ class Skin extends Linker {
* top. For now Monobook.js will be maintained, but it should be consi-
* dered deprecated.
*
+ * @param $skinName String: If set, overrides the skin name
* @return string
*/
- public function generateUserJs() {
+ public function generateUserJs( $skinName = null ) {
global $wgStylePath;
wfProfileIn( __METHOD__ );
+ if( !$skinName ) {
+ $skinName = $this->getSkinName();
+ }
$s = "/* generated javascript */\n";
- $s .= "var skin = '" . Xml::escapeJsString( $this->getSkinName() ) . "';\n";
+ $s .= "var skin = '" . Xml::escapeJsString( $skinName ) . "';\n";
$s .= "var stylepath = '" . Xml::escapeJsString( $wgStylePath ) . "';";
$s .= "\n\n/* MediaWiki:Common.js */\n";
- $commonJs = wfMsgForContent( 'common.js' );
+ $commonJs = wfMsgExt( 'common.js', 'content' );
if ( !wfEmptyMsg( 'common.js', $commonJs ) ) {
$s .= $commonJs;
}
- $s .= "\n\n/* MediaWiki:".ucfirst( $this->getSkinName() ).".js */\n";
+ $s .= "\n\n/* MediaWiki:" . ucfirst( $skinName ) . ".js */\n";
// avoid inclusion of non defined user JavaScript (with custom skins only)
// by checking for default message content
- $msgKey = ucfirst( $this->getSkinName() ).'.js';
- $userJS = wfMsgForContent( $msgKey );
+ $msgKey = ucfirst( $skinName ) . '.js';
+ $userJS = wfMsgExt( $msgKey, 'content' );
if ( !wfEmptyMsg( $msgKey, $userJS ) ) {
$s .= $userJS;
}
@@ -539,11 +547,12 @@ class Skin extends Linker {
wfProfileOut( __METHOD__ );
return $s;
}
-
+
/**
* Split for easier subclassing in SkinSimple, SkinStandard and SkinCologneBlue
+ * Anything in here won't be generated if $wgAllowUserCssPrefs is false.
*/
- protected function reallyGenerateUserStylesheet(){
+ protected function reallyGenerateUserStylesheet() {
global $wgUser;
$s = '';
if( ( $undopt = $wgUser->getOption( 'underline' ) ) < 2 ) {
@@ -553,7 +562,7 @@ class Skin extends Linker {
if( $wgUser->getOption( 'highlightbroken' ) ) {
$s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
} else {
- $s .= <<getOption( 'justify' ) ) {
$s .= "#article, #bodyContent, #mw_content { text-align: justify; }\n";
@@ -577,6 +586,10 @@ END;
if( !$wgUser->getOption( 'editsection' ) ) {
$s .= ".editsection { display: none; }\n";
}
+ $fontstyle = $wgUser->getOption( 'editfont' );
+ if ( $fontstyle !== 'default' ) {
+ $s .= "textarea { font-family: $fontstyle; }\n";
+ }
return $s;
}
@@ -584,8 +597,8 @@ END;
* @private
*/
function setupUserCss( OutputPage $out ) {
- global $wgRequest, $wgContLang, $wgUser;
- global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage, $wgStylePath;
+ global $wgRequest, $wgUser;
+ global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage;
wfProfileIn( __METHOD__ );
@@ -597,19 +610,15 @@ END;
);
// Add any extension CSS
- foreach( $out->getExtStyle() as $tag ) {
- $out->addStyle( $tag['href'] );
+ foreach ( $out->getExtStyle() as $url ) {
+ $out->addStyle( $url );
}
// If we use the site's dynamic CSS, throw that in, too
// Per-site custom styles
if( $wgUseSiteCss ) {
global $wgHandheldStyle;
- $query = wfArrayToCGI( array(
- 'usemsgcache' => 'yes',
- 'ctype' => 'text/css',
- 'smaxage' => $wgSquidMaxage
- ) + $siteargs );
+ $query = wfArrayToCGI( self::getDynamicStylesheetQuery() );
# Site settings must override extension css! (bug 15025)
$out->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) );
$out->addStyle( self::makeNSUrl( 'Print.css', $query, NS_MEDIAWIKI ), 'print' );
@@ -619,35 +628,58 @@ END;
$out->addStyle( self::makeNSUrl( $this->getSkinName() . '.css', $query, NS_MEDIAWIKI ) );
}
- if( $wgUser->isLoggedIn() ) {
- // Ensure that logged-in users' generated CSS isn't clobbered
- // by anons' publicly cacheable generated CSS.
- $siteargs['smaxage'] = '0';
- $siteargs['ts'] = $wgUser->mTouched;
- }
- // Per-user styles based on preferences
- $siteargs['gen'] = 'css';
- if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
- $siteargs['useskin'] = $us;
+ global $wgAllowUserCssPrefs;
+ if( $wgAllowUserCssPrefs ){
+ if( $wgUser->isLoggedIn() ) {
+ // Ensure that logged-in users' generated CSS isn't clobbered
+ // by anons' publicly cacheable generated CSS.
+ $siteargs['smaxage'] = '0';
+ $siteargs['ts'] = $wgUser->mTouched;
+ }
+ // Per-user styles based on preferences
+ $siteargs['gen'] = 'css';
+ if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
+ $siteargs['useskin'] = $us;
+ }
+ $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
}
- $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
// Per-user custom style pages
if( $wgAllowUserCss && $wgUser->isLoggedIn() ) {
$action = $wgRequest->getVal( 'action' );
# If we're previewing the CSS page, use it
if( $this->mTitle->isCssSubpage() && $this->userCanPreview( $action ) ) {
- $previewCss = $wgRequest->getText( 'wpTextbox1' );
// @FIXME: properly escape the cdata!
- $this->usercss = "/**/";
+ $out->addInlineStyle( $wgRequest->getText( 'wpTextbox1' ) );
} else {
- $out->addStyle( self::makeUrl( $this->userpage . '/' . $this->getSkinName() .'.css',
- 'action=raw&ctype=text/css' ) );
+ $names = array( 'common', $this->getSkinName() );
+ foreach( $names as $name ) {
+ $out->addStyle( self::makeUrl(
+ $this->userpage . '/' . $name . '.css',
+ 'action=raw&ctype=text/css' )
+ );
+ }
}
}
wfProfileOut( __METHOD__ );
}
+
+ /**
+ * Get the query to generate a dynamic stylesheet
+ *
+ * @return array
+ */
+ public static function getDynamicStylesheetQuery() {
+ global $wgSquidMaxage;
+ return array(
+ 'action' => 'raw',
+ 'maxage' => $wgSquidMaxage,
+ 'usemsgcache' => 'yes',
+ 'ctype' => 'text/css',
+ 'smaxage' => $wgSquidMaxage,
+ );
+ }
/**
* Add skin specific stylesheets
@@ -660,32 +692,8 @@ END;
$out->addStyle( 'common/common_rtl.css', '', '', 'rtl' );
}
- function getBodyOptions() {
- global $wgUser, $wgOut, $wgRequest, $wgContLang;
-
- extract( $wgRequest->getValues( 'oldid', 'redirect', 'diff' ) );
-
- if ( 0 != $this->mTitle->getNamespace() ) {
- $a = array( 'bgcolor' => '#ffffec' );
- }
- else $a = array( 'bgcolor' => '#FFFFFF' );
- if( $wgOut->isArticle() && $wgUser->getOption( 'editondblclick' ) &&
- $this->mTitle->quickUserCan( 'edit' ) ) {
- $s = $this->mTitle->getFullURL( $this->editUrlOptions() );
- $s = 'document.location = "' .Xml::escapeJsString( $s ) .'";';
- $a += array( 'ondblclick' => $s );
- }
- $a['onload'] = $wgOut->getOnloadHandler();
- $a['class'] =
- 'mediawiki' .
- ' '.( $wgContLang->isRTL() ? 'rtl' : 'ltr' ).
- ' '.$this->getPageClasses( $this->mTitle ) .
- ' skin-'. Sanitizer::escapeClass( $this->getSkinName() );
- return $a;
- }
-
function getPageClasses( $title ) {
- $numeric = 'ns-'.$title->getNamespace();
+ $numeric = 'ns-' . $title->getNamespace();
if( $title->getNamespace() == NS_SPECIAL ) {
$type = 'ns-special';
} elseif( $title->isTalkPage() ) {
@@ -693,7 +701,7 @@ END;
} else {
$type = 'ns-subject';
}
- $name = Sanitizer::escapeClass( 'page-'.$title->getPrefixedText() );
+ $name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() );
return "$numeric $type $name";
}
@@ -720,7 +728,8 @@ END;
$s = '';
$qb = $this->qbSetting();
- if( $langlinks = $this->otherLanguages() ) {
+ $langlinks = $this->otherLanguages();
+ if( $langlinks ) {
$rows = 2;
$borderhack = '';
} else {
@@ -734,24 +743,26 @@ END;
$shove = ( $qb != 0 );
$left = ( $qb == 1 || $qb == 3 );
- if( $wgContLang->isRTL() ) $left = !$left;
+ if( $wgContLang->isRTL() ) {
+ $left = !$left;
+ }
if( !$shove ) {
$s .= "\n" .
- $this->logoText() . ' | ';
+ $this->logoText() . '';
} elseif( $left ) {
$s .= $this->getQuickbarCompensator( $rows );
}
- $l = $wgContLang->isRTL() ? 'right' : 'left';
+ $l = $wgContLang->alignStart();
$s .= "\n";
$s .= $this->topLinks();
- $s .= " " . $this->pageTitleLinks() . " \n";
+ $s .= '' . $this->pageTitleLinks() . " \n";
- $r = $wgContLang->isRTL() ? 'left' : 'right';
+ $r = $wgContLang->alignEnd();
$s .= " | \n";
$s .= $this->nameAndLogin();
- $s .= "\n " . $this->searchForm() . " | ";
+ $s .= "\n
" . $this->searchForm() . '';
if ( $langlinks ) {
$s .= "\n\n$langlinks | \n";
@@ -774,19 +785,20 @@ END;
return $s;
}
-
function getCategoryLinks() {
global $wgOut, $wgUseCategoryBrowser;
global $wgContLang, $wgUser;
- if( count( $wgOut->mCategoryLinks ) == 0 ) return '';
+ if( count( $wgOut->mCategoryLinks ) == 0 ) {
+ return '';
+ }
# Separator
$sep = wfMsgExt( 'catseparator', array( 'parsemag', 'escapenoentities' ) );
// Use Unicode bidi embedding override characters,
// to make sure links don't smash each other up in ugly ways.
- $dir = $wgContLang->isRTL() ? 'rtl' : 'ltr';
+ $dir = $wgContLang->getDir();
$embed = "";
$pop = '';
@@ -814,19 +826,19 @@ END;
$s .= "" .
wfMsgExt( 'hidden-categories', array( 'parsemag', 'escapenoentities' ), count( $allCats['hidden'] ) ) .
$colon . $embed . implode( "$pop $sep $embed", $allCats['hidden'] ) . $pop .
- "
";
+ '';
}
# optional 'dmoz-like' category browser. Will be shown under the list
# of categories an article belong to
- if( $wgUseCategoryBrowser ){
+ if( $wgUseCategoryBrowser ) {
$s .= '
';
# get a big array of the parents tree
$parenttree = $this->mTitle->getParentCategoryTree();
# Skin object passed by reference cause it can not be
# accessed under the method subfunction drawCategoryBrowser
- $tempout = explode( "\n", Skin::drawCategoryBrowser( $parenttree, $this ) );
+ $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree, $this ) );
# Clean out bogus first entry and sort them
unset( $tempout[0] );
asort( $tempout );
@@ -843,7 +855,7 @@ END;
* @param &skin Object: skin passed by reference
* @return String separated by >, terminate with "\n"
*/
- function drawCategoryBrowser( $tree, &$skin ){
+ function drawCategoryBrowser( $tree, &$skin ) {
$return = '';
foreach( $tree as $element => $parent ) {
if( empty( $parent ) ) {
@@ -851,7 +863,7 @@ END;
$return .= "\n";
} else {
# grab the others elements
- $return .= Skin::drawCategoryBrowser( $parent, $skin ) . ' > ';
+ $return .= $this->drawCategoryBrowser( $parent, $skin ) . ' > ';
}
# add our current element to the list
$eltitle = Title::newFromText( $element );
@@ -861,22 +873,25 @@ END;
}
function getCategories() {
- $catlinks=$this->getCategoryLinks();
+ $catlinks = $this->getCategoryLinks();
$classes = 'catlinks';
- if( strpos( $catlinks, '' ) === false &&
- strpos( $catlinks, '
' ) !== false ) {
+ // Check what we're showing
+ global $wgOut, $wgUser;
+ $allCats = $wgOut->getCategoryLinks();
+ $showHidden = $wgUser->getBoolOption( 'showhiddencats' ) ||
+ $this->mTitle->getNamespace() == NS_CATEGORY;
+
+ if( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) {
$classes .= ' catlinks-allhidden';
}
- if( !empty( $catlinks ) ){
- return "
{$catlinks}
";
- }
+ return "
{$catlinks}
";
}
function getQuickbarCompensator( $rows = 1 ) {
- return "
| ";
+ return "
| ";
}
/**
@@ -896,10 +911,10 @@ END;
protected function afterContentHook() {
$data = '';
- if( wfRunHooks( 'SkinAfterContent', array( &$data ) ) ){
+ if( wfRunHooks( 'SkinAfterContent', array( &$data ) ) ) {
// adding just some spaces shouldn't toggle the output
// of the whole
, so we use trim() here
- if( trim( $data ) != '' ){
+ if( trim( $data ) != '' ) {
// Doing this here instead of in the skins to
// ensure that the div has the same ID in all
// skins
@@ -922,13 +937,50 @@ END;
protected function generateDebugHTML() {
global $wgShowDebug, $wgOut;
if ( $wgShowDebug ) {
- $listInternals = str_replace( "\n", "\n
", htmlspecialchars( $wgOut->mDebugtext ) );
- return "\n
\nDebug data:\n";
+ $listInternals = $this->formatDebugHTML( $wgOut->mDebugtext );
+ return "\n
\nDebug data:\n";
}
return '';
}
+ private function formatDebugHTML( $debugText ) {
+ $lines = explode( "\n", $debugText );
+ $curIdent = 0;
+ $ret = '';
+ foreach( $lines as $line ) {
+ $m = array();
+ $display = ltrim( $line );
+ $ident = strlen( $line ) - strlen( $display );
+ $diff = $ident - $curIdent;
+
+ if ( $display == '' ) {
+ $display = "\xc2\xa0";
+ }
+
+ if ( !$ident && $diff < 0 && substr( $display, 0, 9 ) != 'Entering ' && substr( $display, 0, 8 ) != 'Exiting ' ) {
+ $ident = $curIdent;
+ $diff = 0;
+ $display = '' . htmlspecialchars( $display ) . '';
+ } else {
+ $display = htmlspecialchars( $display );
+ }
+
+ if ( $diff < 0 ) {
+ $ret .= str_repeat( "\n", -$diff ) . "
\n";
+ } elseif ( $diff == 0 ) {
+ $ret .= "\n";
+ } else {
+ $ret .= str_repeat( "- \n", $diff );
+ }
+ $ret .= $display . "\n";
+
+ $curIdent = $ident;
+ }
+ $ret .= str_repeat( '
', $curIdent ) . '';
+ return $ret;
+ }
+
/**
* This gets called shortly before the tag.
* @return String HTML to be put before