2015-10-04 12:37:12 +00:00
< ? php
register_module ([
" name " => " Parsedown " ,
2016-03-12 15:26:30 +00:00
" version " => " 0.3 " ,
2015-10-04 12:37:12 +00:00
" author " => " Johnny Broadway, Emanuil Rusev & Starbeamrainbowlabs " ,
2016-03-12 15:26:30 +00:00
" description " => " An upgraded parser based on Emanuil Rusev's Parsedown Extra PHP library (https://github.com/erusev/parsedown-extra), which is licensed MIT. Please be careful, as this module adds a some weight to your installation, and also requires write access to the disk on first load. " ,
2015-10-04 12:37:12 +00:00
" id " => " parser-parsedown " ,
" code " => function () {
2016-03-12 18:30:40 +00:00
global $settings ;
2016-03-12 15:26:30 +00:00
$parser = new PeppermintParsedown ();
$parser -> setInternalLinkBase ( " ?page=%s " );
add_parser ( " parsedown " , function ( $source ) use ( $parser ) {
$result = $parser -> text ( $source );
2015-10-04 13:04:42 +00:00
return $result ;
2015-10-04 12:37:12 +00:00
});
2016-03-12 18:30:40 +00:00
add_help_section ( " 20-parser-default " , " Editor Syntax " ,
" <p> $settings->sitename 's editor uses an extended version of <a href='http://parsedown.org/'>Parsedown</a> to render pages, which is a fantastic open source Github flavoured markdown parser. You can find a quick reference guide on Github flavoured markdown <a href='https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet'>here</a> by <a href='https://github.com/adam-p/'>adam-p</a>, or if you prefer a book <a href='https://www.gitbook.com/book/roachhd/master-markdown/details'>Mastering Markdown</a> by KB is a good read, and free too!</p>
< h3 > Extra Syntax </ h3 >
< p > $settings -> sitename 's editor also supports some extra custom syntax, some of which is inspired by <a href=' https :// mediawiki . org / ' > Mediawiki </ a >.
< table >
< tr >< th style = 'width: 40%' > Type this </ th >< th style = 'width: 20%' > To get this </ th >< th > Comments </ th ></ th >
< tr >< td >< code > [[ Internal link ]] </ code ></ td >< td >< a href = '?page=Internal%20link' > Internal Link </ a ></ td >< td > An internal link .</ td ></ tr >
< tr >< td >< code > [[ Display Text | Internal link ]] </ code ></ td >< td >< a href = '?page=Internal%20link' > Display Text </ a ></ td >< td > An internal link with some display text .</ td ></ tr >
< tr >< td >< code >! [ Alt text ]( http :// example . com / path / to / image . png | 256 x256 | right ) </ code ></ td >< td >< img src = 'http://example.com/path/to/image.png' alt = 'Alt text' style = 'float: right; max-width: 256px; max-height: 256px;' /></ td >< td > An image floating to the right of the page that fits inside a 256 px x 256 px box , preserving aspect ratio .</ td ></ tr >
</ table > " );
2015-10-04 12:37:12 +00:00
}
]);
2016-03-12 15:26:30 +00:00
/*** Parsedown versions ***
* Parsedown Core : 1.6 . 0 *
* Parsedown Extra : 0.7 . 0 *
**************************/
$env -> parsedown_paths = new stdClass ();
$env -> parsedown_paths -> parsedown = " https://cdn.rawgit.com/erusev/parsedown/3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7/Parsedown.php " ;
$env -> parsedown_paths -> parsedown_extra = " https://cdn.rawgit.com/erusev/parsedown-extra/11a44e076d02ffcc4021713398a60cd73f78b6f5/ParsedownExtra.php " ;
// Download parsedown and parsedown extra if they don't already exist
if ( ! file_exists ( " ./Parsedown.php " ) || filesize ( " ./Parsedown.php " ) === 0 )
file_put_contents ( " ./Parsedown.php " , fopen ( $env -> parsedown_paths -> parsedown , " r " ));
if ( ! file_exists ( " ./ParsedownExtra.php " ) || filesize ( " ./ParsedownExtra.php " ) === 0 )
file_put_contents ( " ./ParsedownExtra.php " , fopen ( $env -> parsedown_paths -> parsedown_extra , " r " ));
2015-10-04 12:37:12 +00:00
2016-03-12 15:26:30 +00:00
require_once ( " ./Parsedown.php " );
require_once ( " ./ParsedownExtra.php " );
2015-10-04 12:37:12 +00:00
2015-12-26 12:55:19 +00:00
/*
2016-03-12 15:26:30 +00:00
* ██████ █████ ██████ ███████ ███████ ██████ ██████ ██ ██ ███ ██
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██
* ██████ ███████ ██████ ███████ █████ ██ ██ ██ ██ ██ █ ██ ██ ██ ██
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██
* ██ ██ ██ ██ ██ ███████ ███████ ██████ ██████ ███ ███ ██ ████
*
* ███████ ██ ██ ████████ ███████ ███ ██ ███████ ██ ██████ ███ ██ ███████
* ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ████ ██ ██
* █████ ███ ██ █████ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ███████
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
* ███████ ██ ██ ██ ███████ ██ ████ ███████ ██ ██████ ██ ████ ███████
*/
class PeppermintParsedown extends ParsedownExtra
2015-10-04 12:37:12 +00:00
{
2016-03-12 15:26:30 +00:00
private $internalLinkBase = " ./%s " ;
function __construct ()
{
// Prioritise our internal link parsing over the regular link parsing
array_unshift ( $this -> InlineTypes [ " [ " ], " InternalLink " );
// Prioritise our image parser over the regular image parser
array_unshift ( $this -> InlineTypes [ " ! " ], " ExtendedImage " );
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
//$this->inlineMarkerList .= "{";
}
protected function inlineInternalLink ( $fragment )
{
if ( preg_match ( '/^\[\[(.*)\]\]/' , $fragment [ " text " ], $matches ))
{
$display = $linkPage = $matches [ 1 ];
if ( strpos ( $matches [ 1 ], " | " ))
{
// We have a bar character
$parts = explode ( " | " , $matches [ 1 ], 2 );
$linkPage = $parts [ 0 ];
$display = $parts [ 1 ];
}
// Construct the full url
$linkUrl = str_replace (
" %s " , rawurlencode ( $linkPage ),
$this -> internalLinkBase
);
return [
" extent " => strlen ( $matches [ 0 ]),
" element " => [
" name " => " a " ,
" text " => $display ,
" attributes " => [
" href " => $linkUrl
]
]
];
}
return ;
}
protected function inlineExtendedImage ( $fragment )
{
if ( preg_match ( '/^!\[(.*)\]\(([^ |)]+)\s*\|([^|)]*)(?:\|([^)]*))?\)/' , $fragment [ " text " ], $matches ))
2015-10-04 14:20:47 +00:00
{
2016-03-12 15:26:30 +00:00
/*
* 0 - Everything
* 1 - Alt text
* 2 - Url
* 3 - First param
* 4 - Second Param ( optional )
*/
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
var_dump ( $matches );
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
$altText = $matches [ 1 ];
$imageUrl = $matches [ 2 ];
$param1 = strtolower ( trim ( $matches [ 3 ]));
$param2 = empty ( $matches [ 4 ]) ? false : strtolower ( trim ( $matches [ 4 ]));
$floatDirection = false ;
$imageSize = false ;
if ( $this -> isFloatValue ( $param1 ))
{
$floatDirection = $param1 ;
$imageSize = $this -> parseSizeSpec ( $param2 );
}
else if ( $this -> isFloatValue ( $param2 ))
{
$floatDirection = $param2 ;
$imageSize = $this -> parseSizeSpec ( $param1 );
}
else
{
$imageSize = $this -> parseSizeSpec ( $param1 );
}
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
// If they are both invalid then something very strange is going on
// Let the built in parsedown image handler deal with it
if ( $imageSize === false && $floatDirection === false )
return ;
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
$style = " " ;
if ( $imageSize !== false )
2016-03-12 18:32:58 +00:00
$style .= " max-width: " . $imageSize [ " x " ] . " px; max-height: " . $imageSize [ " y " ] . " px; " ;
2016-03-12 15:26:30 +00:00
if ( $floatDirection )
$style .= " float: $floatDirection ; " ;
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
return [
" extent " => strlen ( $matches [ 0 ]),
" element " => [
" name " => " img " ,
" attributes " => [
" src " => $imageUrl ,
" alt " => $altText ,
" style " => trim ( $style )
]
]
];
2015-10-04 14:20:47 +00:00
}
2016-03-12 15:26:30 +00:00
}
private function isFloatValue ( $value )
{
return in_array ( strtolower ( $value ), [ " left " , " right " ]);
}
private function parseSizeSpec ( $text )
{
if ( strpos ( $text , " x " ) === false )
return false ;
$parts = explode ( " x " , $text , 2 );
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
if ( count ( $parts ) != 2 )
return false ;
2015-10-04 14:20:47 +00:00
2016-03-12 15:26:30 +00:00
array_map ( " trim " , $parts );
array_map ( " intval " , $parts );
if ( in_array ( 0 , $parts ))
return false ;
return [
" x " => $parts [ 0 ],
" y " => $parts [ 1 ]
];
}
/**
* Sets the base url to be used for internal links . '%s' will be replaced
* with a URL encoded version of the page name .
* @ param string $url The url to use when parsing internal links .
*/
public function setInternalLinkBase ( $url )
{
$this -> internalLinkBase = $url ;
}
2015-10-04 12:37:12 +00:00
}
?>