From d2701df350a4756b9847f844c76ddbf4bf29412c Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Fri, 29 Aug 2025 12:43:33 +0200 Subject: [PATCH 1/8] #26447: render info boxes --- src/MacroReplacer/InfoBoxReplacer.php | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/MacroReplacer/InfoBoxReplacer.php diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php new file mode 100644 index 0000000..377f8db --- /dev/null +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -0,0 +1,41 @@ +]*>\s*(.*?)<\/ac:rich-text-body>\s*<\/div>/is', + function ($matches) { + $type = strtolower($matches[1]); + $content = $matches[2]; + + if (preg_match('/^\s*]*>(.*?)<\/p>\s*$/is', $content, $inner)) { + $content = $inner[1]; + } + + return sprintf( + $this->infoBoxStyling(), + $content + ); + }, + $haystack + ); + + return $haystack; + } + + private function infoBoxStyling(): string + { + return ' +
+ +
%s
+
+ '; + } +} From 66258ec17c9313a5c081ee1ea0231f4e37d7ca0a Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Fri, 29 Aug 2025 15:09:32 +0200 Subject: [PATCH 2/8] #26447: render yellow panels --- src/MacroReplacer/InfoBoxReplacer.php | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php index 377f8db..628fe28 100644 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -8,25 +8,28 @@ class InfoBoxReplacer implements MacroReplacerInterface { public function replace(string $haystack): string { - $haystack = preg_replace_callback( - '/
]*>\s*(.*?)<\/ac:rich-text-body>\s*<\/div>/is', + return preg_replace_callback( + '/
]*>(.*?)<\/div>/is', function ($matches) { $type = strtolower($matches[1]); $content = $matches[2]; + $boxStyling = match ($type) { + 'info' => $this->infoBoxStyling(), + 'panel' => $this->warningBoxStyling(), + default => '%s', + }; - if (preg_match('/^\s*]*>(.*?)<\/p>\s*$/is', $content, $inner)) { + if (preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $content, $inner)) { $content = $inner[1]; } return sprintf( - $this->infoBoxStyling(), + $boxStyling, $content ); }, $haystack ); - - return $haystack; } private function infoBoxStyling(): string @@ -38,4 +41,16 @@ private function infoBoxStyling(): string
'; } + + private function warningBoxStyling(): string + { + return ' +
+

+ +

+
%s
+
+ '; + } } From 524f39e3642200c2d6d682032b6fe790a7c18f04 Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Fri, 29 Aug 2025 15:19:49 +0200 Subject: [PATCH 3/8] #26447: improve infobox design --- src/MacroReplacer/InfoBoxReplacer.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php index 628fe28..c0782dd 100644 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -35,8 +35,10 @@ function ($matches) { private function infoBoxStyling(): string { return ' -
- +
+

+ +

%s
'; @@ -47,7 +49,7 @@ private function warningBoxStyling(): string return '

- +

%s
From 08ab1820ea9ffc8706c025e521b9dd357c0303e1 Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Fri, 29 Aug 2025 15:26:44 +0200 Subject: [PATCH 4/8] #26447: refactor --- src/MacroReplacer/InfoBoxReplacer.php | 52 ++++++++++++--------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php index c0782dd..2e2dd5d 100644 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -13,46 +13,38 @@ public function replace(string $haystack): string function ($matches) { $type = strtolower($matches[1]); $content = $matches[2]; - $boxStyling = match ($type) { - 'info' => $this->infoBoxStyling(), - 'panel' => $this->warningBoxStyling(), - default => '%s', - }; + switch ($type) { + case 'panel': + $backgroundColor = 'bg-yellow-100'; + $iconHtml = ''; + break; + case 'info': + $backgroundColor = 'bg-blue-100'; + $iconHtml = ''; + break; + default: + $backgroundColor = ''; + $iconHtml = ''; + break; + } if (preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $content, $inner)) { $content = $inner[1]; } return sprintf( - $boxStyling, + ' +
+

%s

+
%s
+
+ ', + $backgroundColor, + $iconHtml, $content ); }, $haystack ); } - - private function infoBoxStyling(): string - { - return ' -
-

- -

-
%s
-
- '; - } - - private function warningBoxStyling(): string - { - return ' -
-

- -

