Skip to content

Commit

Permalink
Merge pull request #45 from thephpleague/extensions
Browse files Browse the repository at this point in the history
Bulk registration via extensions (#43); used for core parsers/renderers
  • Loading branch information
colinodell committed Dec 31, 2014
2 parents 2508daf + 84873a6 commit 4ded741
Show file tree
Hide file tree
Showing 4 changed files with 286 additions and 69 deletions.
102 changes: 33 additions & 69 deletions src/Environment.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,12 @@

namespace League\CommonMark;

use League\CommonMark\Block\Parser as BlockParser;
use League\CommonMark\Block\Parser\BlockParserInterface;
use League\CommonMark\Block\Renderer as BlockRenderer;
use League\CommonMark\Block\Renderer\BlockRendererInterface;
use League\CommonMark\Inline\Parser as InlineParser;
use League\CommonMark\Extension\CommonMarkCoreExtension;
use League\CommonMark\Extension\ExtensionInterface;
use League\CommonMark\Inline\Parser\InlineParserInterface;
use League\CommonMark\Inline\Processor\EmphasisProcessor;
use League\CommonMark\Inline\Processor\InlineProcessorInterface;
use League\CommonMark\Inline\Renderer as InlineRenderer;
use League\CommonMark\Inline\Renderer\InlineRendererInterface;

class Environment
Expand Down Expand Up @@ -213,80 +210,47 @@ public function createInlineParserEngine()
}

