diff options
author | Thomas Lange <code@nerdmind.de> | 2021-07-19 17:50:21 +0200 |
---|---|---|
committer | Thomas Lange <code@nerdmind.de> | 2021-07-19 17:58:54 +0200 |
commit | dd4b3d9ebb85c9bc8138212fd7cb207ab154f626 (patch) | |
tree | e005be07809b4644d6974eb59bcfdca7017f3234 /core/namespace | |
parent | 489851d1e7b1d346ff316e7a6721de574322d7d6 (diff) | |
download | blog-dd4b3d9ebb85c9bc8138212fd7cb207ab154f626.tar.gz blog-dd4b3d9ebb85c9bc8138212fd7cb207ab154f626.tar.xz blog-dd4b3d9ebb85c9bc8138212fd7cb207ab154f626.zip |
Add and use new parser/transformer classes
Classes:
* Parsers\ArgumentParser
* Parsers\EmoticonParser
* Parsers\MarkdownParser
Interfaces:
* Parsers\ParserInterface
Diffstat (limited to 'core/namespace')
-rw-r--r-- | core/namespace/Parsers/ArgumentParser.php | 30 | ||||
-rw-r--r-- | core/namespace/Parsers/EmoticonParser.php | 72 | ||||
-rw-r--r-- | core/namespace/Parsers/MarkdownParser.php | 37 | ||||
-rw-r--r-- | core/namespace/Parsers/ParserInterface.php | 7 |
4 files changed, 146 insertions, 0 deletions
diff --git a/core/namespace/Parsers/ArgumentParser.php b/core/namespace/Parsers/ArgumentParser.php new file mode 100644 index 0000000..ab32fe1 --- /dev/null +++ b/core/namespace/Parsers/ArgumentParser.php @@ -0,0 +1,30 @@ +<?php +namespace Parsers; + +class ArgumentParser implements ParserInterface { + + #=========================================================================== + # Parse arguments (*without* duplicates) + #=========================================================================== + public function parse(string $text): array { + foreach(explode('|', $text) as $delimiter) { + $part = explode('=', $delimiter); + + $argumentK = $part[0] ?? NULL; + $argumentV = $part[1] ?? TRUE; + + if(preg_match('#^[[:word:]]+$#', $argumentK)) { + $arguments[strtoupper($argumentK)] = $argumentV; + } + } + + return $arguments ?? []; + } + + #=========================================================================== + # Transform arguments (not implemented) + #=========================================================================== + public function transform(string $text): string { + return ''; + } +} diff --git a/core/namespace/Parsers/EmoticonParser.php b/core/namespace/Parsers/EmoticonParser.php new file mode 100644 index 0000000..4e035c8 --- /dev/null +++ b/core/namespace/Parsers/EmoticonParser.php @@ -0,0 +1,72 @@ +<?php +namespace Parsers; +use Application; + +class EmoticonParser implements ParserInterface { + private $Language; + + #=========================================================================== + # Initialize + #=========================================================================== + public function __construct() { + $this->Language = Application::getLanguage(); + } + + #=========================================================================== + # Get emoticons with their explanations + #=========================================================================== + public function getEmoticons(): array { + $Language = $this->Language; + + return [ + html_entity_decode('😊') => $Language->text('emoticon_1F60A'), + html_entity_decode('😞') => $Language->text('emoticon_1F61E'), + html_entity_decode('😃') => $Language->text('emoticon_1F603'), + html_entity_decode('😛') => $Language->text('emoticon_1F61B'), + html_entity_decode('😲') => $Language->text('emoticon_1F632'), + html_entity_decode('😉') => $Language->text('emoticon_1F609'), + html_entity_decode('😢') => $Language->text('emoticon_1F622'), + html_entity_decode('😐') => $Language->text('emoticon_1F610'), + html_entity_decode('😵') => $Language->text('emoticon_1F635'), + html_entity_decode('😒') => $Language->text('emoticon_1F612'), + html_entity_decode('😎') => $Language->text('emoticon_1F60E'), + html_entity_decode('😟') => $Language->text('emoticon_1F61F'), + html_entity_decode('😂') => $Language->text('emoticon_1F602'), + html_entity_decode('😄') => $Language->text('emoticon_1F604'), + ]; + } + + #=========================================================================== + # Parse occurring emoticons (*without* duplicates) + #=========================================================================== + public function parse(string $text): array { + $emoticon_data = $this->getEmoticons(); + $emoticon_list = array_keys($emoticon_data); + $emoticon_list = implode('|', $emoticon_list); + + preg_match_all("#($emoticon_list)#", $text, $matches); + + foreach($matches[1] as $emoticon) { + $emoticons[$emoticon] = $emoticon_data[$emoticon]; + } + + return $emoticons ?? []; + } + + #=========================================================================== + # Wrap emoticons inside a titled span element + #=========================================================================== + public function transform(string $text): string { + $emoticon_data = $this->getEmoticons(); + $emoticon_list = array_keys($emoticon_data); + $emoticon_list = implode('|', $emoticon_list); + + # TODO: Do not wrap emoticons if they occur inside a code block + return preg_replace_callback("#($emoticon_list)#", function($matches) + use($emoticon_data) { + $emoticon = $matches[1]; + $explanation = $emoticon_data[$emoticon]; + return sprintf('<span title="%s">%s</span>', $explanation, $emoticon); + }, $text); + } +} diff --git a/core/namespace/Parsers/MarkdownParser.php b/core/namespace/Parsers/MarkdownParser.php new file mode 100644 index 0000000..27a18ad --- /dev/null +++ b/core/namespace/Parsers/MarkdownParser.php @@ -0,0 +1,37 @@ +<?php +namespace Parsers; +use Parsedown; + +class MarkdownParser implements ParserInterface { + private $Parsedown; + + #=========================================================================== + # Initialize + #=========================================================================== + public function __construct() { + $this->Parsedown = new Parsedown(); + $this->Parsedown->setUrlsLinked(FALSE); + } + + #=========================================================================== + # Parse Markdown (currently only images) + #=========================================================================== + public function parse(string $text): array { + $image = '#\!\[(.*)\]\((.*)(?:\s[\'"](.*)[\'"])?\)#U'; + + if(preg_match_all($image, $text, $matches)) { + $data['img']['src'] = $matches[2]; + $data['img']['alt'] = $matches[1]; + $data['img']['title'] = $matches[3]; + } + + return $data ?? []; + } + + #=========================================================================== + # Transform Markdown to HTML + #=========================================================================== + public function transform(string $text): string { + return $this->Parsedown->text($text); + } +} diff --git a/core/namespace/Parsers/ParserInterface.php b/core/namespace/Parsers/ParserInterface.php new file mode 100644 index 0000000..8dd94e2 --- /dev/null +++ b/core/namespace/Parsers/ParserInterface.php @@ -0,0 +1,7 @@ +<?php +namespace Parsers; + +interface ParserInterface { + public function parse(string $text): array; + public function transform(string $text): string; +} |