Author: Derick Rethans (derickr)
Date: 2024-11-29T16:57:10Z

Commit: 
https://github.com/php/web-wiki/commit/1d6447664829f9f16db44f42216a03ff3748a375
Raw diff: 
https://github.com/php/web-wiki/commit/1d6447664829f9f16db44f42216a03ff3748a375.diff

Upgrade CommonMark in plugin

Changed paths:
  M  dokuwiki/lib/plugins/commonmark/composer.json
  M  dokuwiki/lib/plugins/commonmark/composer.lock
  M  dokuwiki/lib/plugins/commonmark/vendor/composer/ClassLoader.php
  M  dokuwiki/lib/plugins/commonmark/vendor/composer/InstalledVersions.php
  M  dokuwiki/lib/plugins/commonmark/vendor/composer/autoload_real.php
  M  dokuwiki/lib/plugins/commonmark/vendor/composer/installed.json
  M  dokuwiki/lib/plugins/commonmark/vendor/composer/installed.php
  M  dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/CHANGELOG.md
  M  dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/README.md
  M  dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/composer.json
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Attributes/Util/AttributesHelper.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Node/Block/ListBlock.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/FencedCodeParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/IndentedCodeParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockStartParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListItemParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Renderer/Block/FencedCodeRenderer.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Node/Block/Paragraph.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/DocumentBlockParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/ParagraphParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/MarkdownParser.php
  M  
dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Util/RegexHelper.php


Diff:

diff --git a/dokuwiki/lib/plugins/commonmark/composer.json 
b/dokuwiki/lib/plugins/commonmark/composer.json
index d605d5cf..f751b386 100644
--- a/dokuwiki/lib/plugins/commonmark/composer.json
+++ b/dokuwiki/lib/plugins/commonmark/composer.json
@@ -24,7 +24,7 @@
         }
     },
     "require": {
-        "league/commonmark": "2.4.*",
+        "league/commonmark": "2.5.*",
         "symfony/yaml": "4.*"
     },
     "config": {
diff --git a/dokuwiki/lib/plugins/commonmark/composer.lock 
b/dokuwiki/lib/plugins/commonmark/composer.lock
index 98bb0248..2bbf2f25 100644
--- a/dokuwiki/lib/plugins/commonmark/composer.lock
+++ b/dokuwiki/lib/plugins/commonmark/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at 
https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies";,
         "This file is @generated automatically"
     ],
-    "content-hash": "f16c3287995e16f245d1b28669e93bd5",
+    "content-hash": "6f9379c5256b7e4e408c31ccb0d94498",
     "packages": [
         {
             "name": "dflydev/dot-access-data",
@@ -83,16 +83,16 @@
         },
         {
             "name": "league/commonmark",
-            "version": "2.4.1",
+            "version": "2.5.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git";,
-                "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5"
+                "reference": "b650144166dfa7703e62a22e493b853b58d874b0"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5";,
-                "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5",
+                "url": 
"https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0";,
+                "reference": "b650144166dfa7703e62a22e493b853b58d874b0",
                 "shasum": ""
             },
             "require": {
@@ -105,8 +105,8 @@
             },
             "require-dev": {
                 "cebe/markdown": "^1.0",
-                "commonmark/cmark": "0.30.0",
-                "commonmark/commonmark.js": "0.30.0",
+                "commonmark/cmark": "0.31.1",
+                "commonmark/commonmark.js": "0.31.1",
                 "composer/package-versions-deprecated": "^1.8",
                 "embed/embed": "^4.4",
                 "erusev/parsedown": "^1.0",
@@ -115,10 +115,10 @@
                 "michelf/php-markdown": "^1.4 || ^2.0",
                 "nyholm/psr7": "^1.5",
                 "phpstan/phpstan": "^1.8.2",
-                "phpunit/phpunit": "^9.5.21",
+                "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
                 "scrutinizer/ocular": "^1.8.1",
-                "symfony/finder": "^5.3 | ^6.0",
-                "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+                "symfony/finder": "^5.3 | ^6.0 || ^7.0",
+                "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
                 "unleashedtech/php-coding-standard": "^3.1.1",
                 "vimeo/psalm": "^4.24.0 || ^5.0.0"
             },
@@ -128,7 +128,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "2.5-dev"
+                    "dev-main": "2.6-dev"
                 }
             },
             "autoload": {
@@ -185,7 +185,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-08-30T16:55:00+00:00"
+            "time": "2024-08-16T11:46:16+00:00"
         },
         {
             "name": "league/config",
@@ -775,10 +775,10 @@
     "packages-dev": [],
     "aliases": [],
     "minimum-stability": "stable",
-    "stability-flags": [],
+    "stability-flags": {},
     "prefer-stable": false,
     "prefer-lowest": false,
-    "platform": [],
-    "platform-dev": [],
-    "plugin-api-version": "2.3.0"
+    "platform": {},
+    "platform-dev": {},
+    "plugin-api-version": "2.6.0"
 }
