Yaron Koren has submitted this change and it was merged. Change subject: Added limited-overwrite/"merge" option for importing XML or CSV ......................................................................
Added limited-overwrite/"merge" option for importing XML or CSV Change-Id: If308b926be2d17f0fdb3278f1e54cab41b2bd96d --- M includes/DT_ImportJob.php M includes/DT_PageStructure.php M includes/DT_Utils.php M languages/DT_Messages.php 4 files changed, 102 insertions(+), 7 deletions(-) Approvals: Yaron Koren: Verified; Looks good to me, approved diff --git a/includes/DT_ImportJob.php b/includes/DT_ImportJob.php index 09fddd3..0210080 100644 --- a/includes/DT_ImportJob.php +++ b/includes/DT_ImportJob.php @@ -50,14 +50,23 @@ $actual_user = $wgUser; $wgUser = User::newFromId( $this->params['user_id'] ); $text = $this->params['text']; - if ( $for_pages_that_exist == 'append' && $this->title->exists() ) { - if ( method_exists( 'WikiPage', 'getContent' ) ) { - // MW >= 1.21 - $existingText = $wikiPage->getContent()->getNativeData(); - } else { - $existingText = $article->getContent(); + if ( $this->title->exists() ) { + if ( $for_pages_that_exist == 'append' ) { + if ( method_exists( 'WikiPage', 'getContent' ) ) { + // MW >= 1.21 + $existingText = $wikiPage->getContent()->getNativeData(); + } else { + $existingText = $article->getContent(); + } + $text = $existingText . "\n" . $text; + } elseif ( $for_pages_that_exist == 'merge' ) { + $existingPageStructure = DTPageStructure::newFromTitle( $this->title ); + $newPageStructure = new DTPageStructure; + $newPageStructure->parsePageContents( $text ); + $existingPageStructure->mergeInPageStructure( $newPageStructure ); + return $existingPageStructure->toWikitext(); } - $text = $existingText . "\n" . $text; + // otherwise, $for_pages_that_exist == 'overwrite' } $edit_summary = $this->params['edit_summary']; if ( method_exists( 'WikiPage', 'getContent' ) ) { diff --git a/includes/DT_PageStructure.php b/includes/DT_PageStructure.php index 3f65f4a..6df693a 100644 --- a/includes/DT_PageStructure.php +++ b/includes/DT_PageStructure.php @@ -39,6 +39,23 @@ $this->mFields[$fieldName] = trim( $fieldValue ); } + public function toWikitext() { + if ( $this->mIsTemplate ) { + $wikitext = '{{' . $this->mTemplateName; + foreach ( $this->mFields as $fieldName => $fieldValue ) { + if ( is_numeric( $fieldName ) ) { + $wikitext .= '|' . $fieldValue; + } else { + $wikitext .= "\n|$fieldName=$fieldValue"; + } + } + $wikitext .= "\n}}"; + return $wikitext; + } else { + return $this->mFreeText; + } + } + public function toXML( $isSimplified ) { global $wgDataTransferViewXMLParseFields; global $wgDataTransferViewXMLParseFreeText; @@ -261,6 +278,67 @@ } } + /** + * Helper function for mergeInPageStructure(). + */ + private function getSingleInstanceTemplates() { + $instancesPerTemplate = array(); + foreach ( $this->mComponents as $pageComponent ) { + if ( $pageComponent->mIsTemplate ) { + $templateName = $pageComponent->mTemplateName; + if ( array_key_exists( $templateName, $instancesPerTemplate ) ) { + $instancesPerTemplate[$templateName]++; + } else { + $instancesPerTemplate[$templateName] = 1; + } + } + } + + $singleInstanceTemplates = array(); + foreach ( $instancesPerTemplate as $templateName => $instances ) { + if ( $instances == 1 ) { + $singleInstanceTemplates[] = $templateName; + } + } + return $singleInstanceTemplates; + } + + private function getIndexOfTemplateName( $templateName ) { + foreach ( $this->mComponents as $i => $pageComponent ) { + if ( $pageComponent->mTemplateName == $templateName ) { + return $i; + } + } + return null; + } + + public function mergeInPageStructure( $secondPageStructure ) { + // If there are any templates that have one instance in both + // pages, replace values for their fields with values from + // the second page. + $singleInstanceTemplatesHere = $this->getSingleInstanceTemplates(); + $singleInstanceTemplatesThere = $secondPageStructure->getSingleInstanceTemplates(); + $singleInstanceTemplatesInBoth = array_intersect( $singleInstanceTemplatesHere, $singleInstanceTemplatesThere ); + foreach ( $secondPageStructure->mComponents as $pageComponent ) { + if ( in_array( $pageComponent->mTemplateName, $singleInstanceTemplatesInBoth ) ) { + $indexOfThisTemplate = $this->getIndexOfTemplateName( $pageComponent->mTemplateName ); + foreach ( $pageComponent->mFields as $fieldName => $fieldValue ) { + $this->mComponents[$indexOfThisTemplate]->mFields[$fieldName] = $fieldValue; + } + } else { + $this->mComponents[] = $pageComponent; + } + } + } + + public function toWikitext() { + $wikitext = ''; + foreach ( $this->mComponents as $pageComponent ) { + $wikitext .= $pageComponent->toWikitext() . "\n"; + } + return trim( $wikitext ); + } + public function toXML( $isSimplified ) { $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' )->inContentLanguage()->text() ); $id_str = str_replace( ' ', '_', wfMessage( 'dt_xml_id' )->inContentLanguage()->text() ); diff --git a/includes/DT_Utils.php b/includes/DT_Utils.php index 2cabfee..03af8e6 100644 --- a/includes/DT_Utils.php +++ b/includes/DT_Utils.php @@ -36,6 +36,13 @@ array( 'type' => 'radio', 'name' => 'pagesThatExist', + 'value' => 'merge', + ) ) . "\n" . + "\t" . wfMessage( 'dt_import_mergeintoexisting' )->text() . "<br />" . "\n\t" . + "\t" . Xml::element( 'input', + array( + 'type' => 'radio', + 'name' => 'pagesThatExist', 'value' => 'skip', ) ) . "\n" . "\t" . wfMessage( 'dt_import_skipexisting' )->text() . "<br />" . "\n" . diff --git a/languages/DT_Messages.php b/languages/DT_Messages.php index dec4d13..713c80b 100644 --- a/languages/DT_Messages.php +++ b/languages/DT_Messages.php @@ -32,6 +32,7 @@ 'dt_import_encodingtype' => 'Encoding type:', 'dt_import_forexisting' => 'For pages that already exist:', 'dt_import_overwriteexisting' => 'Overwrite existing content', + 'dt_import_mergeintoexisting' => 'Overwrite only fields contained in the file', 'dt_import_skipexisting' => 'Skip', 'dt_import_appendtoexisting' => 'Append to existing content', 'dt_import_summarydesc' => 'Summary of import:', -- To view, visit https://gerrit.wikimedia.org/r/61387 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: If308b926be2d17f0fdb3278f1e54cab41b2bd96d Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/DataTransfer Gerrit-Branch: master Gerrit-Owner: Yaron Koren <yaro...@gmail.com> Gerrit-Reviewer: Siebrand <siebr...@wikimedia.org> Gerrit-Reviewer: Yaron Koren <yaro...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits