/**
  * @since  1.9
  *
  * @param ParserParameterProcessor $parameters
  *
  * @return string|null
  */
 public function parse(ParserParameterProcessor $parameters)
 {
     $count = 0;
     $template = '';
     $subject = $this->parserData->getSemanticData()->getSubject();
     $parametersToArray = $parameters->toArray();
     if (isset($parametersToArray['template'])) {
         $template = $parametersToArray['template'][0];
         unset($parametersToArray['template']);
     }
     foreach ($parametersToArray as $property => $values) {
         $last = count($values) - 1;
         // -1 because the key starts with 0
         foreach ($values as $key => $value) {
             $dataValue = DataValueFactory::getInstance()->newDataValueByText($property, $value, false, $subject);
             if ($this->parserData->canModifySemanticData()) {
                 $this->parserData->addDataValue($dataValue);
             }
             $this->messageFormatter->addFromArray($dataValue->getErrors());
             $this->addFieldsToTemplate($template, $dataValue, $property, $value, $last == $key, $count);
         }
     }
     $this->parserData->pushSemanticDataToParserOutput();
     $html = $this->templateRenderer->render() . $this->messageFormatter->addFromArray($parameters->getErrors())->getHtml();
     return array($html, 'noparse' => $template === '', 'isHTML' => false);
 }
 public function testEditPageToGetNewRevision()
 {
     $this->title = Title::newFromText(__METHOD__);
     $pageCreator = new PageCreator();
     $pageCreator->createPage($this->title)->doEdit('[[EditPageToGetNewRevisionHookTest::Foo]]');
     $parserOutput = $pageCreator->getEditInfo()->output;
     $this->assertInstanceOf('ParserOutput', $parserOutput);
     $parserData = new ParserData($this->title, $parserOutput);
     $expected = array('propertyKeys' => array('_SKEY', '_MDAT', 'EditPageToGetNewRevisionHookTest'));
     $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $parserData->getSemanticData());
 }
 /**
  * @dataProvider categoriesDataProvider
  */
 public function testAddCategoriesWithParserDataUpdate(array $parameters, array $expected)
 {
     $semanticData = $this->semanticDataFactory->setSubject(new DIWikiPage(__METHOD__, $parameters['namespace'], ''))->newEmptySemanticData();
     $title = $semanticData->getSubject()->getTitle();
     $parserOutput = new ParserOutput();
     $parserData = new ParserData($title, $parserOutput);
     $this->applicationFactory->registerObject('Settings', Settings::newFromArray($parameters['settings']));
     $instance = new CategoryPropertyAnnotator(new NullPropertyAnnotator($parserData->getSemanticData()), $parameters['categories']);
     $instance->addAnnotation();
     $parserData->pushSemanticDataToParserOutput();
     $parserDataAfterAnnotation = new ParserData($title, $parserOutput);
     $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $parserDataAfterAnnotation->getSemanticData());
 }
 /**
  * @dataProvider templateDataProvider
  */
 public function testPreprocessTemplateAndParse($namespace, array $settings, $text, $tmplValue, array $expected)
 {
     $parserOutput = new ParserOutput();
     $title = Title::newFromText(__METHOD__, $namespace);
     $outputText = $this->runTemplateTransclusion($title, $text, $tmplValue);
     $this->applicationFactory->registerObject('Settings', Settings::newFromArray($settings));
     $parserData = new ParserData($title, $parserOutput);
     $instance = new InTextAnnotationParser($parserData, new MagicWordsFinder(), new RedirectTargetFinder());
     $instance->parse($outputText);
     $this->assertContains($expected['resultText'], $outputText);
     $parserData = new ParserData($title, $parserOutput);
     $this->assertInstanceOf('\\SMW\\SemanticData', $parserData->getSemanticData());
     $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $parserData->getSemanticData());
 }
 /**
  * @dataProvider categoriesDataProvider
  */
 public function testAddCategoriesWithParserDataUpdate(array $parameters, array $expected)
 {
     $semanticData = $this->semanticDataFactory->setSubject(new DIWikiPage(__METHOD__, $parameters['namespace'], ''))->newEmptySemanticData();
     $title = $semanticData->getSubject()->getTitle();
     $parserOutput = new ParserOutput();
     $parserData = new ParserData($title, $parserOutput);
     $instance = new CategoryPropertyAnnotator(new NullPropertyAnnotator($parserData->getSemanticData()), $parameters['categories']);
     $instance->setShowHiddenCategoriesState($parameters['settings']['smwgShowHiddenCategories']);
     $instance->setCategoryInstanceUsageState($parameters['settings']['smwgCategoriesAsInstances']);
     $instance->setCategoryHierarchyUsageState($parameters['settings']['smwgUseCategoryHierarchy']);
     $instance->addAnnotation();
     $parserData->pushSemanticDataToParserOutput();
     $parserDataAfterAnnotation = new ParserData($title, $parserOutput);
     $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $parserDataAfterAnnotation->getSemanticData());
 }
 private function addErrorWithMsg($subject, $errorMsg)
 {
     $error = new Error($subject);
     $this->parserData->getSemanticData()->addPropertyObjectValue($error->getProperty(), $error->getContainerFor(new DIProperty('_SOBJ'), $errorMsg));
     $this->parserData->addError($errorMsg);
     return false;
 }
 private function transformParametersToArray(ArrayFormatter $parameters)
 {
     if ($this->useFirstElementForPropertyLabel) {
         $parameters->addParameter($parameters->getFirst(), $this->parserData->getTitle()->getPrefixedText());
     }
     return $parameters->toArray();
 }
 private function addProcessingError($errors)
 {
     $processingErrorMsgHandler = new ProcessingErrorMsgHandler($this->parserData->getSubject());
     foreach ($errors as $error) {
         $processingErrorMsgHandler->pushTo($this->parserData->getSemanticData(), $processingErrorMsgHandler->getErrorContainerFromMsg($error, new DIProperty('_ASK')));
     }
 }
 private function createQueryProfile($query, $format, $duration)
 {
     $queryProfileAnnotatorFactory = $this->applicationFactory->newQueryProfileAnnotatorFactory();
     $jointProfileAnnotator = $queryProfileAnnotatorFactory->newJointProfileAnnotator($query, $format, $duration);
     $jointProfileAnnotator->addAnnotation();
     $this->parserData->getSemanticData()->addPropertyObjectValue($jointProfileAnnotator->getProperty(), $jointProfileAnnotator->getContainer());
 }
