159 $title = Title::makeTitle( $row->page_namespace, $row->page_title );
160 $out .=
' ' . Xml::elementClean(
'title', [], self::canonicalTitle( $title ) ) .
"\n";
161 $out .=
' ' . Xml::element(
'ns', [], strval( $row->page_namespace ) ) .
"\n";
162 $out .=
' ' . Xml::element(
'id', [], strval( $row->page_id ) ) .
"\n";
163 if ( $row->page_is_redirect ) {
164 $page = WikiPage::factory( $title );
165 $redirect = $page->getRedirectTarget();
168 $out .= Xml::element(
'redirect', [
'title' => self::canonicalTitle( $redirect ) ] );
173 if ( $row->page_restrictions !=
'' ) {
174 $out .=
' ' . Xml::element(
'restrictions', [],
175 strval( $row->page_restrictions ) ) .
"\n";
178 Hooks::run(
'XmlDumpWriterOpenPage', [ $this, &
$out, $row, $title ] );
202 $out =
" <revision>\n";
203 $out .=
" " . Xml::element(
'id',
null, strval( $row->rev_id ) ) .
"\n";
204 if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
205 $out .=
" " . Xml::element(
'parentid',
null, strval( $row->rev_parent_id ) ) .
"\n";
210 if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
211 $out .=
" " . Xml::element(
'contributor', [
'deleted' =>
'deleted' ] ) .
"\n";
216 if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
217 $out .=
" <minor/>\n";
219 if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
220 $out .=
" " . Xml::element(
'comment', [
'deleted' =>
'deleted' ] ) .
"\n";
222 $comment = CommentStore::getStore()->getComment(
'rev_comment', $row )->text;
223 if ( $comment !=
'' ) {
224 $out .=
" " . Xml::elementClean(
'comment', [], strval( $comment ) ) .
"\n";
228 if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
229 $content_model = strval( $row->rev_content_model );
232 $title = Title::makeTitle( $row->page_namespace, $row->page_title );
233 $content_model = ContentHandler::getDefaultModelFor( $title );
236 $content_handler = ContentHandler::getForModelID( $content_model );
238 if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
239 $content_format = strval( $row->rev_content_format );
242 $content_format = $content_handler->getDefaultFormat();
245 $out .=
" " . Xml::element(
'model',
null, strval( $content_model ) ) .
"\n";
246 $out .=
" " . Xml::element(
'format',
null, strval( $content_format ) ) .
"\n";
249 if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
250 $out .=
" " . Xml::element(
'text', [
'deleted' =>
'deleted' ] ) .
"\n";
251 } elseif ( isset( $row->old_text ) ) {
253 $text = strval( Revision::getRevisionText( $row ) );
254 $text = $content_handler->exportTransform( $text, $content_format );
255 $out .=
" " . Xml::elementClean(
'text',
256 [
'xml:space' =>
'preserve',
'bytes' => intval( $row->rev_len ) ],
257 strval( $text ) ) .
"\n";
260 $out .=
" " . Xml::element(
'text',
261 [
'id' => $row->rev_text_id,
'bytes' => intval( $row->rev_len ) ],
265 if ( isset( $row->rev_sha1 )
267 && !( $row->rev_deleted & Revision::DELETED_TEXT )
269 $out .=
" " . Xml::element(
'sha1',
null, strval( $row->rev_sha1 ) ) .
"\n";
271 $out .=
" <sha1/>\n";
276 Hooks::run(
'XmlDumpWriterWriteRevision', [ &$writer, &
$out, $row, $text ] );
278 $out .=
" </revision>\n";
292 $out =
" <logitem>\n";
293 $out .=
" " . Xml::element(
'id',
null, strval( $row->log_id ) ) .
"\n";
298 $out .=
" " . Xml::element(
'contributor', [
'deleted' =>
'deleted' ] ) .
"\n";
304 $out .=
" " . Xml::element(
'comment', [
'deleted' =>
'deleted' ] ) .
"\n";
306 $comment = CommentStore::getStore()->getComment(
'log_comment', $row )->text;
307 if ( $comment !=
'' ) {
308 $out .=
" " . Xml::elementClean(
'comment',
null, strval( $comment ) ) .
"\n";
312 $out .=
" " . Xml::element(
'type',
null, strval( $row->log_type ) ) .
"\n";
313 $out .=
" " . Xml::element(
'action',
null, strval( $row->log_action ) ) .
"\n";
316 $out .=
" " . Xml::element(
'text', [
'deleted' =>
'deleted' ] ) .
"\n";
318 $title = Title::makeTitle( $row->log_namespace, $row->log_title );
319 $out .=
" " . Xml::elementClean(
'logtitle',
null, self::canonicalTitle( $title ) ) .
"\n";
320 $out .=
" " . Xml::elementClean(
'params',
321 [
'xml:space' =>
'preserve' ],
322 strval( $row->log_params ) ) .
"\n";
325 $out .=
" </logitem>\n";
385 if ( $file->isOld() ) {
387 Xml::element(
'archivename',
null, $file->getArchiveName() ) .
"\n";
391 if ( $dumpContents ) {
392 $be = $file->getRepo()->getBackend();
393 # Dump file as base64
394 # Uses only XML-safe characters, so does not need escaping
395 # @todo Too bad this loads the contents into memory (script might swap)
396 $contents =
' <contents encoding="base64">' .
397 chunk_split( base64_encode(
398 $be->getFileContents( [
'src' => $file->getPath() ] ) ) ) .
404 $comment = Xml::element(
'comment', [
'deleted' =>
'deleted' ] );
406 $comment = Xml::elementClean(
'comment',
null, strval( $file->getDescription() ) );
408 return " <upload>\n" .
410 $this->
writeContributor( $file->getUser(
'id' ), $file->getUser(
'text' ) ) .
411 " " . $comment .
"\n" .
412 " " . Xml::element(
'filename',
null, $file->getName() ) .
"\n" .
414 " " . Xml::element(
'src',
null, $file->getCanonicalUrl() ) .
"\n" .
415 " " . Xml::element(
'size',
null, $file->getSize() ) .
"\n" .
416 " " . Xml::element(
'sha1base36',
null, $file->getSha1() ) .
"\n" .
417 " " . Xml::element(
'rel',
null, $file->getRel() ) .
"\n" .