'Aqueduct Extension', 'author' => 'The Johns Hopkins University Applied Physics Laboratory', 'description' => 'A Mediawiki-based platform that allows users to explore, visualize, and annotate external RDF data sources within a wiki interface', 'version' => 1.2 ); //Set up the special page $wgExtensionMessagesFiles['AqueductExtension'] = $dir . 'AqueductExtension.i18n.php'; $wgAutoloadClasses['SpecialAqueductConfiguration'] = $dir . 'SpecialAqueductConfiguration.php'; $wgSpecialPages['AqueductConfiguration'] = 'SpecialAqueductConfiguration'; //Set up the Aqueduct API $wgAutoloadClasses['ApiAqueduct'] = $dir . 'ApiAqueduct.php'; $wgAPIModules['aqueduct'] = 'ApiAqueduct'; //Set up the Aqueduct Set API $wgAutoloadClasses['ApiAqueductSet'] = $dir . 'ApiAqueductSet.php'; $wgAPIModules['aqueductset'] = 'ApiAqueductSet'; // Article prepopulation extension require_once($dir . 'AqueductPagePopulation.php'); require_once($dir . 'AqueductEditPage.php'); // Set up the hook to interupt the edit to check for a new page creation. $wgHooks['EditPage::showEditForm:initial'][] = 'aqEditWidgetTagHelp'; $wgHooks['AlternateEdit'][] = 'aqEditWidgetTagJS'; $wgHooks['AlternateEdit'][] = 'aqPopulateNewPage'; //Register a hook to set up the user-configured Mediawiki namespaces $wgHooks['SetupAfterCache'][] = 'wfAqueductSetupNS'; //Load the file with the widget tag logic require_once($dir . 'WidgetTags.php'); //Register the general extension init code (used to set up the widget parser tags) if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) { $wgHooks['ParserFirstCallInit'][] = 'wfAqueductExtension'; } else { // Otherwise do things the old fashioned way $wgExtensionFunctions[] = "wfAqueductExtension"; } //Register the magic word init code (used to set up the parser function alias) $wgHooks['LanguageGetMagic'][] = 'wfAqueductExtensionSetMagicWords'; aqProfile("mw"); //Function and class definitions go below //Set up the user-defined Aqueduct namespaces (this must be called early in Mediawiki's init) function wfAqueductSetupNS() { global $wgAqueductTblname, $wgCanonicalNamespaceNames, $wgExtraNamespaces, $wgAqueductQueryTblname, $wgAqueductOldNSTblname; //Don't use DB functions because that file is not loaded here... aqProfile("aq"); $newNamespaces = array(); $db =& wfGetDB( DB_SLAVE ); $res = $db->select($wgAqueductTblname, '*'); while($row = $db->fetchRow($res)) { if (intval($row['aq_wiki_namespace_id'])!=0) { $newNamespaces[intval($row['aq_wiki_namespace_id'])] = $row['aq_wiki_namespace']; $newNamespaces[intval($row['aq_wiki_namespace_id'])+1] = $row['aq_wiki_namespace'].'_talk'; } } $db->freeResult($res); $res = $db->select($wgAqueductOldNSTblname, '*'); while($row = $db->fetchRow($res)) { if (intval($row['aq_wiki_namespace_id'])!=0) { $newNamespaces[intval($row['aq_wiki_namespace_id'])] = $row['aq_wiki_namespace']; $newNamespaces[intval($row['aq_wiki_namespace_id'])+1] = $row['aq_wiki_namespace'].'_talk'; } } $db->freeResult($res); $res = $db->select($wgAqueductQueryTblname, '*'); while($row = $db->fetchRow($res)) { if (intval($row['aq_wiki_namespace_id'])!=0) { $newNamespaces[intval($row['aq_wiki_namespace_id'])] = $row['aq_wiki_parent_namespace'] . '_' . $row['aq_wiki_namespace_tag']; $newNamespaces[intval($row['aq_wiki_namespace_id'])+1] = $row['aq_wiki_parent_namespace'] . '_' . $row['aq_wiki_namespace_tag'] . '_talk'; } } $db->freeResult($res); if (!is_array($wgExtraNamespaces)) { $wgExtraNamespaces = array(); } $wgExtraNamespaces = $wgExtraNamespaces + $newNamespaces; $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $newNamespaces; aqProfile("mw"); return true; } //Extension initialization function (normally used to set up parser tags) function wfAqueductExtension() { global $wgParser,$wgAqueductLayoutMode,$wgDefaultSkin,$wgAqueductJSFiles,$wgRequest,$wgTitle,$wgOut,$wgScriptPath; aqProfile("aq"); wfAqueductSetParserHooks($wgParser); //Only do this once (multiple parser init will be called if we are displaying a compound page) if (!isset($wgAqueductLayoutMode)) { //Figure out if we are using the gridbook skin; if so, go into layout mode $wgAqueductLayoutMode = ($wgDefaultSkin == 'gridbook' && $wgRequest->getText( 'action', 'view' ) == 'view' && $wgTitle->getNamespace()>-1); if ($wgAqueductLayoutMode) { if (!$wgAqueductJSFiles) { $wgAqueductJSFiles = array(); } //Force a bunch of JS and CSS files to load even if there are no widgets on the page because we are in layout mode $wgAqueductJSFiles['jquery-1.3.2.min.js'] = false; $wgAqueductJSFiles['jquery-ui-1.7.2.custom.min.js'] = false; $wgAqueductJSFiles['jquery.layout.min-1.2.0.js'] = false; $wgAqueductJSFiles['gridPlacement.js'] = false; $wgAqueductJSScripts[''] = false; $wgOut->addScriptFile($wgScriptPath. '/extensions/AqueductExtension/widget/js/jquery-1.3.2.min.js'); $wgOut->addScriptFile($wgScriptPath. '/extensions/AqueductExtension/widget/js/jquery-ui-1.7.2.custom.min.js'); $wgOut->addScriptFile($wgScriptPath. '/extensions/AqueductExtension/widget/js/jquery.layout.min-1.2.0.js'); $wgOut->addScriptFile($wgScriptPath. '/extensions/AqueductExtension/widget/js/gridPlacement.js'); $wgOut->addScript('' . "\n"); } } aqProfile("mw"); return true; } function aqSetHook($parser, $name, $function, $description) { global $wgAqueductWidgetTags; // Initiate the array if (!isset($wgAqueductWidgetTags) || !is_array($wgAqueductWidgetTags)) $wgAqueductWidgetTags = array(); // store the description $wgAqueductWidgetTags["$name"] = "$description"; // Add to the parser hooks // if parser is null, then only initiate the descriptions! if ($parser !== null) $parser->setHook( $name, $function ); } function aqSetAdvHook($parser, $name, $function, $description) { global $wgAqueductAdvWidgetTags; // Initiate the array if (!isset($wgAqueductAdvWidgetTags) || !is_array($wgAqueductAdvWidgetTags)) $wgAqueductAdvWidgetTags = array(); // store the description $wgAqueductAdvWidgetTags["$name"] = "$description"; // Add to the parser hooks // if parser is null, then only initiate the descriptions! if ($parser !== null) $parser->setHook( $name, $function ); } function wfAqueductSetParserHooks($parser) { global $wgEnableLayoutWidgets,$wgEnableCustomScripts; aqSetHook($parser, "aqProfile", "aqProfileTag", "Display profiling output for a page's Aqueduct operations." ); aqSetHook($parser, "aqRawWidget", "aqRawWidgetTag", "Place a Raw Format widget. Each row represents an RDF triple." ); aqSetHook($parser, "aqTableViewWidget", "aqTableViewWidgetTag", "Place a Table Format widget. Each row represents an entity, and each column contains fields about that entity." ); aqSetHook($parser, "aqNetworkViewWidget", "aqNetworkViewWidgetTag", "Place a Google Earth widget. Displays data with geospatial information as markers." ); aqSetHook($parser, "aqNetworkViewWidget2D", "aqNetworkViewWidget2DTag", "Place a Google Map widget. Displays data with geospatial information as markers." ); aqSetAdvHook($parser, "aqIncludeWidgets", "aqIncludeWidgetsTag", "Takes a WikiTitle as input and includes all widgets from that page." ); aqSetAdvHook($parser, "aqAddData", "aqAddDataTag", "Takes a WikiTitle as input and includes all data from that page into widgets on this page." ); aqSetAdvHook($parser, "aqAddQuery", "aqAddQueryTag", "Takes a SPARQL query as input to execute." ); aqSetAdvHook($parser, "aqWikiText", "aqWikiTextTag", "Indicates where wikitext should be displayed in a grid-mode page." ); if ($wgEnableCustomScripts ) { aqSetAdvHook($parser, "aqAddHeader", "aqHeaderTag", "Adds a Javascript file to the page." ); aqSetAdvHook($parser, "aqAddScript", "aqScriptTag", "Adds a Javascript script to the page." ); } if ($wgEnableLayoutWidgets) { aqSetAdvHook($parser, "aqLayout", "aqLayoutTag", "Inserts a layout to be used by a Layout widget." ); aqSetHook($parser, "aqLayoutWidget", "aqLayoutWidgetTag", "Uses the layout inserted into a page via 'aqLayout' to display RDF." ); } if ($parser !== null) $parser->setFunctionHook( 'triplemagicword', 'aqAddTripleTag' ); } function wfAqueductExtensionSetMagicWords( &$magicWords, $langCode ) { $magicWords['triplemagicword'] = array( 0, 'triple' ); return true; } function aqProfile($newmode) { global $wgAqueductProfile; if ($wgAqueductProfile === TRUE) { global $aqProfileMode, $aqProfileStart, $aqProfileData; $endtime = microtime(TRUE); if ($aqProfileMode) { if (!$aqProfileData) { $aqProfileData = array(); } if (array_key_exists($aqProfileMode,$aqProfileData)) { $oldtime = $aqProfileData[$aqProfileMode]; } else { $oldtime = 0.0; } $totaltime = $endtime - $aqProfileStart; $aqProfileData[$aqProfileMode] = $oldtime + $totaltime; } $aqProfileMode = $newmode; $aqProfileStart = microtime(TRUE); } } function aqProfileTag() { global $aqProfileData; $out = print_r($aqProfileData,TRUE); $aqProfileData = null; return $out; } ?>