Esempio n. 10
0
 /**
  * Parse parameters, return concept information box and update the
  * ParserOutput with the concept object
  *
  * @since 1.9
  *
  * @param array $params
  *
  * @return string|null
  */
 public function parse(array $rawParams)
 {
     $this->parserData->getOutput()->addModules('ext.smw.style');
     $title = $this->parserData->getTitle();
     $property = new DIProperty('_CONC');
     if (!($title->getNamespace() === SMW_NS_CONCEPT)) {
         return $this->messageFormatter->addFromKey('smw_no_concept_namespace')->getHtml();
     } elseif (count($this->parserData->getSemanticData()->getPropertyValues($property)) > 0) {
         return $this->messageFormatter->addFromKey('smw_multiple_concepts')->getHtml();
     }
     // Remove parser object from parameters array
     if (isset($rawParams[0]) && $rawParams[0] instanceof Parser) {
         array_shift($rawParams);
     }
     // Use first parameter as concept (query) string
     $conceptQuery = array_shift($rawParams);
     // Use second parameter, if any as a description
     $conceptDocu = array_shift($rawParams);
     $query = $this->buildQuery($conceptQuery);
     $conceptQueryString = $query->getDescription()->getQueryString();
     $this->parserData->getSemanticData()->addPropertyObjectValue($property, new DIConcept($conceptQueryString, $conceptDocu, $query->getDescription()->getQueryFeatures(), $query->getDescription()->getSize(), $query->getDescription()->getDepth()));
     $this->messageFormatter->addFromArray($query->getErrors())->addFromArray($this->parserData->getErrors());
     $this->parserData->pushSemanticDataToParserOutput();
     if ($this->messageFormatter->exists()) {
         return $this->messageFormatter->getHtml();
     }
     return $this->buildConceptInfoBox($title, $conceptQueryString, $conceptDocu);
 }
