/** * @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()); }
/** * 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); }
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()); }
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()); }
/** * 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; }
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()); }
/** * @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()); }