diff --git a/composer.json b/composer.json index 0f49d40..8ca0d9d 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "scrivo/highlight.php": "^9.18", "erusev/parsedown": "^1.7", "illuminate/database": "^9.4", - "ext-redis": "*" + "ext-redis": "*", + "erusev/parsedown-extra": "^0.8.1" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 105d72e..8b425ec 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e4f29c3440a94cc63c1b5d37ca4f76e8", + "content-hash": "84a10eea0cdac506e1b208869ec7879e", "packages": [ { "name": "brick/math", @@ -202,6 +202,57 @@ }, "time": "2019-12-30T22:54:17+00:00" }, + { + "name": "erusev/parsedown-extra", + "version": "0.8.1", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown-extra.git", + "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef", + "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef", + "shasum": "" + }, + "require": { + "erusev/parsedown": "^1.7.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "ParsedownExtra": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "An extension of Parsedown that adds support for Markdown Extra.", + "homepage": "https://github.com/erusev/parsedown-extra", + "keywords": [ + "markdown", + "markdown extra", + "parsedown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown-extra/issues", + "source": "https://github.com/erusev/parsedown-extra/tree/0.8.x" + }, + "time": "2019-12-30T23:20:37+00:00" + }, { "name": "illuminate/collections", "version": "v9.52.4", diff --git a/includes/Models/Paste.php b/includes/Models/Paste.php index 765ae23..42c8bd5 100644 --- a/includes/Models/Paste.php +++ b/includes/Models/Paste.php @@ -48,13 +48,17 @@ class Paste extends Model { public function expiryDisplay() { $expiry = $this->expiry; - if (!$expiry) { + if (!$expiry || $expiry === 'NULL') { // TODO: Investigate why this is a string return 'Never'; } + if ($expiry == 'SELF') { return 'View Once'; } - $dateTime = new DateTime(); + + var_dump($expiry); + + $dateTime = new DateTime($expiry); $dateTime->setTimestamp($expiry); $ret = $dateTime->format('Y-m-d H:i:s'); if ($dateTime->diff(new DateTime())->days < 1) { diff --git a/includes/Pastedown.php b/includes/Pastedown.php new file mode 100644 index 0000000..a79c778 --- /dev/null +++ b/includes/Pastedown.php @@ -0,0 +1,70 @@ +BlockTypes['>'] = ['Greentext']; + $this->BlockTypes['<'] []= ['Redtext']; + $this->BlockTypes['@'] = ['Purpletext']; + } + + + protected function blockGreentext($Line) + { + if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'span', + 'attributes' => [ + 'class' => 'greentext' + ], + 'handler' => 'line', + 'text' => $matches[0], + ), + ); + + return $Block; + } + } + + protected function blockRedtext($Line) + { + if (preg_match('/^<[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'span', + 'handler' => 'line', + 'attributes' => [ + 'class' => 'redtext' + ], + 'text' => $matches[0], + ), + ); + + return $Block; + } + } + + protected function blockPurpletext($Line) + { + if (preg_match('/^@[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'span', + 'handler' => 'line', + 'attributes' => [ + 'class' => 'purpletext' + ], + 'text' => $matches[0], + ), + ); + + return $Block; + } + } +} \ No newline at end of file diff --git a/public/paste.php b/public/paste.php index 8df7f37..5f93592 100644 --- a/public/paste.php +++ b/public/paste.php @@ -6,6 +6,7 @@ require_once(__DIR__ . '/../includes/common.php'); use Highlight\Highlighter; use PonePaste\Models\Paste; use PonePaste\Models\User; +use PonePaste\Pastedown; function isRequesterLikelyBot() : bool { return str_contains(strtolower($_SERVER['HTTP_USER_AGENT']), 'bot'); @@ -212,7 +213,7 @@ $p_content = rtrim($p_content); $p_content = htmlspecialchars_decode($p_content); if ($paste_code === "pastedown" || $paste_code === 'pastedown_old') { - $parsedown = new Parsedown(); + $parsedown = new Pastedown(); $parsedown->setSafeMode(true); $p_content = $parsedown->text($p_content); } else { diff --git a/public/theme/bulma/css/paste.css b/public/theme/bulma/css/paste.css index 3dc41a8..eb71967 100644 --- a/public/theme/bulma/css/paste.css +++ b/public/theme/bulma/css/paste.css @@ -260,4 +260,17 @@ button.button--no-style { code { overflow-wrap: anywhere; white-space: pre-wrap; -} \ No newline at end of file +} + +.content .greentext { + color: #789922; + content: ">"; +} + +.content .redtext { + color: #d12222; +} + +.content .purpletext { + color: #9f14ae; +} diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index edba334..7fd8f53 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -6,6 +6,7 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'ParsedownExtra' => array($vendorDir . '/erusev/parsedown-extra'), 'Parsedown' => array($vendorDir . '/erusev/parsedown'), 'Highlight\\' => array($vendorDir . '/scrivo/highlight.php'), 'HighlightUtilities\\' => array($vendorDir . '/scrivo/highlight.php'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 53387e7..d293352 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -158,6 +158,10 @@ class ComposerStaticInit5bf95489f4eff2c10ec062bf7ba377da public static $prefixesPsr0 = array ( 'P' => array ( + 'ParsedownExtra' => + array ( + 0 => __DIR__ . '/..' . '/erusev/parsedown-extra', + ), 'Parsedown' => array ( 0 => __DIR__ . '/..' . '/erusev/parsedown', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index a8b19f2..cacb802 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -205,6 +205,60 @@ }, "install-path": "../erusev/parsedown" }, + { + "name": "erusev/parsedown-extra", + "version": "0.8.1", + "version_normalized": "0.8.1.0", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown-extra.git", + "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef", + "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef", + "shasum": "" + }, + "require": { + "erusev/parsedown": "^1.7.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "time": "2019-12-30T23:20:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "ParsedownExtra": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "An extension of Parsedown that adds support for Markdown Extra.", + "homepage": "https://github.com/erusev/parsedown-extra", + "keywords": [ + "markdown", + "markdown extra", + "parsedown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown-extra/issues", + "source": "https://github.com/erusev/parsedown-extra/tree/0.8.x" + }, + "install-path": "../erusev/parsedown-extra" + }, { "name": "illuminate/collections", "version": "v9.52.4", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 6fa9b48..0a511a1 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'aftercase/ponepaste', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '9bd921ee714769fcddbcbbd0d7c49a64336794f9', + 'reference' => 'ca52ccebb87c68aa9a6e0cf2cd58e9278736033a', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'aftercase/ponepaste' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '9bd921ee714769fcddbcbbd0d7c49a64336794f9', + 'reference' => 'ca52ccebb87c68aa9a6e0cf2cd58e9278736033a', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -46,6 +46,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'erusev/parsedown-extra' => array( + 'pretty_version' => '0.8.1', + 'version' => '0.8.1.0', + 'reference' => '91ac3ff98f0cea243bdccc688df43810f044dcef', + 'type' => 'library', + 'install_path' => __DIR__ . '/../erusev/parsedown-extra', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'illuminate/collections' => array( 'pretty_version' => 'v9.52.4', 'version' => '9.52.4.0', diff --git a/vendor/erusev/parsedown-extra/.travis.yml b/vendor/erusev/parsedown-extra/.travis.yml new file mode 100644 index 0000000..d0b48f8 --- /dev/null +++ b/vendor/erusev/parsedown-extra/.travis.yml @@ -0,0 +1,30 @@ +language: php + +dist: trusty +sudo: false + +matrix: + include: + - php: 5.3 + dist: precise + - php: 5.4 + - php: 5.5 + - php: 5.6 + - php: 7.0 + - php: 7.1 + - php: 7.2 + - php: 7.3 + - php: 7.4 + - php: nightly + fast_finish: true + allow_failures: + - php: nightly + - php: hhvm-nightly + +install: + - composer install --prefer-source + +script: + - vendor/bin/phpunit + - vendor/bin/phpunit vendor/erusev/parsedown/test/CommonMarkTestWeak.php || true + - '[ -z "$TRAVIS_TAG" ] || [ "$TRAVIS_TAG" == "$(php -r "require(\"ParsedownExtra.php\"); echo ParsedownExtra::version;")" ]' diff --git a/vendor/erusev/parsedown-extra/LICENSE.txt b/vendor/erusev/parsedown-extra/LICENSE.txt new file mode 100644 index 0000000..baca86f --- /dev/null +++ b/vendor/erusev/parsedown-extra/LICENSE.txt @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Emanuil Rusev, erusev.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/ParsedownExtra.php b/vendor/erusev/parsedown-extra/ParsedownExtra.php new file mode 100644 index 0000000..632ba84 --- /dev/null +++ b/vendor/erusev/parsedown-extra/ParsedownExtra.php @@ -0,0 +1,538 @@ +BlockTypes[':'] []= 'DefinitionList'; + $this->BlockTypes['*'] []= 'Abbreviation'; + + # identify footnote definitions before reference definitions + array_unshift($this->BlockTypes['['], 'Footnote'); + + # identify footnote markers before before links + array_unshift($this->InlineTypes['['], 'FootnoteMarker'); + } + + # + # ~ + + function text($text) + { + $markup = parent::text($text); + + # merge consecutive dl elements + + $markup = preg_replace('/<\/dl>\s+
'.$backLinksMarkup.'
'; + } + + $Element['text'][1]['text'] []= array( + 'name' => 'li', + 'attributes' => array('id' => 'fn:'.$definitionId), + 'rawHtml' => "\n".$text."\n", + ); + } + + return $Element; + } + + # ~ + + protected function parseAttributeData($attributeString) + { + $Data = array(); + + $attributes = preg_split('/[ ]+/', $attributeString, - 1, PREG_SPLIT_NO_EMPTY); + + foreach ($attributes as $attribute) + { + if ($attribute[0] === '#') + { + $Data['id'] = substr($attribute, 1); + } + else # "." + { + $classes []= substr($attribute, 1); + } + } + + if (isset($classes)) + { + $Data['class'] = implode(' ', $classes); + } + + return $Data; + } + + # ~ + + protected function processTag($elementMarkup) # recursive + { + # http://stackoverflow.com/q/1148928/200145 + libxml_use_internal_errors(true); + + $DOMDocument = new DOMDocument; + + # http://stackoverflow.com/q/11309194/200145 + $elementMarkup = mb_convert_encoding($elementMarkup, 'HTML-ENTITIES', 'UTF-8'); + + # http://stackoverflow.com/q/4879946/200145 + $DOMDocument->loadHTML($elementMarkup); + $DOMDocument->removeChild($DOMDocument->doctype); + $DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild); + + $elementText = ''; + + if ($DOMDocument->documentElement->getAttribute('markdown') === '1') + { + foreach ($DOMDocument->documentElement->childNodes as $Node) + { + $elementText .= $DOMDocument->saveHTML($Node); + } + + $DOMDocument->documentElement->removeAttribute('markdown'); + + $elementText = "\n".$this->text($elementText)."\n"; + } + else + { + foreach ($DOMDocument->documentElement->childNodes as $Node) + { + $nodeMarkup = $DOMDocument->saveHTML($Node); + + if ($Node instanceof DOMElement and ! in_array($Node->nodeName, $this->textLevelElements)) + { + $elementText .= $this->processTag($nodeMarkup); + } + else + { + $elementText .= $nodeMarkup; + } + } + } + + # because we don't want for markup to get encoded + $DOMDocument->documentElement->nodeValue = 'placeholder\x1A'; + + $markup = $DOMDocument->saveHTML($DOMDocument->documentElement); + $markup = str_replace('placeholder\x1A', $elementText, $markup); + + return $markup; + } + + # ~ + + protected function sortFootnotes($A, $B) # callback + { + return $A['number'] - $B['number']; + } + + # + # Fields + # + + protected $regexAttribute = '(?:[#.][-\w]+[ ]*)'; +} diff --git a/vendor/erusev/parsedown-extra/README.md b/vendor/erusev/parsedown-extra/README.md new file mode 100644 index 0000000..cee4b54 --- /dev/null +++ b/vendor/erusev/parsedown-extra/README.md @@ -0,0 +1,31 @@ +> You might also like [Caret](http://caret.io?ref=parsedown) - our Markdown editor for the Desktop. + +## Parsedown Extra + +[](https://travis-ci.org/erusev/parsedown-extra) + +An extension of [Parsedown](http://parsedown.org) that adds support for [Markdown Extra](https://michelf.ca/projects/php-markdown/extra/). + +[See Demo](http://parsedown.org/extra/) + +### Installation + +Include both `Parsedown.php` and `ParsedownExtra.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown-extra). + +### Example + +``` php +$Extra = new ParsedownExtra(); + +echo $Extra->text('# Header {.sth}'); # prints:The HTML specification +is maintained by the W3C. +The abbreviation ML is contained in the abbreviation HTML.
\ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/abbreviation.md b/vendor/erusev/parsedown-extra/test/data/abbreviation.md new file mode 100644 index 0000000..4ac8f88 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/abbreviation.md @@ -0,0 +1,7 @@ +The HTML specification +is maintained by the W3C. +The abbreviation ML is contained in the abbreviation HTML. + +*[HTML]: Hyper Text Markup Language +*[W3C]: World Wide Web Consortium +*[ML]: Markup Language \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/compound_footnote.html b/vendor/erusev/parsedown-extra/test/data/compound_footnote.html new file mode 100644 index 0000000..1a3848f --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/compound_footnote.html @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/compound_footnote.md b/vendor/erusev/parsedown-extra/test/data/compound_footnote.md new file mode 100644 index 0000000..5bca3c7 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/compound_footnote.md @@ -0,0 +1,14 @@ +footnote [^1] and another one [^2] + +[^1]: line 1 + line 2 + + > quote + + another paragraph + +[^2]: + paragraph + + another paragraph + \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/definition_list.html b/vendor/erusev/parsedown-extra/test/data/definition_list.html new file mode 100644 index 0000000..2567dc1 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/definition_list.html @@ -0,0 +1,17 @@ +lazy +line
multiple
+paragraphs
nested
+code block
++quote +block
+
second time 1
+ \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/footnote.md b/vendor/erusev/parsedown-extra/test/data/footnote.md new file mode 100644 index 0000000..07d7010 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/footnote.md @@ -0,0 +1,11 @@ +first [^1] second [^2]. + +[^1]: one +[^2]: two + +first [^a] second [^b]. + +[^a]: one +[^b]: two + +second time [^1] \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.html b/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.html new file mode 100644 index 0000000..27da259 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.html @@ -0,0 +1,25 @@ +markdown
+This is another paragraph. It contains inline markup.
+markdown
+markdown
+markdown
+