-
%s
-
- '; - } } From 9da95c1c17373ea686142f6dbe3693f9b72c62d0 Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Fri, 29 Aug 2025 15:54:14 +0200 Subject: [PATCH 5/8] #26447: add margin --- src/MacroReplacer/InfoBoxReplacer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php index 2e2dd5d..391d31c 100644 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -34,7 +34,7 @@ function ($matches) { return sprintf( ' -
+

%s

%s
From 93b97a624c8dba90dee2c16cfa38e5de5d2faa3d Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Mon, 1 Sep 2025 14:30:26 +0200 Subject: [PATCH 6/8] #26672: remove tailwind/agp styling --- src/MacroReplacer/InfoBoxReplacer.php | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php index 391d31c..2747696 100644 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ b/src/MacroReplacer/InfoBoxReplacer.php @@ -13,20 +13,6 @@ public function replace(string $haystack): string function ($matches) { $type = strtolower($matches[1]); $content = $matches[2]; - switch ($type) { - case 'panel': - $backgroundColor = 'bg-yellow-100'; - $iconHtml = ''; - break; - case 'info': - $backgroundColor = 'bg-blue-100'; - $iconHtml = ''; - break; - default: - $backgroundColor = ''; - $iconHtml = ''; - break; - } if (preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $content, $inner)) { $content = $inner[1]; @@ -34,13 +20,11 @@ function ($matches) { return sprintf( ' -
-

%s

