From cc77a73604ef367567ae299082faf82252b7f5c2 Mon Sep 17 00:00:00 2001 From: sec77 Date: Sun, 4 Feb 2024 14:37:24 +0100 Subject: [PATCH 01/19] fixed ABSOLUTE_PATHS variable --- docker-compose-build.yml | 2 +- docker-compose-dev.yml | 2 +- docker-compose.yml | 2 +- perlite/helper.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose-build.yml b/docker-compose-build.yml index a9330e27..067e371e 100644 --- a/docker-compose-build.yml +++ b/docker-compose-build.yml @@ -8,7 +8,7 @@ services: - NOTES_PATH=Demo - HIDE_FOLDERS=docs,private,trash - LINE_BREAKS=true - - ABSOLUTE_PATHES=false + - ABSOLUTE_PATHS=false - ALLOWED_FILE_LINK_TYPES=pdf,mp4 - DISABLE_POP_HOVER=true - SHOW_TOC=true diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 00becc8c..8420e971 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -9,7 +9,7 @@ services: - NOTES_PATH=Demo - HIDE_FOLDERS=docs,private,trash - LINE_BREAKS=true - - ABSOLUTE_PATHES=false + - ABSOLUTE_PATHS=false - ALLOWED_FILE_LINK_TYPES=pdf,mp4 - DISABLE_POP_HOVER=false - SHOW_TOC=true diff --git a/docker-compose.yml b/docker-compose.yml index 36cc68e4..9e305c28 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: - NOTES_PATH=Demo - HIDE_FOLDERS=docs,private,trash - LINE_BREAKS=true - - ABSOLUTE_PATHES=false + - ABSOLUTE_PATHS=false - ALLOWED_FILE_LINK_TYPES=pdf,mp4 - DISABLE_POP_HOVER=false - SHOW_TOC=true diff --git a/perlite/helper.php b/perlite/helper.php index b80a6c70..cf5ae78a 100644 --- a/perlite/helper.php +++ b/perlite/helper.php @@ -25,7 +25,7 @@ $hideFolders = getenv('HIDE_FOLDERS'); // use absolut paths instead of relative paths -$relPathes = empty(getenv('ABSOLUTE_PATHES')) ? false : filter_var(getenv('RELATIVE_PATHES'), FILTER_VALIDATE_BOOLEAN); +$relPathes = empty(getenv('ABSOLUTE_PATHS')) ? false : filter_var(getenv('ABSOLUTE_PATHS'), FILTER_VALIDATE_BOOLEAN); // Meta Tags infos $siteTitle = empty(getenv('SITE_TITLE')) ? 'Perlite' : getenv('SITE_TITLE'); From 51e3e4f519ade7a98b43af8e428b2960e4a7367d Mon Sep 17 00:00:00 2001 From: ar0x4 Date: Tue, 28 May 2024 02:21:53 +0200 Subject: [PATCH 02/19] Added parsing support for 'center' and 'right' alignment directives in Markdown --- perlite/.styles/perlite.css | 13 ++++++++++++- perlite/Demo/Demo Documents/Images.md | 8 ++++++++ perlite/content.php | 15 +++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/perlite/.styles/perlite.css b/perlite/.styles/perlite.css index e0eb2d60..0293e2e9 100644 --- a/perlite/.styles/perlite.css +++ b/perlite/.styles/perlite.css @@ -82,6 +82,18 @@ img { max-width: 100%; } +.images.center { + display: block !important; + margin-left: auto; + margin-right: auto; +} + +.images.right { + display: block !important; + margin-left: auto; + margin-right: 0; +} + .popup-icon { padding-bottom: 1px; top: -6px; @@ -89,7 +101,6 @@ img { left: 3px; } - #loading-text { position: absolute; top: 8px; diff --git a/perlite/Demo/Demo Documents/Images.md b/perlite/Demo/Demo Documents/Images.md index 2678a88e..8449fbac 100644 --- a/perlite/Demo/Demo Documents/Images.md +++ b/perlite/Demo/Demo Documents/Images.md @@ -10,6 +10,14 @@ Image with a alternate text and size ![[background.png|This is a description|100]] +Centered image + +![[background.png|center]] + +Right aligned image with a custom size + +![[background.png|right|200]] + ## External images diff --git a/perlite/content.php b/perlite/content.php index dc5c78ec..a2c632b3 100644 --- a/perlite/content.php +++ b/perlite/content.php @@ -142,6 +142,21 @@ function parseContent($requestFile) $pattern = array('/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(\d*)x?(\d*)(\]\])/'); $content = preg_replace($pattern, $replaces, $content); + // centerise or right align images with "center"/"right" directive + $pattern = '/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(center|right)\|?(\d*)x?(\d*)(\]\])/'; + $replaces = function ($matches) use ($path) { + $class = "images"; // Default class for all images + if (strpos($matches[4], 'center') !== false) { + $class .= " center"; // Add 'center' class + } elseif (strpos($matches[4], 'right') !== false) { + $class .= " right"; // Add 'right' class + } + $width = $matches[5] ?? 'auto'; + $height = $matches[6] ?? 'auto'; + return '