Esempio n. 11
0
 protected function doStripMagicWordsFromText(&$text)
 {
     $words = array();
     $this->magicWordFinder->setOutput($this->parserData->getOutput());
     foreach (array('SMW_NOFACTBOX', 'SMW_SHOWFACTBOX') as $magicWord) {
         $words = $words + $this->magicWordFinder->matchAndRemove($magicWord, $text);
     }
     $this->magicWordFinder->pushMagicWordsToParserOutput($words);
     return $words;
 }
 private function addQueryProfile($query)
 {
     // If the smwgQueryProfiler is marked with FALSE then just don't create a profile.
     if (ApplicationFactory::getInstance()->getSettings()->get('smwgQueryProfiler') === false) {
         return;
     }
     $query->setContextPage($this->parserData->getSemanticData()->getSubject());
     $profileAnnotatorFactory = ApplicationFactory::getInstance()->getQueryFactory()->newProfileAnnotatorFactory();
     $descriptionProfileAnnotator = $profileAnnotatorFactory->newDescriptionProfileAnnotator($query);
     $descriptionProfileAnnotator->pushAnnotationsTo($this->parserData->getSemanticData());
 }
Esempio n. 13
0
 protected function doStripMagicWordsFromText(&$text)
 {
     $words = array();
     $this->magicWordsFinder->setOutput($this->parserData->getOutput());
     $magicWords = array('SMW_NOFACTBOX', 'SMW_SHOWFACTBOX');
     Hooks::run('SMW::Parser::BeforeMagicWordsFinder', array(&$magicWords));
     foreach ($magicWords as $magicWord) {
         $words[] = $this->magicWordsFinder->findMagicWordInText($magicWord, $text);
     }
     $this->magicWordsFinder->pushMagicWordsToParserOutput($words);
     return $words;
 }
 private function createQueryProfile($query, $format, $duration)
 {
     // In case of an query error add a marker to the subject for
     // discoverability of a failed query
     if ($query->getErrors() !== array()) {
         $this->parserData->getSemanticData()->addPropertyObjectValue(new DIProperty('_ERRP'), DIProperty::newFromUserLabel('_ASK')->getDiWikiPage());
     }
     $queryProfileAnnotatorFactory = $this->applicationFactory->newQueryProfileAnnotatorFactory();
     $jointProfileAnnotator = $queryProfileAnnotatorFactory->newJointProfileAnnotator($query, $format, $duration);
     $jointProfileAnnotator->addAnnotation();
     $this->parserData->getSemanticData()->addPropertyObjectValue($jointProfileAnnotator->getProperty(), $jointProfileAnnotator->getContainer());
 }
 /**
  * @since  1.9
  *
  * @param ArrayFormatter $parameters
  *
  * @return string|null
  */
 public function parse(ArrayFormatter $parameters)
 {
     $count = 0;
     $template = '';
     $subject = $this->parserData->getSemanticData()->getSubject();
     $parametersToArray = $parameters->toArray();
     if (isset($parametersToArray['template'])) {
         $template = $parametersToArray['template'][0];
         unset($parametersToArray['template']);
     }
     foreach ($parametersToArray as $property => $values) {
         foreach ($values as $value) {
             $dataValue = DataValueFactory::getInstance()->newPropertyValue($property, $value, false, $subject);
             $this->parserData->addDataValue($dataValue);
             $this->messageFormatter->addFromArray($dataValue->getErrors());
             $this->addFieldsToTemplate($template, $dataValue, $property, $value, $count);
         }
     }
     $this->parserData->pushSemanticDataToParserOutput();
     $html = $this->templateRenderer->render() . $this->messageFormatter->addFromArray($parameters->getErrors())->getHtml();
     return array($html, 'noparse' => true, 'isHTML' => true);
 }
 private function createQueryProfile($query, $format, $duration)
 {
     // In case of an query error add a marker to the subject for
     // discoverability of a failed query
     if ($query->getErrors() !== array()) {
         $error = new Error($this->parserData->getSubject());
         $this->parserData->getSemanticData()->addPropertyObjectValue($error->getProperty(), $error->getContainerFor(new DIProperty('_ASK'), $query->getQueryString() . ' (' . implode(' ', $query->getErrors()) . ')'));
     }
     $queryProfileAnnotatorFactory = $this->applicationFactory->newQueryProfileAnnotatorFactory();
     $jointProfileAnnotator = $queryProfileAnnotatorFactory->newJointProfileAnnotator($query, $format, $duration);
     $jointProfileAnnotator->addAnnotation();
     $this->parserData->getSemanticData()->addPropertyObjectValue($jointProfileAnnotator->getProperty(), $jointProfileAnnotator->getContainer());
 }
