mirror of
https://github.com/sbrl/Pepperminty-Wiki.git
synced 2024-11-22 04:23:01 +00:00
Moved markdown parser to a module
This commit is contained in:
parent
6bf33a415a
commit
5f33d9a6a4
5 changed files with 297 additions and 234 deletions
122
core.php
122
core.php
|
@ -316,117 +316,6 @@ class page_renderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////////////////// Slimdown /////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////// %slimdown% //
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Slimdown - A very basic regex-based Markdown parser. Supports the
|
|
||||||
* following elements (and can be extended via Slimdown::add_rule()):
|
|
||||||
*
|
|
||||||
* - Headers
|
|
||||||
* - Links
|
|
||||||
* - Bold
|
|
||||||
* - Emphasis
|
|
||||||
* - Deletions
|
|
||||||
* - Quotes
|
|
||||||
* - Inline code
|
|
||||||
* - Blockquotes
|
|
||||||
* - Ordered/unordered lists
|
|
||||||
* - Horizontal rules
|
|
||||||
*
|
|
||||||
* Author: Johnny Broadway <johnny@johnnybroadway.com>
|
|
||||||
* Website: https://gist.github.com/jbroadway/2836900
|
|
||||||
* License: MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modified by Starbeamrainbowlabs (starbeamrainbowlabs)
|
|
||||||
*
|
|
||||||
* Changed bold to use single asterisks
|
|
||||||
* Changed italics to use single underscores
|
|
||||||
* Added one to add the heading levels (no <h1> tags allowed)
|
|
||||||
* Added wiki style internal link parsing
|
|
||||||
* Added wiki style internal link parsing with display text
|
|
||||||
*/
|
|
||||||
class Slimdown {
|
|
||||||
public static $rules = array (
|
|
||||||
'/\r\n/' => "\n", // new line normalisation
|
|
||||||
'/(#+)(.*)/' => 'self::header', // headers
|
|
||||||
'/(\*)(.*?)\1/' => '<strong>\2</strong>', // bold
|
|
||||||
'/(_)(.*?)\1/' => '<em>\2</em>', // emphasis
|
|
||||||
|
|
||||||
// todo test these
|
|
||||||
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\s(left|right)\)/' => '<img src="\2" alt="\1" style="max-width: \3; float: \4;" />', // images with size
|
|
||||||
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\)/' => '<img src="\2" alt="\1" style="max-width: \3;" />', // images with size
|
|
||||||
'/!\[(.*)\]\((.*)\)/' => '<img src="\2" alt="\1" />', // basic images
|
|
||||||
// todo end
|
|
||||||
|
|
||||||
'/\[\[([a-zA-Z0-9\_\- ]+)\|([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\2</a>', //internal links with display text
|
|
||||||
'/\[\[([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\1</a>', //internal links
|
|
||||||
'/\[([^\[]+)\]\(([^\)]+)\)/' => '<a href=\'\2\' target=\'_blank\'>\1</a>', // links
|
|
||||||
'/\~\~(.*?)\~\~/' => '<del>\1</del>', // del
|
|
||||||
'/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote
|
|
||||||
'/`(.*?)`/' => '<code>\1</code>', // inline code
|
|
||||||
'/\n\s*(\*|-)(.*)/' => 'self::ul_list', // ul lists
|
|
||||||
'/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists
|
|
||||||
'/\n(>|\>)(.*)/' => 'self::blockquote', // blockquotes
|
|
||||||
'/\n-{3,}/' => "\n<hr />", // horizontal rule
|
|
||||||
'/\n([^\n]+)\n\n/' => 'self::para', // add paragraphs
|
|
||||||
'/<\/ul>\s?<ul>/' => '', // fix extra ul
|
|
||||||
'/<\/ol>\s?<ol>/' => '', // fix extra ol
|
|
||||||
'/<\/blockquote><blockquote>/' => "\n" // fix extra blockquote
|
|
||||||
);
|
|
||||||
private static function para ($regs) {
|
|
||||||
$line = $regs[1];
|
|
||||||
$trimmed = trim ($line);
|
|
||||||
if (preg_match ('/^<\/?(ul|ol|li|h|p|bl)/', $trimmed)) {
|
|
||||||
return "\n" . $line . "\n";
|
|
||||||
}
|
|
||||||
return sprintf ("\n<p>%s</p>\n", $trimmed);
|
|
||||||
}
|
|
||||||
private static function ul_list ($regs) {
|
|
||||||
$item = $regs[2];
|
|
||||||
return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim($item));
|
|
||||||
}
|
|
||||||
private static function ol_list ($regs) {
|
|
||||||
$item = $regs[1];
|
|
||||||
return sprintf ("\n<ol>\n\t<li>%s</li>\n</ol>", trim($item));
|
|
||||||
}
|
|
||||||
private static function blockquote ($regs) {
|
|
||||||
$item = $regs[2];
|
|
||||||
return sprintf ("\n<blockquote>%s</blockquote>", trim($item));
|
|
||||||
}
|
|
||||||
private static function header ($regs) {
|
|
||||||
list ($tmp, $chars, $header) = $regs;
|
|
||||||
$level = strlen ($chars);
|
|
||||||
return sprintf ('<h%d>%s</h%d>', $level + 1, trim($header), $level + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a rule.
|
|
||||||
*/
|
|
||||||
public static function add_rule ($regex, $replacement) {
|
|
||||||
self::$rules[$regex] = $replacement;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Render some Markdown into HTML.
|
|
||||||
*/
|
|
||||||
public static function render ($text) {
|
|
||||||
foreach (self::$rules as $regex => $replacement) {
|
|
||||||
if (is_callable ( $replacement)) {
|
|
||||||
$text = preg_replace_callback ($regex, $replacement, $text);
|
|
||||||
} else {
|
|
||||||
$text = preg_replace ($regex, $replacement, $text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return trim ($text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
//////////////// Functions ////////////////
|
//////////////// Functions ////////////////
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
@ -486,6 +375,17 @@ function add_action($action_name, $func)
|
||||||
$actions->$action_name = $func;
|
$actions->$action_name = $func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to register a new parser. If multiple parsers are registered then
|
||||||
|
// only the last parser registered will actually be used.
|
||||||
|
$parse_page_source = function() {
|
||||||
|
throw new Exception("No parser registered!");
|
||||||
|
};
|
||||||
|
function add_parser($parser_code)
|
||||||
|
{
|
||||||
|
global $parse_page_source;
|
||||||
|
$parse_page_source = $parser_code;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
260
index.php
260
index.php
|
@ -470,117 +470,6 @@ class page_renderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////////////////// Slimdown /////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////// %slimdown% //
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/**
|
|
||||||
* Slimdown - A very basic regex-based Markdown parser. Supports the
|
|
||||||
* following elements (and can be extended via Slimdown::add_rule()):
|
|
||||||
*
|
|
||||||
* - Headers
|
|
||||||
* - Links
|
|
||||||
* - Bold
|
|
||||||
* - Emphasis
|
|
||||||
* - Deletions
|
|
||||||
* - Quotes
|
|
||||||
* - Inline code
|
|
||||||
* - Blockquotes
|
|
||||||
* - Ordered/unordered lists
|
|
||||||
* - Horizontal rules
|
|
||||||
*
|
|
||||||
* Author: Johnny Broadway <johnny@johnnybroadway.com>
|
|
||||||
* Website: https://gist.github.com/jbroadway/2836900
|
|
||||||
* License: MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modified by Starbeamrainbowlabs (starbeamrainbowlabs)
|
|
||||||
*
|
|
||||||
* Changed bold to use single asterisks
|
|
||||||
* Changed italics to use single underscores
|
|
||||||
* Added one to add the heading levels (no <h1> tags allowed)
|
|
||||||
* Added wiki style internal link parsing
|
|
||||||
* Added wiki style internal link parsing with display text
|
|
||||||
*/
|
|
||||||
class Slimdown {
|
|
||||||
public static $rules = array (
|
|
||||||
'/\r\n/' => "\n", // new line normalisation
|
|
||||||
'/(#+)(.*)/' => 'self::header', // headers
|
|
||||||
'/(\*)(.*?)\1/' => '<strong>\2</strong>', // bold
|
|
||||||
'/(_)(.*?)\1/' => '<em>\2</em>', // emphasis
|
|
||||||
|
|
||||||
// todo test these
|
|
||||||
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\s(left|right)\)/' => '<img src="\2" alt="\1" style="max-width: \3; float: \4;" />', // images with size
|
|
||||||
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\)/' => '<img src="\2" alt="\1" style="max-width: \3;" />', // images with size
|
|
||||||
'/!\[(.*)\]\((.*)\)/' => '<img src="\2" alt="\1" />', // basic images
|
|
||||||
// todo end
|
|
||||||
|
|
||||||
'/\[\[([a-zA-Z0-9\_\- ]+)\|([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\2</a>', //internal links with display text
|
|
||||||
'/\[\[([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\1</a>', //internal links
|
|
||||||
'/\[([^\[]+)\]\(([^\)]+)\)/' => '<a href=\'\2\' target=\'_blank\'>\1</a>', // links
|
|
||||||
'/\~\~(.*?)\~\~/' => '<del>\1</del>', // del
|
|
||||||
'/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote
|
|
||||||
'/`(.*?)`/' => '<code>\1</code>', // inline code
|
|
||||||
'/\n\s*(\*|-)(.*)/' => 'self::ul_list', // ul lists
|
|
||||||
'/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists
|
|
||||||
'/\n(>|\>)(.*)/' => 'self::blockquote', // blockquotes
|
|
||||||
'/\n-{3,}/' => "\n<hr />", // horizontal rule
|
|
||||||
'/\n([^\n]+)\n\n/' => 'self::para', // add paragraphs
|
|
||||||
'/<\/ul>\s?<ul>/' => '', // fix extra ul
|
|
||||||
'/<\/ol>\s?<ol>/' => '', // fix extra ol
|
|
||||||
'/<\/blockquote><blockquote>/' => "\n" // fix extra blockquote
|
|
||||||
);
|
|
||||||
private static function para ($regs) {
|
|
||||||
$line = $regs[1];
|
|
||||||
$trimmed = trim ($line);
|
|
||||||
if (preg_match ('/^<\/?(ul|ol|li|h|p|bl)/', $trimmed)) {
|
|
||||||
return "\n" . $line . "\n";
|
|
||||||
}
|
|
||||||
return sprintf ("\n<p>%s</p>\n", $trimmed);
|
|
||||||
}
|
|
||||||
private static function ul_list ($regs) {
|
|
||||||
$item = $regs[2];
|
|
||||||
return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim($item));
|
|
||||||
}
|
|
||||||
private static function ol_list ($regs) {
|
|
||||||
$item = $regs[1];
|
|
||||||
return sprintf ("\n<ol>\n\t<li>%s</li>\n</ol>", trim($item));
|
|
||||||
}
|
|
||||||
private static function blockquote ($regs) {
|
|
||||||
$item = $regs[2];
|
|
||||||
return sprintf ("\n<blockquote>%s</blockquote>", trim($item));
|
|
||||||
}
|
|
||||||
private static function header ($regs) {
|
|
||||||
list ($tmp, $chars, $header) = $regs;
|
|
||||||
$level = strlen ($chars);
|
|
||||||
return sprintf ('<h%d>%s</h%d>', $level + 1, trim($header), $level + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a rule.
|
|
||||||
*/
|
|
||||||
public static function add_rule ($regex, $replacement) {
|
|
||||||
self::$rules[$regex] = $replacement;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Render some Markdown into HTML.
|
|
||||||
*/
|
|
||||||
public static function render ($text) {
|
|
||||||
foreach (self::$rules as $regex => $replacement) {
|
|
||||||
if (is_callable ( $replacement)) {
|
|
||||||
$text = preg_replace_callback ($regex, $replacement, $text);
|
|
||||||
} else {
|
|
||||||
$text = preg_replace ($regex, $replacement, $text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return trim ($text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
//////////////// Functions ////////////////
|
//////////////// Functions ////////////////
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
@ -640,6 +529,17 @@ function add_action($action_name, $func)
|
||||||
$actions->$action_name = $func;
|
$actions->$action_name = $func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to register a new parser. If multiple parsers are registered then
|
||||||
|
// only the last parser registered will actually be used.
|
||||||
|
$parse_page_source = function() {
|
||||||
|
throw new Exception("No parser registered!");
|
||||||
|
};
|
||||||
|
function add_parser($parser_code)
|
||||||
|
{
|
||||||
|
global $parse_page_source;
|
||||||
|
$parse_page_source = $parser_code;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@ -1202,13 +1102,13 @@ register_module([
|
||||||
|
|
||||||
register_module([
|
register_module([
|
||||||
"name" => "Page viewer",
|
"name" => "Page viewer",
|
||||||
"version" => "0.6",
|
"version" => "0.7",
|
||||||
"author" => "Starbeamrainbowlabs",
|
"author" => "Starbeamrainbowlabs",
|
||||||
"description" => "Allows you to view pages. You should include this one.",
|
"description" => "Allows you to view pages. You should include this one.",
|
||||||
"id" => "page-view",
|
"id" => "page-view",
|
||||||
"code" => function() {
|
"code" => function() {
|
||||||
add_action("view", function() {
|
add_action("view", function() {
|
||||||
global $pageindex, $settings, $page;
|
global $pageindex, $settings, $page, $parse_page_source;
|
||||||
|
|
||||||
//check to make sure that the page exists
|
//check to make sure that the page exists
|
||||||
if(!isset($pageindex->$page))
|
if(!isset($pageindex->$page))
|
||||||
|
@ -1231,11 +1131,11 @@ register_module([
|
||||||
$title = "$page - $settings->sitename";
|
$title = "$page - $settings->sitename";
|
||||||
$content = "<h1>$page</h1>";
|
$content = "<h1>$page</h1>";
|
||||||
|
|
||||||
$slimdown_start = microtime(true);
|
$parsing_start = microtime(true);
|
||||||
|
|
||||||
$content .= Slimdown::render(file_get_contents("$page.md"));
|
$content .= $parse_page_source(file_get_contents("$page.md"));
|
||||||
|
|
||||||
$content .= "\n\t<!-- Took " . (microtime(true) - $slimdown_start) . " seconds to parse markdown -->\n";
|
$content .= "\n\t\t<!-- Took " . (microtime(true) - $parsing_start) . " seconds to parse page source -->\n";
|
||||||
|
|
||||||
if(isset($_GET["printable"]) and $_GET["printable"] === "yes")
|
if(isset($_GET["printable"]) and $_GET["printable"] === "yes")
|
||||||
exit(page_renderer::render_minimal($title, $content));
|
exit(page_renderer::render_minimal($title, $content));
|
||||||
|
@ -1247,6 +1147,134 @@ register_module([
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
register_module([
|
||||||
|
"name" => "Deault Parser",
|
||||||
|
"version" => "0.7",
|
||||||
|
"author" => "Johnny Broadway & Starbeamrainbowlabs",
|
||||||
|
"description" => "The default parser for Pepperminty Wiki. Based on Johnny Broadway's Slimdown (with more than a few modifications). This parser's features are documented in the help page.",
|
||||||
|
"id" => "parser-default",
|
||||||
|
"code" => function() {
|
||||||
|
add_parser(function($markdown) {
|
||||||
|
return Slimdown::render($markdown);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////// Slimdown /////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////// %slimdown% //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/**
|
||||||
|
* Slimdown - A very basic regex-based Markdown parser. Supports the
|
||||||
|
* following elements (and can be extended via Slimdown::add_rule()):
|
||||||
|
*
|
||||||
|
* - Headers
|
||||||
|
* - Links
|
||||||
|
* - Bold
|
||||||
|
* - Emphasis
|
||||||
|
* - Deletions
|
||||||
|
* - Quotes
|
||||||
|
* - Inline code
|
||||||
|
* - Blockquotes
|
||||||
|
* - Ordered/unordered lists
|
||||||
|
* - Horizontal rules
|
||||||
|
*
|
||||||
|
* Author: Johnny Broadway <johnny@johnnybroadway.com>
|
||||||
|
* Website: https://gist.github.com/jbroadway/2836900
|
||||||
|
* License: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modified by Starbeamrainbowlabs (starbeamrainbowlabs)
|
||||||
|
*
|
||||||
|
* Changed bold to use single asterisks
|
||||||
|
* Changed italics to use single underscores
|
||||||
|
* Added one to add the heading levels (no <h1> tags allowed)
|
||||||
|
* Added wiki style internal link parsing
|
||||||
|
* Added wiki style internal link parsing with display text
|
||||||
|
* Added image support
|
||||||
|
*/
|
||||||
|
class Slimdown {
|
||||||
|
public static $rules = array (
|
||||||
|
'/\r\n/' => "\n", // new line normalisation
|
||||||
|
'/(#+)(.*)/' => 'self::header', // headers
|
||||||
|
'/(\*)(.*?)\1/' => '<strong>\2</strong>', // bold
|
||||||
|
'/(_)(.*?)\1/' => '<em>\2</em>', // emphasis
|
||||||
|
|
||||||
|
// todo test these
|
||||||
|
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\s(left|right)\)/' => '<img src="\2" alt="\1" style="max-width: \3; float: \4;" />', // images with size
|
||||||
|
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\)/' => '<img src="\2" alt="\1" style="max-width: \3;" />', // images with size
|
||||||
|
'/!\[(.*)\]\((.*)\)/' => '<img src="\2" alt="\1" />', // basic images
|
||||||
|
// todo end
|
||||||
|
|
||||||
|
'/\[\[([a-zA-Z0-9\_\- ]+)\|([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\2</a>', //internal links with display text
|
||||||
|
'/\[\[([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\1</a>', //internal links
|
||||||
|
'/\[([^\[]+)\]\(([^\)]+)\)/' => '<a href=\'\2\' target=\'_blank\'>\1</a>', // links
|
||||||
|
'/\~\~(.*?)\~\~/' => '<del>\1</del>', // del
|
||||||
|
'/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote
|
||||||
|
'/`(.*?)`/' => '<code>\1</code>', // inline code
|
||||||
|
'/\n\s*(\*|-)(.*)/' => 'self::ul_list', // ul lists
|
||||||
|
'/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists
|
||||||
|
'/\n(>|\>)(.*)/' => 'self::blockquote', // blockquotes
|
||||||
|
'/\n-{3,}/' => "\n<hr />", // horizontal rule
|
||||||
|
'/\n([^\n]+)\n\n/' => 'self::para', // add paragraphs
|
||||||
|
'/<\/ul>\s?<ul>/' => '', // fix extra ul
|
||||||
|
'/<\/ol>\s?<ol>/' => '', // fix extra ol
|
||||||
|
'/<\/blockquote><blockquote>/' => "\n" // fix extra blockquote
|
||||||
|
);
|
||||||
|
private static function para ($regs) {
|
||||||
|
$line = $regs[1];
|
||||||
|
$trimmed = trim ($line);
|
||||||
|
if (preg_match ('/^<\/?(ul|ol|li|h|p|bl)/', $trimmed)) {
|
||||||
|
return "\n" . $line . "\n";
|
||||||
|
}
|
||||||
|
return sprintf ("\n<p>%s</p>\n", $trimmed);
|
||||||
|
}
|
||||||
|
private static function ul_list ($regs) {
|
||||||
|
$item = $regs[2];
|
||||||
|
return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim($item));
|
||||||
|
}
|
||||||
|
private static function ol_list ($regs) {
|
||||||
|
$item = $regs[1];
|
||||||
|
return sprintf ("\n<ol>\n\t<li>%s</li>\n</ol>", trim($item));
|
||||||
|
}
|
||||||
|
private static function blockquote ($regs) {
|
||||||
|
$item = $regs[2];
|
||||||
|
return sprintf ("\n<blockquote>%s</blockquote>", trim($item));
|
||||||
|
}
|
||||||
|
private static function header ($regs) {
|
||||||
|
list ($tmp, $chars, $header) = $regs;
|
||||||
|
$level = strlen ($chars);
|
||||||
|
return sprintf ('<h%d>%s</h%d>', $level + 1, trim($header), $level + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a rule.
|
||||||
|
*/
|
||||||
|
public static function add_rule ($regex, $replacement) {
|
||||||
|
self::$rules[$regex] = $replacement;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Render some Markdown into HTML.
|
||||||
|
*/
|
||||||
|
public static function render ($text) {
|
||||||
|
foreach (self::$rules as $regex => $replacement) {
|
||||||
|
if (is_callable ( $replacement)) {
|
||||||
|
$text = preg_replace_callback ($regex, $replacement, $text);
|
||||||
|
} else {
|
||||||
|
$text = preg_replace ($regex, $replacement, $text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return trim ($text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// %next_module% //
|
// %next_module% //
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -81,10 +81,18 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Page viewer",
|
"name": "Page viewer",
|
||||||
"version": "0.6",
|
"version": "0.7",
|
||||||
"author": "Starbeamrainbowlabs",
|
"author": "Starbeamrainbowlabs",
|
||||||
"description": "Allows you to view pages. You should include this one.",
|
"description": "Allows you to view pages. You should include this one.",
|
||||||
"id": "page-view",
|
"id": "page-view",
|
||||||
"lastupdate": 1432497918
|
"lastupdate": 1432719098
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Deault Parser",
|
||||||
|
"version": "0.7",
|
||||||
|
"author": "Johnny Broadway & Starbeamrainbowlabs",
|
||||||
|
"description": "The default parser for Pepperminty Wiki. Based on Johnny Broadway's Slimdown (with more than a few modifications). This parser's features are documented in the help page.",
|
||||||
|
"id": "parser-default",
|
||||||
|
"lastupdate": 1432718472
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -1,13 +1,13 @@
|
||||||
<?php
|
<?php
|
||||||
register_module([
|
register_module([
|
||||||
"name" => "Page viewer",
|
"name" => "Page viewer",
|
||||||
"version" => "0.6",
|
"version" => "0.7",
|
||||||
"author" => "Starbeamrainbowlabs",
|
"author" => "Starbeamrainbowlabs",
|
||||||
"description" => "Allows you to view pages. You should include this one.",
|
"description" => "Allows you to view pages. You should include this one.",
|
||||||
"id" => "page-view",
|
"id" => "page-view",
|
||||||
"code" => function() {
|
"code" => function() {
|
||||||
add_action("view", function() {
|
add_action("view", function() {
|
||||||
global $pageindex, $settings, $page;
|
global $pageindex, $settings, $page, $parse_page_source;
|
||||||
|
|
||||||
//check to make sure that the page exists
|
//check to make sure that the page exists
|
||||||
if(!isset($pageindex->$page))
|
if(!isset($pageindex->$page))
|
||||||
|
@ -30,11 +30,11 @@ register_module([
|
||||||
$title = "$page - $settings->sitename";
|
$title = "$page - $settings->sitename";
|
||||||
$content = "<h1>$page</h1>";
|
$content = "<h1>$page</h1>";
|
||||||
|
|
||||||
$slimdown_start = microtime(true);
|
$parsing_start = microtime(true);
|
||||||
|
|
||||||
$content .= Slimdown::render(file_get_contents("$page.md"));
|
$content .= $parse_page_source(file_get_contents("$page.md"));
|
||||||
|
|
||||||
$content .= "\n\t<!-- Took " . (microtime(true) - $slimdown_start) . " seconds to parse markdown -->\n";
|
$content .= "\n\t\t<!-- Took " . (microtime(true) - $parsing_start) . " seconds to parse page source -->\n";
|
||||||
|
|
||||||
if(isset($_GET["printable"]) and $_GET["printable"] === "yes")
|
if(isset($_GET["printable"]) and $_GET["printable"] === "yes")
|
||||||
exit(page_renderer::render_minimal($title, $content));
|
exit(page_renderer::render_minimal($title, $content));
|
||||||
|
|
127
modules/parser-default.php
Normal file
127
modules/parser-default.php
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
<?php
|
||||||
|
register_module([
|
||||||
|
"name" => "Deault Parser",
|
||||||
|
"version" => "0.7",
|
||||||
|
"author" => "Johnny Broadway & Starbeamrainbowlabs",
|
||||||
|
"description" => "The default parser for Pepperminty Wiki. Based on Johnny Broadway's Slimdown (with more than a few modifications). This parser's features are documented in the help page.",
|
||||||
|
"id" => "parser-default",
|
||||||
|
"code" => function() {
|
||||||
|
add_parser(function($markdown) {
|
||||||
|
return Slimdown::render($markdown);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////// Slimdown /////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////// %slimdown% //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/**
|
||||||
|
* Slimdown - A very basic regex-based Markdown parser. Supports the
|
||||||
|
* following elements (and can be extended via Slimdown::add_rule()):
|
||||||
|
*
|
||||||
|
* - Headers
|
||||||
|
* - Links
|
||||||
|
* - Bold
|
||||||
|
* - Emphasis
|
||||||
|
* - Deletions
|
||||||
|
* - Quotes
|
||||||
|
* - Inline code
|
||||||
|
* - Blockquotes
|
||||||
|
* - Ordered/unordered lists
|
||||||
|
* - Horizontal rules
|
||||||
|
*
|
||||||
|
* Author: Johnny Broadway <johnny@johnnybroadway.com>
|
||||||
|
* Website: https://gist.github.com/jbroadway/2836900
|
||||||
|
* License: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modified by Starbeamrainbowlabs (starbeamrainbowlabs)
|
||||||
|
*
|
||||||
|
* Changed bold to use single asterisks
|
||||||
|
* Changed italics to use single underscores
|
||||||
|
* Added one to add the heading levels (no <h1> tags allowed)
|
||||||
|
* Added wiki style internal link parsing
|
||||||
|
* Added wiki style internal link parsing with display text
|
||||||
|
* Added image support
|
||||||
|
*/
|
||||||
|
class Slimdown {
|
||||||
|
public static $rules = array (
|
||||||
|
'/\r\n/' => "\n", // new line normalisation
|
||||||
|
'/(#+)(.*)/' => 'self::header', // headers
|
||||||
|
'/(\*)(.*?)\1/' => '<strong>\2</strong>', // bold
|
||||||
|
'/(_)(.*?)\1/' => '<em>\2</em>', // emphasis
|
||||||
|
|
||||||
|
// todo test these
|
||||||
|
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\s(left|right)\)/' => '<img src="\2" alt="\1" style="max-width: \3; float: \4;" />', // images with size
|
||||||
|
'/!\[(.*)\]\(([^\s]+)\s(\d+.+)\)/' => '<img src="\2" alt="\1" style="max-width: \3;" />', // images with size
|
||||||
|
'/!\[(.*)\]\((.*)\)/' => '<img src="\2" alt="\1" />', // basic images
|
||||||
|
// todo end
|
||||||
|
|
||||||
|
'/\[\[([a-zA-Z0-9\_\- ]+)\|([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\2</a>', //internal links with display text
|
||||||
|
'/\[\[([a-zA-Z0-9\_\- ]+)\]\]/' => '<a href=\'index.php?page=\1\'>\1</a>', //internal links
|
||||||
|
'/\[([^\[]+)\]\(([^\)]+)\)/' => '<a href=\'\2\' target=\'_blank\'>\1</a>', // links
|
||||||
|
'/\~\~(.*?)\~\~/' => '<del>\1</del>', // del
|
||||||
|
'/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote
|
||||||
|
'/`(.*?)`/' => '<code>\1</code>', // inline code
|
||||||
|
'/\n\s*(\*|-)(.*)/' => 'self::ul_list', // ul lists
|
||||||
|
'/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists
|
||||||
|
'/\n(>|\>)(.*)/' => 'self::blockquote', // blockquotes
|
||||||
|
'/\n-{3,}/' => "\n<hr />", // horizontal rule
|
||||||
|
'/\n([^\n]+)\n\n/' => 'self::para', // add paragraphs
|
||||||
|
'/<\/ul>\s?<ul>/' => '', // fix extra ul
|
||||||
|
'/<\/ol>\s?<ol>/' => '', // fix extra ol
|
||||||
|
'/<\/blockquote><blockquote>/' => "\n" // fix extra blockquote
|
||||||
|
);
|
||||||
|
private static function para ($regs) {
|
||||||
|
$line = $regs[1];
|
||||||
|
$trimmed = trim ($line);
|
||||||
|
if (preg_match ('/^<\/?(ul|ol|li|h|p|bl)/', $trimmed)) {
|
||||||
|
return "\n" . $line . "\n";
|
||||||
|
}
|
||||||
|
return sprintf ("\n<p>%s</p>\n", $trimmed);
|
||||||
|
}
|
||||||
|
private static function ul_list ($regs) {
|
||||||
|
$item = $regs[2];
|
||||||
|
return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim($item));
|
||||||
|
}
|
||||||
|
private static function ol_list ($regs) {
|
||||||
|
$item = $regs[1];
|
||||||
|
return sprintf ("\n<ol>\n\t<li>%s</li>\n</ol>", trim($item));
|
||||||
|
}
|
||||||
|
private static function blockquote ($regs) {
|
||||||
|
$item = $regs[2];
|
||||||
|
return sprintf ("\n<blockquote>%s</blockquote>", trim($item));
|
||||||
|
}
|
||||||
|
private static function header ($regs) {
|
||||||
|
list ($tmp, $chars, $header) = $regs;
|
||||||
|
$level = strlen ($chars);
|
||||||
|
return sprintf ('<h%d>%s</h%d>', $level + 1, trim($header), $level + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a rule.
|
||||||
|
*/
|
||||||
|
public static function add_rule ($regex, $replacement) {
|
||||||
|
self::$rules[$regex] = $replacement;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Render some Markdown into HTML.
|
||||||
|
*/
|
||||||
|
public static function render ($text) {
|
||||||
|
foreach (self::$rules as $regex => $replacement) {
|
||||||
|
if (is_callable ( $replacement)) {
|
||||||
|
$text = preg_replace_callback ($regex, $replacement, $text);
|
||||||
|
} else {
|
||||||
|
$text = preg_replace ($regex, $replacement, $text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return trim ($text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
?>
|
Loading…
Reference in a new issue