diff options
Diffstat (limited to 'Digitigrade/FormattingProvider')
| -rw-r--r-- | Digitigrade/FormattingProvider/CommonMark.php | 49 | ||||
| -rw-r--r-- | Digitigrade/FormattingProvider/SanitisedHtml.php | 31 |
2 files changed, 80 insertions, 0 deletions
diff --git a/Digitigrade/FormattingProvider/CommonMark.php b/Digitigrade/FormattingProvider/CommonMark.php new file mode 100644 index 0000000..d90ca17 --- /dev/null +++ b/Digitigrade/FormattingProvider/CommonMark.php @@ -0,0 +1,49 @@ +<?php +namespace Digitigrade\FormattingProvider; + +use Digitigrade\FormattingProvider; +use Digitigrade\GlobalConfig; +use Digitigrade\Singleton; +use League\CommonMark\Environment\Environment; +use League\CommonMark\Extension\Autolink\AutolinkExtension; +use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; +use League\CommonMark\Extension\ExternalLink\ExternalLinkExtension; +use League\CommonMark\Extension\Strikethrough\StrikethroughExtension; +use League\CommonMark\MarkdownConverter; + +class CommonMark extends Singleton implements FormattingProvider { + private MarkdownConverter $converter; + + protected function __construct() { + $env = new Environment([ + 'html_input' => 'escape', + 'renderer' => [ + 'soft_break' => '<br>' + ], + 'autolink' => [ + 'allowed_protocols' => SanitisedHtml::ALLOWED_URL_SCHEMES + ], + 'external_link' => [ + 'internal_hosts' => [GlobalConfig::getInstance()->getCanonicalHost()], + 'open_in_new_window' => true, + 'nofollow' => 'all', + 'noopener' => 'all', + 'noreferrer' => 'external' + ] + ]); + $env->addExtension(new CommonMarkCoreExtension); + $env->addExtension(new AutolinkExtension); + $env->addExtension(new ExternalLinkExtension); + $env->addExtension(new StrikethroughExtension); + $this->converter = new MarkdownConverter($env); + } + + public function renderToHtml(string $input): string { + return $this->converter->convert($input); + } + + public function renderToPlainText(string $input): string { + // TODO: somehow remove markup and leave the unformatted content behind + return htmlspecialchars($input); + } +}
\ No newline at end of file diff --git a/Digitigrade/FormattingProvider/SanitisedHtml.php b/Digitigrade/FormattingProvider/SanitisedHtml.php new file mode 100644 index 0000000..fa2e5eb --- /dev/null +++ b/Digitigrade/FormattingProvider/SanitisedHtml.php @@ -0,0 +1,31 @@ +<?php +namespace Digitigrade\FormattingProvider; + +use Digitigrade\FormattingProvider; +use Digitigrade\Singleton; +use Symfony\Component\HtmlSanitizer\HtmlSanitizer; +use Symfony\Component\HtmlSanitizer\HtmlSanitizerConfig; + +class SanitisedHtml extends Singleton implements FormattingProvider { + private HtmlSanitizer $sanitiser; + + public const ALLOWED_URL_SCHEMES = [ + 'http', 'https', 'ftp', 'gopher', 'gemini', 'web+pawpub', 'web+ap', 'matrix', 'xmpp', 'mailto' + ]; + + protected function __construct() { + $this->sanitiser = new HtmlSanitizer((new HtmlSanitizerConfig()) + ->allowSafeElements() + ->allowLinkSchemes(self::ALLOWED_URL_SCHEMES) + ); + } + + public function renderToHtml(string $input): string { + return $this->sanitiser->sanitize($input); + } + + public function renderToPlainText(string $input): string { + // TODO: somehow remove tags and leave the unformatted content behind + return htmlspecialchars($input); + } +}
\ No newline at end of file |
