From 8dacfaedf7f66b05aeaf13f24d7c863d210b6600 Mon Sep 17 00:00:00 2001 From: Roberto Butti Date: Mon, 22 Jan 2024 00:43:57 +0100 Subject: [PATCH] Aside extension for Markdown --- src/Commands/BaseBuildCommand.php | 2 + src/Markdown/Extensions/Aside.php | 14 ++++++ src/Markdown/Extensions/AsideBlockParser.php | 52 ++++++++++++++++++++ src/Markdown/Extensions/AsideExtension.php | 15 ++++++ src/Markdown/Extensions/AsideParser.php | 23 +++++++++ src/Markdown/Extensions/AsideRenderer.php | 25 ++++++++++ 6 files changed, 131 insertions(+) create mode 100644 src/Markdown/Extensions/Aside.php create mode 100644 src/Markdown/Extensions/AsideBlockParser.php create mode 100644 src/Markdown/Extensions/AsideExtension.php create mode 100644 src/Markdown/Extensions/AsideParser.php create mode 100644 src/Markdown/Extensions/AsideRenderer.php diff --git a/src/Commands/BaseBuildCommand.php b/src/Commands/BaseBuildCommand.php index 6955c42..d3d76e3 100644 --- a/src/Commands/BaseBuildCommand.php +++ b/src/Commands/BaseBuildCommand.php @@ -3,6 +3,7 @@ namespace Ibis\Commands; use Ibis\Config; +use Ibis\Markdown\Extensions\AsideExtension; use SplFileInfo; use Illuminate\Filesystem\Filesystem; @@ -71,6 +72,7 @@ protected function buildHtml(string $path, array $config): Collection $environment->addExtension(new GithubFlavoredMarkdownExtension()); $environment->addExtension(new TableExtension()); $environment->addExtension(new FrontMatterExtension()); + $environment->addExtension(new AsideExtension()); $environment->addRenderer(FencedCode::class, new FencedCodeRenderer([ 'html', 'php', 'js', 'bash', 'json' diff --git a/src/Markdown/Extensions/Aside.php b/src/Markdown/Extensions/Aside.php new file mode 100644 index 0000000..cb2bae5 --- /dev/null +++ b/src/Markdown/Extensions/Aside.php @@ -0,0 +1,14 @@ +aside = new Aside(); + } + + public function getBlock(): AbstractBlock + { + return $this->aside; + } + + public function isContainer(): bool + { + return true; + } + + public function canHaveLazyContinuationLines(): bool + { + return false; + } + + public function canContain(AbstractBlock $childBlock): bool + { + return true; + } + + public function tryContinue(Cursor $cursor, BlockContinueParserInterface $activeBlockParser): ?BlockContinue + { + if ($cursor->getLine() === ":::") { + return BlockContinue::finished(); + } + + return BlockContinue::at($cursor); + } + + public function addLine(string $line): void {} + + public function closeBlock(): void {} + +} diff --git a/src/Markdown/Extensions/AsideExtension.php b/src/Markdown/Extensions/AsideExtension.php new file mode 100644 index 0000000..e2d6486 --- /dev/null +++ b/src/Markdown/Extensions/AsideExtension.php @@ -0,0 +1,15 @@ +addBlockStartParser(new AsideParser()) + ->addRenderer(Aside::class, new AsideRenderer()); + } +} diff --git a/src/Markdown/Extensions/AsideParser.php b/src/Markdown/Extensions/AsideParser.php new file mode 100644 index 0000000..41379d2 --- /dev/null +++ b/src/Markdown/Extensions/AsideParser.php @@ -0,0 +1,23 @@ +getRemainder(), ':::note')) { + return BlockStart::none(); + } + + $cursor->advanceToNextNonSpaceOrTab(); + $cursor->advanceToEnd(); + + return BlockStart::of(new AsideBlockParser())->at($cursor); + } +} diff --git a/src/Markdown/Extensions/AsideRenderer.php b/src/Markdown/Extensions/AsideRenderer.php new file mode 100644 index 0000000..28988a7 --- /dev/null +++ b/src/Markdown/Extensions/AsideRenderer.php @@ -0,0 +1,25 @@ +data->getData('attributes'); + $contents = $childRenderer->renderNodes($node->children()); + + return new HtmlElement( + 'blockquote', + ['class' => 'notice'], + new HtmlElement('div', $attrs->export(), $contents) + ); + } +}