From d3add366371bdd8c0f96ae2ca2f25530ee8acdc3 Mon Sep 17 00:00:00 2001 From: jf-cbd Date: Mon, 15 Sep 2025 11:21:51 +0200 Subject: [PATCH 1/2] =?UTF-8?q?N=C2=B08123=20-=20Improve=20on=20mention=20?= =?UTF-8?q?data=20parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/utils.inc.php | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/application/utils.inc.php b/application/utils.inc.php index 21d5eb1e82..a97b9e29db 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -3094,7 +3094,6 @@ public static function ToAcronym(string $sInput): string * Note: Only works for backoffice URLs for now * * @param string $sText Text containing the mentioned objects to be found - * @param string $sFormat {@uses static::ENUM_TEXT_FORMAT_HTML, ...} * * @return array Array of object classes / IDs for the ones found in $sText * @@ -3109,27 +3108,29 @@ public static function ToAcronym(string $sInput): string public static function GetMentionedObjectsFromText(string $sText): array { $aMentionedObjects = []; - $aMentionMatches = []; - $sText = html_entity_decode($sText); + $oDom = new \DOMDocument(); + libxml_use_internal_errors(true); // to keep processing even in case of "invalid" HTML, cf. testGetMentionedObjectsFromText + $oDom->loadHTML($sText); - preg_match_all('/]*)data-object-class="([^"]*)"\s.*data-object-key="([^"]*)"/Ui', $sText, $aMentionMatches); - foreach ($aMentionMatches[0] as $iMatchIdx => $sCompleteMatch) { - $sMatchedClass = $aMentionMatches[2][$iMatchIdx]; - $sMatchedId = $aMentionMatches[3][$iMatchIdx]; + $oXpath = new \DOMXPath($oDom); + $oNodes = $oXpath->query('//a[@data-object-class and @data-object-key]'); + + foreach ($oNodes as $oNode) { + $sObjClass = $oNode->getAttribute('data-object-class'); + $sObjId = $oNode->getAttribute('data-object-key'); // Prepare array for matched class if not already present - if (!array_key_exists($sMatchedClass, $aMentionedObjects)) { - $aMentionedObjects[$sMatchedClass] = array(); + if (!array_key_exists($sObjClass, $aMentionedObjects)) { + $aMentionedObjects[$sObjClass] = []; } // Add matched ID if not already there - if (!in_array($sMatchedId, $aMentionedObjects[$sMatchedClass])) { - $aMentionedObjects[$sMatchedClass][] = $sMatchedId; + if (!in_array($sObjId, $aMentionedObjects[$sObjClass])) { + $aMentionedObjects[$sObjClass][] = $sObjId; } } return $aMentionedObjects; } - /** * Note: This method is not ideal, but other solutions seemed even less ideal: * * Add a "$sMaxLength" param. to utils::ToAcronym(): Does not work for every use cases (see corresponding ticket) as in some parts utils::ToAcronym isn't necessarly meant to be used in a medallion. From d0a1e8bef78872685b266514d67c8e738c6079db Mon Sep 17 00:00:00 2001 From: jf-cbd Date: Mon, 15 Sep 2025 11:34:22 +0200 Subject: [PATCH 2/2] Renaming + formatting --- application/utils.inc.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/application/utils.inc.php b/application/utils.inc.php index a97b9e29db..951c8c3b87 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -3115,9 +3115,9 @@ public static function GetMentionedObjectsFromText(string $sText): array $oXpath = new \DOMXPath($oDom); $oNodes = $oXpath->query('//a[@data-object-class and @data-object-key]'); - foreach ($oNodes as $oNode) { - $sObjClass = $oNode->getAttribute('data-object-class'); - $sObjId = $oNode->getAttribute('data-object-key'); + foreach ($oNodes as $oObjNode) { + $sObjClass = $oObjNode->getAttribute('data-object-class'); + $sObjId = $oObjNode->getAttribute('data-object-key'); // Prepare array for matched class if not already present if (!array_key_exists($sObjClass, $aMentionedObjects)) { @@ -3131,6 +3131,7 @@ public static function GetMentionedObjectsFromText(string $sText): array return $aMentionedObjects; } + /** * Note: This method is not ideal, but other solutions seemed even less ideal: * * Add a "$sMaxLength" param. to utils::ToAcronym(): Does not work for every use cases (see corresponding ticket) as in some parts utils::ToAcronym isn't necessarly meant to be used in a medallion.