diff options
Diffstat (limited to 'www/wiki/extensions/Mermaid/src')
-rw-r--r-- | www/wiki/extensions/Mermaid/src/HookRegistry.php | 116 | ||||
-rw-r--r-- | www/wiki/extensions/Mermaid/src/MermaidParserFunction.php | 139 |
2 files changed, 255 insertions, 0 deletions
diff --git a/www/wiki/extensions/Mermaid/src/HookRegistry.php b/www/wiki/extensions/Mermaid/src/HookRegistry.php new file mode 100644 index 00000000..f6fac542 --- /dev/null +++ b/www/wiki/extensions/Mermaid/src/HookRegistry.php @@ -0,0 +1,116 @@ +<?php + +namespace Mermaid; + +use Hooks; + +/** + * @license GNU GPL v2+ + * @since 1.0 + * + * @author mwjames + */ +class HookRegistry { + + /** + * @var array + */ + private $handlers = array(); + + /** + * @since 1.0 + * + * @param array $configuration + */ + public function __construct( $configuration = array () ) { + $this->registerCallbackHandlers( $configuration ); + } + + /** + * @since 1.0 + */ + public function register() { + foreach ( $this->handlers as $name => $callback ) { + Hooks::register( $name, $callback ); + } + } + + /** + * @since 1.0 + */ + public function deregister() { + foreach ( array_keys( $this->handlers ) as $name ) { + Hooks::clear( $name ); + } + } + + /** + * @since 1.0 + * + * @param string $name + * + * @return Callable|false + */ + public function getHandlerFor( $name ) { + return isset( $this->handlers[$name] ) ? $this->handlers[$name] : false; + } + + /** + * @since 1.0 + * + * @param string $name + * + * @return boolean + */ + public function isRegistered( $name ) { + return Hooks::isRegistered( $name ); + } + + private function registerCallbackHandlers( $configuration ) { + + /** + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserFirstCallInit + */ + $this->handlers['ParserFirstCallInit'] = function ( &$parser ) { + $defaultTheme = $GLOBALS['mermaidgDefaultTheme']; + + $parser->setFunctionHook( + 'mermaid', + MermaidParserFunction::newCallback( $defaultTheme ), + 0 + ); + + return true; + }; + + /** + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars + */ + $this->handlers['ResourceLoaderGetConfigVars'] = function ( &$vars ) { + + $vars['mermaid'] = [ + 'theme' => $GLOBALS['mermaidgDefaultTheme'] + ]; + + return true; + }; + + /** + * @see https://www.mediawiki.org/wiki/Manual:Hooks/OutputPageParserOutput + */ + $this->handlers['OutputPageParserOutput'] = function ( $out, $parserOutput ) { + + $out->addModuleStyles( 'ext.mermaid.styles' ); + + if ( $parserOutput->getExtensionData( 'ext-mermaid' ) === null || + $parserOutput->getExtensionData( 'ext-mermaid' ) === false ) { + return true; + } + + $out->addModules( 'ext.mermaid' ); + + return true; + }; + } + +} diff --git a/www/wiki/extensions/Mermaid/src/MermaidParserFunction.php b/www/wiki/extensions/Mermaid/src/MermaidParserFunction.php new file mode 100644 index 00000000..0697f0e7 --- /dev/null +++ b/www/wiki/extensions/Mermaid/src/MermaidParserFunction.php @@ -0,0 +1,139 @@ +<?php + +namespace Mermaid; + +use Parser; +use Html; + +/** + * @license GNU GPL v2+ + * @since 1.0 + * + * @author mwjames + */ +class MermaidParserFunction { + + /** + * @var Parser + */ + private $parser; + + /** + * @var string + */ + private $defaultTheme = ''; + + /** + * @since 1.1 + * + * @param string $defaultTheme + * + * @return callable + */ + public static function newCallback( $defaultTheme ) { + + return function( $parser ) use ( $defaultTheme ) { + $mermaidParserFunction = new self( + $parser + ); + + $mermaidParserFunction->setDefaultTheme( + $defaultTheme + ); + + return $mermaidParserFunction->parse( func_get_args() ); + }; + } + + /** + * @since 1.0 + * + * @return Parser $parser + */ + public function __construct( Parser $parser ) { + $this->parser = $parser; + } + + /** + * @since 1.0 + * + * @param string $defaultTheme + */ + public function setDefaultTheme( $defaultTheme ) { + $this->defaultTheme = $defaultTheme; + } + + /** + * @since 1.0 + * + * @param array $params + * + * @return string + */ + public function parse( array $params ) { + + $class = 'ext-mermaid'; + $parserOutput = $this->parser->getOutput(); + + if( isset( $params[0] ) && $params[0] instanceof \Parser ) { + array_shift( $params ); + } + + // Signal the OutputPageParserOutput hook + $parserOutput->setExtensionData( + 'ext-mermaid', + true + ); + + $parserOutput->addModuleStyles( + 'ext.mermaid.styles' + ); + + $parserOutput->addModules( + 'ext.mermaid' + ); + + $config = [ + 'theme' => $this->defaultTheme + ]; + + foreach ( $params as $key => $param ) { + + if ( strpos( $param, '=' ) !== false ) { + list( $k, $v ) = explode( '=', $param, 2 ); + + if ( $k === 'config.theme' ) { + $config['theme'] = $v; + unset( $params[$key] ); + } + + if ( $k === 'config.flowchart.curve' ) { + $config['flowchart'] = [ 'curve' => $v ]; + unset( $params[$key] ); + } + } + } + + $content = implode( "|", $params ); + + return Html::rawElement( + 'div', + [ + 'class' => $class, + 'data-mermaid' => json_encode( + [ + 'content' => $content, + 'config' => $config + ] + ) + ], + Html::rawElement( + 'div', + [ + 'class' => 'mermaid-dots', + ] + ) + ); + } + +} |