return $de;
}
- #XXX: is the native model for wikitext a string or the parser output? parse early or parse late?
+ /**
+ * attempts to merge differences between three versions.
+ * Returns a new Content object for a clean merge and false for failure or a conflict.
+ *
+ * This default implementation always returns false.
+ *
+ * @param $oldContent String
+ * @param $myContent String
+ * @param $yourContent String
+ * @return Content|Bool
+ */
+ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+ return false;
+ }
+
+ #TODO: cover patch/undo just like merge3.
#TODO: how to handle extra message for JS/CSS previews??
#TODO: Article::showCssOrJsPage ---> specialized classes!
return $content->getRawData();
}
+ /**
+ * attempts to merge differences between three versions.
+ * Returns a new Content object for a clean merge and false for failure or a conflict.
+ *
+ * This text-based implementation uses wfMerge().
+ *
+ * @param $oldContent String
+ * @param $myContent String
+ * @param $yourContent String
+ * @return Content|Bool
+ */
+ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+ $format = $this->getDefaultFormat();
+
+ $old = $this->serialize( $oldContent, $format );
+ $mine = $this->serialize( $myContent, $format );
+ $yours = $this->serialize( $yourContent, $format );
+
+ $ok = wfMerge( $old, $mine, $yours, $result );
+
+ if ( !$ok ) return false;
+ if ( !$result ) return $this->emptyContent();
+
+ $mergedContent = $this->unserialize( $result, $format );
+ return $mergedContent;
+ }
+
+
}
class WikitextContentHandler extends TextContentHandler {
$text = $this->textbox1; // do not try to merge here!
} elseif ( $this->isConflict ) {
# Attempt merge
- if ( $this->mergeChangesInto( $text ) ) { #FIXME: use ContentHandler
+ if ( $this->mergeChangesInto( $text ) ) { #FIXME: passe/receive Content object
// Successful merge! Maybe we should tell the user the good news?
$this->isConflict = false;
wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" );
wfProfileOut( __METHOD__ );
return false;
}
- $baseText = $baseRevision->getText();
+ $baseContent = $baseRevision->getContent();
// The current state, we want to merge updates into it
$currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
wfProfileOut( __METHOD__ );
return false;
}
- $currentText = $currentRevision->getText();
+ $currentContent = $currentRevision->getContent();
- $result = '';
- if ( wfMerge( $baseText, $editText, $currentText, $result ) ) {
- $editText = $result;
+ $handler = ContentHandler::getForModelName( $baseContent->getModelName() );
+ $editContent = $handler->unserialize( $editText ); #FIXME: supply serialization fomrat from edit form!
+
+ $result = $handler->merge3( $baseContent, $editContent, $currentContent );
+ if ( $result ) {
+ $editText = ContentHandler::getContentText($result); #FIXME: supply serialization fomrat from edit form!
wfProfileOut( __METHOD__ );
return true;
} else {