Esempio n. 17
0
 /**
  * Returns content found for a given ParserOutput object and if the required
  * custom data was not available then semantic data are retrieved from
  * the store for a given subject.
  *
  * The method checks whether the given setting of $showfactbox requires
  * displaying the given data at all.
  *
  * @since 1.9
  *
  * @return integer $showFactbox
  *
  * @return string|null
  */
 protected function fetchContent($showFactbox = SMW_FACTBOX_NONEMPTY)
 {
     if ($showFactbox === SMW_FACTBOX_HIDDEN) {
         return '';
     }
     $semanticData = $this->parserData->getSemanticData();
     if ($semanticData === null || $semanticData->stubObject || $this->isEmpty($semanticData)) {
         $semanticData = $this->store->getSemanticData($this->parserData->getSubject());
     }
     if ($showFactbox === SMW_FACTBOX_SPECIAL && !$semanticData->hasVisibleSpecialProperties()) {
         // show only if there are special properties
         return '';
     } elseif ($showFactbox === SMW_FACTBOX_NONEMPTY && !$semanticData->hasVisibleProperties()) {
         // show only if non-empty
         return '';
     }
     return $this->createTable($semanticData);
 }
 private function doPrepareParameters(ParserParameterProcessor $parserParameterProcessor)
 {
     if ($parserParameterProcessor->hasParameter(self::PARAM_LINKWITH)) {
         $val = $parserParameterProcessor->getParameterValuesByKey(self::PARAM_LINKWITH);
         $parserParameterProcessor->addParameter(end($val), $this->parserData->getTitle()->getPrefixedText());
         $parserParameterProcessor->removeParameterByKey(self::PARAM_LINKWITH);
     }
     if ($this->isEnabledFirstElementAsPropertyLabel) {
         $parserParameterProcessor->addParameter($parserParameterProcessor->getFirst(), $this->parserData->getTitle()->getPrefixedText());
     }
     $parameters = $parserParameterProcessor->toArray();
     // FIXME 3.0 make sorting default by 3.0
     // Only sort for a modified sobj otherwise existing ID will change
     $sort = false;
     // This ensures that an unordered array is ordered and will produce
     // the same ID even if elements are placed differently
     if ($sort) {
         ksort($parameters);
     }
     return $parameters;
 }
Esempio n. 19
0
 public function testSemanticDataStateToParserOutput()
 {
     $parserOutput = new ParserOutput();
     $instance = new ParserData(Title::newFromText(__METHOD__), $parserOutput);
     $this->assertEmpty($parserOutput->getProperty('smw-semanticdata-status'));
     $instance->addDataValue($this->dataValueFactory->newPropertyValue('Foo', 'Bar'));
     $instance->setSemanticDataStateToParserOutputProperty();
     $this->assertTrue($parserOutput->getProperty('smw-semanticdata-status'));
 }
 protected function assertSemanticDataAfterParse($instance, $expected)
 {
     $parserData = new ParserData($instance->getTitle(), $instance->getOutput());
     $semanticDataValidator = new SemanticDataValidator();
     $semanticDataValidator->assertThatPropertiesAreSet($expected, $parserData->getSemanticData());
 }
 protected function setupInstanceAndAssertSemanticData(array $parameters, array $expected)
 {
     $parserOutput = new ParserOutput();
     $title = Title::newFromText(__METHOD__);
     $subobject = new Subobject($title);
     $instance = $this->acquireInstance($subobject, $parserOutput);
     $instance->parse(new ParserParameterFormatter($parameters));
     $parserData = new ParserData($title, $parserOutput);
     $subSemanticData = $parserData->getSemanticData()->getSubSemanticData();
     foreach ($subSemanticData as $actualSemanticDataToAssert) {
         $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $actualSemanticDataToAssert);
     }
 }
 public function testRedirectAnnotationFromInjectedRedirectTarget()
 {
     $namespace = NS_MAIN;
     $text = '';
     $redirectTarget = Title::newFromText('Foo');
     $expected = array('propertyCount' => 1, 'property' => new DIProperty('_REDI'), 'propertyValues' => array('Foo'));
     $settings = array('smwgNamespacesWithSemanticLinks' => array($namespace => true), 'smwgLinksInValues' => false, 'smwgInlineErrors' => true);
     $this->testEnvironment->registerObject('Settings', Settings::newFromArray($settings));
     $parserData = new ParserData(Title::newFromText(__METHOD__, $namespace), new ParserOutput());
     $redirectTargetFinder = new RedirectTargetFinder();
     $instance = new InTextAnnotationParser($parserData, new MagicWordsFinder(), $redirectTargetFinder);
     $instance->setRedirectTarget($redirectTarget);
     $instance->parse($text);
     $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $parserData->getSemanticData());
 }
