fix(web): ParsedownMath
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Baoshuo Ren 2022-10-11 14:03:18 +08:00
parent bd5babfa29
commit 86d4b13cd6
Signed by: baoshuo
GPG Key ID: 00CB9680AB29F51A
7 changed files with 252 additions and 65 deletions

View File

@ -3,12 +3,11 @@
"gregwar/captcha": "^1.1",
"phpmailer/phpmailer": "^6.6",
"ezyang/htmlpurifier": "^4.16",
"erusev/parsedown": "^1.7",
"benjaminhoegh/parsedown-math": "dev-master"
"erusev/parsedown": "^1.7"
},
"autoload": {
"classmap": [
"vendor/benjaminhoegh/parsedown-math/ParsedownMath.php"
"vendor/parsedown-math/ParsedownMath.php"
]
},
"minimum-stability": "dev",

@ -1 +0,0 @@
Subproject commit 668b11b80c7d1dc9812274405426cb62bbb4d78b

View File

@ -6,6 +6,5 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'DynamicParent' => $vendorDir . '/benjaminhoegh/parsedown-math/ParsedownMath.php',
'ParsedownMath' => $vendorDir . '/benjaminhoegh/parsedown-math/ParsedownMath.php',
'ParsedownMath' => $vendorDir . '/parsedown-math/ParsedownMath.php',
);

View File

@ -6,7 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'parsedownMath' => array($vendorDir . '/benjaminhoegh/parsedown-math'),
'Parsedown' => array($vendorDir . '/erusev/parsedown'),
'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
);

View File

