Skip to content

Commit

Permalink
Inject ContentRendererFactory
Browse files Browse the repository at this point in the history
  • Loading branch information
malberts committed Oct 4, 2023
1 parent da01b49 commit b27c3d9
Show file tree
Hide file tree
Showing 17 changed files with 300 additions and 159 deletions.
11 changes: 10 additions & 1 deletion src/Adapters/EmbedPresenter/ParserFunctionEmbedPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use Html;
use MessageLocalizer;
use ParserOutput;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedPresenter;

class ParserFunctionEmbedPresenter implements EmbedPresenter {
Expand All @@ -14,10 +16,12 @@ class ParserFunctionEmbedPresenter implements EmbedPresenter {

private string $html = '';
private UsageTracker $usageTracker;
private ParserOutput $output;

public function __construct( MessageLocalizer $localizer, UsageTracker $usageTracker ) {
public function __construct( MessageLocalizer $localizer, UsageTracker $usageTracker, ParserOutput $output ) {
$this->localizer = $localizer;
$this->usageTracker = $usageTracker;
$this->output = $output;
}

public function showError( string $messageKey ): void {
Expand Down Expand Up @@ -50,4 +54,9 @@ public function getParserFunctionReturnValue(): array {
];
}

public function loadRendererRequirements( ContentRenderer $renderer ): void {
$this->output->addModules( $renderer->getOutputModules() );
$this->output->addModuleStyles( $renderer->getOutputModuleStyles() );
}

}
4 changes: 0 additions & 4 deletions src/Domain/ContentRenderer/CodeRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,6 @@ private function getWrapperClasses(): array {
* @return string[]
*/
private function getLanguageClasses(): array {
if ( $this->language === '' ) {
return [];
}

return [ 'language-' . htmlspecialchars( $this->language ) ];
}

Expand Down
16 changes: 16 additions & 0 deletions src/Domain/ContentRenderer/RendererConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\Domain\ContentRenderer;

class RendererConfig {

public function __construct(
public string $fileExtension,
public string $language,
public bool $showLineNumbers
) {
}

}
48 changes: 3 additions & 45 deletions src/Domain/ContentRendererFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,10 @@

namespace ProfessionalWiki\ExternalContent\Domain;

use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\CodeRenderer;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\MarkdownRenderer;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\RendererConfig;

class ContentRendererFactory {
interface ContentRendererFactory {

/**
* @param string[] $rendererConfig
*/
public function createContentRenderer( array $rendererConfig ): ContentRenderer {
$options = $this->extractOptions( $rendererConfig );

if ( $options === [] ) {
return new MarkdownRenderer();
}

$language = $options['lang'] ?? false;
if ( $language !== false ) {
return new CodeRenderer(
language: is_string( $language ) ? $language : '',
showLineNumbers: ( $options['line'] ?? false ) !== false
);
}

// TODO: use code renderer if extension is not .md, but no config was provided?
return new MarkdownRenderer();
}

/**
* @param string[] $options
* @return array<string|boolean> $results
*/
private function extractOptions( array $options ): array {
$results = [];

foreach ( $options as $option ) {
$pair = array_map( 'trim', explode( '=', $option, 2 ) );
if ( count( $pair ) === 2 ) {
$results[ $pair[0] ] = $pair[1];
}
if ( count( $pair ) === 1 ) {
$results[ $pair[0] ] = true;
}
}

return $results;
}
public function createContentRenderer( RendererConfig $config ): ContentRenderer;

}
32 changes: 32 additions & 0 deletions src/Domain/WikiContentRendererFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\Domain;

use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\CodeRenderer;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\MarkdownRenderer;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\RendererConfig;

class WikiContentRendererFactory implements ContentRendererFactory {

public function createContentRenderer( RendererConfig $config ): ContentRenderer {
if ( $config->language !== '' ) {
return new CodeRenderer(
language: $config->language,
showLineNumbers: $config->showLineNumbers
);
}

// TODO: check config if this should be default behavior
if ( $config->fileExtension === 'md' ) {
return new MarkdownRenderer();
}

return new CodeRenderer(
language: $config->fileExtension, // TODO: Use an extension-to-language map, although common extensions already work.
showLineNumbers: $config->showLineNumbers
);
}

}
12 changes: 5 additions & 7 deletions src/EmbedExtensionFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
use MessageLocalizer;
use ProfessionalWiki\ExternalContent\Adapters\FileFetcher\DomainCredentials;
use ProfessionalWiki\ExternalContent\Adapters\FileFetcher\MediaWikiFileFetcher;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;
use ProfessionalWiki\ExternalContent\Domain\WikiContentRendererFactory;
use ProfessionalWiki\ExternalContent\Domain\UrlNormalizer\BitbucketUrlNormalizer;
use ProfessionalWiki\ExternalContent\Domain\UrlNormalizer\GitHubUrlNormalizer;
use ProfessionalWiki\ExternalContent\Domain\UrlValidator;
Expand Down Expand Up @@ -49,28 +49,26 @@ final protected function __construct() {
}

public function newEmbedUseCaseForEmbedFunction(
EmbedPresenter $presenter,
ContentRenderer $renderer
EmbedPresenter $presenter
): EmbedUseCase {
return new EmbedUseCase(
$presenter,
$this->getUrlValidator(),
new GitHubUrlNormalizer(),
$this->getFileFetcher(),
$renderer
new WikiContentRendererFactory()
);
}

public function newEmbedUseCaseForBitbucketFunction(
EmbedPresenter $presenter,
ContentRenderer $renderer
EmbedPresenter $presenter
): EmbedUseCase {
return new EmbedUseCase(
$presenter,
$this->getUrlValidator(),
new BitbucketUrlNormalizer(),
$this->getFileFetcher(),
$renderer
new WikiContentRendererFactory()
);
}

Expand Down
13 changes: 5 additions & 8 deletions src/EntryPoints/BitbucketFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
use Parser;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\CategoryUsageTracker;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\ParserFunctionEmbedPresenter;
use ProfessionalWiki\ExternalContent\Domain\ContentRendererFactory;
use ProfessionalWiki\ExternalContent\EmbedExtensionFactory;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedRequestBuilder;

final class BitbucketFunction {

Expand All @@ -20,16 +20,13 @@ final class BitbucketFunction {
public function handleParserFunctionCall( Parser $parser, string ...$arguments ) {
$presenter = new ParserFunctionEmbedPresenter(
EmbedExtensionFactory::getInstance()->getMessageLocalizer(),
new CategoryUsageTracker( $parser )
new CategoryUsageTracker( $parser ),
$parser->getOutput()
);

$renderer = ( new ContentRendererFactory() )->createContentRenderer( array_slice( $arguments, 1 ) );
$parser->getOutput()->addModules( $renderer->getOutputModules() );
$parser->getOutput()->addModuleStyles( $renderer->getOutputModuleStyles() );
$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForBitbucketFunction( $presenter );

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForBitbucketFunction( $presenter, $renderer );

$useCase->embed( $arguments[0] );
$useCase->embed( EmbedRequestBuilder::argumentsToRequest( $arguments ) );

return $presenter->getParserFunctionReturnValue();
}
Expand Down
13 changes: 5 additions & 8 deletions src/EntryPoints/EmbedFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
use Parser;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\CategoryUsageTracker;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\ParserFunctionEmbedPresenter;
use ProfessionalWiki\ExternalContent\Domain\ContentRendererFactory;
use ProfessionalWiki\ExternalContent\EmbedExtensionFactory;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedRequestBuilder;

final class EmbedFunction {

Expand All @@ -20,16 +20,13 @@ final class EmbedFunction {
public function handleParserFunctionCall( Parser $parser, string ...$arguments ) {
$presenter = new ParserFunctionEmbedPresenter(
EmbedExtensionFactory::getInstance()->getMessageLocalizer(),
new CategoryUsageTracker( $parser )
new CategoryUsageTracker( $parser ),
$parser->getOutput()
);

$renderer = ( new ContentRendererFactory() )->createContentRenderer( array_slice( $arguments, 1 ) );
$parser->getOutput()->addModules( $renderer->getOutputModules() );
$parser->getOutput()->addModuleStyles( $renderer->getOutputModuleStyles() );
$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForEmbedFunction( $presenter );

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForEmbedFunction( $presenter, $renderer );

$useCase->embed( $arguments[0] );
$useCase->embed( EmbedRequestBuilder::argumentsToRequest( $arguments ) );

return $presenter->getParserFunctionReturnValue();
}
Expand Down
4 changes: 4 additions & 0 deletions src/UseCases/Embed/EmbedPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace ProfessionalWiki\ExternalContent\UseCases\Embed;

use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;

interface EmbedPresenter {

public function showError( string $messageKey ): void;
Expand All @@ -12,4 +14,6 @@ public function showContent( string $content ): void;

public function showFetchingError(): void;

public function loadRendererRequirements( ContentRenderer $renderer ): void;

}
16 changes: 16 additions & 0 deletions src/UseCases/Embed/EmbedRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\UseCases\Embed;

class EmbedRequest {

public function __construct(
public string $fileUrl,
public ?string $language,
public ?bool $showLineNumbers
) {
}

}
45 changes: 45 additions & 0 deletions src/UseCases/Embed/EmbedRequestBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\UseCases\Embed;

class EmbedRequestBuilder {

/**
* @param string[] $arguments
*/
public static function argumentsToRequest( array $arguments ): EmbedRequest {
$normalizedArguments = self::normalizeArguments( array_slice( $arguments, 1 ) );

$language = $normalizedArguments['lang'] ?? null;
$line = $normalizedArguments['line'] ?? null;

return new EmbedRequest(
fileUrl: $arguments[0],
language: is_string( $language ) ? $language : null,
showLineNumbers: is_bool( $line ) ? $line : null
);
}

/**
* @param string[] $arguments
* @return array<string,string|boolean> $results
*/
private static function normalizeArguments( array $arguments ): array {
$results = [];

foreach ( $arguments as $argument ) {
$pair = array_map( 'trim', explode( '=', $argument, 2 ) );
if ( count( $pair ) === 2 ) {
$results[ $pair[0] ] = $pair[1];
}
if ( count( $pair ) === 1 ) {
$results[ $pair[0] ] = true;
}
}

return $results;
}

}
Loading

0 comments on commit b27c3d9

Please sign in to comment.