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+
\s+/', '', $markup); + + # add footnotes + + if (isset($this->DefinitionData['Footnote'])) + { + $Element = $this->buildFootnoteElement(); + + $markup .= "\n" . $this->element($Element); + } + + return $markup; + } + + # + # Blocks + # + + # + # Abbreviation + + protected function blockAbbreviation($Line) + { + if (preg_match('/^\*\[(.+?)\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches)) + { + $this->DefinitionData['Abbreviation'][$matches[1]] = $matches[2]; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + # + # Footnote + + protected function blockFootnote($Line) + { + if (preg_match('/^\[\^(.+?)\]:[ ]?(.*)$/', $Line['text'], $matches)) + { + $Block = array( + 'label' => $matches[1], + 'text' => $matches[2], + 'hidden' => true, + ); + + return $Block; + } + } + + protected function blockFootnoteContinue($Line, $Block) + { + if ($Line['text'][0] === '[' and preg_match('/^\[\^(.+?)\]:/', $Line['text'])) + { + return; + } + + if (isset($Block['interrupted'])) + { + if ($Line['indent'] >= 4) + { + $Block['text'] .= "\n\n" . $Line['text']; + + return $Block; + } + } + else + { + $Block['text'] .= "\n" . $Line['text']; + + return $Block; + } + } + + protected function blockFootnoteComplete($Block) + { + $this->DefinitionData['Footnote'][$Block['label']] = array( + 'text' => $Block['text'], + 'count' => null, + 'number' => null, + ); + + return $Block; + } + + # + # Definition List + + protected function blockDefinitionList($Line, $Block) + { + if ( ! isset($Block) or isset($Block['type'])) + { + return; + } + + $Element = array( + 'name' => 'dl', + 'handler' => 'elements', + 'text' => array(), + ); + + $terms = explode("\n", $Block['element']['text']); + + foreach ($terms as $term) + { + $Element['text'] []= array( + 'name' => 'dt', + 'handler' => 'line', + 'text' => $term, + ); + } + + $Block['element'] = $Element; + + $Block = $this->addDdElement($Line, $Block); + + return $Block; + } + + protected function blockDefinitionListContinue($Line, array $Block) + { + if ($Line['text'][0] === ':') + { + $Block = $this->addDdElement($Line, $Block); + + return $Block; + } + else + { + if (isset($Block['interrupted']) and $Line['indent'] === 0) + { + return; + } + + if (isset($Block['interrupted'])) + { + $Block['dd']['handler'] = 'text'; + $Block['dd']['text'] .= "\n\n"; + + unset($Block['interrupted']); + } + + $text = substr($Line['body'], min($Line['indent'], 4)); + + $Block['dd']['text'] .= "\n" . $text; + + return $Block; + } + } + + # + # Header + + protected function blockHeader($Line) + { + $Block = parent::blockHeader($Line); + + if (! isset($Block)) { + return null; + } + + if (preg_match('/[ #]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE)) + { + $attributeString = $matches[1][0]; + + $Block['element']['attributes'] = $this->parseAttributeData($attributeString); + + $Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]); + } + + return $Block; + } + + # + # Markup + + protected function blockMarkupComplete($Block) + { + if ( ! isset($Block['void'])) + { + $Block['markup'] = $this->processTag($Block['markup']); + } + + return $Block; + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + $Block = parent::blockSetextHeader($Line, $Block); + + if (! isset($Block)) { + return null; + } + + if (preg_match('/[ ]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE)) + { + $attributeString = $matches[1][0]; + + $Block['element']['attributes'] = $this->parseAttributeData($attributeString); + + $Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]); + } + + return $Block; + } + + # + # Inline Elements + # + + # + # Footnote Marker + + protected function inlineFootnoteMarker($Excerpt) + { + if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches)) + { + $name = $matches[1]; + + if ( ! isset($this->DefinitionData['Footnote'][$name])) + { + return; + } + + $this->DefinitionData['Footnote'][$name]['count'] ++; + + if ( ! isset($this->DefinitionData['Footnote'][$name]['number'])) + { + $this->DefinitionData['Footnote'][$name]['number'] = ++ $this->footnoteCount; # ยป & + } + + $Element = array( + 'name' => 'sup', + 'attributes' => array('id' => 'fnref'.$this->DefinitionData['Footnote'][$name]['count'].':'.$name), + 'handler' => 'element', + 'text' => array( + 'name' => 'a', + 'attributes' => array('href' => '#fn:'.$name, 'class' => 'footnote-ref'), + 'text' => $this->DefinitionData['Footnote'][$name]['number'], + ), + ); + + return array( + 'extent' => strlen($matches[0]), + 'element' => $Element, + ); + } + } + + private $footnoteCount = 0; + + # + # Link + + protected function inlineLink($Excerpt) + { + $Link = parent::inlineLink($Excerpt); + + if (! isset($Link)) { + return null; + } + + $remainder = substr($Excerpt['text'], $Link['extent']); + + if (preg_match('/^[ ]*{('.$this->regexAttribute.'+)}/', $remainder, $matches)) + { + $Link['element']['attributes'] += $this->parseAttributeData($matches[1]); + + $Link['extent'] += strlen($matches[0]); + } + + return $Link; + } + + # + # ~ + # + + protected function unmarkedText($text) + { + $text = parent::unmarkedText($text); + + if (isset($this->DefinitionData['Abbreviation'])) + { + foreach ($this->DefinitionData['Abbreviation'] as $abbreviation => $meaning) + { + $pattern = '/\b'.preg_quote($abbreviation, '/').'\b/'; + + $text = preg_replace($pattern, ''.$abbreviation.'', $text); + } + } + + return $text; + } + + # + # Util Methods + # + + protected function addDdElement(array $Line, array $Block) + { + $text = substr($Line['text'], 1); + $text = trim($text); + + unset($Block['dd']); + + $Block['dd'] = array( + 'name' => 'dd', + 'handler' => 'line', + 'text' => $text, + ); + + if (isset($Block['interrupted'])) + { + $Block['dd']['handler'] = 'text'; + + unset($Block['interrupted']); + } + + $Block['element']['text'] []= & $Block['dd']; + + return $Block; + } + + protected function buildFootnoteElement() + { + $Element = array( + 'name' => 'div', + 'attributes' => array('class' => 'footnotes'), + 'handler' => 'elements', + 'text' => array( + array( + 'name' => 'hr', + ), + array( + 'name' => 'ol', + 'handler' => 'elements', + 'text' => array(), + ), + ), + ); + + uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes'); + + foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData) + { + if ( ! isset($DefinitionData['number'])) + { + continue; + } + + $text = $DefinitionData['text']; + + $text = parent::text($text); + + $numbers = range(1, $DefinitionData['count']); + + $backLinksMarkup = ''; + + foreach ($numbers as $number) + { + $backLinksMarkup .= ' '; + } + + $backLinksMarkup = substr($backLinksMarkup, 1); + + if (substr($text, - 4) === '

') + { + $backLinksMarkup = ' '.$backLinksMarkup; + + $text = substr_replace($text, $backLinksMarkup.'

', - 4); + } + else + { + $text .= "\n".'

'.$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 + +[![Build Status](https://img.shields.io/travis/erusev/parsedown-extra/master.svg?style=flat-square)](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:

Header

+``` + +### Questions + +**Who uses Parsedown Extra?** + +[October CMS](http://octobercms.com/), [Bolt CMS](http://bolt.cm/), [Kirby CMS](http://getkirby.com/), [Grav CMS](http://getgrav.org/), [Statamic CMS](http://www.statamic.com/) and [more](https://www.versioneye.com/php/erusev:parsedown-extra/references). + +**How can I help?** + +Use it, star it, share it and in case you feel generous, [donate some money](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2). diff --git a/vendor/erusev/parsedown-extra/composer.json b/vendor/erusev/parsedown-extra/composer.json new file mode 100644 index 0000000..317d147 --- /dev/null +++ b/vendor/erusev/parsedown-extra/composer.json @@ -0,0 +1,33 @@ +{ + "name": "erusev/parsedown-extra", + "description": "An extension of Parsedown that adds support for Markdown Extra.", + "keywords": ["markdown", "markdown extra", "parser", "parsedown"], + "homepage": "https://github.com/erusev/parsedown-extra", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "require": { + "erusev/parsedown": "^1.7.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "autoload": { + "psr-0": {"ParsedownExtra": ""} + }, + "autoload-dev": { + "psr-0": { + "TestParsedown": "test/", + "ParsedownExtraTest": "test/", + "ParsedownTest": "vendor/erusev/parsedown/test/", + "CommonMarkTest": "vendor/erusev/parsedown/test/", + "CommonMarkTestWeak": "vendor/erusev/parsedown/test/" + } + } +} diff --git a/vendor/erusev/parsedown-extra/phpunit.xml.dist b/vendor/erusev/parsedown-extra/phpunit.xml.dist new file mode 100644 index 0000000..29880b5 --- /dev/null +++ b/vendor/erusev/parsedown-extra/phpunit.xml.dist @@ -0,0 +1,8 @@ + + + + + test/ParsedownExtraTest.php + + + diff --git a/vendor/erusev/parsedown-extra/test/ParsedownExtraTest.php b/vendor/erusev/parsedown-extra/test/ParsedownExtraTest.php new file mode 100644 index 0000000..d2a6d23 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/ParsedownExtraTest.php @@ -0,0 +1,11 @@ +textLevelElements; + } +} diff --git a/vendor/erusev/parsedown-extra/test/data/abbreviation.html b/vendor/erusev/parsedown-extra/test/data/abbreviation.html new file mode 100644 index 0000000..9b3a45c --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/abbreviation.html @@ -0,0 +1,3 @@ +

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 @@ +

footnote 1 and another one 2

+
+
+
    +
  1. +

    line 1 +line 2

    +
    +

    quote

    +
    +

    another paragraph 

    +
  2. +
  3. +

    paragraph

    +

    another paragraph 

    +
  4. +
+
\ 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 @@ +
+
Term 1
+
one
+
two +extra line
+
Term 2
+

lazy +line

+

multiple

+

paragraphs

+

nested

+
code block
+
+

quote +block

+
+
\ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/definition_list.md b/vendor/erusev/parsedown-extra/test/data/definition_list.md new file mode 100644 index 0000000..ec0ee03 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/definition_list.md @@ -0,0 +1,20 @@ +Term 1 +: one +: two + extra line + +Term 2 + +: lazy +line + +: multiple + + paragraphs + +: nested + + code block + + > quote + > block \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/footnote.html b/vendor/erusev/parsedown-extra/test/data/footnote.html new file mode 100644 index 0000000..d0ba76c --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/footnote.html @@ -0,0 +1,20 @@ +

first 1 second 2.

+

first 3 second 4.

+

second time 1

+
+
+
    +
  1. +

    one 

    +
  2. +
  3. +

    two 

    +
  4. +
  5. +

    one 

    +
  6. +
  7. +

    two 

    +
  8. +
+
\ 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.

+
+_no markdown_ +
+
+
+
+

markdown

+
+

markdown

+
+
+
+
+_no markdown_ +
+

markdown

+
+
+
+
+_no markdown_ +
\ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.md b/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.md new file mode 100644 index 0000000..dbb85d6 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/markdown_inside_markup.md @@ -0,0 +1,32 @@ +
+_markdown_ + +This is another paragraph. It contains inline markup. +
+_no markdown_ +
+
+ +--- + +
+_markdown_ +
+_markdown_ +
+
+ +--- + +
+_no markdown_ +
+_markdown_ +
+
+ +--- + +
+_no markdown_ +
\ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/special_attributes.html b/vendor/erusev/parsedown-extra/test/data/special_attributes.html new file mode 100644 index 0000000..cafa311 --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/special_attributes.html @@ -0,0 +1,6 @@ +

Header 1

+

Header 2

+

The Site

+

The Site

+

link

+

\ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/test/data/special_attributes.md b/vendor/erusev/parsedown-extra/test/data/special_attributes.md new file mode 100644 index 0000000..01f29fc --- /dev/null +++ b/vendor/erusev/parsedown-extra/test/data/special_attributes.md @@ -0,0 +1,12 @@ +Header 1 {#header1} +======== + +## Header 2 ## {#header2} + +## The Site ## {.main} + +## The Site ## {.main .shine #the-site} + +[link](http://parsedown.org) {.primary #link .upper-case} + +![logo](/md.png) {#logo .big} \ No newline at end of file