From ce1fce989fedab843075f0e85136c89cd3857435 Mon Sep 17 00:00:00 2001 From: Sergey Grigorjev Date: Wed, 2 Oct 2024 16:42:08 +0300 Subject: [PATCH] Added extension node (used in Confluence documents) --- doc/api.md | 2 + src/Builder/ExtensionBuilder.php | 23 ++++ src/Exporter/Html/HtmlExporter.php | 3 + .../Html/Inline/ExtensionExporter.php | 18 +++ src/Node/Block/Document.php | 4 + src/Node/Block/Paragraph.php | 2 + src/Node/Inline/Extension.php | 45 ++++++++ .../Html/Block/DocumentExporterTest.php | 16 +++ tests/Node/Inline/ExtensionTest.php | 105 ++++++++++++++++++ 9 files changed, 218 insertions(+) create mode 100644 src/Builder/ExtensionBuilder.php create mode 100644 src/Exporter/Html/Inline/ExtensionExporter.php create mode 100644 src/Node/Inline/Extension.php create mode 100644 tests/Node/Inline/ExtensionTest.php diff --git a/doc/api.md b/doc/api.md index e87f3d3..49aabdb 100644 --- a/doc/api.md +++ b/doc/api.md @@ -6,6 +6,7 @@ Methods: - `Document::bulletlist()` appends a [bulletList](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/bulletList/) block node - `Document::codeblock()` appends a [codeBlock](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/codeBlock/) block node - `Document::expand()` appends a [expand]() node +- `Document::extension()` appends an `extension` node - `Document::heading()` appends a [heading](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/heading/) block node - `Document::mediaGroup()` appends a [mediaGroup](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/mediaGroup/) block node - `Document::mediaSingle()` appends a [mediaSingle](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/mediaSingle/) block node @@ -120,6 +121,7 @@ Methods: ## `DH\Adf\Node\Block\Paragraph` class materializes a [paragraph](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/paragraph/) block node Methods: - `Paragraph::bulletlist()` appends a [bulletList](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/bulletList/) block node +- `Document::extension()` appends an `extension` node - `Paragraph::heading()` appends a [heading](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/heading/) block node - `Paragraph::orderedlist()` appends a [orderedList](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/orderedList/) block node - `Paragraph::paragraph()` appends a [paragraph](https://developer.atlassian.com/cloud/jira/platform/apis/document/nodes/paragraph/) block node diff --git a/src/Builder/ExtensionBuilder.php b/src/Builder/ExtensionBuilder.php new file mode 100644 index 0000000..cbd6049 --- /dev/null +++ b/src/Builder/ExtensionBuilder.php @@ -0,0 +1,23 @@ +append($mention); + + return $this; + } +} diff --git a/src/Exporter/Html/HtmlExporter.php b/src/Exporter/Html/HtmlExporter.php index 8eddd9f..3e3284f 100644 --- a/src/Exporter/Html/HtmlExporter.php +++ b/src/Exporter/Html/HtmlExporter.php @@ -25,6 +25,7 @@ use DH\Adf\Exporter\Html\Child\TableRowExporter; use DH\Adf\Exporter\Html\Inline\DateExporter; use DH\Adf\Exporter\Html\Inline\EmojiExporter; +use DH\Adf\Exporter\Html\Inline\ExtensionExporter; use DH\Adf\Exporter\Html\Inline\HardbreakExporter; use DH\Adf\Exporter\Html\Inline\InlineCardExporter; use DH\Adf\Exporter\Html\Inline\MentionExporter; @@ -59,6 +60,7 @@ use DH\Adf\Node\Child\TableRow; use DH\Adf\Node\Inline\Date; use DH\Adf\Node\Inline\Emoji; +use DH\Adf\Node\Inline\Extension; use DH\Adf\Node\Inline\Hardbreak; use DH\Adf\Node\Inline\InlineCard; use DH\Adf\Node\Inline\Mention; @@ -103,6 +105,7 @@ abstract class HtmlExporter implements ExporterInterface // inline nodes Emoji::class => EmojiExporter::class, + Extension::class => ExtensionExporter::class, Hardbreak::class => HardbreakExporter::class, Mention::class => MentionExporter::class, Text::class => TextExporter::class, diff --git a/src/Exporter/Html/Inline/ExtensionExporter.php b/src/Exporter/Html/Inline/ExtensionExporter.php new file mode 100644 index 0000000..c0024a5 --- /dev/null +++ b/src/Exporter/Html/Inline/ExtensionExporter.php @@ -0,0 +1,18 @@ +node instanceof Extension); + + return '
The contents of the extension cannot be exported.
'; + } +} diff --git a/src/Node/Block/Document.php b/src/Node/Block/Document.php index ccf1b07..f7ede12 100644 --- a/src/Node/Block/Document.php +++ b/src/Node/Block/Document.php @@ -8,6 +8,7 @@ use DH\Adf\Builder\BulletListBuilder; use DH\Adf\Builder\CodeblockBuilder; use DH\Adf\Builder\ExpandBuilder; +use DH\Adf\Builder\ExtensionBuilder; use DH\Adf\Builder\HeadingBuilder; use DH\Adf\Builder\MediaGroupBuilder; use DH\Adf\Builder\MediaSingleBuilder; @@ -17,6 +18,7 @@ use DH\Adf\Builder\RuleBuilder; use DH\Adf\Builder\TableBuilder; use DH\Adf\Node\BlockNode; +use DH\Adf\Node\Inline\Extension; use JsonSerializable; /** @@ -27,6 +29,7 @@ class Document extends BlockNode implements JsonSerializable use BlockquoteBuilder; use BulletListBuilder; use CodeblockBuilder; + use ExtensionBuilder; use HeadingBuilder; use MediaGroupBuilder; use MediaSingleBuilder; @@ -42,6 +45,7 @@ class Document extends BlockNode implements JsonSerializable Blockquote::class, BulletList::class, CodeBlock::class, + Extension::class, Heading::class, MediaGroup::class, MediaSingle::class, diff --git a/src/Node/Block/Paragraph.php b/src/Node/Block/Paragraph.php index 28911bf..8569b6f 100644 --- a/src/Node/Block/Paragraph.php +++ b/src/Node/Block/Paragraph.php @@ -4,6 +4,7 @@ namespace DH\Adf\Node\Block; +use DH\Adf\Builder\ExtensionBuilder; use DH\Adf\Builder\InlineNodeBuilder; use DH\Adf\Builder\TextBuilder; use DH\Adf\Node\BlockNode; @@ -16,6 +17,7 @@ */ class Paragraph extends BlockNode implements JsonSerializable { + use ExtensionBuilder; use InlineNodeBuilder; use TextBuilder; diff --git a/src/Node/Inline/Extension.php b/src/Node/Inline/Extension.php new file mode 100644 index 0000000..45850cd --- /dev/null +++ b/src/Node/Inline/Extension.php @@ -0,0 +1,45 @@ +layout = $layout; + $this->extensionType = $extensionType; + $this->extensionKey = $extensionKey; + $this->parameters = $parameters; + $this->localId = $localId; + } + + protected function attrs(): array + { + $attrs = parent::attrs(); + $attrs['layout'] = $this->layout; + $attrs['extensionType'] = $this->extensionType; + $attrs['extensionKey'] = $this->extensionKey; + if ($this->parameters) { + $attrs['parameters'] = $this->parameters; + } + $attrs['localId'] = $this->localId; + + return $attrs; + } +} diff --git a/tests/Exporter/Html/Block/DocumentExporterTest.php b/tests/Exporter/Html/Block/DocumentExporterTest.php index 2b69715..49a3424 100644 --- a/tests/Exporter/Html/Block/DocumentExporterTest.php +++ b/tests/Exporter/Html/Block/DocumentExporterTest.php @@ -253,6 +253,22 @@ public function testDocumentWithTable(): void self::assertSame('

