HtmlExporter::export()   B
last analyzed

Complexity

Conditions 9
Paths 10

Size

Total Lines 37
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 18
nc 10
nop 0
dl 0
loc 37
rs 8.0555
c 1
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\ExtensionExporter;
31
use DH\Adf\Exporter\Html\Inline\HardbreakExporter;
32
use DH\Adf\Exporter\Html\Inline\InlineCardExporter;
33
use DH\Adf\Exporter\Html\Inline\MentionExporter;
34
use DH\Adf\Exporter\Html\Inline\StatusExporter;
35
use DH\Adf\Exporter\Html\Inline\TextExporter;
36
use DH\Adf\Exporter\Html\Mark\CodeExporter;
37
use DH\Adf\Exporter\Html\Mark\EmExporter;
38
use DH\Adf\Exporter\Html\Mark\LinkExporter;
39
use DH\Adf\Exporter\Html\Mark\StrikeExporter;
40
use DH\Adf\Exporter\Html\Mark\StrongExporter;
41
use DH\Adf\Exporter\Html\Mark\SubsupExporter;
42
use DH\Adf\Exporter\Html\Mark\TextColorExporter;
43
use DH\Adf\Exporter\Html\Mark\UnderlineExporter;
44
use DH\Adf\Node\Block\Blockquote;
45
use DH\Adf\Node\Block\BulletList;
46
use DH\Adf\Node\Block\CodeBlock;
47
use DH\Adf\Node\Block\Document;
48
use DH\Adf\Node\Block\Expand;
49
use DH\Adf\Node\Block\Heading;
50
use DH\Adf\Node\Block\MediaGroup;
51
use DH\Adf\Node\Block\MediaSingle;
52
use DH\Adf\Node\Block\OrderedList;
53
use DH\Adf\Node\Block\Panel;
54
use DH\Adf\Node\Block\Paragraph;
55
use DH\Adf\Node\Block\Rule;
56
use DH\Adf\Node\Block\Table;
57
use DH\Adf\Node\Block\TaskList;
58
use DH\Adf\Node\BlockNode;
59
use DH\Adf\Node\Child\ListItem;
60
use DH\Adf\Node\Child\Media;
61
use DH\Adf\Node\Child\TableCell;
62
use DH\Adf\Node\Child\TableHeader;
63
use DH\Adf\Node\Child\TableRow;
64
use DH\Adf\Node\Child\TaskItem;
65
use DH\Adf\Node\Inline\Date;
66
use DH\Adf\Node\Inline\Emoji;
67
use DH\Adf\Node\Inline\Extension;
68
use DH\Adf\Node\Inline\Hardbreak;
69
use DH\Adf\Node\Inline\InlineCard;
70
use DH\Adf\Node\Inline\Mention;
71
use DH\Adf\Node\Inline\Status;
72
use DH\Adf\Node\Inline\Text;
73
use DH\Adf\Node\InlineNode;
74
use DH\Adf\Node\Mark\Code;
75
use DH\Adf\Node\Mark\Em;
76
use DH\Adf\Node\Mark\Link;
77
use DH\Adf\Node\Mark\Strike;
78
use DH\Adf\Node\Mark\Strong;
79
use DH\Adf\Node\Mark\Subsup;
80
use DH\Adf\Node\Mark\TextColor;
81
use DH\Adf\Node\Mark\Underline;
82
use DH\Adf\Node\Node;
83
84
abstract class HtmlExporter implements ExporterInterface
85
{
86
    public const NODE_MAPPING = [
87
        // block nodes
88
        Document::class => DocumentExporter::class,
89
        Blockquote::class => BlockquoteExporter::class,
90
        BulletList::class => BulletListExporter::class,
91
        TaskList::class => TaskListExporter::class,
92
        CodeBlock::class => CodeBlockExporter::class,
93
        Heading::class => HeadingExporter::class,
94
        MediaGroup::class => MediaGroupExporter::class,
95
        MediaSingle::class => MediaSingleExporter::class,
96
        OrderedList::class => OrderedListExporter::class,
97
        Panel::class => PanelExporter::class,
98
        Paragraph::class => ParagraphExporter::class,
99
        Rule::class => RuleExporter::class,
100
        Table::class => TableExporter::class,
101
        Expand::class => ExpandExporter::class,
102
103
        // child nodes
104
        ListItem::class => ListItemExporter::class,
105
        TaskItem::class => TaskItemExporter::class,
106
        TableCell::class => TableCellExporter::class,
107
        TableHeader::class => TableHeaderExporter::class,
108
        TableRow::class => TableRowExporter::class,
109
        Media::class => MediaExporter::class,
110
        InlineCard::class => InlineCardExporter::class,
111
112
        // inline nodes
113
        Emoji::class => EmojiExporter::class,
114
        Extension::class => ExtensionExporter::class,
115
        Hardbreak::class => HardbreakExporter::class,
116
        Mention::class => MentionExporter::class,
117
        Text::class => TextExporter::class,
118
        Status::class => StatusExporter::class,
119
        Date::class => DateExporter::class,
120
121
        // mark nodes
122
        Em::class => EmExporter::class,
123
        Strong::class => StrongExporter::class,
124
        Code::class => CodeExporter::class,
125
        Strike::class => StrikeExporter::class,
126
        Subsup::class => SubsupExporter::class,
127
        Underline::class => UnderlineExporter::class,
128
        Link::class => LinkExporter::class,
129
        TextColor::class => TextColorExporter::class,
130
    ];
131
132
    protected Node $node;
133
    protected array $tags = [];
134
135
    private bool $includeMedia = false;
136
137
    public function __construct(Node $node)
138
    {
139
        $this->node = $node;
140
    }
141
142
    public function export(): string
143
    {
144
        // skip parsing media if includeMedia is false
145
        if (!$this->includeMedia && ($this->node instanceof MediaSingle || $this->node instanceof MediaGroup)) {
146
            return '';
147
        }
148
149
        $outputs = [];
150
151
        if ($this->node instanceof BlockNode) {
152
            // $node has children (content) => iterate over them
153
            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

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