commit 15c9c375399469af4c4aa02b52be881d2d00e72c
parent fceb5c4c874d9f7618181aeb705f87e4056d1625
Author: markseu <mark2011@mayberg.se>
Date: Tue, 28 May 2019 22:38:36 +0200
Updated Markdown extension, experimental
Diffstat:
1 file changed, 17 insertions(+), 27 deletions(-)
diff --git a/system/extensions/markdown.php b/system/extensions/markdown.php
@@ -4,7 +4,7 @@
// This file may be used and distributed under the terms of the public license.
class YellowMarkdown {
- const VERSION = "0.8.6";
+ const VERSION = "0.8.7";
const TYPE = "feature";
public $yellow; //access to API
@@ -3740,11 +3740,13 @@ class YellowMarkdownExtraParser extends MarkdownExtraParser {
public $yellow; //access to API
public $page; //access to page
public $idAttributes; //id attributes
+ public $noticeLevel; //recursive level
public function __construct($yellow, $page) {
$this->yellow = $yellow;
$this->page = $page;
$this->idAttributes = array();
+ $this->noticeLevel = 0;
$this->no_markup = $page->safeMode;
$this->url_filter_func = function($url) use ($yellow, $page) {
return $yellow->lookup->normaliseLocation($url, $page->location,
@@ -3900,37 +3902,25 @@ class YellowMarkdownExtraParser extends MarkdownExtraParser {
// Handle notice blocks
public function doNoticeBlocks($text) {
- return preg_replace_callback("/((?>^[ ]*!{1,6}.*\n)+)/m", array($this, "_doNoticeBlocks_callback"), $text);
+ return preg_replace_callback("/((?>^[ ]*!(?!\[)[ ]?.+\n(.+\n)*)+)/m", array($this, "_doNoticeBlocks_callback"), $text);
}
// Handle notice blocks over multiple lines
public function _doNoticeBlocks_callback($matches) {
- $output = $openerLength = $attr = $text = "";
- foreach (preg_split("/\n/", $matches[1]) as $line) {
- if (preg_match("/^[ ]*(!{1,6})[ ]?(.*)$/", $line, $matches)) {
- $openerLengthNew = strlen($matches[1]);
- if ($openerLengthNew!=$openerLength) {
- if (!empty($text)) {
- $line = "<div$attr>\n".$this->runBlockGamut($text)."\n</div>";
- $output .= "\n".$this->hashBlock($line)."\n\n";
- }
- $openerLength = $openerLengthNew;
- $attr = " class=\"notice$openerLength\"";
- $text = $matches[2]."\n";
- if (preg_match("/^[ ]*".$this->id_class_attr_catch_re."[ ]*$/", $text, $matches)) {
- $attr = $this->doExtraAttributes("div", $dummy =& $matches[1]);
- $text = "";
- }
- } else {
- $text .= $matches[2]."\n";
- }
- }
- }
- if (!empty($text)) {
- $line = "<div$attr>\n".$this->runBlockGamut($text)."\n</div>";
- $output .= "\n".$this->hashBlock($line)."\n\n";
+ $lines = $matches[1];
+ $attr = "";
+ $text = preg_replace("/^[ ]*![ ]?/m", "", $lines);
+ if (preg_match("/^[ ]*".$this->id_class_attr_catch_re."[ ]*\n([\S\s]*)$/m", $text, $matches)) {
+ $attr = $this->doExtraAttributes("div", $dummy =& $matches[1]);
+ $text = $matches[2];
+ } elseif ($this->noticeLevel==0) {
+ $level = strspn(str_replace(array(" ", "!["), "", $lines), "!");
+ $attr = " class=\"notice$level\"";
}
- return $output;
+ ++$this->noticeLevel;
+ $output = "<div$attr>\n".$this->runBlockGamut($text)."\n</div>";
+ --$this->noticeLevel;
+ return "\n".$this->hashBlock($output)."\n\n";
}
// Return unique id attribute