]> _ Git - cubist_cms-back.git/commitdiff
wip #2893 @0:15
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 17 Jul 2019 13:38:46 +0000 (15:38 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 17 Jul 2019 13:38:46 +0000 (15:38 +0200)
src/app/Magic/Menu/Menu.php
src/app/Markdown/InternaLink/Extension.php [new file with mode: 0644]
src/app/Markdown/InternaLink/Renderer.php [new file with mode: 0644]

index 6d7f68ae579482db8dac0de068e3defe419c381e..3a5d419b6245f39f1a51b335e5db6974b6ab2ad2 100644 (file)
@@ -38,6 +38,26 @@ class Menu extends BaseMenu
 
     }
 
+    public static function internalToHref($url)
+    {
+        if (stristr($url, 'internal:')) {
+            $e = explode(':', $url, 2);
+            $url = $e[1];
+        }
+
+        if (is_numeric($url)) {
+            $searchParam = 'id';
+        } else {
+            $searchParam = 'name';
+        }
+
+        $item = self::getNavigation()->findOneBy($searchParam, $url);
+        if (null !== $item) {
+            return $item->getHref();
+        }
+        return '#internalnotfound';
+    }
+
     public function makeAllMenus()
     {
         $nav = self::getNavigation();
diff --git a/src/app/Markdown/InternaLink/Extension.php b/src/app/Markdown/InternaLink/Extension.php
new file mode 100644 (file)
index 0000000..65ef941
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+namespace Cubist\Backpack\app\Markdown\InternalLink;
+
+
+use League\CommonMark\Block\Element\Heading;
+use League\CommonMark\ConfigurableEnvironmentInterface;
+use League\CommonMark\Extension\ExtensionInterface;
+use League\CommonMark\Inline\Element\Link;
+
+class Extension implements ExtensionInterface
+{
+    public function register(ConfigurableEnvironmentInterface $environment)
+    {
+        $environment->addInlineRenderer(Link::class, new Renderer(), 10);
+    }
+}
diff --git a/src/app/Markdown/InternaLink/Renderer.php b/src/app/Markdown/InternaLink/Renderer.php
new file mode 100644 (file)
index 0000000..5db2310
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+
+namespace Cubist\Backpack\app\Markdown\InternalLink;
+
+
+use Cubist\Backpack\app\Magic\Menu\Menu;
+use League\CommonMark\ElementRendererInterface;
+use League\CommonMark\HtmlElement;
+use League\CommonMark\Inline\Element\AbstractInline;
+use League\CommonMark\Inline\Element\Link;
+use League\CommonMark\Inline\Renderer\InlineRendererInterface;
+use League\CommonMark\Util\ConfigurationInterface;
+use League\CommonMark\Util\RegexHelper;
+
+class Renderer implements InlineRendererInterface
+{
+    /**
+     * @var ConfigurationInterface
+     */
+    protected $config;
+
+    /**
+     * @param Link $inline
+     * @param ElementRendererInterface $htmlRenderer
+     *
+     * @return HtmlElement
+     */
+    public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer)
+    {
+        if (!($inline instanceof Link)) {
+            throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline));
+        }
+
+        $attrs = $inline->getData('attributes', []);
+
+        $forbidUnsafeLinks = !$this->config->get('allow_unsafe_links');
+        if (!($forbidUnsafeLinks && RegexHelper::isLinkPotentiallyUnsafe($inline->getUrl()))) {
+            $href = $inline->getUrl();
+            if (stristr($href, 'internal:')) {
+                $href = Menu::internalToHref($href);
+            }
+            $attrs['href'] = $href;
+        }
+
+        if (isset($inline->data['title'])) {
+            $attrs['title'] = $inline->data['title'];
+        }
+
+        if (isset($attrs['target']) && $attrs['target'] === '_blank' && !isset($attrs['rel'])) {
+            $attrs['rel'] = 'noopener noreferrer';
+        }
+
+        return new HtmlElement('a', $attrs, $htmlRenderer->renderInlines($inline->children()));
+    }
+
+    /**
+     * @param ConfigurationInterface $configuration
+     */
+    public function setConfiguration(ConfigurationInterface $configuration)
+    {
+        $this->config = $configuration;
+    }
+}