Skip to content

Commit 7283bce

Browse files
authored
Merge pull request #7 from contentstack/next
Feat: Style attrs, Fragment tag and Mail attr support added
2 parents c1e04ae + b57ff58 commit 7283bce

19 files changed

Lines changed: 216 additions & 100 deletions

.github/workflows/ci.yml

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# This workflow will publish a package when a release is created
2+
3+
name: Publish package to NuGet repository
4+
on:
5+
release:
6+
types: [created]
7+
jobs:
8+
publish-nuget:
9+
runs-on: windows-latest
10+
steps:
11+
- name: Checkout repository
12+
uses: actions/checkout@v1
13+
- name: Setup .NET Core @ Latest
14+
uses: actions/setup-dotnet@v1
15+
with:
16+
dotnet-version: '3.1.x'
17+
env:
18+
NUGET_AUTH_TOKEN: ${{ secrets.NUGET_AUTH_TOKEN }}
19+
- name: Build solution and generate NuGet package
20+
run: |
21+
cd contentstack-utils-dotnet
22+
dotnet pack -c Release -o out
23+
24+
- name: Push generated package to GitHub registry
25+
run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true
26+
27+
publish-git:
28+
runs-on: windows-latest
29+
steps:
30+
- name: Checkout repository
31+
uses: actions/checkout@v1
32+
- name: Setup .NET Core @ Latest
33+
uses: actions/setup-dotnet@v1
34+
with:
35+
dotnet-version: '3.1.x'
36+
source-url: https://nuget.pkg.github.com/Contentstack/index.json
37+
env:
38+
NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39+
- name: Build solution and generate NuGet package
40+
run: |
41+
cd contentstack-utils-dotnet
42+
dotnet pack -c Release -o out
43+
44+
- name: Push generated package to GitHub registry
45+
run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true

.github/workflows/sast-scan.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

.github/workflows/sca-scan.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ jobs:
66
security:
77
runs-on: ubuntu-latest
88
steps:
9-
- uses: actions/checkout@master
9+
- name: Checkout repository
10+
uses: actions/checkout@master
11+
- uses: snyk/actions/setup@master
12+
- name: Setup .NET
13+
uses: actions/setup-dotnet@v3.0.3
14+
- name: Restore dependencies
15+
run: dotnet restore ./Contentstack.Utils.sln
1016
- name: Run Snyk to check for vulnerabilities
11-
uses: snyk/actions/dotnet@master
17+
run: cd Contentstack.Utils && snyk test --fail-on=all
1218
env:
1319
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
14-
with:
15-
args: --fail-on=all

.github/workflows/secrets-scan.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

.talismanrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fileignoreconfig:
2+
- filename: Contentstack.Utils/Models/Options.cs
3+
checksum: 3dc51f0de02429ef9a43b66e666ac4dbde41195e245f8ecc0094548ca8603245
4+
version: ""

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11