Esempio n. 23
0
 /**
  * @return array
  */
 public function fetchContentDataProvider()
 {
     $title = Title::newFromText(__METHOD__);
     $provider = array();
     $semanticData = $this->getMockBuilder('\\SMW\\SemanticData')->disableOriginalConstructor()->getMock();
     $semanticData->expects($this->any())->method('getPropertyValues')->will($this->returnValue(array()));
     $semanticData->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
     $parserData = new ParserData($title, new ParserOutput());
     $parserData->setSemanticData($semanticData);
     $provider[] = array($parserData);
     $semanticData = $this->getMockBuilder('\\SMW\\SemanticData')->disableOriginalConstructor()->getMock();
     $semanticData->expects($this->any())->method('getPropertyValues')->will($this->returnValue(array(new DIProperty('_SKEY'))));
     $semanticData->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
     $parserData = new ParserData($title, new ParserOutput());
     $parserData->setSemanticData($semanticData);
     $provider[] = array($parserData);
     return $provider;
 }
 private function addDataValue($property, $value)
 {
     $dataValue = DataValueFactory::getInstance()->newDataValueByText($property, $value, false, $this->subject);
     $this->parserData->addDataValue($dataValue);
 }
 public function testImportFromParserOutput()
 {
     $import = new ParserData(Title::newFromText(__METHOD__), new ParserOutput());
     $import->addDataValue($this->dataValueFactory->newPropertyValue('Foo', 'Bar'));
     $import->pushSemanticDataToParserOutput();
     $instance = new ParserData(Title::newFromText(__METHOD__), new ParserOutput());
     $instance->importFromParserOutput(null);
     $this->assertNotEquals($import->getSemanticData()->getHash(), $instance->getSemanticData()->getHash());
     $instance->importFromParserOutput($import->getOutput());
     $this->assertEquals($import->getSemanticData()->getHash(), $instance->getSemanticData()->getHash());
 }
 protected function setupInstanceAndAssertSemanticData(array $parameters, array $expected)
 {
     $title = isset($expected['embeddedTitle']) ? $expected['embeddedTitle'] : __METHOD__;
     $parserOutput = new ParserOutput();
     $title = Title::newFromText($title);
     $subobject = new Subobject($title);
     $instance = $this->acquireInstance($subobject, $parserOutput);
     $instance->parse(new ParserParameterFormatter($parameters));
     $parserData = new ParserData($title, $parserOutput);
     $subSemanticData = $parserData->getSemanticData()->getSubSemanticData();
     if ($expected['propertyCount'] == 0) {
         $this->assertEmpty($subSemanticData);
     }
     foreach ($subSemanticData as $key => $semanticData) {
         if (strpos($semanticData->getSubject()->getSubobjectName(), '_ERR') !== false) {
             continue;
         }
         $this->semanticDataValidator->assertThatPropertiesAreSet($expected, $semanticData);
     }
 }
 public function testCanModifySemanticData()
 {
     $title = $this->getMockBuilder('Title')->disableOriginalConstructor()->getMock();
     $title->expects($this->once())->method('getNamespace')->will($this->returnValue(-1));
     $parserOutput = new ParserOutput();
     // FIXME 1.21+
     if (!method_exists($parserOutput, 'getExtensionData')) {
         $this->markTestSkipped('getExtensionData is not available.');
     }
     $instance = new ParserData($title, $parserOutput);
     $this->assertTrue($instance->canModifySemanticData());
     $parserOutput->setExtensionData('smw-blockannotation', true);
     $this->assertFalse($instance->canModifySemanticData());
 }