Add short titles support (== TITRE -> h1, -- TITRE -> h2)
git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@1482 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
105
markdown.php
105
markdown.php
@@ -3,17 +3,14 @@
|
|||||||
@package domframework
|
@package domframework
|
||||||
@author Dominique Fournier <dominique@fournier38.fr> */
|
@author Dominique Fournier <dominique@fournier38.fr> */
|
||||||
|
|
||||||
function debugMKD ($msg)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
$trace = debug_backtrace();
|
|
||||||
$back = reset ($trace);
|
|
||||||
file_put_contents ("/tmp/debug", "[".$back["line"]."] $msg\n", FILE_APPEND);
|
|
||||||
}
|
|
||||||
error_reporting (E_ALL);
|
error_reporting (E_ALL);
|
||||||
/** Markdown management */
|
/** Markdown management */
|
||||||
class markdown
|
class markdown
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/** debug variable */
|
||||||
|
public $debug = false;
|
||||||
|
|
||||||
/** Convert the markdown language to HTML
|
/** Convert the markdown language to HTML
|
||||||
Return the HTML string
|
Return the HTML string
|
||||||
@param string $mark Message in markdown syntax to display */
|
@param string $mark Message in markdown syntax to display */
|
||||||
@@ -58,6 +55,13 @@ class markdown
|
|||||||
$search[] = "/\\n^[*_-] ?[*_-] ?[*_-]$/Um";
|
$search[] = "/\\n^[*_-] ?[*_-] ?[*_-]$/Um";
|
||||||
$replace[] = "</p>\n<hr/>\n<p>";
|
$replace[] = "</p>\n<hr/>\n<p>";
|
||||||
|
|
||||||
|
// Titles short
|
||||||
|
// == TITRE1
|
||||||
|
$search[] = "/^==+ (.+)( ==+)?$/Um";
|
||||||
|
$replace[] = "</p>\n<h1>\\1</h1>\n<p>";
|
||||||
|
// -- TITRE2
|
||||||
|
$search[] = "/^--+ (.+)( --+)?$/Um";
|
||||||
|
$replace[] = "</p>\n<h2>\\1</h2>\n<p>";
|
||||||
// EMPHASIS : _ or * for normal, __ or ** for strong
|
// EMPHASIS : _ or * for normal, __ or ** for strong
|
||||||
$search[] = "/__(.+)__/"; $replace[] = "<strong>\\1</strong>";
|
$search[] = "/__(.+)__/"; $replace[] = "<strong>\\1</strong>";
|
||||||
$search[] = "/_(.+)_/"; $replace[] = "<em>\\1</em>";
|
$search[] = "/_(.+)_/"; $replace[] = "<em>\\1</em>";
|
||||||
@@ -128,15 +132,15 @@ class markdown
|
|||||||
$timeInit = microtime (TRUE) - $timeStart;
|
$timeInit = microtime (TRUE) - $timeStart;
|
||||||
foreach ($lines as $nb=>$line)
|
foreach ($lines as $nb=>$line)
|
||||||
{
|
{
|
||||||
debugMKD ("DEBUT:$line");
|
$this->debugMKD ("DEBUT:$line");
|
||||||
if (substr (ltrim ($line), 0, 1) === "<")
|
if (substr (ltrim ($line), 0, 1) === "<")
|
||||||
{
|
{
|
||||||
debugMKD ("HTML : Skipped");
|
$this->debugMKD ("HTML : Skipped");
|
||||||
$res .= $line;
|
$res .= $line;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$type = $this->paragraphType ($line);
|
$type = $this->paragraphType ($line);
|
||||||
debugMKD ("DEBUT: Type='$type'");
|
$this->debugMKD ("DEBUT: Type='$type'");
|
||||||
$matches = array ();
|
$matches = array ();
|
||||||
switch ($type)
|
switch ($type)
|
||||||
{
|
{
|
||||||
@@ -159,18 +163,18 @@ class markdown
|
|||||||
}
|
}
|
||||||
|
|
||||||
$indent = strspn ($line, " ");
|
$indent = strspn ($line, " ");
|
||||||
debugMKD ("DEBUT: Indent='$indent'");
|
$this->debugMKD ("DEBUT: Indent='$indent'");
|
||||||
debugMKD ("DEBUT: indentStack=".print_r ($indentStack, TRUE));
|
$this->debugMKD ("DEBUT: indentStack=".print_r ($indentStack, TRUE));
|
||||||
debugMKD ("DEBUT: typeStack=".print_r ($typeStack, TRUE));
|
$this->debugMKD ("DEBUT: typeStack=".print_r ($typeStack, TRUE));
|
||||||
|
|
||||||
// Spacing
|
// Spacing
|
||||||
if ($indent < end ($indentStack))
|
if ($indent < end ($indentStack))
|
||||||
{
|
{
|
||||||
debugMKD ("DEB1 : Ending of block");
|
$this->debugMKD ("DEB1 : Ending of block");
|
||||||
if (end ($htmlStack) === "li")
|
if (end ($htmlStack) === "li")
|
||||||
{
|
{
|
||||||
debugMKD ("Pending <Li> : closing");
|
$this->debugMKD ("Pending <Li> : closing");
|
||||||
debugMKD ("</li>");
|
$this->debugMKD ("</li>");
|
||||||
$res .= "</li>";
|
$res .= "</li>";
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
}
|
}
|
||||||
@@ -180,29 +184,29 @@ class markdown
|
|||||||
$oldType = array_pop ($typeStack);
|
$oldType = array_pop ($typeStack);
|
||||||
if ($oldType === "code")
|
if ($oldType === "code")
|
||||||
{
|
{
|
||||||
debugMKD ("</code></pre>");
|
$this->debugMKD ("</code></pre>");
|
||||||
$res .= "</code></pre>\n";
|
$res .= "</code></pre>\n";
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
array_pop ($indentStack);
|
array_pop ($indentStack);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
$this->debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
||||||
$res .= str_repeat (" ", end ($indentStack))."</$oldType>\n";
|
$res .= str_repeat (" ", end ($indentStack))."</$oldType>\n";
|
||||||
}
|
}
|
||||||
array_pop ($indentStack);
|
array_pop ($indentStack);
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
if ($type === "ol" || $type === "ul")
|
if ($type === "ol" || $type === "ul")
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : Pending <Li> : closing");
|
$this->debugMKD ("DEB2 : Pending <Li> : closing");
|
||||||
debugMKD ("</li>");
|
$this->debugMKD ("</li>");
|
||||||
$res .= "\n</li>";
|
$res .= "\n</li>";
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type === "")
|
if ($type === "")
|
||||||
{
|
{
|
||||||
debugMKD ("DEB3 : End of block");
|
$this->debugMKD ("DEB3 : End of block");
|
||||||
array_pop ($indentStack);
|
array_pop ($indentStack);
|
||||||
$res .= "\n";
|
$res .= "\n";
|
||||||
continue;
|
continue;
|
||||||
@@ -211,24 +215,24 @@ class markdown
|
|||||||
|
|
||||||
if ($indent == end ($indentStack))
|
if ($indent == end ($indentStack))
|
||||||
{
|
{
|
||||||
debugMKD ("DEB1 : Continuous block $type/".end ($typeStack));
|
$this->debugMKD ("DEB1 : Continuous block $type/".end ($typeStack));
|
||||||
if (end ($htmlStack) === "li")
|
if (end ($htmlStack) === "li" && $type !== "p")
|
||||||
{
|
{
|
||||||
debugMKD ("Pending <Li> : closing");
|
$this->debugMKD ("Pending <Li> : closing");
|
||||||
debugMKD ("</li>");
|
$this->debugMKD ("</li>");
|
||||||
$res .= "</li>";
|
$res .= "</li>";
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type !== end ($typeStack))
|
if ($type !== end ($typeStack))
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : Continuous Block but type change");
|
$this->debugMKD ("DEB2 : Continuous Block but type change");
|
||||||
if (end ($typeStack) !== FALSE)
|
if (end ($typeStack) !== FALSE)
|
||||||
{
|
{
|
||||||
// Remove last \n to put closing tag at the end of line
|
// Remove last \n to put closing tag at the end of line
|
||||||
$res = substr ($res, 0, -1);
|
$res = substr ($res, 0, -1);
|
||||||
$oldType = array_pop ($typeStack);
|
$oldType = array_pop ($typeStack);
|
||||||
debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
$this->debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
||||||
$res .= str_repeat (" ", end ($indentStack))."</$oldType>";
|
$res .= str_repeat (" ", end ($indentStack))."</$oldType>";
|
||||||
array_pop ($indentStack);
|
array_pop ($indentStack);
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
@@ -236,7 +240,7 @@ class markdown
|
|||||||
|
|
||||||
if ($type !== "")
|
if ($type !== "")
|
||||||
{
|
{
|
||||||
debugMKD (str_repeat (" ", end ($indentStack))."<$type>");
|
$this->debugMKD (str_repeat (" ", end ($indentStack))."<$type>");
|
||||||
$res .= "\n".str_repeat (" ", end ($indentStack))."<$type>";
|
$res .= "\n".str_repeat (" ", end ($indentStack))."<$type>";
|
||||||
$htmlStack[] = $type;
|
$htmlStack[] = $type;
|
||||||
array_push ($indentStack, $indent);
|
array_push ($indentStack, $indent);
|
||||||
@@ -246,9 +250,9 @@ class markdown
|
|||||||
|
|
||||||
if ($type === "ol" || $type === "ul")
|
if ($type === "ol" || $type === "ul")
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : Adding li");
|
$this->debugMKD ("DEB2 : Adding li");
|
||||||
$htmlStack[] = "li";
|
$htmlStack[] = "li";
|
||||||
debugMKD (str_repeat (" ", $indent)."<li>");
|
$this->debugMKD (str_repeat (" ", $indent)."<li>");
|
||||||
$res .= "\n".str_repeat (" ", $indent)."<li>";
|
$res .= "\n".str_repeat (" ", $indent)."<li>";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,10 +262,10 @@ class markdown
|
|||||||
{
|
{
|
||||||
// The code indentation should not be parsed as a new code : the
|
// The code indentation should not be parsed as a new code : the
|
||||||
// <code></code> continue until the end of paragraph
|
// <code></code> continue until the end of paragraph
|
||||||
debugMKD ("DEB1 : Starting a new block");
|
$this->debugMKD ("DEB1 : Starting a new block");
|
||||||
if ($type === "")
|
if ($type === "")
|
||||||
{
|
{
|
||||||
debugMKD ("No type : skipped");
|
$this->debugMKD ("No type : skipped");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,11 +276,11 @@ class markdown
|
|||||||
// Code need a pre before code
|
// Code need a pre before code
|
||||||
if (end ($typeStack))
|
if (end ($typeStack))
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : CODE : Close older HTML");
|
$this->debugMKD ("DEB2 : CODE : Close older HTML");
|
||||||
// Remove last \n to put closing tag at the end of line
|
// Remove last \n to put closing tag at the end of line
|
||||||
$res = substr ($res, 0, -1);
|
$res = substr ($res, 0, -1);
|
||||||
$oldType = array_pop ($typeStack);
|
$oldType = array_pop ($typeStack);
|
||||||
debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
$this->debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
||||||
$res .= str_repeat (" ", end ($indentStack))."</$oldType>";
|
$res .= str_repeat (" ", end ($indentStack))."</$oldType>";
|
||||||
array_pop ($indentStack);
|
array_pop ($indentStack);
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
@@ -293,24 +297,24 @@ class markdown
|
|||||||
array_push ($typeStack, $type);
|
array_push ($typeStack, $type);
|
||||||
}
|
}
|
||||||
array_push ($indentStack, $indent);
|
array_push ($indentStack, $indent);
|
||||||
debugMKD (str_repeat (" ", $indent)."<$typetmp>");
|
$this->debugMKD (str_repeat (" ", $indent)."<$typetmp>");
|
||||||
$res .= "\n".str_repeat (" ", $indent)."<$typetmp>";
|
$res .= "\n".str_repeat (" ", $indent)."<$typetmp>";
|
||||||
if ($type === "ol" || $type === "ul")
|
if ($type === "ol" || $type === "ul")
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : Adding li");
|
$this->debugMKD ("DEB2 : Adding li");
|
||||||
$htmlStack[] = "li";
|
$htmlStack[] = "li";
|
||||||
debugMKD (str_repeat (" ", $indent)."<li>");
|
$this->debugMKD (str_repeat (" ", $indent)."<li>");
|
||||||
$res .= "\n".str_repeat (" ", $indent)."<li>";
|
$res .= "\n".str_repeat (" ", $indent)."<li>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type === "" && end ($indentStack))
|
if ($type === "" && end ($indentStack))
|
||||||
{
|
{
|
||||||
debugMKD ("DEB2 : Empty type");
|
$this->debugMKD ("DEB2 : Empty type");
|
||||||
// Remove last \n to put closing tag at the end of line
|
// Remove last \n to put closing tag at the end of line
|
||||||
$res = substr ($res, 0, -1);
|
$res = substr ($res, 0, -1);
|
||||||
$oldType = array_pop ($typeStack);
|
$oldType = array_pop ($typeStack);
|
||||||
debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
$this->debugMKD (str_repeat (" ", end ($indentStack))."</$oldType>");
|
||||||
$res .= "\n".str_repeat (" ", end ($indentStack))."</$oldType>";
|
$res .= "\n".str_repeat (" ", end ($indentStack))."</$oldType>";
|
||||||
array_pop ($htmlStack);
|
array_pop ($htmlStack);
|
||||||
}
|
}
|
||||||
@@ -323,22 +327,22 @@ class markdown
|
|||||||
$timeregex += (microtime (TRUE) - $timetmp);
|
$timeregex += (microtime (TRUE) - $timetmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
debugMKD ("$lineTxt");
|
$this->debugMKD ("$lineTxt");
|
||||||
$res .= "$lineTxt\n";
|
$res .= "$lineTxt\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
debugMKD ("DEB1 : End of loop");
|
$this->debugMKD ("DEB1 : End of loop");
|
||||||
$htmlStack = array_reverse ($htmlStack);
|
$htmlStack = array_reverse ($htmlStack);
|
||||||
foreach ($htmlStack as $type)
|
foreach ($htmlStack as $type)
|
||||||
{
|
{
|
||||||
debugMKD ("FIN</$type>");
|
$this->debugMKD ("FIN</$type>");
|
||||||
$res .= "</$type>\n";
|
$res .= "</$type>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
debugMKD ("TimeInit=".($timeInit*1000)."ms");
|
$this->debugMKD ("TimeInit=".($timeInit*1000)."ms");
|
||||||
debugMKD ("TimeRegex=".($timeregex*1000)."ms");
|
$this->debugMKD ("TimeRegex=".($timeregex*1000)."ms");
|
||||||
debugMKD ("TimeAll=".((microtime (TRUE) - $timeStart)*1000)."ms");
|
$this->debugMKD ("TimeAll=".((microtime (TRUE) - $timeStart)*1000)."ms");
|
||||||
debugMKD ("-----------\n");
|
$this->debugMKD ("-----------\n");
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,4 +360,13 @@ class markdown
|
|||||||
return "code";
|
return "code";
|
||||||
return "p";
|
return "p";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Function to display the MarkDown debug */
|
||||||
|
private function debugMKD ($msg)
|
||||||
|
{
|
||||||
|
if ($this->debug === false) return;
|
||||||
|
$trace = debug_backtrace();
|
||||||
|
$back = reset ($trace);
|
||||||
|
file_put_contents ("/tmp/debug", "[".$back["line"]."] $msg\n", FILE_APPEND);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user