/** * This method will be called before an article is displayed or previewed. * For display and preview we strip out the semantic properties and append them * at the end of the article. * * @param Parser $parser * @param string $text */ static public function onInternalParseBeforeLinks( &$parser, &$text ) { global $smwgStoreAnnotations, $smwgLinksInValues; SMWParseData::stripMagicWords( $text, $parser ); // Store the results if enabled (we have to parse them in any case, // in order to clean the wiki source for further processing). $smwgStoreAnnotations = smwfIsSemanticsProcessed( $parser->getTitle()->getNamespace() ); SMWParserExtensions::$mTempStoreAnnotations = true; // used for [[SMW::on]] and [[SMW:off]] // Process redirects, if any (it seems that there is indeed no more direct way of getting this info from MW) if ( $smwgStoreAnnotations ) { $rt = Title::newFromRedirect( $text ); if ( !is_null( $rt ) ) { $p = new SMWDIProperty( '_REDI' ); $di = SMWDIWikiPage::newFromTitle( $rt, '__red' ); SMWParseData::getSMWData( $parser )->addPropertyObjectValue( $p, $di ); } } // only used in subsequent callbacks, forgotten afterwards SMWParserExtensions::$mTempParser = $parser; // In the regexp matches below, leading ':' escapes the markup, as known for Categories. // Parse links to extract semantic properties. if ( $smwgLinksInValues ) { // More complex regexp -- lib PCRE may cause segfaults if text is long :-( $semanticLinkPattern = '/\[\[ # Beginning of the link (?:([^:][^]]*):[=:])+ # Property name (or a list of those) ( # After that: (?:[^|\[\]] # either normal text (without |, [ or ]) |\[\[[^]]*\]\] # or a [[link]] |\[[^]]*\] # or an [external link] )*) # all this zero or more times (?:\|([^]]*))? # Display text (like "text" in [[link|text]]), optional \]\] # End of link /xu'; $text = preg_replace_callback( $semanticLinkPattern, array( 'SMWParserExtensions', 'parsePropertiesCallback' ), $text ); } else { // Simpler regexps -- no segfaults found for those, but no links in values. $semanticLinkPattern = '/\[\[ # Beginning of the link (?:([^:][^]]*):[=:])+ # Property name (or a list of those) ([^\[\]]*) # content: anything but [, |, ] \]\] # End of link /xu'; $text = preg_replace_callback( $semanticLinkPattern, array( 'SMWParserExtensions', 'simpleParsePropertiesCallback' ), $text ); } // Add link to RDF to HTML header. // TODO: do escaping via Html or Xml class. SMWOutputs::requireHeadItem( 'smw_rdf', '<link rel="alternate" type="application/rdf+xml" title="' . htmlspecialchars( $parser->getTitle()->getPrefixedText() ) . '" href="' . htmlspecialchars( SpecialPage::getTitleFor( 'ExportRDF', $parser->getTitle()->getPrefixedText() )->getLocalUrl( 'xmlmime=rdf' ) ) . "\" />" ); SMWOutputs::commitToParser( $parser ); return true; // always return true, in order not to stop MW's hook processing! }
/** * Method for handling the set_recurring_event parser function. * * @since 1.5.3 * * @param Parser $parser */ public static function render( Parser &$parser ) { $params = func_get_args(); array_shift( $params ); // We already know the $parser ... // Almost all of the work gets done by // getDatesForRecurringEvent(). $results = self::getDatesForRecurringEvent( $params ); if ( $results == null ) { return null; } list( $property_name, $all_date_strings, $unused_params ) = $results; // Do the actual saving of the data. foreach ( $all_date_strings as $date_str ) { SMWParseData::addProperty( $property_name, $date_str, false, $parser, true ); } global $wgTitle; if ( !is_null( $wgTitle ) && $wgTitle->isSpecialPage() ) { global $wgOut; SMWOutputs::commitToOutputPage( $wgOut ); } else { SMWOutputs::commitToParser( $parser ); } }
/** * Method for handling the declare parser function. * * @since 1.5.3 * * @param Parser $parser * @param PPFrame $frame * @param array $args */ public static function render(Parser &$parser, PPFrame $frame, array $args) { if ($frame->isTemplate()) { foreach ($args as $arg) { if (trim($arg) !== '') { $expanded = trim($frame->expand($arg)); $parts = explode('=', $expanded, 2); if (count($parts) == 1) { $propertystring = $expanded; $argumentname = $expanded; } else { $propertystring = $parts[0]; $argumentname = $parts[1]; } $property = SMWPropertyValue::makeUserProperty($propertystring); $argument = $frame->getArgument($argumentname); $valuestring = $frame->expand($argument); if ($property->isValid()) { $type = $property->getPropertyTypeID(); if ($type == '_wpg') { $matches = array(); preg_match_all('/\\[\\[([^\\[\\]]*)\\]\\]/u', $valuestring, $matches); $objects = $matches[1]; if (count($objects) == 0) { if (trim($valuestring) !== '') { SMWParseData::addProperty($propertystring, $valuestring, false, $parser, true); } } else { foreach ($objects as $object) { SMWParseData::addProperty($propertystring, $object, false, $parser, true); } } } elseif (trim($valuestring) !== '') { SMWParseData::addProperty($propertystring, $valuestring, false, $parser, true); } // $value = SMWDataValueFactory::newPropertyObjectValue( $property->getDataItem(), $valuestring ); // if (!$value->isValid()) continue; } } } } else { // @todo Save as metadata } global $wgTitle; if (!is_null($wgTitle) && $wgTitle->isSpecialPage()) { global $wgOut; SMWOutputs::commitToOutputPage($wgOut); } else { SMWOutputs::commitToParser($parser); } return ''; }
/** * Renders and returns the output. * @see ParserHook::render * * @since 1.7 * * @param array $parameters * * @return string */ public function render(array $parameters) { /** * Non-escaping is safe bacause a user's message is passed through parser, which will * handle unsafe HTM elements. */ $result = smwfEncodeMessages(array($parameters['message']), $parameters['icon'], ' <!--br-->', false); if (!is_null($this->parser->getTitle()) && $this->parser->getTitle()->isSpecialPage()) { global $wgOut; SMWOutputs::commitToOutputPage($wgOut); } else { SMWOutputs::commitToParser($this->parser); } return $result; }
/** * Method for handling the ask concept function. * * @todo The possible use of this in an HTML or Specal page context needs to be revisited. The code mentions it, but can this actually happen? * @todo The escaping of symbols in concept queries needs to be revisited. * * @since 1.5.3 * * @param Parser $parser */ public static function render(Parser &$parser) { global $wgContLang, $wgTitle; $title = $parser->getTitle(); $pconc = new SMWDIProperty('_CONC'); if ($title->getNamespace() != SMW_NS_CONCEPT) { $result = smwfEncodeMessages(array(wfMsgForContent('smw_no_concept_namespace'))); SMWOutputs::commitToParser($parser); return $result; } elseif (count(SMWParseData::getSMWdata($parser)->getPropertyValues($pconc)) > 0) { $result = smwfEncodeMessages(array(wfMsgForContent('smw_multiple_concepts'))); SMWOutputs::commitToParser($parser); return $result; } // process input: $params = func_get_args(); array_shift($params); // We already know the $parser ... // Use first parameter as concept (query) string. $concept_input = str_replace(array('>', '<'), array('>', '<'), array_shift($params)); // second parameter, if any, might be a description $concept_docu = array_shift($params); // NOTE: the str_replace above is required in MediaWiki 1.11, but not in MediaWiki 1.14 $query = SMWQueryProcessor::createQuery($concept_input, SMWQueryProcessor::getProcessedParams(array('limit' => 20, 'format' => 'list')), SMWQueryProcessor::CONCEPT_DESC); $concept_text = $query->getDescription()->getQueryString(); if (!is_null(SMWParseData::getSMWData($parser))) { $diConcept = new SMWDIConcept($concept_text, $concept_docu, $query->getDescription()->getQueryFeatures(), $query->getDescription()->getSize(), $query->getDescription()->getDepth()); SMWParseData::getSMWData($parser)->addPropertyObjectValue($pconc, $diConcept); } // display concept box: $rdflink = SMWInfolink::newInternalLink(wfMsgForContent('smw_viewasrdf'), $wgContLang->getNsText(NS_SPECIAL) . ':ExportRDF/' . $title->getPrefixedText(), 'rdflink'); SMWOutputs::requireResource('ext.smw.style'); // TODO: escape output, preferably via Html or Xml class. $result = '<div class="smwfact"><span class="smwfactboxhead">' . wfMsgForContent('smw_concept_description', $title->getText()) . (count($query->getErrors()) > 0 ? ' ' . smwfEncodeMessages($query->getErrors()) : '') . '</span>' . '<span class="smwrdflink">' . $rdflink->getWikiText() . '</span>' . '<br />' . ($concept_docu ? "<p>{$concept_docu}</p>" : '') . '<pre>' . str_replace('[', '[', $concept_text) . "</pre>\n</div>"; if (!is_null($wgTitle) && $wgTitle->isSpecialPage()) { global $wgOut; SMWOutputs::commitToOutputPage($wgOut); } else { SMWOutputs::commitToParser($parser); } return $result; }
/** * Method for handling the ask parser function. * * @since 1.5.3 * * @param Parser $parser */ public static function render(Parser &$parser) { global $smwgQEnabled, $smwgIQRunningNumber, $wgTitle; if ($smwgQEnabled) { $smwgIQRunningNumber++; $params = func_get_args(); array_shift($params); // We already know the $parser ... $result = SMWQueryProcessor::getResultFromFunctionParams($params, SMW_OUTPUT_WIKI); } else { $result = smwfEncodeMessages(array(wfMessage('smw_iq_disabled')->inContentLanguage()->text())); } if (!is_null($wgTitle) && $wgTitle->isSpecialPage()) { global $wgOut; SMWOutputs::commitToOutputPage($wgOut); } else { SMWOutputs::commitToParser($parser); } return $result; }
/** * Method for handling the show parser function. * * @since 1.5.3 * * @param Parser $parser */ public static function render(Parser &$parser) { global $smwgQEnabled, $smwgIQRunningNumber, $wgTitle; if ($smwgQEnabled) { $smwgIQRunningNumber++; $rawParams = func_get_args(); array_shift($rawParams); // We already know the $parser ... list($query, $params) = SMWQueryProcessor::getQueryAndParamsFromFunctionParams($rawParams, SMW_OUTPUT_WIKI, SMWQueryProcessor::INLINE_QUERY, true); $result = SMWQueryProcessor::getResultFromQuery($query, $params, SMW_OUTPUT_WIKI, SMWQueryProcessor::INLINE_QUERY); $queryKey = hash('md4', implode('|', $rawParams), false); SMWAsk::addQueryData($queryKey, $query, $params, $parser); } else { $result = smwfEncodeMessages(array(wfMessage('smw_iq_disabled')->inContentLanguage()->text())); } if (!is_null($wgTitle) && $wgTitle->isSpecialPage()) { global $wgOut; SMWOutputs::commitToOutputPage($wgOut); } else { SMWOutputs::commitToParser($parser); } return $result; }
/** * Format and output report results using the given information plus * OutputPage * * @param OutputPage $out OutputPage to print to * @param Skin $skin User skin to use * @param Database $dbr Database (read) connection to use * @param int $res Result pointer * @param int $num Number of available result rows * @param int $offset Paging offset */ protected function outputResults($out, $skin, $dbr, $res, $num, $offset) { global $wgContLang; $all_display_params = SDUtils::getDisplayParamsForCategory($this->category); $querystring = null; $printouts = $params = array(); // only one set of params is handled for now if (count($all_display_params) > 0) { $display_params = array_map('trim', $all_display_params[0]); SMWQueryProcessor::processFunctionParams($display_params, $querystring, $params, $printouts); } if (!empty($querystring)) { $query = SMWQueryProcessor::createQuery($querystring, $params); } else { $query = new SMWQuery(); } if (!array_key_exists('format', $params)) { $params['format'] = 'category'; } if (array_key_exists('mainlabel', $params)) { $mainlabel = $params['mainlabel']; } else { $mainlabel = ''; } $r = $this->addSemanticResultWrapper($dbr, $res, $num, $query, $mainlabel, $printouts); $printer = SMWQueryProcessor::getResultPrinter($params['format'], SMWQueryProcessor::SPECIAL_PAGE, $r); if (version_compare(SMW_VERSION, '1.6.1', '>')) { SMWQueryProcessor::addThisPrintout($printouts, $params); $params = SMWQueryProcessor::getProcessedParams($params, $printouts); } $prresult = $printer->getResult($r, $params, SMW_OUTPUT_HTML); $prtext = is_array($prresult) ? $prresult[0] : $prresult; SMWOutputs::commitToOutputPage($out); // Crappy hack to get the contents of SMWOutputs::$mHeadItems, // which may have been set in the result printer, and dump into // headItems of $out. // How else can we do this? global $wgParser; SMWOutputs::commitToParser($wgParser); if (!is_null($wgParser->mOutput)) { // getHeadItems() was added in MW 1.16 if (method_exists($wgParser->getOutput(), 'getHeadItems')) { $headItems = $wgParser->getOutput()->getHeadItems(); } else { $headItems = $wgParser->getOutput()->mHeadItems; } foreach ($headItems as $key => $item) { $out->addHeadItem($key, $item); } // Force one more parser function, so links appear. $wgParser->replaceLinkHolders($prtext); } $html = array(); $html[] = $prtext; if (!$this->listoutput) { $html[] = $this->closeList(); } $html = $this->listoutput ? $wgContLang->listToText($html) : implode('', $html); $out->addHTML($html); }