diff --git a/dokuwiki/lib/plugins/commonmark/vendor/composer/ClassLoader.php 
b/dokuwiki/lib/plugins/commonmark/vendor/composer/ClassLoader.php
index afef3fa2..7824d8f7 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/composer/ClassLoader.php
+++ b/dokuwiki/lib/plugins/commonmark/vendor/composer/ClassLoader.php
@@ -42,35 +42,37 @@
  */
 class ClassLoader
 {
-    /** @var ?string */
+    /** @var \Closure(string):void */
+    private static $includeFile;
+
+    /** @var string|null */
     private $vendorDir;
 
     // PSR-4
     /**
-     * @var array[]
-     * @psalm-var array<string, array<string, int>>
+     * @var array<string, array<string, int>>
      */
     private $prefixLengthsPsr4 = array();
     /**
-     * @var array[]
-     * @psalm-var array<string, array<int, string>>
+     * @var array<string, list<string>>
      */
     private $prefixDirsPsr4 = array();
     /**
-     * @var array[]
-     * @psalm-var array<string, string>
+     * @var list<string>
      */
     private $fallbackDirsPsr4 = array();
 
     // PSR-0
     /**
-     * @var array[]
-     * @psalm-var array<string, array<string, string[]>>
+     * List of PSR-0 prefixes
+     *
+     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' 
=> array('path', 'path2')))
+     *
+     * @var array<string, array<string, list<string>>>
      */
     private $prefixesPsr0 = array();
     /**
-     * @var array[]
-     * @psalm-var array<string, string>
+     * @var list<string>
      */
     private $fallbackDirsPsr0 = array();
 
@@ -78,8 +80,7 @@ class ClassLoader
     private $useIncludePath = false;
 
     /**
-     * @var string[]
-     * @psalm-var array<string, string>
+     * @var array<string, string>
      */
     private $classMap = array();
 
@@ -87,29 +88,29 @@ class ClassLoader
     private $classMapAuthoritative = false;
 
     /**
-     * @var bool[]
-     * @psalm-var array<string, bool>
+     * @var array<string, bool>
      */
     private $missingClasses = array();
 
-    /** @var ?string */
+    /** @var string|null */
     private $apcuPrefix;
 
     /**
-     * @var self[]
+     * @var array<string, self>
      */
     private static $registeredLoaders = array();
 
     /**
-     * @param ?string $vendorDir
+     * @param string|null $vendorDir
      */
     public function __construct($vendorDir = null)
     {
         $this->vendorDir = $vendorDir;
+        self::initializeIncludeClosure();
     }
 
     /**
-     * @return string[]
+     * @return array<string, list<string>>
      */
     public function getPrefixes()
     {
@@ -121,8 +122,7 @@ public function getPrefixes()
     }
 
     /**
-     * @return array[]
-     * @psalm-return array<string, array<int, string>>
+     * @return array<string, list<string>>
      */
     public function getPrefixesPsr4()
     {
@@ -130,8 +130,7 @@ public function getPrefixesPsr4()
     }
 
     /**
-     * @return array[]
-     * @psalm-return array<string, string>
+     * @return list<string>
      */
     public function getFallbackDirs()
     {
@@ -139,8 +138,7 @@ public function getFallbackDirs()
     }
 
     /**
-     * @return array[]
-     * @psalm-return array<string, string>
+     * @return list<string>
      */
     public function getFallbackDirsPsr4()
     {
@@ -148,8 +146,7 @@ public function getFallbackDirsPsr4()
     }
 
     /**
-     * @return string[] Array of classname => path
-     * @psalm-return array<string, string>
+     * @return array<string, string> Array of classname => path
      */
     public function getClassMap()
     {
@@ -157,8 +154,7 @@ public function getClassMap()
     }
 
     /**
-     * @param string[] $classMap Class to filename map
-     * @psalm-param array<string, string> $classMap
+     * @param array<string, string> $classMap Class to filename map
      *
      * @return void
      */
@@ -175,24 +171,25 @@ public function addClassMap(array $classMap)
      * Registers a set of PSR-0 directories for a given prefix, either
      * appending or prepending to the ones previously set for this prefix.
      *
-     * @param string          $prefix  The prefix
-     * @param string[]|string $paths   The PSR-0 root directories
-     * @param bool            $prepend Whether to prepend the directories
+     * @param string              $prefix  The prefix
+     * @param list<string>|string $paths   The PSR-0 root directories
+     * @param bool                $prepend Whether to prepend the directories
      *
      * @return void
      */
     public function add($prefix, $paths, $prepend = false)
     {
+        $paths = (array) $paths;
         if (!$prefix) {
             if ($prepend) {
                 $this->fallbackDirsPsr0 = array_merge(
-                    (array) $paths,
+                    $paths,
                     $this->fallbackDirsPsr0
                 );
             } else {
                 $this->fallbackDirsPsr0 = array_merge(
                     $this->fallbackDirsPsr0,
-                    (array) $paths
+                    $paths
                 );
             }
 
@@ -201,19 +198,19 @@ public function add($prefix, $paths, $prepend = false)
 
         $first = $prefix[0];
         if (!isset($this->prefixesPsr0[$first][$prefix])) {
-            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+            $this->prefixesPsr0[$first][$prefix] = $paths;
 
             return;
         }
         if ($prepend) {
             $this->prefixesPsr0[$first][$prefix] = array_merge(
-                (array) $paths,
+                $paths,
                 $this->prefixesPsr0[$first][$prefix]
             );
         } else {
             $this->prefixesPsr0[$first][$prefix] = array_merge(
                 $this->prefixesPsr0[$first][$prefix],
-                (array) $paths
+                $paths
             );
         }
     }
@@ -222,9 +219,9 @@ public function add($prefix, $paths, $prepend = false)
      * Registers a set of PSR-4 directories for a given namespace, either
      * appending or prepending to the ones previously set for this namespace.
      *
-     * @param string          $prefix  The prefix/namespace, with trailing '\\'
-     * @param string[]|string $paths   The PSR-4 base directories
-     * @param bool            $prepend Whether to prepend the directories
+     * @param string              $prefix  The prefix/namespace, with trailing 
'\\'
+     * @param list<string>|string $paths   The PSR-4 base directories
+     * @param bool                $prepend Whether to prepend the directories
      *
      * @throws \InvalidArgumentException
      *
@@ -232,17 +229,18 @@ public function add($prefix, $paths, $prepend = false)
      */
     public function addPsr4($prefix, $paths, $prepend = false)
     {
+        $paths = (array) $paths;
         if (!$prefix) {
             // Register directories for the root namespace.
             if ($prepend) {
                 $this->fallbackDirsPsr4 = array_merge(
-                    (array) $paths,
+                    $paths,
                     $this->fallbackDirsPsr4
                 );
             } else {
                 $this->fallbackDirsPsr4 = array_merge(
                     $this->fallbackDirsPsr4,
-                    (array) $paths
+                    $paths
                 );
             }
         } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -252,18 +250,18 @@ public function addPsr4($prefix, $paths, $prepend = false)
                 throw new \InvalidArgumentException("A non-empty PSR-4 prefix 
must end with a namespace separator.");
             }
             $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
-            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+            $this->prefixDirsPsr4[$prefix] = $paths;
         } elseif ($prepend) {
             // Prepend directories for an already registered namespace.
             $this->prefixDirsPsr4[$prefix] = array_merge(
-                (array) $paths,
+                $paths,
                 $this->prefixDirsPsr4[$prefix]
             );
         } else {
             // Append directories for an already registered namespace.
             $this->prefixDirsPsr4[$prefix] = array_merge(
                 $this->prefixDirsPsr4[$prefix],
-                (array) $paths
+                $paths
             );
         }
     }
@@ -272,8 +270,8 @@ public function addPsr4($prefix, $paths, $prepend = false)
      * Registers a set of PSR-0 directories for a given prefix,
      * replacing any others previously set for this prefix.
      *
-     * @param string          $prefix The prefix
-     * @param string[]|string $paths  The PSR-0 base directories
+     * @param string              $prefix The prefix
+     * @param list<string>|string $paths  The PSR-0 base directories
      *
      * @return void
      */
@@ -290,8 +288,8 @@ public function set($prefix, $paths)
      * Registers a set of PSR-4 directories for a given namespace,
      * replacing any others previously set for this namespace.
      *
-     * @param string          $prefix The prefix/namespace, with trailing '\\'
-     * @param string[]|string $paths  The PSR-4 base directories
+     * @param string              $prefix The prefix/namespace, with trailing 
'\\'
+     * @param list<string>|string $paths  The PSR-4 base directories
      *
      * @throws \InvalidArgumentException
      *
@@ -425,7 +423,8 @@ public function unregister()
     public function loadClass($class)
     {
         if ($file = $this->findFile($class)) {
-            includeFile($file);
+            $includeFile = self::$includeFile;
+            $includeFile($file);
 
             return true;
         }
@@ -476,9 +475,9 @@ public function findFile($class)
     }
 
     /**
-     * Returns the currently registered loaders indexed by their corresponding 
vendor directories.
+     * Returns the currently registered loaders keyed by their corresponding 
vendor directories.
      *
-     * @return self[]
+     * @return array<string, self>
      */
     public static function getRegisteredLoaders()
     {
@@ -555,18 +554,26 @@ private function findFileWithExtension($class, $ext)
 
         return false;
     }
-}
 