header 1

header 2

cell 1

cell 2

', $exporter->export()); } + public function testDocumentWithExtension() + { + $document = (new Document()) + ->extension('default', + 'com.atlassian.confluence.macro.core', + 'toc', + [], + '123cad9c-95d8-49df-8b99-00886ba0af5d', + ) + ; + + $exporter = new DocumentExporter($document); + + self::assertSame('
The contents of the extension cannot be exported.
', $exporter->export()); + } + public function testLoad(): void { $json = <<<'TXT' diff --git a/tests/Node/Inline/ExtensionTest.php b/tests/Node/Inline/ExtensionTest.php new file mode 100644 index 0000000..13c015e --- /dev/null +++ b/tests/Node/Inline/ExtensionTest.php @@ -0,0 +1,105 @@ + [ + 'minLevel' => [ + 'value' => '1', + ], + 'maxLevel' => [ + 'value' => '3', + ], + 'outline' => [ + 'value' => 'false', + ], + 'type' => [ + 'value' => 'list', + ], + 'printable' => [ + 'value' => 'false', + ], + ], + ], + '123cad9c-95d8-49df-8b99-00886ba0af5d', + ); + $doc = $extension->toJson(); + + self::assertJsonStringEqualsJsonString($doc, json_encode([ + 'type' => 'extension', + 'attrs' => [ + "extensionKey" => "toc", + "extensionType" => "com.atlassian.confluence.macro.core", + "layout" => "default", + "localId" => "123cad9c-95d8-49df-8b99-00886ba0af5d", + "parameters" => [ + "macroParams" => [ + "maxLevel" => [ + "value" => "3" + ], + "minLevel" => [ + "value" => "1" + ], + "outline" => [ + "value" => "false" + ], + "printable" => [ + "value" => "false" + ], + "type" => [ + "value" => "list" + ] + ] + ], + ], + ])); + } + + public function testExtensionToDocument(): void + { + $doc = (new Document()) + ->extension( + 'default', + 'com.atlassian.confluence.macro.core', + 'toc', + [], + '123cad9c-95d8-49df-8b99-00886ba0af5d', + ) + ->toJson(); + + self::assertJsonStringEqualsJsonString($doc, json_encode([ + 'version' => 1, + 'type' => 'doc', + 'content' => [ + [ + 'type' => 'extension', + 'attrs' => [ + "extensionKey" => "toc", + "extensionType" => "com.atlassian.confluence.macro.core", + "layout" => "default", + "localId" => "123cad9c-95d8-49df-8b99-00886ba0af5d" + ], + ], + ], + ])); + } +}