Skip to content

Commit 7c6554a

Browse files
committed
feat: ✨ Json to Html parsing
1 parent 6e4b3c0 commit 7c6554a

6 files changed

Lines changed: 578 additions & 36 deletions

File tree

src/Model/Option.php

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Contentstack\Utils\Resource\EmbeddedObject;
1010
use Contentstack\Utils\Enum\StyleType;
1111
use Contentstack\Utils\Enum\MarkType;
12+
use Contentstack\Utils\Enum\NodeType;
1213

1314
class Option implements RenderableInterface {
1415

@@ -53,6 +54,88 @@ function renderMark(MarkType $markType, string $text): string
5354
return $resultString;
5455
}
5556

57+
function renderNode(NodeType $nodeType, object $node, string $innerHtml): string
58+
{
59+
$resultString = "";
60+
$attrs = get_object_vars($node->attrs);
61+
switch ($nodeType)
62+
{
63+
case NodeType::get(NodeType::PARAGRAPH):
64+
$resultString = "<p>".$innerHtml."</p>";
65+
break;
66+
case NodeType::get(NodeType::LINK):
67+
$resultString = "<a href=\"".($attrs["url"] ?? "")."\">".$innerHtml."</a>";
68+
break;
69+
case NodeType::get(NodeType::IMAGE):
70+
$resultString = "<img src=\"".($attrs["url"] ?? "")."\" />".$innerHtml;
71+
break;
72+
case NodeType::get(NodeType::EMBED):
73+
$resultString = "<iframe src=\"".($attrs["url"] ?? "")."\">".$innerHtml."</iframe>";
74+
break;
75+
case NodeType::get(NodeType::HEADING_1):
76+
$resultString = "<h1>".$innerHtml."</h1>";
77+
break;
78+
case NodeType::get(NodeType::HEADING_2):
79+
$resultString = "<h2>".$innerHtml."</h2>";
80+
break;
81+
case NodeType::get(NodeType::HEADING_3):
82+
$resultString = "<h3>".$innerHtml."</h3>";
83+
break;
84+
case NodeType::get(NodeType::HEADING_4):
85+
$resultString = "<h4>".$innerHtml."</h4>";
86+
break;
87+
case NodeType::get(NodeType::HEADING_5):
88+
$resultString = "<h5>".$innerHtml."</h5>";
89+
break;
90+
case NodeType::get(NodeType::HEADING_6):
91+
$resultString = "<h6>".$innerHtml."</h6>";
92+
break;
93+
case NodeType::get(NodeType::ORDER_LIST):
94+
$resultString = "<ol>".$innerHtml."</ol>";
95+
break;
96+
case NodeType::get(NodeType::UNORDER_LIST):
97+
$resultString = "<ul>".$innerHtml."</ul>";
98+
break;
99+
case NodeType::get(NodeType::LIST_ITEM):
100+
$resultString = "<li>".$innerHtml."</li>";
101+
break;
102+
case NodeType::get(NodeType::HR):
103+
$resultString = "<hr>";
104+
break;
105+
case NodeType::get(NodeType::TABLE):
106+
$resultString = "<table>".$innerHtml."</table>";
107+
break;
108+
case NodeType::get(NodeType::TABLE_HEADER):
109+
$resultString = "<thead>".$innerHtml."</thead>";
110+
break;
111+
case NodeType::get(NodeType::TABLE_BODY):
112+
$resultString = "<tbody>".$innerHtml."</tbody>";
113+
break;
114+
case NodeType::get(NodeType::TABLE_FOOTER):
115+
$resultString = "<tfoot>".$innerHtml."</tfoot>";
116+
break;
117+
case NodeType::get(NodeType::TABLE_ROW):
118+
$resultString = "<tr>".$innerHtml."</tr>";
119+
break;
120+
case NodeType::get(NodeType::TABLE_HEAD):
121+
$resultString = "<th>".$innerHtml."</th>";
122+
break;
123+
case NodeType::get(NodeType::TABLE_DATA):
124+
$resultString = "<td>".$innerHtml."</td>";
125+
break;
126+
case NodeType::get(NodeType::BLOCK_QUOTE):
127+
$resultString = "<blockquote>".$innerHtml."</blockquote>";
128+
break;
129+
case NodeType::get(NodeType::CODE):
130+
$resultString = "<code>".$innerHtml."</code>";
131+
break;
132+
default:
133+
$resultString = $innerHtml;
134+
break;
135+
}
136+
return $resultString;
137+
}
138+
56139
function renderOptions(array $embeddedObject, Metadata $metadata): string
57140
{
58141
$resultString = "";

src/Resource/RenderableInterface.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Contentstack\Utils\Enum\EmbedItemType;
77
use Contentstack\Utils\Model\Metadata;
88
use Contentstack\Utils\Enum\MarkType;
9+
use Contentstack\Utils\Enum\NodeType;
910

1011
interface RenderableInterface
1112
{
@@ -20,4 +21,11 @@ function renderOptions(array $embeddedObject, Metadata $metadata): string;
2021
* @param $text - Text content for rendering
2122
*/
2223
function renderMark(MarkType $markType, string $text): string;
24+
25+
/**
26+
* @param $nodeType - NodeType for the text content
27+
* @param $node - Json node content for rendering
28+
* @param $innerHtml - Child Html content for the node
29+
*/
30+
function renderNode(NodeType $nodeType, object $node, string $innerHtml): string;
2331
}

src/Utils.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ public static function jsonArrayToHtml(array $contents, Option $option): array {
6868
}
6969

7070
public static function jsonToHtml(object $content, Option $option): string {
71-
if ($content->children != null) {
72-
return Utils::nodeChildrenToHtml($content->children, $option);
71+
$resultHtml = '';
72+
if (isset($content->children)) {
73+
$resultHtml = Utils::nodeChildrenToHtml($content->children, $option);
7374
}
74-
return '';
75+
return $resultHtml;
7576
}
7677

7778
private static function nodeChildrenToHtml(array $nodes, Option $option): string {
@@ -88,6 +89,16 @@ private static function nodeToHtml(object $node, Option $option): string {
8889
$resultHtml = Utils::referenceToHtml($node, $option);
8990
break;
9091
default:
92+
$innerHtml = "";
93+
if (isset($node->children))
94+
{
95+
$innerHtml = Utils::nodeChildrenToHtml($node->children, $option);
96+
}
97+
$resultHtml = $option->renderNode(
98+
NodeType::byValue($node->type),
99+
$node,
100+
$innerHtml
101+
);
91102
break;
92103
}
93104
} else {

tests/DefaultOptionTest.php

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Contentstack\Utils\Enum\EmbedItemType;
1212
use Contentstack\Utils\Enum\StyleType;
1313
use Contentstack\Utils\Enum\MarkType;
14+
use Contentstack\Utils\Enum\NodeType;
1415
use Contentstack\Utils\Model\Metadata;
1516
use Contentstack\Utils\Model\Option;
1617
use PHPUnit\Framework\TestCase;
@@ -121,4 +122,211 @@ public function testShouldReturnMarkTypeHtmlContent(): void
121122
$superscriptString = DefaultOptionTest::$defaultRender->renderMark(MarkType::get(MarkType::SUPERSCRIPT), DefaultOptionTest::$text);
122123
$this->assertEquals("<sup>".DefaultOptionTest::$text."</sup>", $superscriptString);
123124
}
125+
126+
function testShouldReturnParagraphHtmlForParagraphnode(): void
127+
{
128+
$node = json_decode(BlankDocument);
129+
130+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::PARAGRAPH), $node, DefaultOptionTest::$text);
131+
132+
$this->assertEquals("<p>".DefaultOptionTest::$text."</p>", $resultString);
133+
}
134+
135+
function testShouldReturnLinkHtmlForLinkNode(): void
136+
{
137+
$node = json_decode(BlankDocument);
138+
139+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::LINK), $node, DefaultOptionTest::$text);
140+
141+
$this->assertEquals("<a href=\"\">".DefaultOptionTest::$text."</a>", $resultString);
142+
}
143+
144+
function testShouldReturnImageHtmlForImageNode(): void
145+
{
146+
$node = json_decode(BlankDocument);
147+
148+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::IMAGE), $node, DefaultOptionTest::$text);
149+
150+
$this->assertEquals("<img src=\"\" />".DefaultOptionTest::$text, $resultString);
151+
}
152+
153+
function testShouldReturnEmbedHtmlForEmbedNode(): void
154+
{
155+
$node = json_decode(BlankDocument);
156+
157+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::EMBED), $node, DefaultOptionTest::$text);
158+
159+
$this->assertEquals("<iframe src=\"\">".DefaultOptionTest::$text."</iframe>", $resultString);
160+
}
161+
162+
function testShouldReturnH1HtmlForH1Node(): void
163+
{
164+
$node = json_decode(BlankDocument);
165+
166+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_1), $node, DefaultOptionTest::$text);
167+
168+
$this->assertEquals("<h1>".DefaultOptionTest::$text."</h1>", $resultString);
169+
}
170+
171+
function testShouldReturnH2HtmlForH2Node(): void
172+
{
173+
$node = json_decode(BlankDocument);
174+
175+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_2), $node, DefaultOptionTest::$text);
176+
177+
$this->assertEquals("<h2>".DefaultOptionTest::$text."</h2>", $resultString);
178+
}
179+
180+
function testShouldReturnH3HtmlForH3Node(): void
181+
{
182+
$node = json_decode(BlankDocument);
183+
184+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_3), $node, DefaultOptionTest::$text);
185+
186+
$this->assertEquals("<h3>".DefaultOptionTest::$text."</h3>", $resultString);
187+
}
188+
189+
function testShouldReturnH4HtmlForH4Node(): void
190+
{
191+
$node = json_decode(BlankDocument);
192+
193+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_4), $node, DefaultOptionTest::$text);
194+
195+
$this->assertEquals("<h4>".DefaultOptionTest::$text."</h4>", $resultString);
196+
}
197+
198+
function testShouldReturnH5HtmlForH5Node(): void
199+
{
200+
$node = json_decode(BlankDocument);
201+
202+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_5), $node, DefaultOptionTest::$text);
203+
204+
$this->assertEquals("<h5>".DefaultOptionTest::$text."</h5>", $resultString);
205+
}
206+
207+
function testShouldReturnH6HtmlForH6Node(): void
208+
{
209+
$node = json_decode(BlankDocument);
210+
211+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HEADING_6), $node, DefaultOptionTest::$text);
212+
213+
$this->assertEquals("<h6>".DefaultOptionTest::$text."</h6>", $resultString);
214+
}
215+
216+
function testShouldReturnHRHtmlForHRNode(): void
217+
{
218+
$node = json_decode(BlankDocument);
219+
220+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::HR), $node, DefaultOptionTest::$text);
221+
222+
$this->assertEquals("<hr>", $resultString);
223+
}
224+
225+
function testShouldReturnTableHtmlForTableNode(): void
226+
{
227+
$node = json_decode(BlankDocument);
228+
229+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE), $node, DefaultOptionTest::$text);
230+
231+
$this->assertEquals("<table>".DefaultOptionTest::$text."</table>", $resultString);
232+
}
233+
234+
function testShouldReturnTableHeaderHtmlForTableHeaderNode(): void
235+
{
236+
$node = json_decode(BlankDocument);
237+
238+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_HEADER), $node, DefaultOptionTest::$text);
239+
240+
$this->assertEquals("<thead>".DefaultOptionTest::$text."</thead>", $resultString);
241+
}
242+
243+
function testShouldReturnTableBodyHtmlForTableBodyNode(): void
244+
{
245+
$node = json_decode(BlankDocument);
246+
247+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_BODY), $node, DefaultOptionTest::$text);
248+
249+
$this->assertEquals("<tbody>".DefaultOptionTest::$text."</tbody>", $resultString);
250+
}
251+
252+
function testShouldReturnTableFooterHtmlForTableFooterNode(): void
253+
{
254+
$node = json_decode(BlankDocument);
255+
256+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_FOOTER), $node, DefaultOptionTest::$text);
257+
258+
$this->assertEquals("<tfoot>".DefaultOptionTest::$text."</tfoot>", $resultString);
259+
}
260+
261+
function testShouldReturnTableRowHtmlForTableRowNode(): void
262+
{
263+
$node = json_decode(BlankDocument);
264+
265+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_ROW), $node, DefaultOptionTest::$text);
266+
267+
$this->assertEquals("<tr>".DefaultOptionTest::$text."</tr>", $resultString);
268+
}
269+
270+
function testShouldReturnTableHeadHtmlForTableHeadNode(): void
271+
{
272+
$node = json_decode(BlankDocument);
273+
274+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_HEAD), $node, DefaultOptionTest::$text);
275+
276+
$this->assertEquals("<th>".DefaultOptionTest::$text."</th>", $resultString);
277+
}
278+
279+
function testShouldReturnTableDataHtmlForTableDataNode(): void
280+
{
281+
$node = json_decode(BlankDocument);
282+
283+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TABLE_DATA), $node, DefaultOptionTest::$text);
284+
285+
$this->assertEquals("<td>".DefaultOptionTest::$text."</td>", $resultString);
286+
}
287+
288+
function testShouldReturnblockquoteHtmlForblockquoteNode(): void
289+
{
290+
$node = json_decode(BlankDocument);
291+
292+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::BLOCK_QUOTE), $node, DefaultOptionTest::$text);
293+
294+
$this->assertEquals("<blockquote>".DefaultOptionTest::$text."</blockquote>", $resultString);
295+
}
296+
297+
function testShouldReturnCodeHtmlForCodeNode(): void
298+
{
299+
$node = json_decode(BlankDocument);
300+
301+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::CODE), $node, DefaultOptionTest::$text);
302+
303+
$this->assertEquals("<code>".DefaultOptionTest::$text."</code>", $resultString);
304+
}
305+
306+
function testShouldReturnReferenceHtmlForReferenceNode(): void
307+
{
308+
$node = json_decode(BlankDocument);
309+
310+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::REFERENCE), $node, DefaultOptionTest::$text);
311+
312+
$this->assertEquals(DefaultOptionTest::$text, $resultString);
313+
}
314+
315+
function testShouldTextReferenceHtmlForTextNode(): void
316+
{
317+
$node = json_decode(BlankDocument);
318+
319+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::TEXT), $node, DefaultOptionTest::$text);
320+
321+
$this->assertEquals(DefaultOptionTest::$text, $resultString);
322+
}
323+
324+
function testShouldTextDocumentHtmlForDocumentNode(): void
325+
{
326+
$node = json_decode(BlankDocument);
327+
328+
$resultString = DefaultOptionTest::$defaultRender->renderNode(NodeType::get(NodeType::DOCUMENT), $node, DefaultOptionTest::$text);
329+
330+
$this->assertEquals(DefaultOptionTest::$text, $resultString);
331+
}
124332
}

0 commit comments

Comments
 (0)