Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
dotnet-version: 3.1.102
- name: Test
working-directory: ./source
run: dotnet test Handlebars.sln --logger:trx
run: dotnet test Handlebars.sln --logger:trx --logger:GitHubActions

sonar-ci:
name: SonarCloud
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
dotnet-version: 3.1.201
- name: Test
working-directory: ./source
run: dotnet test Handlebars.sln --logger:trx
run: dotnet test Handlebars.sln --logger:trx --logger:GitHubActions

sonar-pr:
name: SonarCloud
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,7 @@ nupkgs
.idea/

#DotNet Benchmark
BenchmarkDotNet.Artifacts/
BenchmarkDotNet.Artifacts/

#Test results
TestResults/
33 changes: 14 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,29 +124,24 @@ Views\{Controller}\{Action}\partials\somepartial.hbs
### Registering Block Helpers

```c#
HandlebarsBlockHelper _stringEqualityBlockHelper = (TextWriter output, HelperOptions options, dynamic context, object[] arguments) => {
if (arguments.Length != 2)
{
throw new HandlebarsException("{{StringEqualityBlockHelper}} helper must have exactly two argument");
}
string left = arguments[0] as string;
string right = arguments[1] as string;
if (left == right)
{
options.Template(output, null);
}
else
{
options.Inverse(output, null);
}
};
Handlebars.RegisterHelper("StringEqualityBlockHelper", _stringEqualityBlockHelper);
Dictionary<string, string> animals = new Dictionary<string, string>() {
Handlebars.RegisterHelper("StringEqualityBlockHelper", (TextWriter output, HelperOptions options, dynamic context, object[] arguments) =>
{
if (arguments.Length != 2) throw new HandlebarsException("{{StringEqualityBlockHelper}} helper must have exactly two argument");

var left = arguments[0] as string;
var right = arguments[1] as string;
if (left == right) options.Template(output, null);
else options.Inverse(output, null);
});

var animals = new Dictionary<string, string>()
{
{"Fluffy", "cat" },
{"Fido", "dog" },
{"Chewy", "hamster" }
};
string template = "{{#each @value}}The animal, {{@key}}, {{StringEqualityBlockHelper @value 'dog'}}is a dog{{else}}is not a dog{{/StringEqualityBlockHelper}}.\r\n{{/each}}";

string template = "{{#each this}}The animal, {{@key}}, {{#StringEqualityBlockHelper @value 'dog'}}is a dog{{else}}is not a dog{{/StringEqualityBlockHelper}}.\r\n{{/each}}";
Func<object, string> compiledTemplate = Handlebars.Compile(template);
string templateOutput = compiledTemplate(animals);

Expand Down
3 changes: 2 additions & 1 deletion source/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<Owner>Rex Morgan; Handlebars-Net</Owner>
<LangVersion>8</LangVersion>
</PropertyGroup>

<PropertyGroup>
<NoWarn>1591</NoWarn>
<NoWarn>1591;1574;1584;1658</NoWarn>
</PropertyGroup>

<ItemGroup>
Expand Down
3 changes: 1 addition & 2 deletions source/Handlebars.Benchmark/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ public static void Main(string[] args)
.WithLaunchCount(1);

var manualConfig = DefaultConfig.Instance
.AddJob(job)
.WithOptions(ConfigOptions.JoinSummary);
.AddJob(job);

manualConfig.AddLogicalGroupRules(BenchmarkLogicalGroupRule.ByMethod);

Expand Down
56 changes: 47 additions & 9 deletions source/Handlebars.Test/BasicIntegrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Reflection;
using HandlebarsDotNet.Compiler;
using HandlebarsDotNet.Helpers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using HandlebarsDotNet.Features;
using HandlebarsDotNet.Helpers.BlockHelpers;
using Xunit.Abstractions;

namespace HandlebarsDotNet.Test
Expand All @@ -19,7 +21,6 @@ public class HandlebarsEnvGenerator : IEnumerable<object[]>
private readonly List<IHandlebars> _data = new List<IHandlebars>
{
Handlebars.Create(),
Handlebars.Create(new HandlebarsConfiguration{ CompileTimeConfiguration = { UseAggressiveCaching = false}}),
Handlebars.Create(new HandlebarsConfiguration().Configure(o => o.Compatibility.RelaxedHelperNaming = true)),
Handlebars.Create(new HandlebarsConfiguration().UseWarmUp(types =>
{
Expand Down Expand Up @@ -328,7 +329,7 @@ public void CustomAliasedPropertyOnArray(IHandlebars handlebars)
var aliasProvider = new DelegatedMemberAliasProvider()
.AddAlias<IList>("myCountAlias", list => list.Count);

handlebars.Configuration.CompileTimeConfiguration.AliasProviders.Add(aliasProvider);
handlebars.Configuration.AliasProviders.Add(aliasProvider);

var source = "Array is {{ names.myCountAlias }} item(s) long";
var template = handlebars.Compile(source);
Expand Down Expand Up @@ -616,6 +617,42 @@ public void BasicDictionaryEnumerator(IHandlebars handlebars)
var result = template(data);
Assert.Equal("hello world ", result);
}

[Theory, ClassData(typeof(HandlebarsEnvGenerator))]
public void BasicDictionaryEnumeratorDeep(IHandlebars handlebars)
{
var source = "{{#each enumerateMe}}{{this.inner.a}}{{this.inner.b}}{{/each}}";
var template = handlebars.Compile(source);
var data = new
{
enumerateMe = new Dictionary<string, object>
{
{
"foo", new Dictionary<string, object>
{
["inner"] = new Dictionary<string, object>
{
["a"] = "1",
["b"] = "2"
}
}
},
{
"bar", new Dictionary<string, object>
{
["inner"] = new Dictionary<string, object>
{
["a"] = "3",
["b"] = "4"
}
}
}
}
};

var result = template(data);
Assert.Equal("1234", result);
}

[Theory, ClassData(typeof(HandlebarsEnvGenerator))]
public void DictionaryEnumeratorWithBlockParams(IHandlebars handlebars)
Expand Down Expand Up @@ -1633,8 +1670,7 @@ public void BasicReturnFromHelper(IHandlebars Handlebars)
[Theory, ClassData(typeof(HandlebarsEnvGenerator))]
public void CollectionReturnFromHelper(IHandlebars handlebars)
{
var getData = $"getData{Guid.NewGuid()}";
handlebars.RegisterHelper(getData, (context, arguments) =>
handlebars.RegisterHelper($"getData", (context, arguments) =>
{
var data = new Dictionary<string, string>
{
Expand All @@ -1644,7 +1680,7 @@ public void CollectionReturnFromHelper(IHandlebars handlebars)

return data;
});
var source = $"{{{{#each ({getData} 'Darmstadt' 'San Francisco')}}}}{{{{@key}}}} lives in {{{{@value}}}}. {{{{/each}}}}";
var source = "{{#each (getData 'Darmstadt' 'San Francisco')}}{{@key}} lives in {{@value}}. {{/each}}";
var template = handlebars.Compile(source);

var result = template(new object());
Expand Down Expand Up @@ -1788,9 +1824,10 @@ private void CustomHelperResolverTest(IHandlebars handlebars)
[InlineData("one.two")]
public void ReferencingDirectlyVariableWhenHelperRegistered(string helperName)
{
var source = "{{ ./" + helperName + " }}";

foreach (IHandlebars handlebars in new HandlebarsEnvGenerator().Select(o => o[0]))
{
var source = "{{ ./" + helperName + " }}";
handlebars.RegisterHelper("one.two", (context, arguments) => 0);

var template = handlebars.Compile(source);
Expand All @@ -1803,7 +1840,7 @@ public void ReferencingDirectlyVariableWhenHelperRegistered(string helperName)

private class StringHelperResolver : IHelperResolver
{
public bool TryResolveReturnHelper(string name, Type targetType, out HandlebarsReturnHelper helper)
public bool TryResolveHelper(string name, Type targetType, out HelperDescriptorBase helper)
{
if (targetType == typeof(string))
{
Expand All @@ -1816,15 +1853,16 @@ public bool TryResolveReturnHelper(string name, Type targetType, out HandlebarsR
return false;
}

helper = (context, arguments) => method.Invoke(arguments[0], arguments.Skip(1).ToArray());
object Helper(dynamic context, object[] arguments) => method.Invoke(arguments[0], arguments.Skip(1).ToArray());
helper = new DelegateReturnHelperDescriptor(name, Helper);
return true;
}

helper = null;
return false;
}

public bool TryResolveBlockHelper(string name, out HandlebarsBlockHelper helper)
public bool TryResolveBlockHelper(string name, out BlockHelperDescriptorBase helper)
{
helper = null;
return false;
Expand Down
Loading