Passed
Push — main ( 67734d...d50340 )
by Damien
01:53
created

HtmlExporter::includeMedia()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DH\Adf\Exporter\Html;
6
7
use DH\Adf\Exporter\ExporterInterface;
8
use DH\Adf\Exporter\Html\Block\BlockquoteExporter;
9
use DH\Adf\Exporter\Html\Block\BulletListExporter;
10
use DH\Adf\Exporter\Html\Block\CodeBlockExporter;
11
use DH\Adf\Exporter\Html\Block\DocumentExporter;
12
use DH\Adf\Exporter\Html\Block\ExpandExporter;
13
use DH\Adf\Exporter\Html\Block\HeadingExporter;
14
use DH\Adf\Exporter\Html\Block\MediaGroupExporter;
15
use DH\Adf\Exporter\Html\Block\MediaSingleExporter;
16
use DH\Adf\Exporter\Html\Block\OrderedListExporter;
17
use DH\Adf\Exporter\Html\Block\PanelExporter;
18
use DH\Adf\Exporter\Html\Block\ParagraphExporter;
19
use DH\Adf\Exporter\Html\Block\RuleExporter;
20
use DH\Adf\Exporter\Html\Block\TableExporter;
21
use DH\Adf\Exporter\Html\Block\TaskListExporter;
22
use DH\Adf\Exporter\Html\Child\ListItemExporter;
23
use DH\Adf\Exporter\Html\Child\MediaExporter;
24
use DH\Adf\Exporter\Html\Child\TableCellExporter;
25
use DH\Adf\Exporter\Html\Child\TableHeaderExporter;
26
use DH\Adf\Exporter\Html\Child\TableRowExporter;
27
use DH\Adf\Exporter\Html\Child\TaskItemExporter;
28
use DH\Adf\Exporter\Html\Inline\DateExporter;
29
use DH\Adf\Exporter\Html\Inline\EmojiExporter;
30
use DH\Adf\Exporter\Html\Inline\HardbreakExporter;
31
use DH\Adf\Exporter\Html\Inline\InlineCardExporter;
32
use DH\Adf\Exporter\Html\Inline\MentionExporter;
33
use DH\Adf\Exporter\Html\Inline\StatusExporter;
34
use DH\Adf\Exporter\Html\Inline\TextExporter;
35
use DH\Adf\Exporter\Html\Mark\CodeExporter;
36
use DH\Adf\Exporter\Html\Mark\EmExporter;
37
use DH\Adf\Exporter\Html\Mark\LinkExporter;
38
use DH\Adf\Exporter\Html\Mark\StrikeExporter;
39
use DH\Adf\Exporter\Html\Mark\StrongExporter;
40
use DH\Adf\Exporter\Html\Mark\SubsupExporter;
41
use DH\Adf\Exporter\Html\Mark\TextColorExporter;
42
use DH\Adf\Exporter\Html\Mark\UnderlineExporter;
43
use DH\Adf\Node\Block\Blockquote;
44
use DH\Adf\Node\Block\BulletList;
45
use DH\Adf\Node\Block\CodeBlock;
46
use DH\Adf\Node\Block\Document;
47
use DH\Adf\Node\Block\Expand;
48
use DH\Adf\Node\Block\Heading;
49
use DH\Adf\Node\Block\MediaGroup;
50
use DH\Adf\Node\Block\MediaSingle;
51
use DH\Adf\Node\Block\OrderedList;
52
use DH\Adf\Node\Block\Panel;
53
use DH\Adf\Node\Block\Paragraph;
54
use DH\Adf\Node\Block\Rule;
55
use DH\Adf\Node\Block\Table;
56
use DH\Adf\Node\Block\TaskList;
57
use DH\Adf\Node\BlockNode;
58
use DH\Adf\Node\Child\ListItem;
59
use DH\Adf\Node\Child\Media;
60
use DH\Adf\Node\Child\TableCell;
61
use DH\Adf\Node\Child\TableHeader;
62
use DH\Adf\Node\Child\TableRow;
63
use DH\Adf\Node\Child\TaskItem;
64
use DH\Adf\Node\Inline\Date;
65
use DH\Adf\Node\Inline\Emoji;
66
use DH\Adf\Node\Inline\Hardbreak;
67
use DH\Adf\Node\Inline\InlineCard;
68
use DH\Adf\Node\Inline\Mention;
69
use DH\Adf\Node\Inline\Status;
70
use DH\Adf\Node\Inline\Text;
71
use DH\Adf\Node\InlineNode;
72
use DH\Adf\Node\Mark\Code;
73
use DH\Adf\Node\Mark\Em;
74
use DH\Adf\Node\Mark\Link;
75
use DH\Adf\Node\Mark\Strike;
76
use DH\Adf\Node\Mark\Strong;
77
use DH\Adf\Node\Mark\Subsup;
78
use DH\Adf\Node\Mark\TextColor;
79
use DH\Adf\Node\Mark\Underline;
80
use DH\Adf\Node\Node;
81
82
abstract class HtmlExporter implements ExporterInterface
83
{
84
    public const NODE_MAPPING = [
85
        // block nodes
86
        Document::class => DocumentExporter::class,
87
        Blockquote::class => BlockquoteExporter::class,
88
        BulletList::class => BulletListExporter::class,
89
        TaskList::class => TaskListExporter::class,
90
        CodeBlock::class => CodeBlockExporter::class,
91
        Heading::class => HeadingExporter::class,
92
        MediaGroup::class => MediaGroupExporter::class,
93
        MediaSingle::class => MediaSingleExporter::class,
94
        OrderedList::class => OrderedListExporter::class,
95
        Panel::class => PanelExporter::class,
96
        Paragraph::class => ParagraphExporter::class,
97
        Rule::class => RuleExporter::class,
98
        Table::class => TableExporter::class,
99
        Expand::class => ExpandExporter::class,
100
101
        // child nodes
102
        ListItem::class => ListItemExporter::class,
103
        TaskItem::class => TaskItemExporter::class,
104
        TableCell::class => TableCellExporter::class,
105
        TableHeader::class => TableHeaderExporter::class,
106
        TableRow::class => TableRowExporter::class,
107
        Media::class => MediaExporter::class,
108
        InlineCard::class => InlineCardExporter::class,
109
110
        // inline nodes
111
        Emoji::class => EmojiExporter::class,
112
        Hardbreak::class => HardbreakExporter::class,
113
        Mention::class => MentionExporter::class,
114
        Text::class => TextExporter::class,
115
        Status::class => StatusExporter::class,
116
        Date::class => DateExporter::class,
117
118
        // mark nodes
119
        Em::class => EmExporter::class,
120
        Strong::class => StrongExporter::class,
121
        Code::class => CodeExporter::class,
122
        Strike::class => StrikeExporter::class,
123
        Subsup::class => SubsupExporter::class,
124
        Underline::class => UnderlineExporter::class,
125
        Link::class => LinkExporter::class,
126
        TextColor::class => TextColorExporter::class,
127
    ];
128
129
    protected Node $node;
130
    protected array $tags = [];
131
132
    private bool $includeMedia = false;
133
134
    public function __construct(Node $node)
135
    {
136
        $this->node = $node;
137
    }
138
139
    public function export(): string
140
    {
141
        // skip parsing media if includeMedia is false
142
        if (!$this->includeMedia && ($this->node instanceof MediaSingle || $this->node instanceof MediaGroup)) {
143
            return "";
144
        }
145
146
        $outputs = [];
147
148
        if ($this->node instanceof BlockNode) {
149
            // $node has children (content) => iterate over them
150
            foreach ($this->node->getContent() as $child) {
0 ignored issues
show
Bug introduced by
The method getContent() does not exist on DH\Adf\Node\Node. It seems like you code against a sub-type of DH\Adf\Node\Node such as DH\Adf\Node\BlockNode. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

150
            foreach ($this->node->/** @scrutinizer ignore-call */ getContent() as $child) {
Loading history...
151
                $class = self::NODE_MAPPING[$child::class];
152
                $exporter = new $class($child);
153
                $outputs[] = $exporter->includeMedia($this->includeMedia)->export();
154
            }
155
        } elseif ($this->node instanceof InlineNode) {
156
            // $node doesn't have children but can have marks
157
            $class = self::NODE_MAPPING[$this->node::class];
158
            $exporter = new $class($this->node);
159
            $outputs[] = $exporter->export();
160
        }
161
162
        $output = implode('', $outputs);
163
164
        if (0 === \count($this->tags)) {
165
            // no wrapping tags
166
            return $output;
167
        }
168
169
        if (1 === \count($this->tags)) {
170
            // no closing tag
171
            return $this->tags[0] . $output;
172
        }
173
174
        // opening and closing tags
175
        return $this->tags[0] . $output . $this->tags[1];
176
    }
177
178
    /**
179
     * Enable output of Media Nodes
180
     * @param bool $incl If media should be included
181
     * @return $this
182
     */
183
    public function includeMedia(bool $incl = true): self {
184
        $this->includeMedia = $incl;
185
        return $this;
186
    }
187
}
188