-/**
- * Scope isolated include.
- *
- * Prevents access to $this/self from included files.
- *
- * @param  string $file
- * @return void
- * @private
- */
-function includeFile($file)
-{
-    include $file;
+    /**
+     * @return void
+     */
+    private static function initializeIncludeClosure()
+    {
+        if (self::$includeFile !== null) {
+            return;
+        }
+
+        /**
+         * Scope isolated include.
+         *
+         * Prevents access to $this/self from included files.
+         *
+         * @param  string $file
+         * @return void
+         */
+        self::$includeFile = \Closure::bind(static function($file) {
+            include $file;
+        }, null, null);
+    }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/composer/InstalledVersions.php 
b/dokuwiki/lib/plugins/commonmark/vendor/composer/InstalledVersions.php
index c6b54af7..51e734a7 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/composer/InstalledVersions.php
+++ b/dokuwiki/lib/plugins/commonmark/vendor/composer/InstalledVersions.php
@@ -98,7 +98,7 @@ public static function isInstalled($packageName, 
$includeDevRequirements = true)
     {
         foreach (self::getInstalled() as $installed) {
             if (isset($installed['versions'][$packageName])) {
-                return $includeDevRequirements || 
empty($installed['versions'][$packageName]['dev_requirement']);
+                return $includeDevRequirements || 
!isset($installed['versions'][$packageName]['dev_requirement']) || 
$installed['versions'][$packageName]['dev_requirement'] === false;
             }
         }
 
@@ -119,7 +119,7 @@ public static function isInstalled($packageName, 
$includeDevRequirements = true)
      */
     public static function satisfies(VersionParser $parser, $packageName, 
$constraint)
     {
-        $constraint = $parser->parseConstraints($constraint);
+        $constraint = $parser->parseConstraints((string) $constraint);
         $provided = 
$parser->parseConstraints(self::getVersionRanges($packageName));
 
         return $provided->matches($constraint);
@@ -328,7 +328,9 @@ private static function getInstalled()
                 if (isset(self::$installedByVendor[$vendorDir])) {
                     $installed[] = self::$installedByVendor[$vendorDir];
                 } elseif (is_file($vendorDir.'/composer/installed.php')) {
-                    $installed[] = self::$installedByVendor[$vendorDir] = 
require $vendorDir.'/composer/installed.php';
+                    /** @var array{root: array{name: string, pretty_version: 
string, version: string, reference: string|null, type: string, install_path: 
string, aliases: string[], dev: bool}, versions: array<string, 
array{pretty_version?: string, version?: string, reference?: string|null, 
type?: string, install_path?: string, aliases?: string[], dev_requirement: 
bool, replaced?: string[], provided?: string[]}>} $required */
+                    $required = require $vendorDir.'/composer/installed.php';
+                    $installed[] = self::$installedByVendor[$vendorDir] = 
$required;
                     if (null === self::$installed && 
strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
                         self::$installed = $installed[count($installed) - 1];
                     }
@@ -340,12 +342,17 @@ private static function getInstalled()
             // only require the installed.php file if this file is loaded from 
its dumped location,
             // and not from its source location in the composer/composer 
package, see https://github.com/composer/composer/issues/9937
             if (substr(__DIR__, -8, 1) !== 'C') {
-                self::$installed = require __DIR__ . '/installed.php';
+                /** @var array{root: array{name: string, pretty_version: 
string, version: string, reference: string|null, type: string, install_path: 
string, aliases: string[], dev: bool}, versions: array<string, 
array{pretty_version?: string, version?: string, reference?: string|null, 
type?: string, install_path?: string, aliases?: string[], dev_requirement: 
bool, replaced?: string[], provided?: string[]}>} $required */
+                $required = require __DIR__ . '/installed.php';
+                self::$installed = $required;
             } else {
                 self::$installed = array();
             }
         }
-        $installed[] = self::$installed;
+
+        if (self::$installed !== array()) {
+            $installed[] = self::$installed;
+        }
 
         return $installed;
     }
diff --git a/dokuwiki/lib/plugins/commonmark/vendor/composer/autoload_real.php 
b/dokuwiki/lib/plugins/commonmark/vendor/composer/autoload_real.php
index 801f3cc6..b76227ac 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/composer/autoload_real.php
+++ b/dokuwiki/lib/plugins/commonmark/vendor/composer/autoload_real.php
@@ -33,25 +33,18 @@ public static function getLoader()
 
         $loader->register(true);
 
-        $includeFiles = 
\Composer\Autoload\ComposerStaticInitef565756f0c190b452f9f5a713079493::$files;
-        foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequireef565756f0c190b452f9f5a713079493($fileIdentifier, 
$file);
+        $filesToLoad = 
\Composer\Autoload\ComposerStaticInitef565756f0c190b452f9f5a713079493::$files;
+        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) 
{
+            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) 
{
+                $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+
+                require $file;
+            }
+        }, null, null);
+        foreach ($filesToLoad as $fileIdentifier => $file) {
+            $requireFile($fileIdentifier, $file);
         }
 
         return $loader;
     }
 }
-
-/**
- * @param string $fileIdentifier
- * @param string $file
- * @return void
- */
-function composerRequireef565756f0c190b452f9f5a713079493($fileIdentifier, 
$file)
-{
-    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
-        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
-
-        require $file;
-    }
-}
diff --git a/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.json 
b/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.json
index 0e9baf3c..be43d939 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.json
+++ b/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.json
@@ -80,17 +80,17 @@
         },
         {
             "name": "league/commonmark",
-            "version": "2.4.1",
-            "version_normalized": "2.4.1.0",
+            "version": "2.5.3",
+            "version_normalized": "2.5.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git";,
-                "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5"
+                "reference": "b650144166dfa7703e62a22e493b853b58d874b0"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5";,
-                "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5",
+                "url": 
"https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0";,
+                "reference": "b650144166dfa7703e62a22e493b853b58d874b0",
                 "shasum": ""
             },
             "require": {
@@ -103,8 +103,8 @@
             },
             "require-dev": {
                 "cebe/markdown": "^1.0",
-                "commonmark/cmark": "0.30.0",
-                "commonmark/commonmark.js": "0.30.0",
+                "commonmark/cmark": "0.31.1",
+                "commonmark/commonmark.js": "0.31.1",
                 "composer/package-versions-deprecated": "^1.8",
                 "embed/embed": "^4.4",
                 "erusev/parsedown": "^1.0",
@@ -113,21 +113,21 @@
                 "michelf/php-markdown": "^1.4 || ^2.0",
                 "nyholm/psr7": "^1.5",
                 "phpstan/phpstan": "^1.8.2",
-                "phpunit/phpunit": "^9.5.21",
+                "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
                 "scrutinizer/ocular": "^1.8.1",
-                "symfony/finder": "^5.3 | ^6.0",
-                "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+                "symfony/finder": "^5.3 | ^6.0 || ^7.0",
+                "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
                 "unleashedtech/php-coding-standard": "^3.1.1",
                 "vimeo/psalm": "^4.24.0 || ^5.0.0"
             },
             "suggest": {
                 "symfony/yaml": "v2.3+ required if using the Front Matter 
extension"
             },
-            "time": "2023-08-30T16:55:00+00:00",
+            "time": "2024-08-16T11:46:16+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "2.5-dev"
+                    "dev-main": "2.6-dev"
                 }
             },
             "installation-source": "dist",