'; + }; + $content = preg_replace_callback($pattern, $replaces, $content); + // img links with captions and size $replaces = '

\\4

'; $pattern = array('/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(.+\|)\|?(\d*)x?(\d*)(\]\])/'); From 595911984de02fcb7a189ec2df65487a71589d24 Mon Sep 17 00:00:00 2001 From: Yaroslav Tsvira <51800453+Yaro2709@users.noreply.github.com> Date: Sat, 3 Aug 2024 23:08:28 +0300 Subject: [PATCH 03/19] FIX: Correct use of katex in double dollars $$ --- perlite/.src/PerliteParsedown.php | 37 ++++++++++++++----------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/perlite/.src/PerliteParsedown.php b/perlite/.src/PerliteParsedown.php index b85cf8c0..261ec387 100644 --- a/perlite/.src/PerliteParsedown.php +++ b/perlite/.src/PerliteParsedown.php @@ -501,27 +501,24 @@ protected function blockHeader($Line) # handle katex code protected function inlineKatex($Excerpt) { - $katex = $Excerpt['text']; - - if (preg_match("/(\\$\\$[^ ].*?\\$\\$)/", $Excerpt['text'], $matches)) { - - $katex = $matches[0]; - - } else if (preg_match("/(\\$[^ ].*?\\$)/", $Excerpt['text'], $matches)) { - - $katex = $matches[0]; - - } else { - return; + $marker = $Excerpt['text'][0]; + if (preg_match('/^(\\'.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), + 'element' => array( + 'name' => $name, + 'text' => $text, + ), + ); } - - return array( - 'extent' => strlen($katex), - 'element' => array( - 'name' => 'katex', - 'text' => $katex, - ), - ); } # handle obsidian tags From 27e9f8bb1654a84cba8737cc0a4d1a0b14ea12ce Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 6 Aug 2024 22:22:04 +0530 Subject: [PATCH 04/19] Added YouTube link support --- perlite/.src/PerliteParsedown.php | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/perlite/.src/PerliteParsedown.php b/perlite/.src/PerliteParsedown.php index b85cf8c0..60a23c70 100644 --- a/perlite/.src/PerliteParsedown.php +++ b/perlite/.src/PerliteParsedown.php @@ -13,6 +13,10 @@ class PerliteParsedown extends Parsedown { + public function __construct() + { + $this->BlockTypes['!'] = array('YouTube'); + } function text($text) { @@ -478,6 +482,53 @@ protected function blockHeader($Line) } } + protected function blockYouTube($Line) + { + + if ( ! isset($Line['text'][1]) or $Line['text'][1] !== '[') + { + return; + } + + $Line['text']= substr($Line['text'], 1); + + $Link = $this->inlineLink($Line); + + + if ($Link === null) + { + return; + } + + // See: https://stackoverflow.com/a/64320469 + $yt = preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $Link['element']['attributes']['href'], $match); + + if (! $yt) + { + return; + } + + $youtubeId = $match[1]; + $Block = array( + 'element' => array( + 'name' => 'iframe', + 'text' => $Line['text'], + 'handler' => 'line', + + 'attributes' => array( + 'class' => 'external-embed mod-receives-events', 'sandbox' => 'allow-forms allow-presentation allow-same-origin allow-scripts allow-modals allow-popups', + 'allow' => 'fullscreen', + 'frameborder' => '0', + 'src' => 'https://www.youtube.com/embed/'. $youtubeId, + ), + + ), + ); + + return $Block; + } + + # extend to obsidian tags protected $inlineMarkerList = '!"*$_#&[:<>`~\\'; protected $InlineTypes = array( From ee621a0d14609aa51f492e91152b67d4427deb0f Mon Sep 17 00:00:00 2001 From: sec77 <31564517+secure-77@users.noreply.github.com> Date: Mon, 23 Sep 2024 18:48:31 +0200 Subject: [PATCH 05/19] added Youtube Demo Link --- perlite/Demo/Demo Documents/Links and Embedded.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/perlite/Demo/Demo Documents/Links and Embedded.md b/perlite/Demo/Demo Documents/Links and Embedded.md index 39ce696f..edef39c3 100644 --- a/perlite/Demo/Demo Documents/Links and Embedded.md +++ b/perlite/Demo/Demo Documents/Links and Embedded.md @@ -28,6 +28,10 @@ Video embedded: ![[mov_bbb.mp4]] +Youtube embedded: + +![Making a Minecraft Obsidian Block in Real Life Using Astro Tech Resin](https://www.youtube.com/watch?v=NnTvZWp5Q7o) + ## PDF Link to internal stored PDF: [[pdf-test.pdf]] From ae44a1c5db5438378cacefc6a0dd52e4e3c82775 Mon Sep 17 00:00:00 2001 From: sec77 <31564517+secure-77@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:19:04 +0200 Subject: [PATCH 06/19] added webp image support --- Changelog.md | 9 +++++++++ perlite/Demo/Demo Documents/Images.md | 4 ++++ .../Demo/Demo Documents/Latex and Mermaid.md | 5 ++++- perlite/Demo/Demo Documents/docs/aufbau.webp | Bin 0 -> 41278 bytes perlite/content.php | 10 ++++++---- 5 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 perlite/Demo/Demo Documents/docs/aufbau.webp diff --git a/Changelog.md b/Changelog.md index fac5f2a9..3a416e09 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,12 @@ +## 1.5.9 +- added YouTube link support #133 thanks to @rsubr +- added image postion support thanks to @ar0x4 +- fixed direct page links [#90](https://github.com/secure-77/Perlite/issues/90) +- added support for webp images [#126](https://github.com/secure-77/Perlite/issues/126) + + + + ## 1.5.8 - merged PR #111 thanks to @selfiens - merged PR #112 thanks to @selfiens diff --git a/perlite/Demo/Demo Documents/Images.md b/perlite/Demo/Demo Documents/Images.md index 8449fbac..ca786976 100644 --- a/perlite/Demo/Demo Documents/Images.md +++ b/perlite/Demo/Demo Documents/Images.md @@ -18,6 +18,10 @@ Right aligned image with a custom size ![[background.png|right|200]] +webp Image + +![[docs/aufbau.webp]] + ## External images diff --git a/perlite/Demo/Demo Documents/Latex and Mermaid.md b/perlite/Demo/Demo Documents/Latex and Mermaid.md index d873d7e8..58ab4292 100644 --- a/perlite/Demo/Demo Documents/Latex and Mermaid.md +++ b/perlite/Demo/Demo Documents/Latex and Mermaid.md @@ -9,7 +9,10 @@ $$I = \int \rho R^{2} dV$$ And note that you can backslash-escape any punctuation characters which you wish to be displayed literally, ex.: \`foo\`, \*bar\*, etc. - + +Consider non-empty sets $A$, $B$ and $C$. Then a binary operation $f$ is a mapping from set $A\times C$ to set $A$ or $B$. +$$f\colon D\subseteq A \times C \to \left[ \begin{array}{lcl} A \\ B \end{array} \right.$$ + ## Mermaid Simple Flow Chart diff --git a/perlite/Demo/Demo Documents/docs/aufbau.webp b/perlite/Demo/Demo Documents/docs/aufbau.webp new file mode 100644 index 0000000000000000000000000000000000000000..e99297a327586d0dc998ca942ece4f3bab0f6235 GIT binary patch literal 41278 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

umA{Sk``wR<`XhOqR`u?BjqsfcOz&Bb#2Q0 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'; @@ -139,11 +141,11 @@ function parseContent($requestFile) // img links with size $replaces = '

image not found

'; - $pattern = array('/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(\d*)x?(\d*)(\]\])/'); + $pattern = array('/(\!?\[\[)(.*?)'.$allowedImageTypes.'\|?(\d*)x?(\d*)(\]\])/'); $content = preg_replace($pattern, $replaces, $content); // centerise or right align images with "center"/"right" directive - $pattern = '/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(center|right)\|?(\d*)x?(\d*)(\]\])/'; + $pattern = '/(\!?\[\[)(.*?)'.$allowedImageTypes.'\|?(center|right)\|?(\d*)x?(\d*)(\]\])/'; $replaces = function ($matches) use ($path) { $class = "images"; // Default class for all images if (strpos($matches[4], 'center') !== false) { @@ -159,12 +161,12 @@ function parseContent($requestFile) // img links with captions and size $replaces = '