@ -41,13 +41,6 @@ class ComposerStaticInit0d7c2cd5c2dbf2120e4372996869e900
);
public static $prefixesPsr0 = array (
'p' =>
array (
'parsedownMath' =>
array (
0 => __DIR__ . '/..' . '/benjaminhoegh/parsedown-math',
),
),
'P' =>
array (
'Parsedown' =>
@ -65,8 +58,7 @@ class ComposerStaticInit0d7c2cd5c2dbf2120e4372996869e900
);
public static $classMap = array (
'DynamicParent' => __DIR__ . '/..' . '/benjaminhoegh/parsedown-math/ParsedownMath.php',
'ParsedownMath' => __DIR__ . '/..' . '/benjaminhoegh/parsedown-math/ParsedownMath.php',
'ParsedownMath' => __DIR__ . '/..' . '/parsedown-math/ParsedownMath.php',
);
public static function getInitializer(ClassLoader $loader)

View File

@ -1,53 +1,4 @@
[
{
"name": "benjaminhoegh/parsedown-math",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/BenjaminHoegh/ParsedownMath.git",
"reference": "668b11b80c7d1dc9812274405426cb62bbb4d78b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/BenjaminHoegh/ParsedownMath/zipball/668b11b80c7d1dc9812274405426cb62bbb4d78b",
"reference": "668b11b80c7d1dc9812274405426cb62bbb4d78b",
"shasum": ""
},
"require": {
"php": "^5.6||^8.0"
},
"time": "2022-05-17T18:37:50+00:00",
"type": "library",
"installation-source": "source",
"autoload": {
"psr-0": {
"parsedownMath": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "An extension of Parsedown that adds support for LaTeX.",
"homepage": "https://github.com/BenjaminHoegh/ParsedownMath",
"keywords": [
"latex",
"markdown",
"parsedown",
"parser"
],
"funding": [
{
"url": "https://paypal.me/BenjaminHoegh",
"type": "custom"
},
{
"url": "https://www.buymeacoffee.com/BenjaminHoegh",
"type": "custom"
}
]
},
{
"name": "erusev/parsedown",
"version": "1.7.4",

View File

@ -0,0 +1,248 @@
<?php
class ParsedownMath extends Parsedown
{
const VERSION = '1.2';
public function __construct($options = '')
{
if (version_compare(parent::version, '1.7.3') < 0) {
throw new Exception('ParsedownMath requires a later version of Parsedown');
}
// Blocks
$this->BlockTypes['\\'][] = 'Math';
$this->BlockTypes['$'][] = 'Math';
// Inline
$this->InlineTypes['\\'][] = 'Math';
$this->inlineMarkerList .= '\\';
$this->InlineTypes['$'][] = 'Math';
$this->inlineMarkerList .= '$';
$this->options['math']['enabled'] = (isset($options['math']['enabled']) ? $options['math']['enabled'] : false);
$this->options['math']['inline']['enabled'] = (isset($options['math']['inline']['enabled']) ? $options['math']['inline']['enabled'] : true);
$this->options['math']['block']['enabled'] = (isset($options['math']['block']['enabled']) ? $options['math']['block']['enabled'] : true);
$this->options['math']['matchSingleDollar'] = (isset($options['math']['matchSingleDollar']) ? $options['math']['matchSingleDollar'] : false);
}
protected function element(array $Element)
{
if ($this->safeMode) {
$Element = $this->sanitiseElement($Element);
}
if (isset($Element['name'])) {
$markup = '<'.$Element['name'];
} else {
$markup = '';
}
if (isset($Element['attributes'])) {
foreach ($Element['attributes'] as $name => $value) {
if ($value === null) {
continue;
}
$markup .= ' '.$name.'="'.self::escape($value).'"';
}
}
if (isset($Element['text'])) {
if (isset($Element['name'])) {
$markup .= '>';
}
if (!isset($Element['nonNestables'])) {
$Element['nonNestables'] = array();
}
if (isset($Element['handler'])) {
$markup .= $this->{$Element['handler']}($Element['text'], $Element['nonNestables']);
} else {
$markup .= self::escape($Element['text'], true);
}
if (isset($Element['name'])) {
$markup .= '</'.$Element['name'].'>';
}
} else {
if (isset($Element['name'])) {
$markup .= ' />';
}
}
return $markup;
}
// -------------------------------------------------------------------------
// ----------------------- Inline --------------------------
// -------------------------------------------------------------------------
//
// Inline Math
// -------------------------------------------------------------------------
protected function inlineMath($Excerpt)
{
if (!$this->options['math']['enabled'] === true && !$this->options['math']['inline']['enabled'] !== false) {
return;
}
$matchSignleDollar = $this->options['math']['matchSingleDollar'] ?? false;
// Using inline detection to detect Block single-line math.
if (preg_match('/^(?<!\\\\)(?<!\$)\${2}(?!\$)[^$]*?(?<!\$)\${2}(?!\$)$/', $Excerpt['text'], $matches)) {
$Block = array(
'element' => array(
'text' => '',
),
);
$Block['end'] = '$$';
$Block['complete'] = true;
$Block['latex'] = true;
$Block['element']['text'] = $matches[0];
$Block['extent'] = strlen($Block['element']['text']);
return $Block;
}
// Inline Matches
if ($matchSignleDollar === true) {
// Experimental
if (preg_match('/^(?<!\\\\)((?<!\$)\$(?!\$)(.*?)(?<!\$)\$(?!\$)|(?<!\\\\\()\\\\\((.*?)(?<!\\\\\()\\\\\)(?!\\\\\)))/s', $Excerpt['text'], $matches)) {
$this->mathMatch = $matches[0];
}
} else {
if (preg_match('/^(?<!\\\\)(?<!\\\\\()\\\\\((.*?)(?<!\\\\\()\\\\\)(?!\\\\\))/s', $Excerpt['text'], $matches)) {
$this->mathMatch = $matches[0];
}
}
if (isset($this->mathMatch)) {
return array(
'extent' => strlen($this->mathMatch),
'element' => array(
'text' => $this->mathMatch,
),
);
}
}
protected $specialCharacters = array(
'\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '<', '>', '#', '+', '-', '.', '!', '|', '~', '^', '='
);
//
// Inline Escape
// -------------------------------------------------------------------------
protected function inlineEscapeSequence($Excerpt)
{
$Element = array(
'element' => array(
'rawHtml' => $Excerpt['text'][1],
),
'extent' => 2,
);
if ($this->options['math']['enabled'] === true) {
if (isset($Excerpt['text'][1]) && in_array($Excerpt['text'][1], $this->specialCharacters) && !preg_match('/^(?<!\\\\)((?<!\\\\\()\\\\\((?!\\\\\())(.*?)(?<!\\\\)(?<!\\\\\()((?<!\\\\\))\\\\\)(?!\\\\\)))(?!\\\\\()/s', $Excerpt['text'])) {
return $Element;
} elseif (isset($Excerpt['text'][1]) && in_array($Excerpt['text'][1], $this->specialCharacters) && !preg_match('/^(?<!\\\\)(?<!\\\\\()\\\\\((.{1,}?)(?<!\\\\\()\\\\\)(?!\\\\\))/s', $Excerpt['text'])) {
return $Element;
}
} else {
if (isset($Excerpt['text'][1]) && in_array($Excerpt['text'][1], $this->specialCharacters)) {
return $Element;
}
}
}
// -------------------------------------------------------------------------
// ----------------------- Blocks --------------------------
// -------------------------------------------------------------------------
//
// Block Math
// --------------------------------------------------------------------------
protected function blockMath($Line)
{
if (!$this->options['math']['enabled'] === true && !$this->options['math']['block']['enabled'] !== false) {
return;
}
$Block = array(
'element' => array(
'text' => '',
),
);
if (preg_match('/^(?<!\\\\)(\\\\\[)(?!.)$/', $Line['text'])) {
$Block['end'] = '\]';
return $Block;
} elseif (preg_match('/^(?<!\\\\)(\$\$)(?!.)$/', $Line['text'])) {
$Block['end'] = '$$';
return $Block;
}
}
// ~
protected function blockMathContinue($Line, $Block)
{
if (isset($Block['complete'])) {
return;
}
if (isset($Block['interrupted'])) {
$Block['element']['text'] .= str_repeat("\n", $Block['interrupted']);
unset($Block['interrupted']);
}
if (preg_match('/^(?<!\\\\)(\\\\\])$/', $Line['text']) && $Block['end'] === '\]') {
$Block['complete'] = true;
$Block['latex'] = true;
$Block['element']['text'] = "\\[".$Block['element']['text']."\\]";
return $Block;
} elseif (preg_match('/^(?<!\\\\)(\$\$)$/', $Line['text']) && $Block['end'] === '$$') {
$Block['complete'] = true;
$Block['latex'] = true;
$Block['element']['text'] = "$$".$Block['element']['text']."$$";
return $Block;
}
$Block['element']['text'] .= "\n" . $Line['body'];
// ~
return $Block;
}
// ~
protected function blockMathComplete($Block)
{
return $Block;
}
}