2+
### Version: 1.0.2
3+
#### Date: Mar-14-2024
4+
- Style attributes supported in converted HTML.
5+
- Fragment tag support added
6+
27
### Version: 1.0.1
38
#### Date: July-16-2021
49
- Json RTE content to Html Support added.

Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,29 @@ public static class JsonToHtmlResultConstants
44
{
55
public const string kPlainTextHtml = "<strong>Aliquam sit amet libero dapibus, eleifend ligula at, varius justo</strong><strong><em>Lorem ipsum</em></strong><strong><em><u>dolor sit amet</u></em></strong><strong><em><u><strike>consectetur adipiscing elit.</strike></u></em></strong><strong><em><u><span>Sed condimentum iaculis magna in vehicula. </span></u></em></strong><strong><em><u><sup> Vestibulum vitae convallis </sup></u></em></strong><strong><em><u><sub> lacus. </sub></u></em></strong>";
66
public const string kParagraphHtml = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. Praesent a diam iaculis turpis rhoncus faucibus. Aliquam sed pulvinar sem.</p>";
7-
public const string kH1Html = "<h1><strong><em><u><sub>Lorem ipsum dolor sit amet.</sub></u></em></strong></h1>";
7+
public const string kH1Html = "<h1 style=\"color:blue;font-size:24px;\"><strong><em><u><sub>Lorem ipsum dolor sit amet.</sub></u></em></strong></h1>";
88
public const string kH2Html = "<h2><strong><em><u><sub>Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor. </sub></u></em></strong></h2>";
99
public const string kH3Html = "<h3><strong><em><u><sub>Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.</sub></u></em></strong></h3>";
1010
public const string kH4Html = "<h4><strong><em><u><sub>MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra</sub></u></em></strong></h4>";
1111
public const string kH5Html = "<h5>Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.</h5>";
1212
public const string kH6Html = "<h6>Nunc porta diam vitae purus semper, ut consequat lorem vehicula.</h6>";
13-
public const string kOrderListHtml = "<ol><li>Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.</li><li>Pellentesque mattis lacus in quam aliquam congue</li><li>Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.</li><li>Sed in ante lacinia, molestie metus eu, fringilla sapien.</li></ol>";
13+
public const string kOrderListHtml = "<ol><li style=\"text-align:justify;\">Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.</li><li style=\"text-align:justify;\">Pellentesque mattis lacus in quam aliquam congue</li><li style=\"text-align:justify;\">Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.</li><li style=\"text-align:justify;\">Sed in ante lacinia, molestie metus eu, fringilla sapien.</li></ol>";
1414
public const string kIUnorderListHtml = "<ul><li>Sed quis metus sed mi hendrerit mollis vel et odio.</li><li>Integer vitae sem dignissim, elementum libero vel, fringilla massa.</li><li>Integer imperdiet arcu sit amet tortor faucibus aliquet.</li><li>Aenean scelerisque velit vitae dui vehicula, at congue massa sagittis.</li></ul>";
1515
public const string kImgHtml = "<img src=\"https://images.contentstack.com/v3/assets/UID_13/Donald.jog.png\" />";
1616
public const string kTableHtml = "<table><thead><tr><th><p>Header 1</p></th><th><p>Header 2</p></th></tr></thead><tbody><tr><td><p>Body row 1 data 1</p></td><td><p>Body row 1 data 2</p></td></tr><tr><td><p>Body row 2 data 1</p></td><td><p>Body row 2 data 2</p></td></tr></tbody></table>";
1717
public const string kBlockquoteHtml = "<blockquote>Praesent eu ex sed nibh venenatis pretium.</blockquote>";
1818
public const string kCodeHtml = "<code>Code template.</code>";
19-
public const string kLinkInPHtml = "<p><strong><em><u><sub></sub></u></em></strong><a href=\"LINK.com\">LINK</a></p>";
19+
public const string kLinkInPHtml = "<p style=\"text-align:left;\"><strong><em><u><sub></sub></u></em></strong><a href=\"LINK.com\">LINK</a></p>";
20+
public const string kLinkInPMailToHtml = "<p style=\"text-align:left;\"><strong><em><u><sub></sub></u></em></strong><a href=\"mailto:support@contentstack.com\">LINK</a></p>";
21+
public const string kLinkInPMailToTARGEtHtml = "<p style=\"text-align:left;\"><strong><em><u><sub></sub></u></em></strong><a href=\"mailto:support@contentstack.com\" target=\"_self\">LINK</a></p>";
2022
public const string kEmbedHtml = "<iframe src=\"https://www.youtube.com/watch?v=AOP0yARiW8U\"></iframe>";
2123
}
2224

