Skip to content
Open
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
3 changes: 3 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
ubuntu-latest:
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Added import keyword to import templates into other templates
- Added 'Template.Parse()' method
- Added 'Template.ParseFromLines()' method

### Changed

- Log error instead of warning when a template file is not found
Expand Down
1 change: 1 addition & 0 deletions build/Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
[GitHubActions("tests",
GitHubActionsImage.UbuntuLatest,
OnPushBranches = new[] { "main" },
OnPullRequestBranches = new[] { "main" },
InvokedTargets = new[] { nameof(Test) },
PublishCondition = "always()",
EnableGitHubToken = true,
Expand Down
5 changes: 4 additions & 1 deletion build/build.csproj.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_ANONYMOUSMETHOD_ON_SINGLE_LINE/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=4a98fdf6_002D7d98_002D4f5a_002Dafeb_002Dea44ad98c70c/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=f9fce829_002De6f4_002D4cb2_002D80f1_002D5497c44f51df/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
Expand All @@ -25,4 +27,5 @@
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
29 changes: 29 additions & 0 deletions src/Assets/SimpleCodeGenerator/Editor/IntermediateTemplate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@ public IntermediateTemplate(IEnumerable<string> template, object data)
content = new List<string>(template);
}

public IntermediateTemplate RenderImports()
{
var result = new IntermediateTemplate(content, data);

for (int i = 0; i < result.content.Count; i++)
{
result.content[i] = InsertImportedTemplates(result.content[i]);
}

return result;
}

public IntermediateTemplate RenderStandaloneValues()
{
var result = new IntermediateTemplate(content, data);
Expand Down Expand Up @@ -82,6 +94,23 @@ public IntermediateTemplate RenderForLoops()
return result;
}

private static string InsertImportedTemplates(string input)
{
while (true)
{
Match importMatch = Regex.Match(input, @"\{\{\s*import\s+(?<templateName>\S+)\s*\}\}");

if (!importMatch.Success)
break;

string templateName = importMatch.Groups["templateName"].Value;

// TODO
}

return input;
}

private static string InsertValuesFromObject(string input, object objectToInsert, string propertyRootPath = "")
{
while (true)
Expand Down
29 changes: 28 additions & 1 deletion src/Assets/SimpleCodeGenerator/Editor/Template.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.IO;
using System;
using System.Collections.Generic;
using System.IO;
using JetBrains.Annotations;
using SimpleCodeGenerator.Core;
using UnityEditor;
using UnityEngine;
Expand All @@ -8,20 +11,36 @@ namespace SimpleCodeGenerator.Editor
public class Template
{
private readonly string[] content;
private readonly Dictionary<string, Template> importedTemplates = new();

private Template(string[] content)
{
this.content = content;
}

[PublicAPI]
public static Template ParseFromFile(string path)
{
return new Template(File.ReadAllLines(path));
}

[PublicAPI]
public static Template ParseFromLines(string[] lines)
{
return new Template(lines);
}

[PublicAPI]
public static Template Parse(string contentWithLineBreaks)
{
return ParseFromLines(contentWithLineBreaks.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None));
}

[PublicAPI]
public string Render(object data)
{
return new IntermediateTemplate(content, data)
.RenderImports()
.RenderStandaloneValues()
.RenderForLoops()
.Build();
Expand All @@ -32,6 +51,7 @@ internal static Template FindBuiltInTemplate(string templateName)
return ParseFromFile(GetAbsolutePathToBuiltInTemplate(templateName));
}

[PublicAPI]
public static bool TryFindTemplateInAssets(string templateAssetPath, out Template template)
{
if (!templateAssetPath.StartsWith("Assets/"))
Expand Down Expand Up @@ -59,5 +79,12 @@ internal static AbsolutePath GetAbsolutePathToBuiltInTemplate(string templateNam
{
return GetPathToBuiltInTemplates() / $"{templateName}.txt";
}

[PublicAPI]
public Template Import(string key, Template template)
{
importedTemplates.Add(key, template);
return this;
}
}
}
22 changes: 22 additions & 0 deletions tests/TemplateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace tests;
public class TemplateTests
{
private const string TemplateFile1 = "Templates/Test_Template_1.txt";
private const string TemplateFileImport = "Templates/Test_Template_Import.txt";
private const string TemplateFileImportPartial = "Templates/Test_Template_Import_Partial.txt";
private const string StringDictionaryTemplateFile = "Templates/StringDictionary.txt";
private const string EnumTemplateFile = "Templates/Enum.txt";

Expand Down Expand Up @@ -83,4 +85,24 @@ public Task Render_RenderValidTemplate2_TemplateIsRenderedCorrectly()
settings.UseDirectory("Verify");
return Verify(result, settings);
}

[Fact]
public Task Render_TemplateWithImportedTemplate_TemplateIsRenderedCorrectly()
{
Template template = Template.ParseFromFile(TemplateFileImport);
template.Import("Template_To_Import", Template.ParseFromFile(TemplateFileImportPartial));
template.Import("This_Can_Be_Any_Key", Template.Parse("1234567890"));

var data = new
{
Template = "Import",
SomeNumbers = new[] { 1, 2, 3, 4, 5 }
};

string result = template.Render(data);

var settings = new VerifySettings();
settings.UseDirectory("Verify");
return Verify(result, settings);
}
}
10 changes: 10 additions & 0 deletions tests/Templates/Test_Template_Import.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{{ import "Template_To_Import" }}

// Test Template {{ Template }} with imported template

{{ import "Template_To_Import" }}
{{ import "This_Can_Be_Any_Key" }}

{{ for number in SomeNumbers }}
// {{ number }}
{{ end }}
7 changes: 7 additions & 0 deletions tests/Templates/Test_Template_Import_Partial.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// This is text from a partial template
// And this is more text from a partial template with a variable: {{ Variable }}

// Let's also add a list of strings to the template
{{ for item in Strings }}
// {{ item }}
{{ end }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// This is text from a partial template
// And this is more text from a partial template with a variable: this is a string

// Let's also add a list of strings to the template
// hello
// world
// !

// Test Template Import with imported template

// This is text from a partial template
// And this is more text from a partial template with a variable: this is a string

// Let's also add a list of strings to the template
// hello
// world
// !
1234567890

// 1
// 2
// 3
// 4
// 5
Loading