+
%s
', - $backgroundColor, - $iconHtml, + $type, $content ); }, From 637a2159c221e6e2f1cc68525d799283ba36b68c Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Tue, 2 Sep 2025 15:38:26 +0200 Subject: [PATCH 7/8] #26672: add replacer for generic and adf-panels; remove infoboxReplacer --- src/MacroReplacer/AdfPanelReplacer.php | 40 ++++++++++++++ src/MacroReplacer/GenericPanelReplacer.php | 39 ++++++++++++++ src/MacroReplacer/InfoBoxReplacer.php | 34 ------------ src/MacroReplacer/StructuredMacroReplacer.php | 53 ++++++++++--------- 4 files changed, 108 insertions(+), 58 deletions(-) create mode 100644 src/MacroReplacer/AdfPanelReplacer.php create mode 100644 src/MacroReplacer/GenericPanelReplacer.php delete mode 100644 src/MacroReplacer/InfoBoxReplacer.php diff --git a/src/MacroReplacer/AdfPanelReplacer.php b/src/MacroReplacer/AdfPanelReplacer.php new file mode 100644 index 0000000..c500a82 --- /dev/null +++ b/src/MacroReplacer/AdfPanelReplacer.php @@ -0,0 +1,40 @@ + with
+ */ +class AdfPanelReplacer implements MacroReplacerInterface +{ + public function replace(string $haystack): string + { + $result = preg_replace_callback( + '/]*>(.*?)<\/ac:adf-node>/is', + function ($match) { + $content = $match[1]; + + // Extract panel-type + preg_match('/(.*?)<\/ac:adf-attribute>/is', $content, $typeMatch); + $panelType = strtolower($typeMatch[1] ?? 'custom'); + + // Extract inner content + preg_match('/]*>(.*?)<\/ac:adf-content>/is', $content, $bodyMatch); + $body = $bodyMatch[1] ?? $content; + + return sprintf('
%s
', $panelType, $body); + }, + $haystack + ); + + $result = preg_replace( + '/]*>(.*?)<\/ac:adf-extension>/is', + '$1', + $result + ); + + return $result; + } +} diff --git a/src/MacroReplacer/GenericPanelReplacer.php b/src/MacroReplacer/GenericPanelReplacer.php new file mode 100644 index 0000000..bdc515a --- /dev/null +++ b/src/MacroReplacer/GenericPanelReplacer.php @@ -0,0 +1,39 @@ + (custom panels) + * with
+ */ +class GenericPanelReplacer implements MacroReplacerInterface +{ + public function replace(string $haystack): string + { + return preg_replace_callback( + '/]*>(.*?)<\/ac:structured-macro>/is', + function ($match) { + $content = $match[1]; + + // Extract parameters + preg_match('/#(.*?)<\/ac:parameter>/is', $content, $bgMatch); + preg_match('/:(.*?):<\/ac:parameter>/is', $content, $iconMatch); + preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $content, $bodyMatch); + + $bgColor = $bgMatch[1] ?? ''; + $icon = $iconMatch[1] ?? ''; + $body = $bodyMatch[1] ?? $content; + + return sprintf( + '
%s
', + htmlspecialchars($bgColor, ENT_QUOTES), + htmlspecialchars($icon, ENT_QUOTES), + $body + ); + }, + $haystack + ); + } +} diff --git a/src/MacroReplacer/InfoBoxReplacer.php b/src/MacroReplacer/InfoBoxReplacer.php deleted file mode 100644 index 2747696..0000000 --- a/src/MacroReplacer/InfoBoxReplacer.php +++ /dev/null @@ -1,34 +0,0 @@ -]*>(.*?)<\/div>/is', - function ($matches) { - $type = strtolower($matches[1]); - $content = $matches[2]; - - if (preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $content, $inner)) { - $content = $inner[1]; - } - - return sprintf( - ' -
-
%s
-
- ', - $type, - $content - ); - }, - $haystack - ); - } -} diff --git a/src/MacroReplacer/StructuredMacroReplacer.php b/src/MacroReplacer/StructuredMacroReplacer.php index d5c7b1a..8d9b683 100755 --- a/src/MacroReplacer/StructuredMacroReplacer.php +++ b/src/MacroReplacer/StructuredMacroReplacer.php @@ -1,24 +1,29 @@ - with
with class - */ -class StructuredMacroReplacer implements MacroReplacerInterface -{ - public function replace(string $haystack): string - { - return preg_replace_callback( - '/]*>(.*?)<\/ac:structured-macro>/is', - function ($match) { - $macroName = $match[1]; - $macroContent = $match[2]; - return '
' . $macroContent . '
'; - }, - $haystack - ); - } -} + with
with class + */ +class StructuredMacroReplacer implements MacroReplacerInterface +{ + public function replace(string $haystack): string + { + return preg_replace_callback( + '/]*>(.*?)<\/ac:structured-macro>/is', + function ($match) { + $macroName = $match[1]; + $macroContent = $match[2]; + + if (preg_match('/]*>(.*?)<\/ac:rich-text-body>/is', $macroContent, $inner)) { + $macroContent = $inner[1]; + } + + return sprintf('
%s
', $macroName, $macroContent); + }, + $haystack + ); + } +} From 04b509020582ded41a6a4f631c1fe842312ea9de Mon Sep 17 00:00:00 2001 From: MarkoWystrach Date: Wed, 3 Sep 2025 10:56:14 +0200 Subject: [PATCH 8/8] #26447: remove "confluence"-naming; color and icon attributes for custom panels --- src/MacroReplacer/AdfPanelReplacer.php | 2 +- src/MacroReplacer/GenericPanelReplacer.php | 2 +- src/MacroReplacer/StructuredMacroReplacer.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MacroReplacer/AdfPanelReplacer.php b/src/MacroReplacer/AdfPanelReplacer.php index c500a82..60e9844 100644 --- a/src/MacroReplacer/AdfPanelReplacer.php +++ b/src/MacroReplacer/AdfPanelReplacer.php @@ -24,7 +24,7 @@ function ($match) { preg_match('/]*>(.*?)<\/ac:adf-content>/is', $content, $bodyMatch); $body = $bodyMatch[1] ?? $content; - return sprintf('
%s
', $panelType, $body); + return sprintf('
%s
', $panelType, $body); }, $haystack ); diff --git a/src/MacroReplacer/GenericPanelReplacer.php b/src/MacroReplacer/GenericPanelReplacer.php index bdc515a..c4ce998 100644 --- a/src/MacroReplacer/GenericPanelReplacer.php +++ b/src/MacroReplacer/GenericPanelReplacer.php @@ -27,7 +27,7 @@ function ($match) { $body = $bodyMatch[1] ?? $content; return sprintf( - '
%s
', + '
%s
', htmlspecialchars($bgColor, ENT_QUOTES), htmlspecialchars($icon, ENT_QUOTES), $body diff --git a/src/MacroReplacer/StructuredMacroReplacer.php b/src/MacroReplacer/StructuredMacroReplacer.php index 8d9b683..146bdbc 100755 --- a/src/MacroReplacer/StructuredMacroReplacer.php +++ b/src/MacroReplacer/StructuredMacroReplacer.php @@ -21,7 +21,7 @@ function ($match) { $macroContent = $inner[1]; } - return sprintf('
%s
', $macroName, $macroContent); + return sprintf('
%s
', $macroName, $macroContent); }, $haystack );