2325
public static class JsonToHtmlConstants
2426
{
2527
public const string kBlankDocument = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[],\"type\":\"doc\"}";
2628
public const string kPlainTextJson = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"text\":\"Aliquam sit amet libero dapibus, eleifend ligula at, varius justo\",\"bold\":true},{ \"text\":\"Lorem ipsum\",\"bold\":true,\"italic\":true},{ \"text\":\"dolor sit amet\",\"bold\":true,\"italic\":true,\"underline\":true},{ \"text\":\"consectetur adipiscing elit.\",\"bold\":true,\"italic\":true,\"underline\":true,\"strikethrough\":true},{ \"text\":\"Sed condimentum iaculis magna in vehicula. \",\"bold\":true,\"italic\":true,\"underline\":true,\"inlineCode\":true},{ \"text\":\" Vestibulum vitae convallis \",\"bold\":true,\"italic\":true,\"underline\":true,\"superscript\":true},{ \"text\":\" lacus. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}],\"type\":\"doc\"}";
27-
public const string kH1Json = "{ \"uid\":\"06e34a7a449d7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h1\",\"attrs\":{ },\"uid\":\"c2dfed70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Lorem ipsum dolor sit amet.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}";
29+
public const string kH1Json = "{ \"uid\":\"06e34a7a449d7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h1\",\"attrs\":{ \"style\": { \"color\": \"blue\", \"font-size\": \"24px\" } },\"uid\":\"c2dfed70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Lorem ipsum dolor sit amet.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}";
2830
public const string kH2Json = "{ \"uid\":\"06e34a7a4e2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h2\",\"attrs\":{ },\"uid\":\"c2dfed9a7030c65e2e1\",\"children\":[{ \"text\":\"Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}";
2931
public const string kH3Json = "{ \"uid\":\"06e34ad7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h3\",\"attrs\":{ },\"uid\":\"c2df42cfb70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}";
3032
public const string kH4Json = "{ \"uid\":\"06e34a7a4e54cd\", \"_version\":13, \"attrs\":{ \"style\":{ \"text-align\":\"center\" }, \"redactor-attributes\":{ } }, \"children\":[{\"type\":\"h4\",\"attrs\":{},\"uid\":\"c2dfed4d7030c65e2e1\",\"children\":[{\"text\":\"MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}";
@@ -38,6 +40,7 @@ public static class JsonToHtmlConstants
3840
public const string kCodeJson = "{ \"uid\":\"06ea490849d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"83fba92c91b30002b\",\"type\":\"code\",\"attrs\":{},\"children\":[{\"text\":\"Code template.\"}]}],\"type\":\"doc\"}";
3941
public const string kTableJson = "{ \"uid\": \"06e481190849d7fcd\", \"_version\": 13, \"attrs\": { }, \"children\": [ { \"uid\": \"6dd64343bf634bfadd4\", \"type\": \"table\", \"attrs\": { \"rows\": 4, \"cols\": 2, \"colWidths\": [ 250, 250 ] }, \"children\": [ { \"uid\": \"b9082\", \"type\": \"thead\", \"attrs\": {}, \"children\": [ { \"type\": \"tr\", \"attrs\": {}, \"children\": [ { \"type\": \"th\", \"attrs\": {}, \"children\": [ { \"type\": \"p\", \"attrs\": {}, \"children\": [ { \"text\": \"Header 1\" } ], \"uid\": \"daa3ef\" } ], \"uid\": \"4b3124414a3\" }, { \"type\": \"th\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Header 2\" } ], \"uid\": \"eae83c5797d\" } ], \"uid\": \"bca9b6f037a04fb485\" } ], \"uid\": \"b91ae7a48ef2e9da1\" } ] }, { \"type\": \"tbody\", \"attrs\": { }, \"children\": [ { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 1\" } ], \"uid\": \"ec674ccc5ce70b7cab\" } ], \"uid\": \"2a70bdeeb99a\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 2\" } ], \"uid\": \"769a 3f9db34 ce8ec 10486d50\" } ], \"uid\": \"d6407 34a5c6 1ab1e5f7d1\" } ], \"uid\": \"77f6 b951c68 7f9eb397c5\" }, { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 1\" } ], \"uid\": \"a6bf 11bb48 630e87d721c0\" } ], \"uid\": \"3da39838b0feaf\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 2\" } ], \"uid\": \"3b7d12 1f694202 49029e86313\" } ], \"uid\": \"95b38b04abcbc25e94f\" } ], \"uid\": \"b 227fea 8d247013 4f1e1e8\" } ], \"uid\": \"fd5ab86aa642798451b\" } ] }, ], \"type\": \"doc\" }";
4042
public const string kLinkInPJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{\"style\":{\"text-align\":\"left\"},\"redactor-attributes\":{ }},\"uid\":\"d88dcdf4590dff2d\",\"children\":[{\"text\":\"\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true},{ \"uid\":\"0d06598201aa8b47\",\"type\":\"a\",\"attrs\":{ \"url\":\"LINK.com\",\"target\":\"_self\"},\"children\":[{ \"text\":\"LINK\"}]},{ \"text\":\"\"}]}],\"type\":\"doc\"}";
43+
public const string kLinkInPMailToJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{\"style\":{\"text-align\":\"left\"},\"redactor-attributes\":{ }},\"uid\":\"d88dcdf4590dff2d\",\"children\":[{\"text\":\"\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true},{ \"uid\":\"0d06598201aa8b47\",\"type\":\"a\",\"attrs\":{ \"url\":\"mailto:support@contentstack.com\",\"target\":\"_self\"},\"children\":[{ \"text\":\"LINK\"}]},{ \"text\":\"\"}]}],\"type\":\"doc\"}";
4144
public const string kEmbedJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"251017315905c35d42c9\",\"type\":\"embed\",\"attrs\":{\"url\":\"https://www.youtube.com/watch?v=AOP0yARiW8U\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}";
4245
public const string kAssetReferenceJson = "{\"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{}, \"children\":[{ \"uid\": \"4f7e33 3390a955 de10c1 c836\", \"type\":\"reference\",\"attrs\":{\"display-type\":\"display\",\"asset-uid\":\"UID_12\",\"content-type-uid\":\"sys_assets\",\"asset-link\":\"https://images.contentstack.com/v3/assets/UID_14/11.jpg\",\"asset-name\":\"11.jpg\",\"asset-type\":\"image/jpeg\",\"type\":\"asset\",\"class-name\":\"embedded-asset\",\"width\":25.16914749661705,\"className\":\"dsd\",\"id\":\"sdf\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}";
4346
public const string kEntryReferenceBlockJson = "{ \"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"70f9b 325075d43 128c0d0 aa3eb7f291f\",\"type\":\"reference\",\"attrs\":{\"display-type\":\"block\",\"entry-uid\":\"UID_07\",\"content-type-uid\":\"content_block\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}";

Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
4+
<TargetFrameworks>net7.0</TargetFrameworks>
55

66
<IsPackable>false</IsPackable>
7-
<ReleaseVersion>1.0.1</ReleaseVersion>
7+
<ReleaseVersion>$(Version)</ReleaseVersion>
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
12-
<PackageReference Include="xunit" Version="2.4.0" />
13-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
14-
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
15-
<PackageReference Include="coverlet.collector" Version="3.0.3">
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
12+
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
13+
<PackageReference Include="coverlet.collector" Version="6.0.2">
14+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
15+
<PrivateAssets>all</PrivateAssets>
16+
</PackageReference>
17+
<PackageReference Include="xunit" Version="2.7.0" />
18+
<PackageReference Include="xunit.core" Version="2.7.0" />
19+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
1620
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1721
<PrivateAssets>all</PrivateAssets>
1822
</PackageReference>
1923
</ItemGroup>
20-
24+
<ItemGroup>
25+
<Reference Include="Contentstack.Utils">
26+
<HintPath>..\Contentstack.Utils\bin\Debug\netstandard2.0\Contentstack.Utils.dll</HintPath>
27+
</Reference>
28+
</ItemGroup>
2129
<ItemGroup>
2230
<ProjectReference Include="..\Contentstack.Utils\Contentstack.Utils.csproj" />
2331
</ItemGroup>

Contentstack.Utils.Tests/DefaultRenderTest.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ public void testEmbedDocument()
197197
Assert.Equal($"<iframe src=\"\">{text}</iframe>", result);
198198
}
199199

200+
[Fact]
201+
public void testFragmentDocument()
202+
{
203+
string result = defaultRender.RenderNode("fragment", node, (nodes) => { return text; });
204+
205+
Assert.Equal($"<fragment>{text}</fragment>", result);
206+
}
207+
200208
[Fact]
201209
public void testH1Document()
202210
{

0 commit comments

Comments
 (0)