summaryrefslogtreecommitdiff
path: root/lib/MyParsedown.php
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2024-01-31 06:11:00 +0300
committerEvgeny Zinoviev <me@ch1p.io>2024-01-31 20:45:40 +0300
commitc0dc531ebefd8912819f3b6c8bda1fed3c7e750c (patch)
tree2c75aa9df182260aef09faf4befd81a4c2b9c5e2 /lib/MyParsedown.php
parent48d688cdf7f9eae1bf11b8a6f0e5b98687c604cb (diff)
make it simple, but not simpler
Diffstat (limited to 'lib/MyParsedown.php')
-rw-r--r--lib/MyParsedown.php218
1 files changed, 0 insertions, 218 deletions
diff --git a/lib/MyParsedown.php b/lib/MyParsedown.php
deleted file mode 100644
index 85ed9c4..0000000
--- a/lib/MyParsedown.php
+++ /dev/null
@@ -1,218 +0,0 @@
-<?php
-
-class MyParsedown extends ParsedownExtended {
-
- public function __construct(
- ?array $opts = null,
- protected bool $useImagePreviews = false
- ) {
- $parsedown_opts = [
- 'tables' => [
- 'tablespan' => true
- ]
- ];
- if (!is_null($opts)) {
- $parsedown_opts = array_merge($parsedown_opts, $opts);
- }
- parent::__construct($parsedown_opts);
-
- $this->InlineTypes['{'][] = 'FileAttach';
- $this->InlineTypes['{'][] = 'Image';
- $this->InlineTypes['{'][] = 'Video';
- $this->inlineMarkerList .= '{';
- }
-
- protected function inlineFileAttach($excerpt) {
- if (preg_match('/^{fileAttach:([\w]{8})}{\/fileAttach}/', $excerpt['text'], $matches)) {
- $random_id = $matches[1];
- $upload = uploads::getByRandomId($random_id);
- $result = [
- 'extent' => strlen($matches[0]),
- 'element' => [
- 'name' => 'span',
- 'text' => '',
- ],
- 'type' => ''
- ];
-
- if (!$upload) {
- return $result;
- }
-
- unset($result['element']['text']);
-
- $ctx = self::getSkinContext();
- $result['element']['rawHtml'] = $ctx->fileupload($upload->name, $upload->getDirectUrl(), $upload->note, $upload->getSize());
-
- return $result;
- }
- }
-
- protected function inlineImage($excerpt) {
- global $config;
-
- if (preg_match('/^{image:([\w]{8}),(.*?)}{\/image}/', $excerpt['text'], $matches)) {
- $random_id = $matches[1];
-
- $opts = [
- 'w' => 'auto',
- 'h' => 'auto',
- 'align' => 'left',
- 'nolabel' => false,
- ];
- $inputopts = explode(',', $matches[2]);
-
- foreach ($inputopts as $opt) {
- if ($opt == 'nolabel')
- $opts[$opt] = true;
- else {
- list($k, $v) = explode('=', $opt);
- if (!isset($opts[$k]))
- continue;
- $opts[$k] = $v;
- }
- }
-
- $image = uploads::getByRandomId($random_id);
- $result = [
- 'extent' => strlen($matches[0]),
- 'element' => [
- 'name' => 'span',
- 'text' => '',
- ],
- 'type' => ''
- ];
-
- if (!$image) {
- return $result;
- }
-
- list($w, $h) = $image->getImagePreviewSize(
- $opts['w'] == 'auto' ? null : $opts['w'],
- $opts['h'] == 'auto' ? null : $opts['h']
- );
- $opts['w'] = $w;
- // $opts['h'] = $h;
-
- if (!$this->useImagePreviews)
- $image_url = $image->getDirectUrl();
- else
- $image_url = $image->getDirectPreviewUrl($w, $h);
-
- unset($result['element']['text']);
-
- $ctx = self::getSkinContext();
- $result['element']['rawHtml'] = $ctx->image(
- w: $opts['w'],
- nolabel: $opts['nolabel'],
- align: $opts['align'],
- padding_top: round($h / $w * 100, 4),
- may_have_alpha: $image->imageMayHaveAlphaChannel(),
-
- url: $image_url,
- direct_url: $image->getDirectUrl(),
- note: $image->note
- );
-
- return $result;
- }
- }
-
- protected function inlineVideo($excerpt) {
- if (preg_match('/^{video:([\w]{8})(?:,(.*?))?}{\/video}/', $excerpt['text'], $matches)) {
- $random_id = $matches[1];
-
- $opts = [
- 'w' => 'auto',
- 'h' => 'auto',
- 'align' => 'left',
- 'nolabel' => false,
- ];
- $inputopts = !empty($matches[2]) ? explode(',', $matches[2]) : [];
-
- foreach ($inputopts as $opt) {
- if ($opt == 'nolabel')
- $opts[$opt] = true;
- else {
- list($k, $v) = explode('=', $opt);
- if (!isset($opts[$k]))
- continue;
- $opts[$k] = $v;
- }
- }
-
- $video = uploads::getByRandomId($random_id);
- $result = [
- 'extent' => strlen($matches[0]),
- 'element' => [
- 'name' => 'span',
- 'text' => '',
- ],
- 'type' => ''
- ];
-
- if (!$video) {
- return $result;
- }
-
- $video_url = $video->getDirectUrl();
-
- unset($result['element']['text']);
-
- $ctx = self::getSkinContext();
- $result['element']['rawHtml'] = $ctx->video(
- url: $video_url,
- w: $opts['w'],
- h: $opts['h']
- );
-
- return $result;
- }
- }
-
- protected function paragraph($line) {
- if (preg_match('/^{fileAttach:([\w]{8})}{\/fileAttach}$/', $line['text'])) {
- return $this->inlineFileAttach($line);
- }
- if (preg_match('/^{image:([\w]{8}),(?:.*?)}{\/image}/', $line['text'])) {
- return $this->inlineImage($line);
- }
- if (preg_match('/^{video:([\w]{8})(?:,(?:.*?))?}{\/video}/', $line['text'])) {
- return $this->inlineVideo($line);
- }
- return parent::paragraph($line);
- }
-
- protected function blockFencedCodeComplete($block) {
- if (!isset($block['element']['element']['attributes'])) {
- return $block;
- }
-
- $code = $block['element']['element']['text'];
- $languageClass = $block['element']['element']['attributes']['class'];
- $language = explode('-', $languageClass);
-
- if ($language[1] == 'term') {
- $lines = explode("\n", $code);
- for ($i = 0; $i < count($lines); $i++) {
- $line = $lines[$i];
- if (str_starts_with($line, '$ ') || str_starts_with($line, '# ')) {
- $lines[$i] = '<span class="term-prompt">'.substr($line, 0, 2).'</span>'.htmlspecialchars(substr($line, 2), ENT_NOQUOTES, 'UTF-8');
- } else {
- $lines[$i] = htmlspecialchars($line, ENT_NOQUOTES, 'UTF-8');
- }
- }
- $block['element']['element']['rawHtml'] = implode("\n", $lines);
- unset($block['element']['element']['text']);
-
- return $block;
- }
-
- return parent::blockFencedCodeComplete($block);
- }
-
- protected static function getSkinContext(): SkinContext {
- return new SkinContext('\\skin\\markdown');
- }
-
-}