editpage.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 1,865 行 · 第 1/4 页

PHP
1,865
字号
			$wgOut->addParserOutputNoText( $parserOutput );			wfProfileOut( $fname );			return $previewhead . $previewHTML;		}	}	/**	 * Call the stock "user is blocked" page	 */	function blockedPage() {		global $wgOut, $wgUser;		$wgOut->blockedPage( false ); # Standard block notice on the top, don't 'return'				# If the user made changes, preserve them when showing the markup		# (This happens when a user is blocked during edit, for instance)				$first = $this->firsttime || ( !$this->save && $this->textbox1 == '' );		$source = $first ? $this->getContent() : $this->textbox1;				# Spit out the source or the user's modified version		$rows = $wgUser->getOption( 'rows' );		$cols = $wgUser->getOption( 'cols' );		$attribs = array( 'id' => 'wpTextbox1', 'name' => 'wpTextbox1', 'cols' => $cols, 'rows' => $rows, 'readonly' => 'readonly' );		$wgOut->addHtml( '<hr />' );		$wgOut->addWikiText( wfMsg( $first ? 'blockedoriginalsource' : 'blockededitsource', $this->mTitle->getPrefixedText() ) );		$wgOut->addHtml( wfElement( 'textarea', $attribs, $source ) );	}	/**	 * Produce the stock "please login to edit pages" page	 */	function userNotLoggedInPage() {		global $wgUser, $wgOut;		$skin = $wgUser->getSkin();				$loginTitle = Title::makeTitle( NS_SPECIAL, 'Userlogin' );		$loginLink = $skin->makeKnownLinkObj( $loginTitle, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $this->mTitle->getPrefixedUrl() );			$wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) );		$wgOut->setRobotPolicy( 'noindex,nofollow' );		$wgOut->setArticleRelated( false );				$wgOut->addHtml( wfMsgWikiHtml( 'whitelistedittext', $loginLink ) );		$wgOut->returnToMain( false, $this->mTitle->getPrefixedUrl() );	}	/**	 * Creates a basic error page which informs the user that	 * they have to validate their email address before being	 * allowed to edit.	 */	function userNotConfirmedPage() {		global $wgOut;		$wgOut->setPageTitle( wfMsg( 'confirmedittitle' ) );		$wgOut->setRobotPolicy( 'noindex,nofollow' );		$wgOut->setArticleRelated( false );				$wgOut->addWikiText( wfMsg( 'confirmedittext' ) );		$wgOut->returnToMain( false );	}	/**	 * Produce the stock "your edit contains spam" page	 *	 * @param $match Text which triggered one or more filters	 */	function spamPage( $match = false ) {		global $wgOut;		$wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );		$wgOut->setRobotPolicy( 'noindex,nofollow' );		$wgOut->setArticleRelated( false );		$wgOut->addWikiText( wfMsg( 'spamprotectiontext' ) );		if ( $match )			$wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "<nowiki>{$match}</nowiki>" ) );					$wgOut->returnToMain( false );	}	/**	 * @private	 * @todo document	 */	function mergeChangesInto( &$editText ){		$fname = 'EditPage::mergeChangesInto';		wfProfileIn( $fname );		$db =& wfGetDB( DB_MASTER );		// This is the revision the editor started from		$baseRevision = Revision::loadFromTimestamp(			$db, $this->mArticle->mTitle, $this->edittime );		if( is_null( $baseRevision ) ) {			wfProfileOut( $fname );			return false;		}		$baseText = $baseRevision->getText();		// The current state, we want to merge updates into it		$currentRevision =  Revision::loadFromTitle(			$db, $this->mArticle->mTitle );		if( is_null( $currentRevision ) ) {			wfProfileOut( $fname );			return false;		}		$currentText = $currentRevision->getText();		if( wfMerge( $baseText, $editText, $currentText, $result ) ){			$editText = $result;			wfProfileOut( $fname );			return true;		} else {			wfProfileOut( $fname );			return false;		}	}	/**	 * Check if the browser is on a blacklist of user-agents known to	 * mangle UTF-8 data on form submission. Returns true if Unicode	 * should make it through, false if it's known to be a problem.	 * @return bool	 * @private	 */	function checkUnicodeCompliantBrowser() {		global $wgBrowserBlackList;		if( empty( $_SERVER["HTTP_USER_AGENT"] ) ) {			// No User-Agent header sent? Trust it by default...			return true;		}		$currentbrowser = $_SERVER["HTTP_USER_AGENT"];		foreach ( $wgBrowserBlackList as $browser ) {			if ( preg_match($browser, $currentbrowser) ) {				return false;			}		}		return true;	}	/**	 * Format an anchor fragment as it would appear for a given section name	 * @param string $text	 * @return string	 * @private	 */	function sectionAnchor( $text ) {		$headline = Sanitizer::decodeCharReferences( $text );		# strip out HTML		$headline = preg_replace( '/<.*?' . '>/', '', $headline );		$headline = trim( $headline );		$sectionanchor = '#' . urlencode( str_replace( ' ', '_', $headline ) );		$replacearray = array(			'%3A' => ':',			'%' => '.'		);		return str_replace(			array_keys( $replacearray ),			array_values( $replacearray ),			$sectionanchor );	}	/**	 * Shows a bulletin board style toolbar for common editing functions.	 * It can be disabled in the user preferences.	 * The necessary JavaScript code can be found in style/wikibits.js.	 */	function getEditToolbar() {		global $wgStylePath, $wgContLang, $wgJsMimeType;		/**		 * toolarray an array of arrays which each include the filename of		 * the button image (without path), the opening tag, the closing tag,		 * and optionally a sample text that is inserted between the two when no		 * selection is highlighted.		 * The tip text is shown when the user moves the mouse over the button.		 *		 * Already here are accesskeys (key), which are not used yet until someone		 * can figure out a way to make them work in IE. However, we should make		 * sure these keys are not defined on the edit page.		 */		$toolarray=array(			array(	'image'=>'button_bold.png',					'open'	=>	"\'\'\'",					'close'	=>	"\'\'\'",					'sample'=>	wfMsg('bold_sample'),					'tip'	=>	wfMsg('bold_tip'),					'key'	=>	'B'				),			array(	'image'=>'button_italic.png',					'open'	=>	"\'\'",					'close'	=>	"\'\'",					'sample'=>	wfMsg('italic_sample'),					'tip'	=>	wfMsg('italic_tip'),					'key'	=>	'I'				),			array(	'image'=>'button_link.png',					'open'	=>	'[[',					'close'	=>	']]',					'sample'=>	wfMsg('link_sample'),					'tip'	=>	wfMsg('link_tip'),					'key'	=>	'L'				),			array(	'image'=>'button_extlink.png',					'open'	=>	'[',					'close'	=>	']',					'sample'=>	wfMsg('extlink_sample'),					'tip'	=>	wfMsg('extlink_tip'),					'key'	=>	'X'				),			array(	'image'=>'button_headline.png',					'open'	=>	"\\n== ",					'close'	=>	" ==\\n",					'sample'=>	wfMsg('headline_sample'),					'tip'	=>	wfMsg('headline_tip'),					'key'	=>	'H'				),			array(	'image'=>'button_image.png',					'open'	=>	'[['.$wgContLang->getNsText(NS_IMAGE).":",					'close'	=>	']]',					'sample'=>	wfMsg('image_sample'),					'tip'	=>	wfMsg('image_tip'),					'key'	=>	'D'				),			array(	'image'	=>'button_media.png',					'open'	=>	'[['.$wgContLang->getNsText(NS_MEDIA).':',					'close'	=>	']]',					'sample'=>	wfMsg('media_sample'),					'tip'	=>	wfMsg('media_tip'),					'key'	=>	'M'				),			array(	'image'	=>'button_math.png',					'open'	=>	"<math>",					'close'	=>	"<\\/math>",					'sample'=>	wfMsg('math_sample'),					'tip'	=>	wfMsg('math_tip'),					'key'	=>	'C'				),			array(	'image'	=>'button_nowiki.png',					'open'	=>	"<nowiki>",					'close'	=>	"<\\/nowiki>",					'sample'=>	wfMsg('nowiki_sample'),					'tip'	=>	wfMsg('nowiki_tip'),					'key'	=>	'N'				),			array(	'image'	=>'button_sig.png',					'open'	=>	'--~~~~',					'close'	=>	'',					'sample'=>	'',					'tip'	=>	wfMsg('sig_tip'),					'key'	=>	'Y'				),			array(	'image'	=>'button_hr.png',					'open'	=>	"\\n----\\n",					'close'	=>	'',					'sample'=>	'',					'tip'	=>	wfMsg('hr_tip'),					'key'	=>	'R'				)		);		$toolbar = "<div id='toolbar'>\n";		$toolbar.="<script type='$wgJsMimeType'>\n/*<![CDATA[*/\n";		foreach($toolarray as $tool) {			$image=$wgStylePath.'/common/images/'.$tool['image'];			$open=$tool['open'];			$close=$tool['close'];			$sample = wfEscapeJsString( $tool['sample'] );			// Note that we use the tip both for the ALT tag and the TITLE tag of the image.			// Older browsers show a "speedtip" type message only for ALT.			// Ideally these should be different, realistically they			// probably don't need to be.			$tip = wfEscapeJsString( $tool['tip'] );			#$key = $tool["key"];			$toolbar.="addButton('$image','$tip','$open','$close','$sample');\n";		}		$toolbar.="/*]]>*/\n</script>";		$toolbar.="\n</div>";		return $toolbar;	}	/**	 * Output preview text only. This can be sucked into the edit page	 * via JavaScript, and saves the server time rendering the skin as	 * well as theoretically being more robust on the client (doesn't	 * disturb the edit box's undo history, won't eat your text on	 * failure, etc).	 *	 * @todo This doesn't include category or interlanguage links.	 *       Would need to enhance it a bit, maybe wrap them in XML	 *       or something... that might also require more skin	 *       initialization, so check whether that's a problem.	 */	function livePreview() {		global $wgOut;		$wgOut->disable();		header( 'Content-type: text/xml' );		header( 'Cache-control: no-cache' );		# FIXME		echo $this->getPreviewText( );		/* To not shake screen up and down between preview and live-preview */		echo "<br style=\"clear:both;\" />\n";	}	/**	 * Get a diff between the current contents of the edit box and the	 * version of the page we're editing from.	 *	 * If this is a section edit, we'll replace the section as for final	 * save and then make a comparison.	 *	 * @return string HTML	 */	function getDiff() {		require_once( 'DifferenceEngine.php' );		$oldtext = $this->mArticle->fetchContent();		$newtext = $this->mArticle->replaceSection(			$this->section, $this->textbox1, $this->summary, $this->edittime );		$newtext = $this->mArticle->preSaveTransform( $newtext );		$oldtitle = wfMsgExt( 'currentrev', array('parseinline') );		$newtitle = wfMsgExt( 'yourtext', array('parseinline') );		if ( $oldtext !== false  || $newtext != '' ) {			$de = new DifferenceEngine( $this->mTitle );			$de->setText( $oldtext, $newtext );			$difftext = $de->getDiff( $oldtitle, $newtitle );		} else {			$difftext = '';		}		return '<div id="wikiDiff">' . $difftext . '</div>';	}	/**	 * Filter an input field through a Unicode de-armoring process if it	 * came from an old browser with known broken Unicode editing issues.	 *	 * @param WebRequest $request	 * @param string $field	 * @return string	 * @private	 */	function safeUnicodeInput( $request, $field ) {		$text = rtrim( $request->getText( $field ) );		return $request->getBool( 'safemode' )			? $this->unmakesafe( $text )			: $text;	}	/**	 * Filter an output field through a Unicode armoring process if it is	 * going to an old browser with known broken Unicode editing issues.	 *	 * @param string $text	 * @return string	 * @private	 */	function safeUnicodeOutput( $text ) {		global $wgContLang;		$codedText = $wgContLang->recodeForEdit( $text );		return $this->checkUnicodeCompliantBrowser()			? $codedText			: $this->makesafe( $codedText );	}	/**	 * A number of web browsers are known to corrupt non-ASCII characters	 * in a UTF-8 text editing environment. To protect against this,	 * detected browsers will be served an armored version of the text,	 * with non-ASCII chars converted to numeric HTML character references.	 *	 * Preexisting such character references will have a 0 added to them	 * to ensure that round-trips do not alter the original data.	 *	 * @param string $invalue	 * @return string	 * @private	 */	function makesafe( $invalue ) {		// Armor existing references for reversability.		$invalue = strtr( $invalue, array( "&#x" => "&#x0" ) );		$bytesleft = 0;		$result = "";		$working = 0;		for( $i = 0; $i < strlen( $invalue ); $i++ ) {			$bytevalue = ord( $invalue{$i} );			if( $bytevalue <= 0x7F ) { //0xxx xxxx				$result .= chr( $bytevalue );				$bytesleft = 0;			} elseif( $bytevalue <= 0xBF ) { //10xx xxxx				$working = $working << 6;				$working += ($bytevalue & 0x3F);				$bytesleft--;				if( $bytesleft <= 0 ) {					$result .= "&#x" . strtoupper( dechex( $working ) ) . ";";				}			} elseif( $bytevalue <= 0xDF ) { //110x xxxx				$working = $bytevalue & 0x1F;				$bytesleft = 1;			} elseif( $bytevalue <= 0xEF ) { //1110 xxxx				$working = $bytevalue & 0x0F;				$bytesleft = 2;			} else { //1111 0xxx				$working = $bytevalue & 0x07;				$bytesleft = 3;			}		}		return $result;	}	/**	 * Reverse the previously applied transliteration of non-ASCII characters	 * back to UTF-8. Used to protect data from corruption by broken web browsers	 * as listed in $wgBrowserBlackList.	 *	 * @param string $invalue	 * @return string	 * @private	 */	function unmakesafe( $invalue ) {		$result = "";		for( $i = 0; $i < strlen( $invalue ); $i++ ) {			if( ( substr( $invalue, $i, 3 ) == "&#x" ) && ( $invalue{$i+3} != '0' ) ) {				$i += 3;				$hexstring = "";				do {					$hexstring .= $invalue{$i};					$i++;				} while( ctype_xdigit( $invalue{$i} ) && ( $i < strlen( $invalue ) ) );				// Do some sanity checks. These aren't needed for reversability,				// but should help keep the breakage down if the editor				// breaks one of the entities whilst editing.				if ((substr($invalue,$i,1)==";") and (strlen($hexstring) <= 6)) {					$codepoint = hexdec($hexstring);					$result .= codepointToUtf8( $codepoint );				} else {					$result .= "&#x" . $hexstring . substr( $invalue, $i, 1 );				}			} else {				$result .= substr( $invalue, $i, 1 );			}		}		// reverse the transform that we made for reversability reasons.		return strtr( $result, array( "&#x0" => "&#x" ) );	}	function noCreatePermission() {		global $wgOut;		$wgOut->setPageTitle( wfMsg( 'nocreatetitle' ) );		$wgOut->addWikiText( wfMsg( 'nocreatetext' ) );	}}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?