00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 require_once( 'commandLine.inc' );
00033 require_once( 'cleanupTable.inc' );
00034
00038 class TitleCleanup extends TableCleanup {
00039 function __construct( $dryrun = false ) {
00040 parent::__construct( 'page', $dryrun );
00041 }
00042
00043 function processPage( $row ) {
00044 $current = Title::makeTitle( $row->page_namespace, $row->page_title );
00045 $display = $current->getPrefixedText();
00046
00047 $verified = UtfNormal::cleanUp( $display );
00048
00049 $title = Title::newFromText( $verified );
00050
00051 if( !is_null( $title ) && $title->equals( $current ) && $title->canExist() ) {
00052 return $this->progress( 0 );
00053 }
00054
00055 if( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) {
00056 $this->log( "file $row->page_title needs cleanup, please run cleanupImages.php." );
00057 return $this->progress( 0 );
00058 } elseif( is_null( $title ) ) {
00059 $this->log( "page $row->page_id ($display) is illegal." );
00060 $this->moveIllegalPage( $row );
00061 return $this->progress( 1 );
00062 } else {
00063 $this->log( "page $row->page_id ($display) doesn't match self." );
00064 $this->moveInconsistentPage( $row, $title );
00065 return $this->progress( 1 );
00066 }
00067 }
00068
00069 function fileExists( $name ) {
00070
00071
00072 $dbr = wfGetDB( DB_SLAVE );
00073 $row = $dbr->selectRow( 'image', array( 'img_name' ), array( 'img_name' => $name ), __METHOD__ );
00074 return $row !== false;
00075 }
00076
00077 function moveIllegalPage( $row ) {
00078 $legal = 'A-Za-z0-9_/\\\\-';
00079 $legalized = preg_replace_callback( "!([^$legal])!",
00080 array( &$this, 'hexChar' ),
00081 $row->page_title );
00082 if( $legalized == '.' ) $legalized = '(dot)';
00083 if( $legalized == '_' ) $legalized = '(space)';
00084 $legalized = 'Broken/' . $legalized;
00085
00086 $title = Title::newFromText( $legalized );
00087 if( is_null( $title ) ) {
00088 $clean = 'Broken/id:' . $row->page_id;
00089 $this->log( "Couldn't legalize; form '$legalized' still invalid; using '$clean'" );
00090 $title = Title::newFromText( $clean );
00091 } elseif( $title->exists() ) {
00092 $clean = 'Broken/id:' . $row->page_id;
00093 $this->log( "Legalized for '$legalized' exists; using '$clean'" );
00094 $title = Title::newFromText( $clean );
00095 }
00096
00097 $dest = $title->getDBkey();
00098 if( $this->dryrun ) {
00099 $this->log( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')" );
00100 } else {
00101 $this->log( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')" );
00102 $dbw = wfGetDB( DB_MASTER );
00103 $dbw->update( 'page',
00104 array( 'page_title' => $dest ),
00105 array( 'page_id' => $row->page_id ),
00106 'cleanupTitles::moveInconsistentPage' );
00107 }
00108 }
00109
00110 function moveInconsistentPage( $row, $title ) {
00111 if( $title->exists() || $title->getInterwiki() ) {
00112 if( $title->getInterwiki() ) {
00113 $prior = $title->getPrefixedDbKey();
00114 } else {
00115 $prior = $title->getDBkey();
00116 }
00117 $clean = 'Broken/' . $prior;
00118 $verified = Title::makeTitleSafe( $row->page_namespace, $clean );
00119 if( $verified->exists() ) {
00120 $blah = "Broken/id:" . $row->page_id;
00121 $this->log( "Couldn't legalize; form '$clean' exists; using '$blah'" );
00122 $verified = Title::makeTitleSafe( $row->page_namespace, $blah );
00123 }
00124 $title = $verified;
00125 }
00126 if( is_null( $title ) ) {
00127 wfDie( "Something awry; empty title.\n" );
00128 }
00129 $ns = $title->getNamespace();
00130 $dest = $title->getDBkey();
00131 if( $this->dryrun ) {
00132 $this->log( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')" );
00133 } else {
00134 $this->log( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')" );
00135 $dbw = wfGetDB( DB_MASTER );
00136 $dbw->update( 'page',
00137 array(
00138 'page_namespace' => $ns,
00139 'page_title' => $dest
00140 ),
00141 array( 'page_id' => $row->page_id ),
00142 'cleanupTitles::moveInconsistentPage' );
00143 $linkCache = LinkCache::singleton();
00144 $linkCache->clear();
00145 }
00146 }
00147 }
00148
00149 $wgUser->setName( 'Conversion script' );
00150 $caps = new TitleCleanup( !isset( $options['fix'] ) );
00151 $caps->cleanup();
00152
00153