/** * */ function wfSpecialExport($page = '') { global $wgOut, $wgRequest, $wgSitename, $wgExportAllowListContributors; global $wgExportAllowHistory, $wgExportMaxHistory; $curonly = true; $doexport = false; if ($wgRequest->getCheck('addcat')) { $page = $wgRequest->getText('pages'); $catname = $wgRequest->getText('catname'); if ($catname !== '' && $catname !== NULL && $catname !== false) { $t = Title::makeTitleSafe(NS_MAIN, $catname); if ($t) { /** * @fixme This can lead to hitting memory limit for very large * categories. Ideally we would do the lookup synchronously * during the export in a single query. */ $catpages = wfExportGetPagesFromCategory($t); if ($catpages) { $page .= "\n" . implode("\n", $catpages); } } } } else { if ($wgRequest->wasPosted() && $page == '') { $page = $wgRequest->getText('pages'); $curonly = $wgRequest->getCheck('curonly'); $rawOffset = $wgRequest->getVal('offset'); if ($rawOffset) { $offset = wfTimestamp(TS_MW, $rawOffset); } else { $offset = null; } $limit = $wgRequest->getInt('limit'); $dir = $wgRequest->getVal('dir'); $history = array('dir' => 'asc', 'offset' => false, 'limit' => $wgExportMaxHistory); $historyCheck = $wgRequest->getCheck('history'); if ($curonly) { $history = WikiExporter::CURRENT; } elseif (!$historyCheck) { if ($limit > 0 && $limit < $wgExportMaxHistory) { $history['limit'] = $limit; } if (!is_null($offset)) { $history['offset'] = $offset; } if (strtolower($dir) == 'desc') { $history['dir'] = 'desc'; } } if ($page != '') { $doexport = true; } } else { // Default to current-only for GET requests $page = $wgRequest->getText('pages', $page); $historyCheck = $wgRequest->getCheck('history'); if ($historyCheck) { $history = WikiExporter::FULL; } else { $history = WikiExporter::CURRENT; } if ($page != '') { $doexport = true; } } } if (!$wgExportAllowHistory) { // Override $history = WikiExporter::CURRENT; } $list_authors = $wgRequest->getCheck('listauthors'); if (!$curonly || !$wgExportAllowListContributors) { $list_authors = false; } if ($doexport) { $wgOut->disable(); // Cancel output buffering and gzipping if set // This should provide safer streaming for pages with history wfResetOutputBuffers(); header("Content-type: application/xml; charset=utf-8"); if ($wgRequest->getCheck('wpDownload')) { // Provide a sane filename suggestion $filename = urlencode($wgSitename . '-' . wfTimestampNow() . '.xml'); $wgRequest->response()->header("Content-disposition: attachment;filename={$filename}"); } /* Split up the input and look up linked pages */ $inputPages = array_filter(explode("\n", $page), 'wfFilterPage'); $pageSet = array_flip($inputPages); if ($wgRequest->getCheck('templates')) { $pageSet = wfExportGetTemplates($inputPages, $pageSet); } /* // Enable this when we can do something useful exporting/importing image information. :) if( $wgRequest->getCheck( 'images' ) ) { $pageSet = wfExportGetImages( $inputPages, $pageSet ); } */ $pages = array_keys($pageSet); /* Ok, let's get to it... */ if ($history == WikiExporter::CURRENT) { $lb = false; $db = wfGetDB(DB_SLAVE); $buffer = WikiExporter::BUFFER; } else { // Use an unbuffered query; histories may be very long! $lb = wfGetLBFactory()->newMainLB(); $db = $lb->getConnection(DB_SLAVE); $buffer = WikiExporter::STREAM; // This might take a while... :D wfSuppressWarnings(); set_time_limit(0); wfRestoreWarnings(); } $exporter = new WikiExporter($db, $history, $buffer); $exporter->list_authors = $list_authors; $exporter->openStream(); foreach ($pages as $page) { /* if( $wgExportMaxHistory && !$curonly ) { $title = Title::newFromText( $page ); if( $title ) { $count = Revision::countByTitle( $db, $title ); if( $count > $wgExportMaxHistory ) { wfDebug( __FUNCTION__ . ": Skipped $page, $count revisions too big\n" ); continue; } } }*/ #Bug 8824: Only export pages the user can read $title = Title::newFromText($page); if (is_null($title)) { continue; } #TODO: perhaps output an <error> tag or something. if (!$title->userCanRead()) { continue; } #TODO: perhaps output an <error> tag or something. $exporter->pageByTitle($title); } $exporter->closeStream(); if ($lb) { $lb->closeAll(); } return; } $self = SpecialPage::getTitleFor('Export'); $wgOut->addHTML(wfMsgExt('exporttext', 'parse')); $form = Xml::openElement('form', array('method' => 'post', 'action' => $self->getLocalUrl('action=submit'))); $form .= Xml::inputLabel(wfMsg('export-addcattext'), 'catname', 'catname', 40) . ' '; $form .= Xml::submitButton(wfMsg('export-addcat'), array('name' => 'addcat')) . '<br />'; $form .= Xml::openElement('textarea', array('name' => 'pages', 'cols' => 40, 'rows' => 10)); $form .= htmlspecialchars($page); $form .= Xml::closeElement('textarea'); $form .= '<br />'; if ($wgExportAllowHistory) { $form .= Xml::checkLabel(wfMsg('exportcuronly'), 'curonly', 'curonly', true) . '<br />'; } else { $wgOut->addHTML(wfMsgExt('exportnohistory', 'parse')); } $form .= Xml::checkLabel(wfMsg('export-templates'), 'templates', 'wpExportTemplates', false) . '<br />'; // Enable this when we can do something useful exporting/importing image information. :) //$form .= Xml::checkLabel( wfMsg( 'export-images' ), 'images', 'wpExportImages', false ) . '<br />'; $form .= Xml::checkLabel(wfMsg('export-download'), 'wpDownload', 'wpDownload', true) . '<br />'; $form .= Xml::submitButton(wfMsg('export-submit'), array('accesskey' => 's')); $form .= Xml::closeElement('form'); $wgOut->addHTML($form); }
/** * */ function wfSpecialExport($page = '') { global $wgOut, $wgRequest, $wgSitename, $wgExportAllowListContributors; global $wgExportAllowHistory, $wgExportMaxHistory; $curonly = true; $doexport = false; if ($wgRequest->getCheck('addcat')) { $page = $wgRequest->getText('pages'); $catname = $wgRequest->getText('catname'); if ($catname !== '' && $catname !== NULL && $catname !== false) { $t = Title::makeTitleSafe(NS_CATEGORY, $catname); if ($t) { $catpages = wfExportGetPagesFromCategory($t); if ($catpages) { $page .= "\n" . implode("\n", $catpages); } } } } else { if ($wgRequest->wasPosted() && $page == '') { $page = $wgRequest->getText('pages'); $curonly = $wgRequest->getCheck('curonly'); $rawOffset = $wgRequest->getVal('offset'); if ($rawOffset) { $offset = wfTimestamp(TS_MW, $rawOffset); } else { $offset = null; } $limit = $wgRequest->getInt('limit'); $dir = $wgRequest->getVal('dir'); $history = array('dir' => 'asc', 'offset' => false, 'limit' => $wgExportMaxHistory); $historyCheck = $wgRequest->getCheck('history'); if ($curonly) { $history = WikiExporter::CURRENT; } elseif (!$historyCheck) { if ($limit > 0 && $limit < $wgExportMaxHistory) { $history['limit'] = $limit; } if (!is_null($offset)) { $history['offset'] = $offset; } if (strtolower($dir) == 'desc') { $history['dir'] = 'desc'; } } if ($page != '') { $doexport = true; } } else { // Default to current-only for GET requests $page = $wgRequest->getText('pages', $page); $historyCheck = $wgRequest->getCheck('history'); if ($historyCheck) { $history = WikiExporter::FULL; } else { $history = WikiExporter::CURRENT; } if ($page != '') { $doexport = true; } } } if (!$wgExportAllowHistory) { // Override $history = WikiExporter::CURRENT; } $list_authors = $wgRequest->getCheck('listauthors'); if (!$curonly || !$wgExportAllowListContributors) { $list_authors = false; } if ($doexport) { $wgOut->disable(); // Cancel output buffering and gzipping if set // This should provide safer streaming for pages with history wfResetOutputBuffers(); header("Content-type: application/xml; charset=utf-8"); if ($wgRequest->getCheck('wpDownload')) { // Provide a sane filename suggestion $filename = urlencode($wgSitename . '-' . wfTimestampNow() . '.xml'); $wgRequest->response()->header("Content-disposition: attachment;filename={$filename}"); } $pages = explode("\n", $page); $db = wfGetDB(DB_SLAVE); $exporter = new WikiExporter($db, $history); $exporter->list_authors = $list_authors; $exporter->openStream(); foreach ($pages as $page) { /* if( $wgExportMaxHistory && !$curonly ) { $title = Title::newFromText( $page ); if( $title ) { $count = Revision::countByTitle( $db, $title ); if( $count > $wgExportMaxHistory ) { wfDebug( __FUNCTION__ . ": Skipped $page, $count revisions too big\n" ); continue; } } }*/ #Bug 8824: Only export pages the user can read $title = Title::newFromText($page); if (is_null($title)) { continue; } #TODO: perhaps output an <error> tag or something. if (!$title->userCan('read')) { continue; } #TODO: perhaps output an <error> tag or something. $exporter->pageByTitle($title); } $exporter->closeStream(); return; } $self = SpecialPage::getTitleFor('Export'); $wgOut->addHtml(wfMsgExt('exporttext', 'parse')); $form = Xml::openElement('form', array('method' => 'post', 'action' => $self->getLocalUrl('action=submit'))); $form .= Xml::inputLabel(wfMsg('export-addcattext'), 'catname', 'catname', 40) . ' '; $form .= Xml::submitButton(wfMsg('export-addcat'), array('name' => 'addcat')) . '<br />'; $form .= Xml::openElement('textarea', array('name' => 'pages', 'cols' => 40, 'rows' => 10)); $form .= htmlspecialchars($page); $form .= Xml::closeElement('textarea'); $form .= '<br />'; if ($wgExportAllowHistory) { $form .= Xml::checkLabel(wfMsg('exportcuronly'), 'curonly', 'curonly', true) . '<br />'; } else { $wgOut->addHtml(wfMsgExt('exportnohistory', 'parse')); } $form .= Xml::checkLabel(wfMsg('export-download'), 'wpDownload', 'wpDownload', true) . '<br />'; $form .= Xml::submitButton(wfMsg('export-submit')); $form .= Xml::closeElement('form'); $wgOut->addHtml($form); }