Skip to content

Commit c25a62a

Browse files
committed
🎉 Json to Html feature completed
- Node Type rendering added - Option class RenderNode function added
1 parent 9b1151b commit c25a62a

3 files changed

Lines changed: 109 additions & 30 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
using Contentstack.Utils.Models;
22
using Contentstack.Utils.Interfaces;
33
using Contentstack.Utils.Enums;
4+
using System.Collections.Generic;
45

56
namespace Contentstack.Utils.Interfaces
67
{
8+
public delegate string NodeChildrenCallBack(List<Node> nodes);
9+
710
public interface IRenderable
811
{
912
string RenderOption(IEmbeddedObject entry, Metadata metadata);
1013
string RenderMark(MarkType markType, string text);
14+
string RenderNode(NodeType nodeType, Node node, NodeChildrenCallBack callBack);
1115
}
1216
}

Contentstack.Utils/Models/Options.cs

Lines changed: 104 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
namespace Contentstack.Utils.Models
55
{
6-
public class Options: IRenderable
6+
public class Options : IRenderable
77
{
88
#region #region Public
9-
public Options() {}
10-
9+
public Options() { }
10+
1111
public Options(IEntryEmbedable entry)
1212
{
1313
this.entry = entry;
@@ -20,64 +20,139 @@ public virtual string RenderOption(IEmbeddedObject embeddedObject, Metadata meta
2020
switch (metadata.StyleType)
2121
{
2222
case Enums.StyleType.Block:
23-
string renderString = "<div><p>" + embeddedObject.Uid +"</p>";
24-
if (embeddedObject is IEmbeddedEntry) {
25-
renderString += "<p>Content type: <span>" + ((IEmbeddedEntry)embeddedObject).Title + "</span></p>";
26-
} else {
27-
renderString += "<p>Content type: <span>" + embeddedObject.ContentTypeUid + "</span></p>";
23+
string renderString = "<div><p>" + embeddedObject.Uid + "</p>";
24+
if (embeddedObject is IEmbeddedEntry)
25+
{
26+
renderString += "<p>Content type: <span>" + ((IEmbeddedEntry)embeddedObject).Title + "</span></p>";
27+
}
28+
else
29+
{
30+
renderString += "<p>Content type: <span>" + embeddedObject.ContentTypeUid + "</span></p>";
2831
}
2932
renderString = renderString + "</div>";
3033
return renderString;
3134

3235
case Enums.StyleType.Inline:
33-
if (embeddedObject is IEmbeddedEntry) {
34-
return "<span>" + ((IEmbeddedEntry)embeddedObject).Title + "</span>";
36+
if (embeddedObject is IEmbeddedEntry)
37+
{
38+
return "<span>" + ((IEmbeddedEntry)embeddedObject).Title + "</span>";
3539
}
36-
return "<span>" + embeddedObject.Uid + "</span>";
40+
return "<span>" + embeddedObject.Uid + "</span>";
3741

3842
case Enums.StyleType.Link:
39-
if (embeddedObject is IEmbeddedEntry) {
40-
return "<a href=\"" + embeddedObject.Uid +"\">" + (metadata.Text ?? ((IEmbeddedEntry)embeddedObject).Title) + "</a>";
43+
if (embeddedObject is IEmbeddedEntry)
44+
{
45+
return "<a href=\"" + embeddedObject.Uid + "\">" + (metadata.Text ?? ((IEmbeddedEntry)embeddedObject).Title) + "</a>";
4146
}
42-
return "<a href=\"" + embeddedObject.Uid + "\">" + (metadata.Text ?? embeddedObject.Uid) + "</a>";
47+
return "<a href=\"" + embeddedObject.Uid + "\">" + (metadata.Text ?? embeddedObject.Uid) + "</a>";
4348

4449
case Enums.StyleType.Display:
4550
if (embeddedObject is IEmbeddedAsset)
4651
{
47-
return "<img src=\"" + ((IEmbeddedAsset)embeddedObject).Url + "\" alt=\"" + ((IEmbeddedAsset)embeddedObject).Title + "\" />";
52+
return "<img src=\"" + ((IEmbeddedAsset)embeddedObject).Url + "\" alt=\"" + ((IEmbeddedAsset)embeddedObject).Title + "\" />";
4853
}
49-
return "<img src=\"" + embeddedObject.Uid + "\" alt=\"" + embeddedObject.Uid + "\" />";
54+
return "<img src=\"" + embeddedObject.Uid + "\" alt=\"" + embeddedObject.Uid + "\" />";
5055

5156
case Enums.StyleType.Download:
5257
if (embeddedObject is IEmbeddedAsset)
5358
{
54-
return "<a href=\"" + ((IEmbeddedAsset)embeddedObject).Url + "\">" + (metadata.Text ?? ((IEmbeddedAsset)embeddedObject).Title) + "</a>";
59+
return "<a href=\"" + ((IEmbeddedAsset)embeddedObject).Url + "\">" + (metadata.Text ?? ((IEmbeddedAsset)embeddedObject).Title) + "</a>";
5560
}
56-
return "<a href=\"" + embeddedObject.Uid + "\">" + (metadata.Text ?? embeddedObject.Uid)+ "</a>";
61+
return "<a href=\"" + embeddedObject.Uid + "\">" + (metadata.Text ?? embeddedObject.Uid) + "</a>";
5762
}
58-
return "";
63+
return "";
5964
}
6065

61-
public string RenderMark(MarkType markType, string text)
66+
public virtual string RenderMark(MarkType markType, string text)
6267
{
63-
switch (markType) {
68+
switch (markType)
69+
{
6470
case MarkType.Bold:
65-
return "<strong>"+text+"</strong>";
71+
return $"<strong>{text}</strong>";
6672
case MarkType.Italic:
67-
return "<em>"+text+"</em>";
73+
return $"<em>{text}</em>";
6874
case MarkType.Underline:
69-
return "<u>"+text+"</u>";
75+
return $"<u>{text}</u>";
7076
case MarkType.Strikethrough:
71-
return "<strike>"+text+"</strike>";
77+
return $"<strike>{text}</strike>";
7278
case MarkType.InlineCode:
73-
return "<span>"+text+"</span>";
79+
return $"<span>{text}</span>";
7480
case MarkType.Subscript:
75-
return "<sub>" + text + "</sub>";
81+
return $"<sub>{text}</sub>";
7682
case MarkType.Superscript:
77-
return "<sup>"+text+"</sup>";
83+
return $"<sup>{text}</sup>";
7884
}
7985
return text;
8086
}
81-
#endregion
87+
88+
public virtual string RenderNode(NodeType nodeType, Node node, NodeChildrenCallBack callBack)
89+
{
90+
string href = "";
91+
92+
switch (nodeType)
93+
{
94+
case NodeType.Paragraph:
95+
return $"<p>{callBack(node.children)}</p>";
96+
case NodeType.Link:
97+
if (node.attrs.ContainsKey("url"))
98+
{
99+
href = (string)node.attrs["url"];
100+
}
101+
return $"<a href=\"{href}\">{callBack(node.children)}</a>";
102+
case NodeType.Image:
103+
if (node.attrs.ContainsKey("url"))
104+
{
105+
href = (string)node.attrs["url"];
106+
}
107+
return $"<img src=\"{href}\" />{callBack(node.children)}";
108+
case NodeType.Embed:
109+
if (node.attrs.ContainsKey("url"))
110+
{
111+
href = (string)node.attrs["url"];
112+
}
113+
return $"<iframe src=\"{href}\">{callBack(node.children)}</iframe>";
114+
case NodeType.Heading_1:
115+
return $"<h1>{callBack(node.children)}</h1>";
116+
case NodeType.Heading_2:
117+
return $"<h2>{callBack(node.children)}</h2>";
118+
case NodeType.Heading_3:
119+
return $"<h3>{callBack(node.children)}</h3>";
120+
case NodeType.Heading_4:
121+
return $"<h4>{callBack(node.children)}</h4>";
122+
case NodeType.Heading_5:
123+
return $"<h5>{callBack(node.children)}</h5>";
124+
case NodeType.Heading_6:
125+
return $"<h6>{callBack(node.children)}</h6>";
126+
case NodeType.OrderList:
127+
return $"<ol>{callBack(node.children)}</ol>";
128+
case NodeType.UnOrderList:
129+
return $"<ul>{callBack(node.children)}</ul>";
130+
case NodeType.ListItem:
131+
return $"<li>{callBack(node.children)}</li>";
132+
case NodeType.Hr:
133+
return $"<hr>";
134+
case NodeType.Table:
135+
return $"<table>{callBack(node.children)}</table>";
136+
case NodeType.TableHeader:
137+
return $"<thead>{callBack(node.children)}</thead>";
138+
case NodeType.TableBody:
139+
return $"<tbody>{callBack(node.children)}</tbody>";
140+
case NodeType.TableFooter:
141+
return $"<tfoot>{callBack(node.children)}</tfoot>";
142+
case NodeType.TableRow:
143+
return $"<tr>{callBack(node.children)}</tr>";
144+
case NodeType.TableHead:
145+
return $"<th>{callBack(node.children)}</th>";
146+
case NodeType.TableData:
147+
return $"<td>{callBack(node.children)}</td>";
148+
case NodeType.BlockQuote:
149+
return $"<blockquote>{callBack(node.children)}</blockquote>";
150+
case NodeType.Code:
151+
return $"<code>{callBack(node.children)}</code>";
152+
default:
153+
return callBack(node.children);
154+
}
155+
#endregion
156+
}
82157
}
83158
}

Contentstack.Utils/Utils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private static string nodeToHtml(Node node, Options options)
7575
case Enums.NodeType.Reference:
7676
return referenceToHtml(node, options);
7777
}
78-
return "";
78+
return options.RenderNode(node.type, node, (nodes) => { return nodeChildrenToHtml(nodes, options); });
7979
}
8080

8181
private static string referenceToHtml(Node node, Options options)

0 commit comments

Comments
 (0)