diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/ParserFunctionFactory.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/ParserFunctionFactory.php | 521 |
1 files changed, 521 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/ParserFunctionFactory.php b/www/wiki/extensions/SemanticMediaWiki/src/ParserFunctionFactory.php new file mode 100644 index 00000000..a38f404c --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/ParserFunctionFactory.php @@ -0,0 +1,521 @@ +<?php + +namespace SMW; + +// Fatal error: Cannot use SMW\ParserFunctions\SubobjectParserFunction as SubobjectParserFunction because the name is already in use +use Parser; +use SMW\Parser\RecursiveTextProcessor; +use SMW\ParserFunctions\AskParserFunction; +use SMW\ParserFunctions\ConceptParserFunction; +use SMW\ParserFunctions\DeclareParserFunction; +use SMW\ParserFunctions\ExpensiveFuncExecutionWatcher; +use SMW\ParserFunctions\RecurringEventsParserFunction as RecurringEventsParserFunc; +use SMW\ParserFunctions\SetParserFunction; +use SMW\ParserFunctions\ShowParserFunction; +use SMW\ParserFunctions\SubobjectParserFunction as SubobjectParserFunc; +use SMW\Utils\CircularReferenceGuard; + +/** + * @see http://www.semantic-mediawiki.org/wiki/Help:ParserFunction + * + * @license GNU GPL v2+ + * @since 1.9 + * + * @author mwjames + */ +class ParserFunctionFactory { + + /** + * @var Parser + */ + private $parser; + + /** + * @since 1.9 + * + * @param Parser|null $parser + */ + public function __construct( Parser $parser = null ) { + $this->parser = $parser; + } + + /** + * Convenience instantiation of a ParserFunctionFactory object + * + * @since 1.9 + * + * @param Parser $parser + * + * @return ParserFunctionFactory + */ + public static function newFromParser( Parser $parser ) { + return new self( $parser ); + } + + /** + * @deprecated since 2.1, use newSubobjectParserFunction + */ + public function getSubobjectParser() { + return $this->newSubobjectParserFunction( $this->parser ); + } + + /** + * @deprecated since 2.1, use newRecurringEventsParserFunction + */ + public function getRecurringEventsParser() { + return $this->newRecurringEventsParserFunction( $this->parser ); + } + + /** + * @since 3.0 + * + * @param Parser $parser + */ + public function registerFunctionHandlers( Parser $parser ) { + + list( $name, $definition, $flag ) = $this->getAskParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getShowParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getSubobjectParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getSetRecurringEventParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getSetParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getConceptParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + + list( $name, $definition, $flag ) = $this->getDeclareParserFunctionDefinition(); + $parser->setFunctionHook( $name, $definition, $flag ); + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return AskParserFunction + */ + public function newAskParserFunction( Parser $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + + $circularReferenceGuard = new CircularReferenceGuard( 'ask-parser' ); + $circularReferenceGuard->setMaxRecursionDepth( 2 ); + + $parserData = $applicationFactory->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + if ( isset( $parser->getOptions()->smwAskNoDependencyTracking ) ) { + $parserData->setOption( $parserData::NO_QUERY_DEPENDENCY_TRACE, $parser->getOptions()->smwAskNoDependencyTracking ); + } + + // Avoid possible actions during for example stashedit etc. + $parserData->setOption( 'request.action', $GLOBALS['wgRequest']->getVal( 'action' ) ); + + $parserData->setParserOptions( + $parser->getOptions() + ); + + $messageFormatter = new MessageFormatter( + $parser->getTargetLanguage() + ); + + $expensiveFuncExecutionWatcher = new ExpensiveFuncExecutionWatcher( + $parserData + ); + + $expensiveFuncExecutionWatcher->setExpensiveThreshold( + $applicationFactory->getSettings()->get( 'smwgQExpensiveThreshold' ) + ); + + $expensiveFuncExecutionWatcher->setExpensiveExecutionLimit( + $applicationFactory->getSettings()->get( 'smwgQExpensiveExecutionLimit' ) + ); + + $askParserFunction = new AskParserFunction( + $parserData, + $messageFormatter, + $circularReferenceGuard, + $expensiveFuncExecutionWatcher + ); + + $askParserFunction->setPostProcHandler( + $applicationFactory->create( 'PostProcHandler', $parser->getOutput() ) + ); + + $askParserFunction->setRecursiveTextProcessor( + new RecursiveTextProcessor( $parser ) + ); + + return $askParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return ShowParserFunction + */ + public function newShowParserFunction( Parser $parser ) { + + $showParserFunction = new ShowParserFunction( + $this->newAskParserFunction( $parser ) + ); + + return $showParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return SetParserFunction + */ + public function newSetParserFunction( Parser $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + + $parserData = $applicationFactory->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + $messageFormatter = new MessageFormatter( + $parser->getTargetLanguage() + ); + + $mediaWikiCollaboratorFactory = $applicationFactory->newMwCollaboratorFactory(); + + $stripMarkerDecoder = $mediaWikiCollaboratorFactory->newStripMarkerDecoder( + $parser->mStripState + ); + + $setParserFunction = new SetParserFunction( + $parserData, + $messageFormatter, + $mediaWikiCollaboratorFactory->newWikitextTemplateRenderer() + ); + + $setParserFunction->setStripMarkerDecoder( + $stripMarkerDecoder + ); + + return $setParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return ConceptParserFunction + */ + public function newConceptParserFunction( Parser $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + + $parserData = $applicationFactory->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + $messageFormatter = new MessageFormatter( + $parser->getTargetLanguage() + ); + + $conceptParserFunction = new ConceptParserFunction( + $parserData, + $messageFormatter + ); + + $conceptParserFunction->setPostProcHandler( + $applicationFactory->create( 'PostProcHandler', $parser->getOutput() ) + ); + + return $conceptParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return SubobjectParserFunction + */ + public function newSubobjectParserFunction( Parser $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + + $parserData = $applicationFactory->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + $subobject = new Subobject( $parser->getTitle() ); + + $messageFormatter = new MessageFormatter( + $parser->getTargetLanguage() + ); + + $subobjectParserFunction = new SubobjectParserFunc( + $parserData, + $subobject, + $messageFormatter + ); + + $subobjectParserFunction->isCapitalLinks( + Site::isCapitalLinks() + ); + + $subobjectParserFunction->isComparableContent( + $applicationFactory->getSettings()->get( 'smwgUseComparableContentHash' ) + ); + + $stripMarkerDecoder = $applicationFactory->newMwCollaboratorFactory()->newStripMarkerDecoder( + $parser->mStripState + ); + + $subobjectParserFunction->setStripMarkerDecoder( + $stripMarkerDecoder + ); + + return $subobjectParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return RecurringEventsParserFunction + */ + public function newRecurringEventsParserFunction( Parser $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + $settings = $applicationFactory->getSettings(); + + $parserData = $applicationFactory->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + $subobject = new Subobject( $parser->getTitle() ); + + $messageFormatter = new MessageFormatter( + $parser->getTargetLanguage() + ); + + $recurringEvents = new RecurringEvents(); + + $recurringEvents->setDefaultNumRecurringEvents( + $settings->get( 'smwgDefaultNumRecurringEvents' ) + ); + + $recurringEvents->setMaxNumRecurringEvents( + $settings->get( 'smwgMaxNumRecurringEvents' ) + ); + + $recurringEventsParserFunction = new RecurringEventsParserFunc( + $parserData, + $subobject, + $messageFormatter, + $recurringEvents + ); + + $recurringEventsParserFunction->isCapitalLinks( + Site::isCapitalLinks() + ); + + $recurringEventsParserFunction->isComparableContent( + $settings->get( 'smwgUseComparableContentHash' ) + ); + + return $recurringEventsParserFunction; + } + + /** + * @since 2.1 + * + * @param Parser $parser + * + * @return DeclareParserFunction + */ + public function newDeclareParserFunction( Parser $parser ) { + + $parserData = ApplicationFactory::getInstance()->newParserData( + $parser->getTitle(), + $parser->getOutput() + ); + + $declareParserFunction = new DeclareParserFunction( + $parserData + ); + + return $declareParserFunction; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getAskParserFunctionDefinition() { + + $askParserFunctionDefinition = function( $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + $settings = $applicationFactory->getSettings(); + + $askParserFunction = $this->newAskParserFunction( + $parser + ); + + if ( !$settings->get( 'smwgQEnabled' ) ) { + return $settings->isFlagSet( 'smwgParserFeatures', SMW_PARSER_INL_ERROR ) ? $askParserFunction->isQueryDisabled(): ''; + } + + return $askParserFunction->parse( func_get_args() ); + }; + + return [ 'ask', $askParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getShowParserFunctionDefinition() { + + $showParserFunctionDefinition = function( $parser ) { + + $applicationFactory = ApplicationFactory::getInstance(); + $settings = $applicationFactory->getSettings(); + + $showParserFunction = $this->newShowParserFunction( + $parser + ); + + if ( !$settings->get( 'smwgQEnabled' ) ) { + return $settings->isFlagSet( 'smwgParserFeatures', SMW_PARSER_INL_ERROR ) ? $showParserFunction->isQueryDisabled(): ''; + } + + return $showParserFunction->parse( func_get_args() ); + }; + + return [ 'show', $showParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getSubobjectParserFunctionDefinition() { + + $subobjectParserFunctionDefinition = function( $parser ) { + + $subobjectParserFunction = $this->newSubobjectParserFunction( + $parser + ); + + return $subobjectParserFunction->parse( + ParameterProcessorFactory::newFromArray( func_get_args() ) + ); + }; + + return [ 'subobject', $subobjectParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getSetRecurringEventParserFunctionDefinition() { + + $recurringEventsParserFunctionDefinition = function( $parser ) { + + $recurringEventsParserFunction = $this->newRecurringEventsParserFunction( + $parser + ); + + return $recurringEventsParserFunction->parse( + ParameterProcessorFactory::newFromArray( func_get_args() ) + ); + }; + + return [ 'set_recurring_event', $recurringEventsParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getSetParserFunctionDefinition() { + + $setParserFunctionDefinition = function( $parser ) { + + $setParserFunction = $this->newSetParserFunction( + $parser + ); + + return $setParserFunction->parse( + ParameterProcessorFactory::newFromArray( func_get_args() ) + ); + }; + + return [ 'set', $setParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getConceptParserFunctionDefinition() { + + $conceptParserFunctionDefinition = function( $parser ) { + + $conceptParserFunction = $this->newConceptParserFunction( + $parser + ); + + return $conceptParserFunction->parse( func_get_args() ); + }; + + return [ 'concept', $conceptParserFunctionDefinition, 0 ]; + } + + /** + * @since 2.3 + * + * @return array + */ + public function getDeclareParserFunctionDefinition() { + + $declareParserFunctionDefinition = function( $parser, $frame, $args ) { + + $declareParserFunction = $this->newDeclareParserFunction( + $parser + ); + + return $declareParserFunction->parse( $frame, $args ); + }; + + return [ 'declare', $declareParserFunctionDefinition, Parser::SFH_OBJECT_ARGS ]; + } + +} |