\\4

'; - $pattern = array('/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(.+\|)\|?(\d*)x?(\d*)(\]\])/'); + $pattern = array('/(\!?\[\[)(.*?)'.$allowedImageTypes.'\|?(.+\|)\|?(\d*)x?(\d*)(\]\])/'); $content = preg_replace($pattern, $replaces, $content); // img links with captions $replaces = '

\\4

'; - $pattern = array('/(\!?\[\[)(.*?)(.png|.jpg|.jpeg|.svg|.gif|.bmp|.tif|.tiff)\|?(.*)(\]\])/'); + $pattern = array('/(\!?\[\[)(.*?)'.$allowedImageTypes.'\|?(.*)(\]\])/'); $content = preg_replace($pattern, $replaces, $content); From c5eb84d2caae9f8d98667ce62ab526c634d70bbf Mon Sep 17 00:00:00 2001 From: sec77 <31564517+secure-77@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:42:00 +0200 Subject: [PATCH 07/19] fixed edit link and change site title --- Changelog.md | 3 +++ perlite/index.php | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Changelog.md b/Changelog.md index 3a416e09..0e6d52fe 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,9 @@ - added image postion support thanks to @ar0x4 - fixed direct page links [#90](https://github.com/secure-77/Perlite/issues/90) - added support for webp images [#126](https://github.com/secure-77/Perlite/issues/126) +- fixed kartex problem PR [#131](https://github.com/secure-77/Perlite/pull/131) thanks to @Yaro2709 +- fixed obsidian edit link thanks to klgzzz +- changed site title to use the env. variable site_title diff --git a/perlite/index.php b/perlite/index.php index df7dfb5d..54f4ad9b 100644 --- a/perlite/index.php +++ b/perlite/index.php @@ -10,7 +10,7 @@ require_once __DIR__ . '/vendor/autoload.php'; require 'helper.php'; -$title = 'Perlite'; +$title = $siteTitle; $menu = menu($rootDir); $jsonGraphData = getfullGraph($rootDir); @@ -791,12 +791,8 @@ class="svg-icon right-triangle">

-

- -

-

- -

+

+