public function build() { $article = $this->Agent->getArticle(); $text = $article->getContent(true); # Strip comments and <nowiki> $text = preg_replace("/<!--.*?-->/s", "", $text); $text = preg_replace("@<nowiki>.*?</nowiki>@s", "", $text); # change template usage to substitution; note that this is WRONG #$tchars = Title::legalChars(); #$text = preg_replace("/(?<!{){{([$tchars]+)(\|.*?)?}}(?!})/", "{{subst:$1$2}}", $text); $parser = new Parser(); # so the magic variables work out right $parser->mOptions = new ParserOptions(); $parser->mTitle = $this->Agent->getTitle(); $parser->mOutputType = OT_WIKI; $parser->initialiseVariables(); $parser->clearState(); $text = $parser->replaceVariables($text); preg_match_all("@<rdf>(.*?)</rdf>@s", $text, $matches, PREG_PATTERN_ORDER); $content = $matches[1]; $rdf = implode(' ', array_values($content)); $model = MwRdf::Model(); if (strlen($rdf) > 0) { $parser->mOutputType = OT_HTML; $rdf = $parser->replaceVariables($rdf); $turtle_parser = MwRdf::Parser('turtle'); $base_uri = $this->Agent->getTitle()->getFullUrl(); $prelude = MwRdf::getNamespacePrelude(); $model->loadStatementsFromString($turtle_parser, $prelude . $rdf); } return $model; }
public function testThatTheInPageModelIsStoredCorrectlyInContext() { $this->agent->storeModel('inpage'); $store = MwRdf::StoredModel(); $context = $this->agent->getContextNode('inpage'); $model = $this->agent->buildModel('inpage'); $this->assertModelContainsModelInContext($store, $model, $context, "The inpage RDF model has not been successfully stored and retrieved."); }
public function retrieve() { $sm = MwRdf::StoredModel(); $model = MwRdf::Model(); $context = $this->Agent->getContextNode($this->getName()); $stream = librdf_model_context_as_stream($sm->getModel(), $context->getNode()); librdf_model_add_statements($model->getModel(), $stream); librdf_free_stream($stream); $sm->rewind(); return $model; }
public function retrieve() { $base_uri = $this->Agent->getTitle()->getFullUrl(); $query = MwRdf::Query($this->getQueryString(), $base_uri, 'sparql'); $store = MwRdf::StoredModel(); $res = $query->execute($store); $model = MwRdf::Model(); foreach ($res as $statement) { $model->addStatement($statement); } return $model; }
/** * As with QueryPage, this is the actual workhorse. It does everything * needed to make a real, honest-to-gosh query page. * * @param $offset database query offset * @param $limit database query limit * @param $shownavigation show navigation like "next 200"? */ function doQuery($offset, $limit, $shownavigation = true) { global $wgUser, $wgOut, $wgContLang; $this->offset = $offset; $this->limit = $limit; $sname = $this->getName(); $fname = get_class($this) . '::doQuery'; $sk = $wgUser->getSkin(); $wgOut->setSyndicated($this->isSyndicated()); $query = MwRdf::Query($this->getQuery(), $this->getBaseUrl(), $this->getQueryLanguage()); $librdf_res = $query->execute(MwRdf::StoredModel()); # let's just dump the tuples into a normal php array shall # we? This will avoid memory management hassels. $res = array(); foreach ($librdf_res as $tuple) { $res[] = $tuple; } $num = count($res); $res = $this->preprocessResults($res); if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); # often disable 'next' link when we reach the end $atend = $num < $limit; $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = "<ol start='" . ($offset + 1) . "' class='special'>"; } # here's where we do the offset and limit for ($i = $offset; $i < $num && $i < $offset + $limit; $i++) { $format = $this->formatResult($sk, $res[$i]); if ($format) { $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n"; } } if (!$this->listoutput) { $s[] = '</ol>'; } $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s); $wgOut->addHTML($str); } if ($shownavigation) { $wgOut->addHTML("<p>{$sl}</p>\n"); } return $num; }
public function build() { $dc = MwRdf::Vocabulary('dc'); $model = MwRdf::Model(); $ar = $this->Agent->titleResource(); $categories = $this->Agent->getTitle()->getParentCategories(); if (is_array($categories)) { foreach (array_keys($categories) as $category) { $catmf = MwRdf::ModelingAgent(Title::newFromText($category)); $model->addStatement(MwRdf::Statement($ar, $dc->subject, $catmf->titleResource())); } } return $model; }
public function build() { $dcterms = MwRdf::Vocabulary('dcterms'); $model = MwRdf::Model(); $tr = $this->Agent->titleResource(); $dbr = wfGetDB(DB_SLAVE); $res = $dbr->select('pagelinks', array('pl_namespace', 'pl_title'), array('pl_from = ' . $this->Agent->getTitle()->getArticleID()), 'MwRdfLinksFrom', array('ORDER BY' => 'pl_namespace, pl_title')); while ($res && ($row = $dbr->fetchObject($res))) { $lt = Title::makeTitle($row->pl_namespace, $row->pl_title); $ltmf = MwRdf::ModelingAgent($lt); $model->addStatement(MwRdf::Statement($tr, $dcterms->references, $ltmf->titleResource())); } $dbr->freeResult($res); return $model; }
public function build() { global $wgRightsUrl; $rdf = MwRdf::Vocabulary('rdf'); $cc = MwRdf::Vocabulary('cc'); $model = MwRdf::Model(); $tr = $this->Agent->titleResource(); $model->addStatement(MwRdf::Statement($tr, $rdf->a, $cc->Work)); if (!isset($wgRightsUrl)) { return $model; } $lr = MwRdf::UriNode($wgRightsUrl); $model->addStatement(MwRdf::Statement($tr, $cc->license, $lr)); $model->addStatement(MwRdf::Statement($lr, $rdf->a, $cc->License)); $terms = MwRdf::GetCcTerms($wgRightsUrl); if (!isset($terms)) { return $model; } foreach ($terms as $term) { switch ($term) { case 're': $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->Reproduction)); break; case 'di': $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->Distribution)); break; case 'de': $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->DerivativeWorks)); break; case 'nc': $model->addStatement(MwRdf::Statement($lr, $cc->prohibits, $cc->CommercialUse)); break; case 'no': $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->Notice)); break; case 'by': $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->Attribution)); break; case 'sa': $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->ShareAlike)); break; case 'sc': $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->SourceCode)); break; } } return $model; }
public function build() { global $wgContLang; $dc = MwRdf::Vocabulary('dc'); $dcterms = MwRdf::Vocabulary('dcterms'); $rdfs = MwRdf::Vocabulary('rdfs'); $model = MwRdf::Model(); $tr = $this->Agent->titleResource(); $article = $this->Agent->getArticle(); $text = $article->getContent(true); $parser = new Parser(); $parser->mOptions = new ParserOptions(); $parser->mTitle = $this; $parser->initialiseVariables(); $parser->clearState(); $tags = array('nowiki'); $m = array(); $text = $parser->extractTagsAndParams($tags, $text, $m); # XXX: maybe it would actually be better to do this at another # stage after the parser has already identified interwiki and # lang links # Find prefixed links preg_match_all("/\\[\\[([^|\\]]+:[^|\\]]+)(\\|.*)?\\]\\]/", $text, $m); if (!isset($m[0])) { return $model; } // nothing found so nevermind foreach ($m[1] as $linktext) { $iwlink = Title::newFromText($linktext); if (isset($iwlink)) { $pfx = $iwlink->getInterwiki(); if (strlen($pfx) > 0) { $iwlinkmf = MwRdf::ModelingAgent($iwlink); $iwr = $iwlinkmf->titleResource(); # XXX: Wikitravel uses some 4+ prefixes for sister site links if ($wgContLang->getLanguageName($pfx) && strlen($pfx) < 4) { $model->addStatement(MwRdf::Statement($tr, $dcterms->hasVersion, $iwr)); $model->addStatement(MwRdf::Statement($iwr, $dc->language, MwRdf::Language($pfx))); } else { # XXX: Express the "sister site" relationship better $model->addStatement(MwRdf::Statement($tr, $rdfs->seeAlso, $iwr)); } } } } return $model; }
public function build() { global $wgServer; $dc = MwRdf::Vocabulary('dc'); $dcterms = MwRdf::Vocabulary('dcterms'); $dctype = MwRdf::Vocabulary('dctype'); $model = MwRdf::Model(); $tr = $this->Agent->titleResource(); $dbr = wfGetDB(DB_SLAVE); $res = $dbr->select('imagelinks', array('il_to'), array('il_from = ' . $this->Agent->getTitle()->getArticleID()), 'MwRdfImage'); while ($res && ($row = $dbr->fetchObject($res))) { $img = wfFindFile($row->il_to); if (!$img->exists()) { continue; } $iuri = $img->getURL(); if ($iuri[0] == '/') { $iuri = $wgServer . $iuri; } $ir = MwRdf::UriNode($iuri); $model->addStatement(MwRdf::Statement($tr, $dcterms->hasPart, $ir)); $model->addStatement(MwRdf::Statement($ir, $dc->type, $dctype->Image)); $mt = $img->getMimeType(); if (isset($mt)) { $model->addStatement(MwRdf::Statement($ir, $dc->format, MwRdf::MediaType($mt))); } $hist_line = $img->nextHistoryLine(); if (!isset($hist_line)) { continue; } $creator = MwRdf::PersonToResource($hist_line->img_user, $hist_line->img_user_text, User::whoIsReal($hist_line->img_user)); $model->addStatement(MwRdf::Statement($ir, $dc->creator, $creator)); $model->addStatement(MwRdf::Statement($ir, $dc->date, MwRdf::TimestampResource($hist_line->img_timestamp))); $seen = array($hist_line->img_user => true); while ($hist_line = $img->nextHistoryLine()) { if (isset($seen[$hist_line->img_user])) { continue; } $contributor = MwRdf::PersonToResource($hist_line->img_user, $hist_line->img_user_text, User::whoIsReal($hist_line->img_user)); $model->addStatement(MwRdf::Statement($ir, $dc->contributor, $contributor)); $seen[$hist_line->img_user] = true; } } $dbr->freeResult($res); return $model; }
public function build() { global $wgSitename, $wgContLanguageCode; $article = $this->Agent->getArticle(); $model = MwRdf::Model(); $rdf = MwRdf::Vocabulary('rdf'); $dc = MwRdf::Vocabulary('dc'); $dctype = MwRdf::Vocabulary('dctype'); $artres = $this->Agent->titleResource(); $model->addStatement(MwRdf::Statement($artres, $dc->title, MwRdf::LiteralNode($this->Agent->getTitle()->getText()))); $model->addStatement(MwRdf::Statement($artres, $dc->publisher, MwRdf::PageOrString(wfMsg('aboutpage'), $wgSitename))); $model->addStatement(MwRdf::Statement($artres, $dc->language, MwRdf::Language($wgContLanguageCode))); $model->addStatement(MwRdf::Statement($artres, $dc->type, $dctype->Text)); $model->addStatement(MwRdf::Statement($artres, $dc->format, MwRdf::MediaType('text/html'))); if ($this->Agent->getTimestampResource()) { $model->addStatement(MwRdf::Statement($artres, $dc->date, $this->Agent->getTimestampResource())); } if (MWNamespace::isTalk($this->Agent->getTitle()->getNamespace())) { $model->addStatement(MwRdf::Statement($artres, $dc->subject, $this->Agent->subjectResource())); } else { $talk = MwRdf::ModelingAgent($this->Agent->getTitle()->getTalkPage()); $model->addStatement(MwRdf::Statement($talk->titleResource(), $dc->subject, $artres)); } # 'Creator' is responsible for this version $creator = MwRdf::PersonToResource($article->getUser()); $model->addStatement(MwRdf::Statement($artres, $dc->creator, $creator)); # 'Contributors' are all other version authors $contributors = $article->getContributors(); foreach ($contributors as $user_parts) { $contributor = MwRdf::PersonToResource($user_parts[0], $user_parts[1], $user_parts[2]); $model->addStatement(MwRdf::Statement($artres, $dc->contributor, $contributor)); } # Rights notification global $wgRightsPage, $wgRightsUrl, $wgRightsText; $rights = MwRdf::RightsResource(); if ($rights) { $model->addStatement(MwRdf::Statement($artres, $dc->rights, $rights)); } return $model; }
public function build() { global $wgContLanguageCode; $dc = MwRdf::Vocabulary('dc'); $dcterms = MwRdf::Vocabulary('dcterms'); $model = MwRdf::Model(); $tr = $this->Agent->titleResource(); $dbr = wfGetDB(DB_SLAVE); $res = $dbr->select(array('page', 'revision'), array('rev_id', 'rev_timestamp', 'rev_user', 'rev_user_text'), array('page_namespace = ' . $this->Agent->getTitle()->getNamespace(), 'page_title = ' . $dbr->addQuotes($this->Agent->getTitle()->getDBkey()), 'rev_page = page_id', 'rev_id != page_latest'), 'MwRdfHistory', array('ORDER BY' => 'rev_timestamp DESC')); while ($res && ($row = $dbr->fetchObject($res))) { $url = $this->Agent->getTitle()->getFullURL('oldid=' . $row->rev_id); $ur = MwRdf::UriNode($url); $model->addStatement(MwRdf::Statement($tr, $dcterms->hasVersion, $ur)); $model->addStatement(MwRdf::Statement($ur, $dcterms->isVersionOf, $tr)); $model->addStatement(MwRdf::Statement($ur, $dc->language, MwRdf::Language($wgContLanguageCode))); $realname = $row->rev_user == 0 ? null : User::whoIsReal($row->rev_user); $pr = MwRdf::PersonToResource($row->rev_user, $row->rev_user_text, $realname); $model->addStatement(MwRdf::Statement($ur, $dc->creator, $pr)); $model->addStatement(MwRdf::Statement($ur, $dc->date, MwRdf::TimestampResource($row->rev_timestamp))); } $dbr->freeResult($res); return $model; }
public function testLoad() { $agent = MwRdf::ModelingAgent($this->title); for ($i = 0; $i < 10000; $i++) { $model = $agent->retrieveModel('inpage'); $this->assertType('object', $model); $this->assertTrue($model instanceof LibRDF_Model); $statement = MwRdf::Statement(MwRdf::UriNode('http://www.w3.org/TR/rdf-syntax-grammar'), MwRdf::UriNode('http://purl.org/dc/elements/1.1/title'), MwRdf::LiteralNode('RDF/XML Syntax Specification (Revised)')); $this->assertTrue($model->hasStatement($statement)); $statements = $model->findStatements(MwRdf::UriNode('http://www.w3.org/TR/rdf-syntax-grammar'), MwRdf::UriNode('http://example.org/stuff/1.0/editor'), null); $this->assertType('object', $statements); $this->assertTrue($statements instanceof LibRDF_StreamIterator); $statement = $statements->current(); $this->assertTrue($statement instanceof LibRdf_Statement); $editor = $statement->getObject(); $this->assertTrue($editor instanceof LibRdf_BlankNode); $statement = MwRdf::Statement($editor, MwRdf::UriNode('http://example.org/stuff/1.0/fullname'), MwRdf::LiteralNode("Dave Beckett")); $this->assertTrue($model->hasStatement($statement)); $statement = MwRdf::Statement($editor, MwRdf::UriNode('http://example.org/stuff/1.0/homePage'), MwRdf::UriNode('http://purl.org/net/dajobe/')); $this->assertTrue($model->hasStatement($statement)); $model->rewind(); } }
public function getQuery() { $ns = MwRdf::Vocabulary('dc')->getNS(); return "\n\t\t\tPREFIX dc: <{$ns}>\n\t\t\tSELECT ?url ?title\n\t\t\tWHERE { ?url dc:title ?title } "; }
function wfRdfSpecialPage($par) { global $wgRequest, $wgOut, $_SERVER, $_REQUEST; MwRdf::setup(); $target = $wgRequest->getVal('target'); if (!isset($target) || $target == null) { # no target parameter MwRdf::ShowForm(); return; } if (strlen($target) == 0) { # no target contents MwRdf::ShowForm(wfMsg('badtitle')); return; } $nt = Title::newFromText($target); if ($nt->getArticleID() == 0) { # not an article MwRdf::ShowForm(wfMsg('badtitle')); return; } $format = $wgRequest->getVal('format', 'rdfxml'); $accept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null; $rdftype = wfNegotiateType(wfAcceptToPrefs($accept), wfAcceptToPrefs(MwRdf::getTypePrefs($format))); if (!$rdftype) { wfHttpError(406, "Not Acceptable", wfMsg("notacceptable")); return false; } $wgOut->disable(); if (!headers_sent()) { header("Content-type: {$rdftype}"); } $wgOut->sendCacheControl(); $mf = MwRdf::ModelingAgent($nt); # Note: WebRequest chokes on arrays here $modelnames = null; if (isset($_REQUEST['modelnames'])) { $modelnames = $_REQUEST['modelnames']; } if (is_null($modelnames)) { $modelnames = $mf->listDefaultModels(); } if (is_string($modelnames)) { $modelnames = explode(',', $modelnames); } if (!$modelnames) { MwRdf::ShowForm(wfMsg('nomodelsselected')); return; } $model = $mf->retrieveModel($modelnames); if (!$model->current()) { $mf->storeAllModels(); $model = $mf->retrieveModel($modelnames); } $ser = MwRdf::Serializer($format); $text = $model->serializeStatements($ser); # XXX: Test Hook: it would be better if we could capture the # print statement below with an output buffer, but that is # disabled for the CLI in PHP 5 if (isset($_SERVER['CONTEXT']) && $_SERVER['CONTEXT'] == 'phpunit test') { return $text; } else { print $text; return true; } }
public function testTimestamp() { $this->markTestIncomplete(); $pagename = self::$username . '/NonArticle'; $title = Title::newFromText($pagename, NS_USER); if ($title->exists()) { $article = new Article($title); $article->doPurge(); } $agent = MwRdf::ModelingAgent($title); $this->assertType('boolean', $agent->getTimestampResource()); $this->assertFalse($agent->getTimestampResource()); }
public function getQueryString() { $url = $this->Agent->getTitle()->getFullUrl(); $ns = MwRdf::Vocabulary('dcterms')->getNS(); return "PREFIX dcterms: <{$ns}>\n\t\t\tCONSTRUCT { <{$url}> dcterms:isReferencedBy ?x }\n\t\t\tWHERE { ?x dcterms:references <{$url}> } "; }
public function testGetCcTerms() { $license = 'http://creativecommons.org/licenses/by-sa/1.0/'; $terms = MwRdf::GetCcTerms($license); $this->assertType('array', $terms, $license); $this->assertContains('re', $terms); $this->assertContains('di', $terms); $this->assertContains('de', $terms); $this->assertContains('no', $terms); $this->assertContains('by', $terms); $this->assertContains('sa', $terms); $license = 'http://creativecommons.org/licenses/by-nc-sa/1.0/'; $terms = MwRdf::GetCcTerms($license); $this->assertType('array', $terms, $license); $this->assertContains('re', $terms); $this->assertContains('di', $terms); $this->assertContains('de', $terms); $this->assertContains('no', $terms); $this->assertContains('by', $terms); $this->assertContains('sa', $terms); $this->assertContains('nc', $terms); $license = 'http://creativecommons.org/licenses/GPL/2.0/'; $terms = MwRdf::GetCcTerms($license); $this->assertType('array', $terms, $license); $this->assertContains('de', $terms); $this->assertContains('re', $terms); $this->assertContains('di', $terms); $this->assertContains('no', $terms); $this->assertContains('sa', $terms); $this->assertContains('sc', $terms); $license = 'http://creativecommons.org/licenses/LGPL/2.1/'; $terms = MwRdf::GetCcTerms($license); $this->assertType('array', $terms, $license); $this->assertContains('de', $terms); $this->assertContains('re', $terms); $this->assertContains('di', $terms); $this->assertContains('no', $terms); $this->assertContains('sa', $terms); $this->assertContains('sc', $terms); $license = 'http://www.gnu.org/copyleft/fdl.html'; $terms = MwRdf::GetCcTerms($license); $this->assertType('array', $terms, $license); $this->assertContains('de', $terms); $this->assertContains('re', $terms); $this->assertContains('di', $terms); $this->assertContains('no', $terms); $this->assertContains('sa', $terms); $this->assertContains('sc', $terms); }
public function __construct() { foreach ($this as $key => $value) { $this->{$key} = MwRdf::UriNode($this->getNS() . $key); } }
public function clearStoredModel($name) { $context = $this->getContextNode($name); $store = MwRdf::StoredModel(); librdf_model_context_remove_statements($store->getModel(), $context->getNode()); $store->rewind(); $store = null; # __destruct() causes a segfault }
public function cleanup() { if (self::$Store) { self::$Store = null; } if (self::$StoredModel) { self::$StoredModel = null; } }
public function testShowFormWithMessage() { $msg = 'this is a message'; MwRdf::ShowForm($msg); $this->assertContains($msg, $this->html); }
if ($page_count < $start) { fwrite(STDOUT, "-1"); exit(1); } MwRdf::Setup(); $dbr = wfGetDB(DB_SLAVE); $res = $dbr->query("\n\tSELECT page_id,\n\tpage_title,\n\tpage_namespace,\n\tpage_is_redirect\n\tFROM page\n\tORDER BY page_id\n\tLIMIT 200\n\tOFFSET {$start}"); while ($s = $dbr->fetchObject($res)) { if ($s->page_is_redirect) { continue; } $title = Title::makeTitle($s->page_namespace, $s->page_title); if (!$title) { continue; } $agent = MwRdf::ModelingAgent($title); fwrite(STDERR, $s->page_id . ": " . $title->getPrefixedDbKey()); $agent->storeAllModels(); $agent = null; $title = null; fwrite(STDERR, "\n"); } fwrite(STDOUT, $start + 200); function get_total_number_of_articles() { $dbr = wfGetDB(DB_SLAVE); # get the total number of articles $page = $dbr->tableName('page'); $res = $dbr->query("select count( page_id ) as page_count from {$page};"); $s = $dbr->fetchObject($res); return $s->page_count;