/**
* @return Environment
* Add a single extension
*
* @param ExtensionInterface $extension
*
* @return $this
*/
public static function createCommonMarkEnvironment()
public function addExtension(ExtensionInterface $extension)
{
$environment = new static();
// Block parsers
foreach ($extension->getBlockParsers() as $blockParser) {
$this->addBlockParser($blockParser);
}

$blockParsers = array(
// This order is important
new BlockParser\IndentedCodeParser(),
new BlockParser\LazyParagraphParser(),
new BlockParser\BlockQuoteParser(),
new BlockParser\ATXHeaderParser(),
new BlockParser\FencedCodeParser(),
new BlockParser\HtmlBlockParser(),
new BlockParser\SetExtHeaderParser(),
new BlockParser\HorizontalRuleParser(),
new BlockParser\ListParser(),
);

foreach ($blockParsers as $blockParser) {
$environment->addBlockParser($blockParser);
// Block renderers
foreach ($extension->getBlockRenderers() as $class => $blockRenderer) {
$this->addBlockRenderer($class, $blockRenderer);
}

$inlineParsers = array(
new InlineParser\NewlineParser(),
new InlineParser\BacktickParser(),
new InlineParser\EscapableParser(),
new InlineParser\EntityParser(),
new InlineParser\EmphasisParser(),
new InlineParser\AutolinkParser(),
new InlineParser\RawHtmlParser(),
new InlineParser\CloseBracketParser(),
new InlineParser\OpenBracketParser(),
new InlineParser\BangParser(),
);

foreach ($inlineParsers as $inlineParser) {
$environment->addInlineParser($inlineParser);
// Inline parsers
foreach ($extension->getInlineParsers() as $inlineParser) {
$this->addInlineParser($inlineParser);
}

$environment->addInlineProcessor(new EmphasisProcessor());

$blockRenderers = array(
'League\CommonMark\Block\Element\BlockQuote' => new BlockRenderer\BlockQuoteRenderer(),
'League\CommonMark\Block\Element\Document' => new BlockRenderer\DocumentRenderer(),
'League\CommonMark\Block\Element\FencedCode' => new BlockRenderer\FencedCodeRenderer(),
'League\CommonMark\Block\Element\Header' => new BlockRenderer\HeaderRenderer(),
'League\CommonMark\Block\Element\HorizontalRule' => new BlockRenderer\HorizontalRuleRenderer(),
'League\CommonMark\Block\Element\HtmlBlock' => new BlockRenderer\HtmlBlockRenderer(),
'League\CommonMark\Block\Element\IndentedCode' => new BlockRenderer\IndentedCodeRenderer(),
'League\CommonMark\Block\Element\ListBlock' => new BlockRenderer\ListBlockRenderer(),
'League\CommonMark\Block\Element\ListItem' => new BlockRenderer\ListItemRenderer(),
'League\CommonMark\Block\Element\Paragraph' => new BlockRenderer\ParagraphRenderer(),
'League\CommonMark\Block\Element\ReferenceDefinition' => new BlockRenderer\ReferenceDefinitionRenderer(),
);

foreach ($blockRenderers as $class => $renderer) {
$environment->addBlockRenderer($class, $renderer);
// Inline processors
foreach ($extension->getInlineProcessors() as $inlineProcessor) {
$this->addInlineProcessor($inlineProcessor);
}

$inlineRenderers = array(
'League\CommonMark\Inline\Element\Code' => new InlineRenderer\CodeRenderer(),
'League\CommonMark\Inline\Element\Emphasis' => new InlineRenderer\EmphasisRenderer(),
'League\CommonMark\Inline\Element\Html' => new InlineRenderer\RawHtmlRenderer(),
'League\CommonMark\Inline\Element\Image' => new InlineRenderer\ImageRenderer(),
'League\CommonMark\Inline\Element\Link' => new InlineRenderer\LinkRenderer(),
'League\CommonMark\Inline\Element\Newline' => new InlineRenderer\NewlineRenderer(),
'League\CommonMark\Inline\Element\Strong' => new InlineRenderer\StrongRenderer(),
'League\CommonMark\Inline\Element\Text' => new InlineRenderer\TextRenderer(),
);

foreach ($inlineRenderers as $class => $renderer) {
$environment->addInlineRenderer($class, $renderer);
// Inline renderers
foreach ($extension->getInlineRenderers() as $class => $inlineRenderer) {
$this->addInlineRenderer($class, $inlineRenderer);
}
}

/**
* @return Environment
*/
public static function createCommonMarkEnvironment()
{
$environment = new static();
$environment->addExtension(new CommonMarkCoreExtension());

return $environment;
}
Expand Down
119 changes: 119 additions & 0 deletions src/Extension/CommonMarkCoreExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<?php

/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (http://bitly.com/commonmarkjs)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace League\CommonMark\Extension;

use League\CommonMark\Block\Parser as BlockParser;
use League\CommonMark\Block\Renderer as BlockRenderer;
use League\CommonMark\Inline\Parser as InlineParser;
use League\CommonMark\Inline\Processor as InlineProcessor;
use League\CommonMark\Inline\Renderer as InlineRenderer;

class CommonMarkCoreExtension extends Extension
{
/**
* @return BlockParser\BlockParserInterface[]
*/
public function getBlockParsers()
{
return array(
// This order is important
new BlockParser\IndentedCodeParser(),
new BlockParser\LazyParagraphParser(),
new BlockParser\BlockQuoteParser(),
new BlockParser\ATXHeaderParser(),
new BlockParser\FencedCodeParser(),
new BlockParser\HtmlBlockParser(),
new BlockParser\SetExtHeaderParser(),
new BlockParser\HorizontalRuleParser(),
new BlockParser\ListParser(),
);
}

/**
* @return BlockRenderer\BlockRendererInterface[]
*/
public function getBlockRenderers()
{
return array(
'League\CommonMark\Block\Element\BlockQuote' => new BlockRenderer\BlockQuoteRenderer(),
'League\CommonMark\Block\Element\Document' => new BlockRenderer\DocumentRenderer(),
'League\CommonMark\Block\Element\FencedCode' => new BlockRenderer\FencedCodeRenderer(),
'League\CommonMark\Block\Element\Header' => new BlockRenderer\HeaderRenderer(),
'League\CommonMark\Block\Element\HorizontalRule' => new BlockRenderer\HorizontalRuleRenderer(),
'League\CommonMark\Block\Element\HtmlBlock' => new BlockRenderer\HtmlBlockRenderer(),
'League\CommonMark\Block\Element\IndentedCode' => new BlockRenderer\IndentedCodeRenderer(),
'League\CommonMark\Block\Element\ListBlock' => new BlockRenderer\ListBlockRenderer(),
'League\CommonMark\Block\Element\ListItem' => new BlockRenderer\ListItemRenderer(),
'League\CommonMark\Block\Element\Paragraph' => new BlockRenderer\ParagraphRenderer(),
'League\CommonMark\Block\Element\ReferenceDefinition' => new BlockRenderer\ReferenceDefinitionRenderer(),
);
}

/**
* @return InlineParser\InlineParserInterface[]
*/
public function getInlineParsers()
{
return array(
new InlineParser\NewlineParser(),
new InlineParser\BacktickParser(),
new InlineParser\EscapableParser(),
new InlineParser\EntityParser(),
new InlineParser\EmphasisParser(),
new InlineParser\AutolinkParser(),
new InlineParser\RawHtmlParser(),
new InlineParser\CloseBracketParser(),
new InlineParser\OpenBracketParser(),
new InlineParser\BangParser(),
);
}

/**
* @return InlineProcessor\InlineProcessorInterface[]
*/
public function getInlineProcessors()
{
return array(
new InlineProcessor\EmphasisProcessor()
);
}

/**
* @return InlineRenderer\InlineRendererInterface[]
*/
public function getInlineRenderers()
{
return array(
'League\CommonMark\Inline\Element\Code' => new InlineRenderer\CodeRenderer(),
'League\CommonMark\Inline\Element\Emphasis' => new InlineRenderer\EmphasisRenderer(),
'League\CommonMark\Inline\Element\Html' => new InlineRenderer\RawHtmlRenderer(),
'League\CommonMark\Inline\Element\Image' => new InlineRenderer\ImageRenderer(),
'League\CommonMark\Inline\Element\Link' => new InlineRenderer\LinkRenderer(),
'League\CommonMark\Inline\Element\Newline' => new InlineRenderer\NewlineRenderer(),
'League\CommonMark\Inline\Element\Strong' => new InlineRenderer\StrongRenderer(),
'League\CommonMark\Inline\Element\Text' => new InlineRenderer\TextRenderer(),
);
}

/**
* Returns the name of the extension
*
* @return string
*/
public function getName()
{
return 'commonmark';
}
}
64 changes: 64 additions & 0 deletions src/Extension/Extension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (http://bitly.com/commonmarkjs)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace League\CommonMark\Extension;

use League\CommonMark\Block\Parser\BlockParserInterface;
use League\CommonMark\Block\Renderer\BlockRendererInterface;
use League\CommonMark\Inline\Parser\InlineParserInterface;
use League\CommonMark\Inline\Processor\InlineProcessorInterface;
use League\CommonMark\Inline\Renderer\InlineRendererInterface;

abstract class Extension implements ExtensionInterface
{
/**
* @return BlockParserInterface[]
*/
public function getBlockParsers()
{
return array();
}

/**
* @return BlockRendererInterface[]
*/
public function getBlockRenderers()
{
return array();
}

/**
* @return InlineParserInterface[]
*/
public function getInlineParsers()
{
return array();
}

/**
* @return InlineProcessorInterface[]
*/
public function getInlineProcessors()
{
return array();
}

/**
* @return InlineRendererInterface[]
*/
public function getInlineRenderers()
{
return array();
}
}
70 changes: 70 additions & 0 deletions src/Extension/ExtensionInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (http://bitly.com/commonmarkjs)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace League\CommonMark\Extension;

use League\CommonMark\Block\Parser\BlockParserInterface;
use League\CommonMark\Block\Renderer\BlockRendererInterface;
use League\CommonMark\Inline\Parser\InlineParserInterface;
use League\CommonMark\Inline\Processor\InlineProcessorInterface;
use League\CommonMark\Inline\Renderer\InlineRendererInterface;

interface ExtensionInterface
{
/**
* Returns a list of block parsers to add to the existing list
*
* @return BlockParserInterface[]
*/
public function getBlockParsers();

/**
* Returns a list of block renderers to add to the existing list
*
* The list keys are the block class names which the corresponding value (renderer) will handle.
*
* @return BlockRendererInterface[]
*/
public function getBlockRenderers();

/**
* Returns a list of inline parsers to add to the existing list
*
* @return InlineParserInterface[]
*/
public function getInlineParsers();

/**
* Returns a list of inline processors to add to the existing list
*
* @return InlineProcessorInterface[]
*/
public function getInlineProcessors();

/**
* Returns a list of inline renderers to add to the existing list
*
* The list keys are the inline class names which the corresponding value (renderer) will handle.
*
* @return InlineRendererInterface[]
*/
public function getInlineRenderers();

/**
* Returns the name of the extension
*
* @return string
*/
public function getName();
}

0 comments on commit 4ded741

Please sign in to comment.