protected function runOnPageSet(ApiPageSet $pageSet) { $articles = array_map(function (Title $item) { return Article::newFromTitle($item, RequestContext::getMain()); }, $pageSet->getGoodTitles()); /** * @var Article $article */ foreach ($articles as $id => $article) { $d = $article->getParserOutput()->getProperty(PortableInfoboxDataService::INFOBOXES_PROPERTY_NAME); if (is_array($d)) { $inf = []; foreach (array_keys($d) as $k => $v) { $inf[$k] = []; } $pageSet->getResult()->setIndexedTagName($inf, 'infobox'); $pageSet->getResult()->addValue(['query', 'pages', $id], 'infoboxes', $inf); foreach ($d as $count => $infobox) { $s = isset($infobox['sources']) ? $infobox['sources'] : []; $pageSet->getResult()->addValue(['query', 'pages', $id, 'infoboxes', $count], 'id', $count); $pageSet->getResult()->setIndexedTagName($s, "source"); $pageSet->getResult()->addValue(['query', 'pages', $id, 'infoboxes', $count], 'sources', $s); } } } }
public function execute() { $user = $this->getUser(); if ($user->isAnon()) { $this->dieUsage('Anonymous users cannot use watchlist change notifications', 'notloggedin'); } $params = $this->extractRequestParams(); $this->requireMaxOneParameter($params, 'timestamp', 'torevid', 'newerthanrevid'); $pageSet = new ApiPageSet($this); $args = array_merge(array($params, 'entirewatchlist'), array_keys($pageSet->getAllowedParams())); call_user_func_array(array($this, 'requireOnlyOneParameter'), $args); $dbw = $this->getDB(DB_MASTER); $timestamp = null; if (isset($params['timestamp'])) { $timestamp = $dbw->timestamp($params['timestamp']); } if (!$params['entirewatchlist']) { $pageSet->execute(); } if (isset($params['torevid'])) { if ($params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1) { $this->dieUsage('torevid may only be used with a single page', 'multpages'); } $title = reset($pageSet->getGoodTitles()); $timestamp = Revision::getTimestampFromId($title, $params['torevid']); if ($timestamp) { $timestamp = $dbw->timestamp($timestamp); } else { $timestamp = null; } } elseif (isset($params['newerthanrevid'])) { if ($params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1) { $this->dieUsage('newerthanrevid may only be used with a single page', 'multpages'); } $title = reset($pageSet->getGoodTitles()); $revid = $title->getNextRevisionID($params['newerthanrevid']); if ($revid) { $timestamp = $dbw->timestamp(Revision::getTimestampFromId($title, $revid)); } else { $timestamp = null; } } $apiResult = $this->getResult(); $result = array(); if ($params['entirewatchlist']) { // Entire watchlist mode: Just update the thing and return a success indicator $dbw->update('watchlist', array('wl_notificationtimestamp' => $timestamp), array('wl_user' => $user->getID()), __METHOD__); $result['notificationtimestamp'] = is_null($timestamp) ? '' : wfTimestamp(TS_ISO_8601, $timestamp); } else { // First, log the invalid titles foreach ($pageSet->getInvalidTitles() as $title) { $r = array(); $r['title'] = $title; $r['invalid'] = ''; $result[] = $r; } foreach ($pageSet->getMissingPageIDs() as $p) { $page = array(); $page['pageid'] = $p; $page['missing'] = ''; $page['notwatched'] = ''; $result[] = $page; } foreach ($pageSet->getMissingRevisionIDs() as $r) { $rev = array(); $rev['revid'] = $r; $rev['missing'] = ''; $rev['notwatched'] = ''; $result[] = $rev; } // Now process the valid titles $lb = new LinkBatch($pageSet->getTitles()); $dbw->update('watchlist', array('wl_notificationtimestamp' => $timestamp), array('wl_user' => $user->getID(), $lb->constructSet('wl', $dbw)), __METHOD__); // Query the results of our update $timestamps = array(); $res = $dbw->select('watchlist', array('wl_namespace', 'wl_title', 'wl_notificationtimestamp'), array('wl_user' => $user->getID(), $lb->constructSet('wl', $dbw)), __METHOD__); foreach ($res as $row) { $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp; } // Now, put the valid titles into the result foreach ($pageSet->getTitles() as $title) { $ns = $title->getNamespace(); $dbkey = $title->getDBkey(); $r = array('ns' => intval($ns), 'title' => $title->getPrefixedText()); if (!$title->exists()) { $r['missing'] = ''; } if (isset($timestamps[$ns]) && array_key_exists($dbkey, $timestamps[$ns])) { $r['notificationtimestamp'] = ''; if ($timestamps[$ns][$dbkey] !== null) { $r['notificationtimestamp'] = wfTimestamp(TS_ISO_8601, $timestamps[$ns][$dbkey]); } } else { $r['notwatched'] = ''; } $result[] = $r; } $apiResult->setIndexedTagName($result, 'page'); } $apiResult->addValue(null, $this->getModuleName(), $result); }
/** * @param ApiPageSet $pageSet Pages to be exported * @param ApiResult $result Result to output to */ private function doExport($pageSet, $result) { $exportTitles = array(); $titles = $pageSet->getGoodTitles(); if (count($titles)) { $user = $this->getUser(); /** @var $title Title */ foreach ($titles as $title) { if ($title->userCan('read', $user)) { $exportTitles[] = $title; } } } $exporter = new WikiExporter($this->getDB()); // WikiExporter writes to stdout, so catch its // output with an ob ob_start(); $exporter->openStream(); foreach ($exportTitles as $title) { $exporter->pageByTitle($title); } $exporter->closeStream(); $exportxml = ob_get_contents(); ob_end_clean(); // Don't check the size of exported stuff // It's not continuable, so it would cause more // problems than it'd solve if ($this->mParams['exportnowrap']) { $result->reset(); // Raw formatter will handle this $result->addValue(null, 'text', $exportxml, ApiResult::NO_SIZE_CHECK); $result->addValue(null, 'mime', 'text/xml', ApiResult::NO_SIZE_CHECK); } else { $r = array(); ApiResult::setContent($r, $exportxml); $result->addValue('query', 'export', $r, ApiResult::NO_SIZE_CHECK); } }
/** * @param ApiPageSet $pageSet Pages to be exported * @param ApiResult $result Result to output to */ private function doExport($pageSet, $result) { $exportTitles = []; $titles = $pageSet->getGoodTitles(); if (count($titles)) { $user = $this->getUser(); /** @var $title Title */ foreach ($titles as $title) { if ($title->userCan('read', $user)) { $exportTitles[] = $title; } } } $exporter = new WikiExporter($this->getDB()); $sink = new DumpStringOutput(); $exporter->setOutputSink($sink); $exporter->openStream(); foreach ($exportTitles as $title) { $exporter->pageByTitle($title); } $exporter->closeStream(); // Don't check the size of exported stuff // It's not continuable, so it would cause more // problems than it'd solve if ($this->mParams['exportnowrap']) { $result->reset(); // Raw formatter will handle this $result->addValue(null, 'text', $sink, ApiResult::NO_SIZE_CHECK); $result->addValue(null, 'mime', 'text/xml', ApiResult::NO_SIZE_CHECK); } else { $result->addValue('query', 'export', $sink, ApiResult::NO_SIZE_CHECK); $result->addValue('query', ApiResult::META_BC_SUBELEMENTS, ['export']); } }