specialimport.php

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

PHP
849
字号
<?php/** * MediaWiki page data importer * Copyright (C) 2003,2005 Brion Vibber <brion@pobox.com> * http://www.mediawiki.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html * * @package MediaWiki * @subpackage SpecialPage *//** * Constructor */function wfSpecialImport( $page = '' ) {	global $wgUser, $wgOut, $wgRequest, $wgTitle, $wgImportSources;	global $wgImportTargetNamespace;	$interwiki = false;	$namespace = $wgImportTargetNamespace;	$frompage = '';	$history = true;		if( $wgRequest->wasPosted() && $wgRequest->getVal( 'action' ) == 'submit') {		$isUpload = false;		$namespace = $wgRequest->getIntOrNull( 'namespace' );				switch( $wgRequest->getVal( "source" ) ) {		case "upload":			$isUpload = true;			if( $wgUser->isAllowed( 'importupload' ) ) {				$source = ImportStreamSource::newFromUpload( "xmlimport" );			} else {				return $wgOut->permissionRequired( 'importupload' );			}			break;		case "interwiki":			$interwiki = $wgRequest->getVal( 'interwiki' );			$history = $wgRequest->getCheck( 'interwikiHistory' );			$frompage = $wgRequest->getText( "frompage" );			$source = ImportStreamSource::newFromInterwiki(				$interwiki,				$frompage,				$history );			break;		default:			$source = new WikiErrorMsg( "importunknownsource" );		}		if( WikiError::isError( $source ) ) {			$wgOut->addWikiText( wfEscapeWikiText( $source->getMessage() ) );		} else {			$wgOut->addWikiText( wfMsg( "importstart" ) );						$importer = new WikiImporter( $source );			if( !is_null( $namespace ) ) {				$importer->setTargetNamespace( $namespace );			}			$reporter = new ImportReporter( $importer, $isUpload, $interwiki );						$reporter->open();			$result = $importer->doImport();			$reporter->close();						if( WikiError::isError( $result ) ) {				$wgOut->addWikiText( wfMsg( "importfailed",					wfEscapeWikiText( $result->getMessage() ) ) );			} else {				# Success!				$wgOut->addWikiText( wfMsg( "importsuccess" ) );			}		}	}	$action = $wgTitle->escapeLocalUrl( 'action=submit' );	if( $wgUser->isAllowed( 'importupload' ) ) {		$wgOut->addWikiText( wfMsg( "importtext" ) );		$wgOut->addHTML( "<fieldset>	<legend>" . wfMsgHtml('upload') . "</legend>	<form enctype='multipart/form-data' method='post' action=\"$action\">		<input type='hidden' name='action' value='submit' />		<input type='hidden' name='source' value='upload' />		<input type='hidden' name='MAX_FILE_SIZE' value='2000000' />		<input type='file' name='xmlimport' value='' size='30' />		<input type='submit' value=\"" . wfMsgHtml( "uploadbtn" ) . "\" />	</form></fieldset>" );	} else {		if( empty( $wgImportSources ) ) {			$wgOut->addWikiText( wfMsg( 'importnosources' ) );		}	}	if( !empty( $wgImportSources ) ) {		$wgOut->addHTML( "<fieldset>	<legend>" . wfMsgHtml('importinterwiki') . "</legend>	<form method='post' action=\"$action\">" .		$wgOut->parse( wfMsg( 'import-interwiki-text' ) ) . "		<input type='hidden' name='action' value='submit' />		<input type='hidden' name='source' value='interwiki' />		<table>			<tr>				<td>					<select name='interwiki'>" );		foreach( $wgImportSources as $prefix ) {			$iw = htmlspecialchars( $prefix );			$selected = ($interwiki === $prefix) ? ' selected="selected"' : '';			$wgOut->addHTML( "<option value=\"$iw\"$selected>$iw</option>\n" );		}		$wgOut->addHTML( "					</select>				</td>				<td>" .					wfInput( 'frompage', 50, $frompage ) .				"</td>			</tr>			<tr>				<td></td>				<td>" .					wfCheckLabel( wfMsg( 'import-interwiki-history' ),						'interwikiHistory', 'interwikiHistory', $history ) .				"</td>			</tr>			<tr>				<td></td>				<td>					" . wfMsgHtml( 'import-interwiki-namespace' ) . " " .						HTMLnamespaceselector( $namespace, '' ) . "				</td>			</tr>			<tr>				<td></td>				<td>" .					wfSubmitButton( wfMsg( 'import-interwiki-submit' ) ) .				"</td>			</tr>		</table>	</form></fieldset>" );	}}/** * Reporting callback */class ImportReporter {	function __construct( $importer, $upload, $interwiki ) {		$importer->setPageOutCallback( array( $this, 'reportPage' ) );		$this->mPageCount = 0;		$this->mIsUpload = $upload;		$this->mInterwiki = $interwiki;	}		function open() {		global $wgOut;		$wgOut->addHtml( "<ul>\n" );	}		function reportPage( $title, $origTitle, $revisionCount ) {		global $wgOut, $wgUser, $wgLang, $wgContLang;				$skin = $wgUser->getSkin();				$this->mPageCount++;				$localCount = $wgLang->formatNum( $revisionCount );		$contentCount = $wgContLang->formatNum( $revisionCount );				$wgOut->addHtml( "<li>" . $skin->makeKnownLinkObj( $title ) .			" " .			wfMsgHtml( 'import-revision-count', $localCount ) .			"</li>\n" );				$log = new LogPage( 'import' );		if( $this->mIsUpload ) {			$detail = wfMsgForContent( 'import-logentry-upload-detail',				$contentCount );			$log->addEntry( 'upload', $title, $detail );		} else {			$interwiki = '[[:' . $this->mInterwiki . ':' .				$origTitle->getPrefixedText() . ']]';			$detail = wfMsgForContent( 'import-logentry-interwiki-detail',				$contentCount, $interwiki );			$log->addEntry( 'interwiki', $title, $detail );		}				$comment = $detail; // quick		$dbw = wfGetDB( DB_MASTER );		$nullRevision = Revision::newNullRevision(			$dbw, $title->getArticleId(), $comment, true );		$nullRevId = $nullRevision->insertOn( $dbw );	}		function close() {		global $wgOut;		if( $this->mPageCount == 0 ) {			$wgOut->addHtml( "<li>" . wfMsgHtml( 'importnopages' ) . "</li>\n" );		}		$wgOut->addHtml( "</ul>\n" );	}}/** * * @package MediaWiki * @subpackage SpecialPage */class WikiRevision {	var $title = null;	var $id = 0;	var $timestamp = "20010115000000";	var $user = 0;	var $user_text = "";	var $text = "";	var $comment = "";	var $minor = false;	function setTitle( $title ) {		if( is_object( $title ) ) {			$this->title = $title;		} elseif( is_null( $title ) ) {			throw new MWException( "WikiRevision given a null title in import." );		} else {			throw new MWException( "WikiRevision given non-object title in import." );		}	}	function setID( $id ) {		$this->id = $id;	}	function setTimestamp( $ts ) {		# 2003-08-05T18:30:02Z		$this->timestamp = wfTimestamp( TS_MW, $ts );	}	function setUsername( $user ) {		$this->user_text = $user;	}	function setUserIP( $ip ) {		$this->user_text = $ip;	}	function setText( $text ) {		$this->text = $text;	}	function setComment( $text ) {		$this->comment = $text;	}	function setMinor( $minor ) {		$this->minor = (bool)$minor;	}	function getTitle() {		return $this->title;	}	function getID() { 		return $this->id;	}	function getTimestamp() {		return $this->timestamp;	}	function getUser() {		return $this->user_text;	}	function getText() {		return $this->text;	}	function getComment() {		return $this->comment;	}	function getMinor() {		return $this->minor;	}	function importOldRevision() {		$fname = "WikiImporter::importOldRevision";		$dbw =& wfGetDB( DB_MASTER );		# Sneak a single revision into place		$user = User::newFromName( $this->getUser() );		if( $user ) {			$userId = intval( $user->getId() );			$userText = $user->getName();		} else {			$userId = 0;			$userText = $this->getUser();		}		// avoid memory leak...?		$linkCache =& LinkCache::singleton();		$linkCache->clear();		$article = new Article( $this->title );		$pageId = $article->getId();		if( $pageId == 0 ) {			# must create the page...			$pageId = $article->insertOn( $dbw );			$created = true;		} else {			$created = false;		}		# FIXME: Check for exact conflicts		# FIXME: Use original rev_id optionally		# FIXME: blah blah blah		#if( $numrows > 0 ) {		#	return wfMsg( "importhistoryconflict" );		#}		# Insert the row		$revision = new Revision( array(			'page'       => $pageId,			'text'       => $this->getText(),			'comment'    => $this->getComment(),			'user'       => $userId,			'user_text'  => $userText,			'timestamp'  => $this->timestamp,			'minor_edit' => $this->minor,			) );		$revId = $revision->insertOn( $dbw );		$changed = $article->updateIfNewerOn( $dbw, $revision );		if( $created ) {			wfDebug( __METHOD__ . ": running onArticleCreate\n" );			Article::onArticleCreate( $this->title );		} else {			if( $changed ) {				wfDebug( __METHOD__ . ": running onArticleEdit\n" );				Article::onArticleEdit( $this->title );			}		}		if( $created || $changed ) {			wfDebug( __METHOD__ . ": running edit updates\n" );			$article->editUpdates(				$this->getText(),				$this->getComment(),				$this->minor,				$this->timestamp,				$revId );		}				return true;	}}/** * * @package MediaWiki * @subpackage SpecialPage */class WikiImporter {	var $mSource = null;	var $mPageCallback = null;	var $mPageOutCallback = null;	var $mRevisionCallback = null;	var $mTargetNamespace = null;	var $lastfield;	function WikiImporter( $source ) {		$this->setRevisionCallback( array( &$this, "importRevision" ) );		$this->mSource = $source;	}	function throwXmlError( $err ) {		$this->debug( "FAILURE: $err" );		wfDebug( "WikiImporter XML error: $err\n" );	}	# --------------	function doImport() {		if( empty( $this->mSource ) ) {			return new WikiErrorMsg( "importnotext" );		}		$parser = xml_parser_create( "UTF-8" );		# case folding violates XML standard, turn it off		xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );		xml_set_object( $parser, $this );		xml_set_element_handler( $parser, "in_start", "" );		$offset = 0; // for context extraction on error reporting		do {			$chunk = $this->mSource->readChunk();			if( !xml_parse( $parser, $chunk, $this->mSource->atEnd() ) ) {				wfDebug( "WikiImporter::doImport encountered XML parsing error\n" );				return new WikiXmlError( $parser, 'XML import parse failure', $chunk, $offset );			}			$offset += strlen( $chunk );		} while( $chunk !== false && !$this->mSource->atEnd() );		xml_parser_free( $parser );

⌨️ 快捷键说明

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