diff --git a/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.php 
b/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.php
index b3afad7e..44f8489e 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.php
+++ b/dokuwiki/lib/plugins/commonmark/vendor/composer/installed.php
@@ -3,7 +3,7 @@
         'name' => 'clockoon/dokuwiki-commonmark-plugin',
         'pretty_version' => '1.2.1',
         'version' => '1.2.1.0',
-        'reference' => NULL,
+        'reference' => null,
         'type' => 'dokuwiki-plugin',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -13,7 +13,7 @@
         'clockoon/dokuwiki-commonmark-plugin' => array(
             'pretty_version' => '1.2.1',
             'version' => '1.2.1.0',
-            'reference' => NULL,
+            'reference' => null,
             'type' => 'dokuwiki-plugin',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -29,9 +29,9 @@
             'dev_requirement' => false,
         ),
         'league/commonmark' => array(
-            'pretty_version' => '2.4.1',
-            'version' => '2.4.1.0',
-            'reference' => '3669d6d5f7a47a93c08ddff335e6d945481a1dd5',
+            'pretty_version' => '2.5.3',
+            'version' => '2.5.3.0',
+            'reference' => 'b650144166dfa7703e62a22e493b853b58d874b0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../league/commonmark',
             'aliases' => array(),
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/CHANGELOG.md 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/CHANGELOG.md
index c2cd312a..917e5e80 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/CHANGELOG.md
+++ b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/CHANGELOG.md
@@ -6,6 +6,77 @@ Updates should follow the [Keep a 
CHANGELOG](https://keepachangelog.com/) princi
 
 ## [Unreleased][unreleased]
 
+## [2.5.3] - 2024-08-16
+
+### Changed
+
+- Made compatible with CommonMark spec 0.31.1, including:
+  - Remove `source`, add `search` to list of recognized block tags
+
+## [2.5.2] - 2024-08-14
+
+### Changed
+
+- Boolean attributes now require an explicit `true` value (#1040)
+
+### Fixed
+
+- Fixed regression where text could be misinterpreted as an attribute (#1040)
+
+## [2.5.1] - 2024-07-24
+
+### Fixed
+
+- Fixed attribute parsing incorrectly parsing mustache-like syntax (#1035)
+- Fixed incorrect `Table` start line numbers (#1037)
+
+## [2.5.0] - 2024-07-22
+
+### Added
+
+- The `AttributesExtension` now supports attributes without values (#985, #986)
+- The `AutolinkExtension` exposes two new configuration options to override 
the default behavior (#969, #987):
+    - `autolink/allowed_protocols` - an array of protocols to allow 
autolinking for
+    - `autolink/default_protocol` - the default protocol to use when none is 
specified
+
+### Changed
+
+- Made compatible with CommonMark spec 0.31.0, including:
+    - Allow closing fence to be followed by tabs
+    - Remove restrictive limitation on inline comments
+    - Unicode symbols now treated like punctuation (for purposes of 
flankingness)
+    - Trailing tabs on the last line of indented code blocks will be excluded
+    - Improved HTML comment matching
+- `Paragraph`s only containing link reference definitions will be kept in the 
AST until the `Document` is finalized
+    - (These were previously removed immediately after parsing the `Paragraph`)
+
+### Fixed
+
+- Fixed list tightness not being determined properly in some edge cases
+- Fixed incorrect ending line numbers for several block types in various 
scenarios
+- Fixed lowercase inline HTML declarations not being accepted
+
+## [2.4.4] - 2024-07-22
+
+### Fixed
+
+- Fixed SmartPunct extension changing already-formatted quotation marks (#1030)
+
+## [2.4.3] - 2024-07-22
+
+### Fixed
+
+- Fixed the Attributes extension not supporting CSS level 3 selectors (#1013)
+- Fixed `UrlAutolinkParser` incorrectly parsing text containing `www` anywhere 
before an autolink (#1025)
+
+
+## [2.4.2] - 2024-02-02
+
+### Fixed
+
+- Fixed declaration parser being too strict
+- `FencedCodeRenderer`: don't add `language-` to class if already prefixed
+
 ## [2.4.1] - 2023-08-30
 
 ### Fixed
@@ -560,7 +631,14 @@ No changes were introduced since the previous release.
     - Alternative 1: Use `CommonMarkConverter` or 
`GithubFlavoredMarkdownConverter` if you don't need to customize the environment
     - Alternative 2: Instantiate a new `Environment` and add the necessary 
extensions yourself
 
-[unreleased]: https://github.com/thephpleague/commonmark/compare/2.4.1...main
+[unreleased]: https://github.com/thephpleague/commonmark/compare/2.5.3...main
+[2.5.3]: https://github.com/thephpleague/commonmark/compare/2.5.2...2.5.3
+[2.5.2]: https://github.com/thephpleague/commonmark/compare/2.5.1...2.5.2
+[2.5.1]: https://github.com/thephpleague/commonmark/compare/2.5.0...2.5.1
+[2.5.0]: https://github.com/thephpleague/commonmark/compare/2.4.4...2.5.0
+[2.4.4]: https://github.com/thephpleague/commonmark/compare/2.4.3...2.4.4
+[2.4.3]: https://github.com/thephpleague/commonmark/compare/2.4.2...2.4.3
+[2.4.2]: https://github.com/thephpleague/commonmark/compare/2.4.1...2.4.2
 [2.4.1]: https://github.com/thephpleague/commonmark/compare/2.4.0...2.4.1
 [2.4.0]: https://github.com/thephpleague/commonmark/compare/2.3.9...2.4.0
 [2.3.9]: https://github.com/thephpleague/commonmark/compare/2.3.8...2.3.9
diff --git a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/README.md 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/README.md
index 2106902a..36a337b0 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/README.md
+++ b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/README.md
@@ -98,7 +98,7 @@ See [our extension 
documentation](https://commonmark.thephpleague.com/extensions
 
 Custom parsers/renderers can be bundled into extensions which extend 
CommonMark.  Here are some that you may find interesting:
 
- - [Alt Three Emoji](https://github.com/AltThree/Emoji) An emoji parser for 
CommonMark.
+ - [Emoji extension](https://github.com/ElGigi/CommonMarkEmoji) - UTF-8 emoji 
extension with Github tag.
  - [Sup Sub extensions](https://github.com/OWS/commonmark-sup-sub-extensions) 
- Adds support of superscript and subscript (`<sup>` and `<sub>` HTML tags)
  - [YouTube iframe 
extension](https://github.com/zoonru/commonmark-ext-youtube-iframe) - Replaces 
youtube link with iframe.
  - [Lazy Image 
extension](https://github.com/simonvomeyser/commonmark-ext-lazy-image) - Adds 
various options for lazy loading of images.
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/composer.json 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/composer.json
index 3dfb755f..9b906620 100644
--- a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/composer.json
+++ b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/composer.json
@@ -31,8 +31,8 @@
     "require-dev": {
         "ext-json": "*",
         "cebe/markdown": "^1.0",
-        "commonmark/cmark": "0.30.0",
-        "commonmark/commonmark.js": "0.30.0",
+        "commonmark/cmark": "0.31.1",
+        "commonmark/commonmark.js": "0.31.1",
         "composer/package-versions-deprecated": "^1.8",
         "embed/embed": "^4.4",
         "erusev/parsedown": "^1.0",
@@ -40,10 +40,10 @@
         "michelf/php-markdown": "^1.4 || ^2.0",
         "nyholm/psr7": "^1.5",
         "phpstan/phpstan": "^1.8.2",
-        "phpunit/phpunit": "^9.5.21",
+        "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
         "scrutinizer/ocular": "^1.8.1",
-        "symfony/finder": "^5.3 | ^6.0",
-        "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+        "symfony/finder": "^5.3 | ^6.0 || ^7.0",
+        "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
         "unleashedtech/php-coding-standard": "^3.1.1",
         "vimeo/psalm": "^4.24.0 || ^5.0.0"
     },
@@ -56,9 +56,9 @@
             "type": "package",
             "package": {
                 "name": "commonmark/commonmark.js",
-                "version": "0.30.0",
+                "version": "0.31.1",
                 "dist": {
-                    "url": 
"https://github.com/commonmark/commonmark.js/archive/0.30.0.zip";,
+                    "url": 
"https://github.com/commonmark/commonmark.js/archive/0.31.1.zip";,
                     "type": "zip"
                 }
             }
@@ -67,9 +67,9 @@
             "type": "package",
             "package": {
                 "name": "commonmark/cmark",
-                "version": "0.30.0",
+                "version": "0.31.1",
                 "dist": {
-                    "url": 
"https://github.com/commonmark/cmark/archive/0.30.0.zip";,
+                    "url": 
"https://github.com/commonmark/cmark/archive/0.31.1.zip";,
                     "type": "zip"
                 }
             }
@@ -80,7 +80,7 @@
                 "name": "github/gfm",
                 "version": "0.29.0",
                 "dist": {
-                    "url": 
"https://github.com/github/cmark-gfm/archive/0.29.0.gfm.9.zip";,
+                    "url": 
"https://github.com/github/cmark-gfm/archive/0.29.0.gfm.13.zip";,
                     "type": "zip"
                 }
             }
@@ -112,7 +112,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-main": "2.5-dev"
+            "dev-main": "2.6-dev"
         }
     },
     "config": {
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Attributes/Util/AttributesHelper.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Attributes/Util/AttributesHelper.php
index de5c111e..d13a565e 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Attributes/Util/AttributesHelper.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Attributes/Util/AttributesHelper.php
@@ -23,7 +23,7 @@
  */
 final class AttributesHelper
 {
-    private const SINGLE_ATTRIBUTE = '\s*([.#][_a-z0-9-]+|' . 
RegexHelper::PARTIAL_ATTRIBUTENAME . RegexHelper::PARTIAL_ATTRIBUTEVALUESPEC . 
')\s*';
+    private const SINGLE_ATTRIBUTE = '\s*([.]-?[_a-z][^\s}]*|[#][^\s}]+|' . 
RegexHelper::PARTIAL_ATTRIBUTENAME . RegexHelper::PARTIAL_ATTRIBUTEVALUESPEC . 
')\s*';
     private const ATTRIBUTE_LIST   = '/^{:?(' . self::SINGLE_ATTRIBUTE . 
')+}/i';
 
     /**
@@ -75,6 +75,11 @@ public static function parseAttributes(Cursor $cursor): array
             /** @psalm-suppress PossiblyUndefinedArrayOffset */
             [$name, $value] = \explode('=', $attribute, 2);
 
+            if ($value === 'true') {
+                $attributes[$name] = true;
+                continue;
+            }
+
             $first = $value[0];
             $last  = \substr($value, -1);
             if (($first === '"' && $last === '"') || ($first === "'" && $last 
=== "'") && \strlen($value) > 1) {
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php
index 3516ebba..54aafd4d 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php
@@ -14,13 +14,26 @@
 namespace League\CommonMark\Extension\Autolink;
 
 use League\CommonMark\Environment\EnvironmentBuilderInterface;
-use League\CommonMark\Extension\ExtensionInterface;
+use League\CommonMark\Extension\ConfigurableExtensionInterface;
+use League\Config\ConfigurationBuilderInterface;
+use Nette\Schema\Expect;
 
-final class AutolinkExtension implements ExtensionInterface
+final class AutolinkExtension implements ConfigurableExtensionInterface
 {
+    public function configureSchema(ConfigurationBuilderInterface $builder): 
void
+    {
+        $builder->addSchema('autolink', Expect::structure([
+            'allowed_protocols' => Expect::listOf('string')->default(['http', 
'https', 'ftp'])->mergeDefaults(false),
+            'default_protocol' => Expect::string()->default('http'),
+        ]));
+    }
+
     public function register(EnvironmentBuilderInterface $environment): void
     {
         $environment->addInlineParser(new EmailAutolinkParser());
-        $environment->addInlineParser(new UrlAutolinkParser());
+        $environment->addInlineParser(new UrlAutolinkParser(
+            
$environment->getConfiguration()->get('autolink.allowed_protocols'),
+            $environment->getConfiguration()->get('autolink.default_protocol'),
+        ));
     }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkParser.php
index f44da335..1ef270fe 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkParser.php
@@ -56,7 +56,7 @@ final class UrlAutolinkParser implements InlineParserInterface
      *
      * @psalm-readonly
      */
-    private array $prefixes = ['www'];
+    private array $prefixes = ['www.'];
 
     /**
      * @psalm-var non-empty-string
@@ -65,10 +65,12 @@ final class UrlAutolinkParser implements 
InlineParserInterface
      */
     private string $finalRegex;
 
+    private string $defaultProtocol;
+
     /**
      * @param array<int, string> $allowedProtocols
      */
-    public function __construct(array $allowedProtocols = ['http', 'https', 
'ftp'])
+    public function __construct(array $allowedProtocols = ['http', 'https', 
'ftp'], string $defaultProtocol = 'http')
     {
         /**
          * @psalm-suppress PropertyTypeCoercion
@@ -78,6 +80,8 @@ public function __construct(array $allowedProtocols = 
['http', 'https', 'ftp'])
         foreach ($allowedProtocols as $protocol) {
             $this->prefixes[] = $protocol . '://';
         }
+
+        $this->defaultProtocol = $defaultProtocol;
     }
 
     public function getMatchDefinition(): InlineParserMatch
@@ -120,9 +124,9 @@ public function parse(InlineParserContext $inlineContext): 
bool
 
         $cursor->advanceBy(\mb_strlen($url, 'UTF-8'));
 
-        // Auto-prefix 'http://' onto 'www' URLs
+        // Auto-prefix 'http(s)://' onto 'www' URLs
         if (\substr($url, 0, 4) === 'www.') {
-            $inlineContext->getContainer()->appendChild(new Link('http://' . 
$url, $url));
+            $inlineContext->getContainer()->appendChild(new 
Link($this->defaultProtocol . '://' . $url, $url));
 
             return true;
         }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Node/Block/ListBlock.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Node/Block/ListBlock.php
index 74f9ca84..504a38a2 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Node/Block/ListBlock.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Node/Block/ListBlock.php
@@ -27,7 +27,7 @@ class ListBlock extends AbstractBlock implements 
TightBlockInterface
     public const DELIM_PERIOD = 'period';
     public const DELIM_PAREN  = 'paren';
 
-    protected bool $tight = false;
+    protected bool $tight = false; // TODO Make lists tight by default in v3
 
     /** @psalm-readonly */
     protected ListData $listData;
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/FencedCodeParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/FencedCodeParser.php
index 88572c7f..96a5baa4 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/FencedCodeParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/FencedCodeParser.php
@@ -44,7 +44,7 @@ public function tryContinue(Cursor $cursor, 
BlockContinueParserInterface $active
     {
         // Check for closing code fence
         if (! $cursor->isIndented() && $cursor->getNextNonSpaceCharacter() === 
$this->block->getChar()) {
-            $match = RegexHelper::matchFirst('/^(?:`{3,}|~{3,})(?= *$)/', 
$cursor->getLine(), $cursor->getNextNonSpacePosition());
+            $match = RegexHelper::matchFirst('/^(?:`{3,}|~{3,})(?=[ \t]*$)/', 
$cursor->getLine(), $cursor->getNextNonSpacePosition());
             if ($match !== null && \strlen($match[0]) >= 
$this->block->getLength()) {
                 // closing fence - we're at end of line, so we can finalize now
                 return BlockContinue::finished();
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/IndentedCodeParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/IndentedCodeParser.php
index b7c425aa..ac6406fb 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/IndentedCodeParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/IndentedCodeParser.php
@@ -63,21 +63,14 @@ public function addLine(string $line): void
 
     public function closeBlock(): void
     {
-        $reversed = \array_reverse($this->strings->toArray(), true);
-        foreach ($reversed as $index => $line) {
-            if ($line !== '' && $line !== "\n" && ! \preg_match('/^(\n *)$/', 
$line)) {
-                break;
-            }
+        $lines = $this->strings->toArray();
 
-            unset($reversed[$index]);
+        // Note that indented code block cannot be empty, so $lines will 
always have at least one non-empty element
+        while (\preg_match('/^[ \t]*$/', \end($lines))) { // 
@phpstan-ignore-line
+            \array_pop($lines);
         }
 
-        $fixed = \array_reverse($reversed);
-        $tmp   = \implode("\n", $fixed);
-        if (\substr($tmp, -1) !== "\n") {
-            $tmp .= "\n";
-        }
-
-        $this->block->setLiteral($tmp);
+        $this->block->setLiteral(\implode("\n", $lines) . "\n");
+        $this->block->setEndLine($this->block->getStartLine() + \count($lines) 
- 1);
     }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockParser.php
index 4dffb7ac..5a7ee45a 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockParser.php
@@ -27,10 +27,6 @@ final class ListBlockParser extends 
AbstractBlockContinueParser
     /** @psalm-readonly */
     private ListBlock $block;
 
-    private bool $hadBlankLine = false;
-
-    private int $linesAfterBlank = 0;
-
     public function __construct(ListData $listData)
     {
         $this->block = new ListBlock($listData);
@@ -48,32 +44,50 @@ public function isContainer(): bool
 
     public function canContain(AbstractBlock $childBlock): bool
     {
-        if (! $childBlock instanceof ListItem) {
-            return false;
-        }
-
-        // Another list item is being added to this list block.
-        // If the previous line was blank, that means this list
-        // block is "loose" (not tight).
-        if ($this->hadBlankLine && $this->linesAfterBlank === 1) {
-            $this->block->setTight(false);
-            $this->hadBlankLine = false;
-        }
-
-        return true;
+        return $childBlock instanceof ListItem;
     }
 
     public function tryContinue(Cursor $cursor, BlockContinueParserInterface 
$activeBlockParser): ?BlockContinue
     {
-        if ($cursor->isBlank()) {
-            $this->hadBlankLine    = true;
-            $this->linesAfterBlank = 0;
-        } elseif ($this->hadBlankLine) {
-            $this->linesAfterBlank++;
-        }
-
         // List blocks themselves don't have any markers, only list items. So 
try to stay in the list.
         // If there is a block start other than list item, canContain makes 
sure that this list is closed.
         return BlockContinue::at($cursor);
     }
+
+    public function closeBlock(): void
+    {
+        $item = $this->block->firstChild();
+        while ($item instanceof AbstractBlock) {
+            // check for non-final list item ending with blank line:
+            if ($item->next() !== null && self::endsWithBlankLine($item)) {
+                $this->block->setTight(false);
+                break;
+            }
+
+            // recurse into children of list item, to see if there are spaces 
between any of them
+            $subitem = $item->firstChild();
+            while ($subitem instanceof AbstractBlock) {
+                if ($subitem->next() && self::endsWithBlankLine($subitem)) {
+                    $this->block->setTight(false);
+                    break 2;
+                }
+
+                $subitem = $subitem->next();
+            }
+
+            $item = $item->next();
+        }
+
+        $lastChild = $this->block->lastChild();
+        if ($lastChild instanceof AbstractBlock) {
+            $this->block->setEndLine($lastChild->getEndLine());
+        }
+    }
+
+    private static function endsWithBlankLine(AbstractBlock $block): bool
+    {
+        $next = $block->next();
+
+        return $next instanceof AbstractBlock && $block->getEndLine() !== 
$next->getStartLine() - 1;
+    }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockStartParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockStartParser.php
index 65b4535b..a55f6f9d 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockStartParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListBlockStartParser.php
@@ -58,6 +58,7 @@ public function tryStart(Cursor $cursor, 
MarkdownParserStateInterface $parserSta
         if (! ($matched instanceof ListBlockParser) || ! 
$listData->equals($matched->getBlock()->getListData())) {
             $listBlockParser = new ListBlockParser($listData);
             // We start out with assuming a list is tight. If we find a blank 
line, we set it to loose later.
+            // TODO for 3.0: Just make them tight by default in the block so 
we can remove this call
             $listBlockParser->getBlock()->setTight(true);
 
             return BlockStart::of($listBlockParser, 
$listItemParser)->at($cursor);
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListItemParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListItemParser.php
index 73b98be7..739eefcb 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListItemParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Parser/Block/ListItemParser.php
@@ -13,11 +13,9 @@
 
 namespace League\CommonMark\Extension\CommonMark\Parser\Block;
 
-use League\CommonMark\Extension\CommonMark\Node\Block\ListBlock;
 use League\CommonMark\Extension\CommonMark\Node\Block\ListData;
 use League\CommonMark\Extension\CommonMark\Node\Block\ListItem;
 use League\CommonMark\Node\Block\AbstractBlock;
-use League\CommonMark\Node\Block\Paragraph;
 use League\CommonMark\Parser\Block\AbstractBlockContinueParser;
 use League\CommonMark\Parser\Block\BlockContinue;
 use League\CommonMark\Parser\Block\BlockContinueParserInterface;
@@ -28,8 +26,6 @@ final class ListItemParser extends AbstractBlockContinueParser
     /** @psalm-readonly */
     private ListItem $block;
 
-    private bool $hadBlankLine = false;
-
     public function __construct(ListData $listData)
     {
         $this->block = new ListItem($listData);
@@ -47,18 +43,7 @@ public function isContainer(): bool
 
     public function canContain(AbstractBlock $childBlock): bool
     {
-        if ($this->hadBlankLine) {
-            // We saw a blank line in this list item, that means the list 
block is loose.
-            //
-            // spec: if any of its constituent list items directly contain two 
block-level elements with a blank line
-            // between them
-            $parent = $this->block->parent();
-            if ($parent instanceof ListBlock) {
-                $parent->setTight(false);
-            }
-        }
-
-        return true;
+        return ! $childBlock instanceof ListItem;
     }
 
     public function tryContinue(Cursor $cursor, BlockContinueParserInterface 
$activeBlockParser): ?BlockContinue
@@ -69,9 +54,6 @@ public function tryContinue(Cursor $cursor, 
BlockContinueParserInterface $active
                 return BlockContinue::none();
             }
 
-            $activeBlock = $activeBlockParser->getBlock();
-            // If the active block is a code block, blank lines in it should 
not affect if the list is tight.
-            $this->hadBlankLine = $activeBlock instanceof Paragraph || 
$activeBlock instanceof ListItem;
             $cursor->advanceToNextNonSpaceOrTab();
 
             return BlockContinue::at($cursor);
@@ -87,4 +69,14 @@ public function tryContinue(Cursor $cursor, 
BlockContinueParserInterface $active
         // Note: We'll hit this case for lazy continuation lines, they will 
get added later.
         return BlockContinue::none();
     }
+
+    public function closeBlock(): void
+    {
+        if (($lastChild = $this->block->lastChild()) instanceof AbstractBlock) 
{
+            $this->block->setEndLine($lastChild->getEndLine());
+        } else {
+            // Empty list item
+            $this->block->setEndLine($this->block->getStartLine());
+        }
+    }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Renderer/Block/FencedCodeRenderer.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Renderer/Block/FencedCodeRenderer.php
index e7204ea6..8df9a40e 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Renderer/Block/FencedCodeRenderer.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/CommonMark/Renderer/Block/FencedCodeRenderer.php
@@ -41,7 +41,12 @@ public function render(Node $node, 
ChildNodeRendererInterface $childRenderer): \
 
         $infoWords = $node->getInfoWords();
         if (\count($infoWords) !== 0 && $infoWords[0] !== '') {
-            $attrs->append('class', 'language-' . $infoWords[0]);
+            $class = $infoWords[0];
+            if (! \str_starts_with($class, 'language-')) {
+                $class = 'language-' . $class;
+            }
+
+            $attrs->append('class', $class);
         }
 
         return new HtmlElement(
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php
index 97c9d1a4..959930b3 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php
@@ -24,12 +24,19 @@
 
 final class QuoteParser implements InlineParserInterface
 {
+    /**
+     * @deprecated This constant is no longer used and will be removed in a 
future major release
+     */
     public const DOUBLE_QUOTES = [Quote::DOUBLE_QUOTE, 
Quote::DOUBLE_QUOTE_OPENER, Quote::DOUBLE_QUOTE_CLOSER];
+
+    /**
+     * @deprecated This constant is no longer used and will be removed in a 
future major release
+     */
     public const SINGLE_QUOTES = [Quote::SINGLE_QUOTE, 
Quote::SINGLE_QUOTE_OPENER, Quote::SINGLE_QUOTE_CLOSER];
 
     public function getMatchDefinition(): InlineParserMatch
     {
-        return InlineParserMatch::oneOf(...\array_merge(self::DOUBLE_QUOTES, 
self::SINGLE_QUOTES));
+        return InlineParserMatch::oneOf(Quote::SINGLE_QUOTE, 
Quote::DOUBLE_QUOTE);
     }
 
     /**
@@ -40,8 +47,6 @@ public function parse(InlineParserContext $inlineContext): 
bool
         $char   = $inlineContext->getFullMatch();
         $cursor = $inlineContext->getCursor();
 
-        $normalizedCharacter = $this->getNormalizedQuoteCharacter($char);
-
         $charBefore = $cursor->peek(-1);
         if ($charBefore === null) {
             $charBefore = "\n";
@@ -58,28 +63,15 @@ public function parse(InlineParserContext $inlineContext): 
bool
         $canOpen                        = $leftFlanking && ! $rightFlanking;
         $canClose                       = $rightFlanking;
 
-        $node = new Quote($normalizedCharacter, ['delim' => true]);
+        $node = new Quote($char, ['delim' => true]);
         $inlineContext->getContainer()->appendChild($node);
 
         // Add entry to stack to this opener
-        $inlineContext->getDelimiterStack()->push(new 
Delimiter($normalizedCharacter, 1, $node, $canOpen, $canClose));
+        $inlineContext->getDelimiterStack()->push(new Delimiter($char, 1, 
$node, $canOpen, $canClose));
 
         return true;
     }
 
-    private function getNormalizedQuoteCharacter(string $character): string
-    {
-        if (\in_array($character, self::DOUBLE_QUOTES, true)) {
-            return Quote::DOUBLE_QUOTE;
-        }
-
-        if (\in_array($character, self::SINGLE_QUOTES, true)) {
-            return Quote::SINGLE_QUOTE;
-        }
-
-        return $character;
-    }
-
     /**
      * @return bool[]
      */
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Node/Block/Paragraph.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Node/Block/Paragraph.php
index 5b7d17c2..d06d84ea 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Node/Block/Paragraph.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Node/Block/Paragraph.php
@@ -18,4 +18,6 @@
 
 class Paragraph extends AbstractBlock
 {
+    /** @internal */
+    public bool $onlyContainsLinkReferenceDefinitions = false;
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/DocumentBlockParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/DocumentBlockParser.php
index bacb5122..c03c24ef 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/DocumentBlockParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/DocumentBlockParser.php
@@ -15,6 +15,7 @@
 
 use League\CommonMark\Node\Block\AbstractBlock;
 use League\CommonMark\Node\Block\Document;
+use League\CommonMark\Node\Block\Paragraph;
 use League\CommonMark\Parser\Cursor;
 use League\CommonMark\Reference\ReferenceMapInterface;
 
@@ -50,4 +51,30 @@ public function tryContinue(Cursor $cursor, 
BlockContinueParserInterface $active
     {
         return BlockContinue::at($cursor);
     }
+
+    public function closeBlock(): void
+    {
+        $this->removeLinkReferenceDefinitions();
+    }
+
+    private function removeLinkReferenceDefinitions(): void
+    {
+        $emptyNodes = [];
+
+        $walker = $this->document->walker();
+        while ($event = $walker->next()) {
+            $node = $event->getNode();
+            // TODO for v3: It would be great if we could find an alternate 
way to identify such paragraphs.
+            // Unfortunately, we can't simply check for empty paragraphs here 
because inlines haven't been processed yet,
+            // meaning all paragraphs will appear blank here, and we don't 
have a way to check the status of the reference parser
+            // which is attached to the (already-closed) paragraph parser.
+            if ($event->isEntering() && $node instanceof Paragraph && 
$node->onlyContainsLinkReferenceDefinitions) {
+                $emptyNodes[] = $node;
+            }
+        }
+
+        foreach ($emptyNodes as $node) {
+            $node->detach();
+        }
+    }
 }
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/ParagraphParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/ParagraphParser.php
index 1573429f..f9312be9 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/ParagraphParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/Block/ParagraphParser.php
@@ -59,9 +59,7 @@ public function addLine(string $line): void
 
     public function closeBlock(): void
     {
-        if ($this->referenceParser->hasReferences() && 
$this->referenceParser->getParagraphContent() === '') {
-            $this->block->detach();
-        }
+        $this->block->onlyContainsLinkReferenceDefinitions = 
$this->referenceParser->hasReferences() && 
$this->referenceParser->getParagraphContent() === '';
     }
 
     public function parseInlines(InlineParserEngineInterface $inlineParser): 
void
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/MarkdownParser.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/MarkdownParser.php
index dcf9a420..2fecb9ba 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/MarkdownParser.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Parser/MarkdownParser.php
@@ -158,12 +158,13 @@ private function parseLine(string $line): void
                 $unmatchedBlocks = 0;
             }
 
+            $oldBlockLineStart = null;
             if ($blockStart->isReplaceActiveBlockParser()) {
-                $this->prepareActiveBlockParserForReplacement();
+                $oldBlockLineStart = 
$this->prepareActiveBlockParserForReplacement();
             }
 
             foreach ($blockStart->getBlockParsers() as $newBlockParser) {
-                $blockParser    = $this->addChild($newBlockParser);
+                $blockParser    = $this->addChild($newBlockParser, 
$oldBlockLineStart);
                 $tryBlockStarts = $newBlockParser->isContainer();
             }
         }
@@ -176,7 +177,7 @@ private function parseLine(string $line): void
         } else {
             // finalize any blocks not matched
             if ($unmatchedBlocks > 0) {
-                $this->closeBlockParsers($unmatchedBlocks, $this->lineNumber);
+                $this->closeBlockParsers($unmatchedBlocks, $this->lineNumber - 
1);
             }
 
             if (! $blockParser->isContainer()) {
@@ -275,12 +276,12 @@ private function processInlines(): void
      * Add block of type tag as a child of the tip. If the tip can't accept 
children, close and finalize it and try
      * its parent, and so on til we find a block that can accept children.
      */
-    private function addChild(BlockContinueParserInterface $blockParser): 
BlockContinueParserInterface
+    private function addChild(BlockContinueParserInterface $blockParser, ?int 
$startLineNumber = null): BlockContinueParserInterface
     {
-        $blockParser->getBlock()->setStartLine($this->lineNumber);
+        $blockParser->getBlock()->setStartLine($startLineNumber ?? 
$this->lineNumber);
 
         while (! 
$this->getActiveBlockParser()->canContain($blockParser->getBlock())) {
-            $this->closeBlockParsers(1, $this->lineNumber - 1);
+            $this->closeBlockParsers(1, ($startLineNumber ?? 
$this->lineNumber) - 1);
         }
 
         
$this->getActiveBlockParser()->getBlock()->appendChild($blockParser->getBlock());
@@ -307,7 +308,10 @@ private function deactivateBlockParser(): 
BlockContinueParserInterface
         return $popped;
     }
 
-    private function prepareActiveBlockParserForReplacement(): void
+    /**
+     * @return int|null The line number where the old block started
+     */
+    private function prepareActiveBlockParserForReplacement(): ?int
     {
         // Note that we don't want to parse inlines or finalize this block, as 
it's getting replaced.
         $old = $this->deactivateBlockParser();
@@ -317,6 +321,8 @@ private function prepareActiveBlockParserForReplacement(): 
void
         }
 
         $old->getBlock()->detach();
+
+        return $old->getBlock()->getStartLine();
     }
 
     /**
diff --git 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Util/RegexHelper.php
 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Util/RegexHelper.php
index 44e7e3ad..a89e7bda 100644
--- 
a/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Util/RegexHelper.php
+++ 
b/dokuwiki/lib/plugins/commonmark/vendor/league/commonmark/src/Util/RegexHelper.php
@@ -41,7 +41,7 @@ final class RegexHelper
     public const PARTIAL_REG_CHAR              = '[^\\\\()\x00-\x20]';
     public const PARTIAL_IN_PARENS_NOSP        = '\((' . 
self::PARTIAL_REG_CHAR . '|' . self::PARTIAL_ESCAPED_CHAR . '|\\\\)*\)';
     public const PARTIAL_TAGNAME               = '[a-z][a-z0-9-]*';
-    public const PARTIAL_BLOCKTAGNAME          = 
'(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)';
+    public const PARTIAL_BLOCKTAGNAME          = 
'(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)';
     public const PARTIAL_ATTRIBUTENAME         = '[a-z_:][a-z0-9:._-]*';
     public const PARTIAL_UNQUOTEDVALUE         = '[^"\'=<>`\x00-\x20]+';
     public const PARTIAL_SINGLEQUOTEDVALUE     = '\'[^\']*\'';
@@ -53,9 +53,9 @@ final class RegexHelper
     public const PARTIAL_CLOSETAG              = '<\/' . self::PARTIAL_TAGNAME 
. '\s*[>]';
     public const PARTIAL_OPENBLOCKTAG          = '<' . 
self::PARTIAL_BLOCKTAGNAME . self::PARTIAL_ATTRIBUTE . '*' . '\s*\/?>';
     public const PARTIAL_CLOSEBLOCKTAG         = '<\/' . 
self::PARTIAL_BLOCKTAGNAME . '\s*[>]';
-    public const PARTIAL_HTMLCOMMENT           = 
'<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->';
+    public const PARTIAL_HTMLCOMMENT           = 
'<!-->|<!--->|<!--[\s\S]*?-->';
     public const PARTIAL_PROCESSINGINSTRUCTION = '[<][?][\s\S]*?[?][>]';
-    public const PARTIAL_DECLARATION           = '<![A-Z]+' . '\s+[^>]*>';
+    public const PARTIAL_DECLARATION           = '<![A-Za-z]+' . '[^>]*>';
     public const PARTIAL_CDATA                 = '<!\[CDATA\[[\s\S]*?]\]>';
     public const PARTIAL_HTMLTAG               = '(?:' . self::PARTIAL_OPENTAG 
. '|' . self::PARTIAL_CLOSETAG . '|' . self::PARTIAL_HTMLCOMMENT . '|' .
         self::PARTIAL_PROCESSINGINSTRUCTION . '|' . self::PARTIAL_DECLARATION 
. '|' . self::PARTIAL_CDATA . ')';
@@ -65,7 +65,7 @@ final class RegexHelper
         '|' . '\'(' . self::PARTIAL_ESCAPED_CHAR . '|[^\'\x00])*\'' .
         '|' . '\((' . self::PARTIAL_ESCAPED_CHAR . '|[^()\x00])*\))';
 
-    public const REGEX_PUNCTUATION        = 
'/^[\x{2000}-\x{206F}\x{2E00}-\x{2E7F}\p{Pc}\p{Pd}\p{Pe}\p{Pf}\p{Pi}\p{Po}\p{Ps}\\\\\'!"#\$%&\(\)\*\+,\-\.\\/:;<=>\?@\[\]\^_`\{\|\}~]/u';
+    public const REGEX_PUNCTUATION        = 
'/^[!"#$%&\'()*+,\-.\\/:;<=>?@\\[\\]\\\\^_`{|}~\p{P}\p{S}]/u';
     public const REGEX_UNSAFE_PROTOCOL    = 
'/^javascript:|vbscript:|file:|data:/i';
     public const REGEX_SAFE_DATA_PROTOCOL = 
'/^data:image\/(?:png|gif|jpeg|webp)/i';
     public const REGEX_NON_SPACE          = '/[^ \t\f\v\r\n]/';

Reply via email to