diff --git a/mROA.CodegenTools/DefineTemplatePart.cs b/mROA.CodegenTools/DefineTemplatePart.cs index 16d6f96..0219e42 100644 --- a/mROA.CodegenTools/DefineTemplatePart.cs +++ b/mROA.CodegenTools/DefineTemplatePart.cs @@ -16,6 +16,8 @@ namespace mROA.CodegenTools } public string Tag => _tag; + public int TargetLength => StoredText.Length; + public string Bake() { return String.Empty; diff --git a/mROA.CodegenTools/ITemplatePart.cs b/mROA.CodegenTools/ITemplatePart.cs index d9a588c..7cf847c 100644 --- a/mROA.CodegenTools/ITemplatePart.cs +++ b/mROA.CodegenTools/ITemplatePart.cs @@ -3,6 +3,7 @@ namespace mROA.CodegenTools public interface ITemplatePart { TemplateDocument Context { get; set; } + int TargetLength { get; } string Bake(); } diff --git a/mROA.CodegenTools/InsertTemplatePart.cs b/mROA.CodegenTools/InsertTemplatePart.cs index 3955149..fd9ac4d 100644 --- a/mROA.CodegenTools/InsertTemplatePart.cs +++ b/mROA.CodegenTools/InsertTemplatePart.cs @@ -5,8 +5,7 @@ namespace mROA.CodegenTools { public class InsertTemplatePart : ITemplatePart, ITagged { - private string _insertedText; - private ITemplatePart _insertedPart; + private object _insertedValue; private string _tag; public string Tag => _tag; public TemplateDocument Context { get; set; } @@ -21,9 +20,6 @@ namespace mROA.CodegenTools private bool IsInserted(object value) { - if (!(value is string) && !(value is ITemplatePart) ) - return false; - if (Parameters.IndexOf("R") == 0) return false; ProduceInserted(value); @@ -36,39 +32,37 @@ namespace mROA.CodegenTools var currentIndex = Context.Parts.IndexOf(this); var clone = (InsertTemplatePart)MemberwiseClone(); clone._tag += "+"; - - if (value is string s) - { - clone.Setup(s); - }else - clone.Setup((ITemplatePart)value); + + clone._insertedValue = value; Context.Parts.Insert(currentIndex, clone); } - public void Setup(string inside) + public void Setup(object value) { - if (IsInserted(inside)) + if (!(value is string) && !(value is ITemplatePart) ) return; - _insertedText = inside; + if (IsInserted(value)) + return; + + _insertedValue = value; } - public void Setup(ITemplatePart part) - { - if (IsInserted(part)) - return; - _insertedPart = part; - } - + + public int TargetLength => 0; + public string Bake() { - if (_insertedText != null) + switch (_insertedValue) { - return _insertedText; + case null: + return string.Empty; + case string s: + return s; + default: + return ((ITemplatePart)_insertedValue).Bake(); } - - return _insertedPart.Bake(); } } } \ No newline at end of file diff --git a/mROA.CodegenTools/LinkTemplatePart.cs b/mROA.CodegenTools/LinkTemplatePart.cs index 274d89a..d6be78a 100644 --- a/mROA.CodegenTools/LinkTemplatePart.cs +++ b/mROA.CodegenTools/LinkTemplatePart.cs @@ -16,9 +16,11 @@ namespace mROA.CodegenTools public string LinkedTag => _linkedTag; + public int TargetLength { get; } + public string Bake() { - return Context.Parts.OfType().FirstOrDefault(i => i.Tag == _linkedTag)?.Bake(); + return Context[_linkedTag]?.Bake(); } } } \ No newline at end of file diff --git a/mROA.CodegenTools/LiteralTemplatePart.cs b/mROA.CodegenTools/LiteralTemplatePart.cs index 17d562e..abe82a1 100644 --- a/mROA.CodegenTools/LiteralTemplatePart.cs +++ b/mROA.CodegenTools/LiteralTemplatePart.cs @@ -11,6 +11,8 @@ namespace mROA.CodegenTools } public TemplateDocument Context { get; set; } + public int TargetLength { get; } + public string Bake() { return _internalText; diff --git a/mROA.CodegenTools/TemplateDocument.cs b/mROA.CodegenTools/TemplateDocument.cs index 41ed3e3..85b006f 100644 --- a/mROA.CodegenTools/TemplateDocument.cs +++ b/mROA.CodegenTools/TemplateDocument.cs @@ -1,9 +1,35 @@ using System.Collections.Generic; +using System.Linq; +using System.Text; namespace mROA.CodegenTools { public class TemplateDocument { - public List Parts { get; set; } + public List Parts { get; } + public ITagged this[string tag] => Parts.OfType().FirstOrDefault(i => i.Tag == tag); + public void Insert(string tag, object value) + { + var selectedPart = this[tag]; + if (selectedPart is InsertTemplatePart itp) + { + itp.Setup(value); + } + } + + public string Compile() + { + var approximatelyLength = Parts.Sum(i => i.TargetLength); + var stringBuilder = new StringBuilder(approximatelyLength); + + for (int i = 0; i < Parts.Count; i++) + { + var part = Parts[i]; + var baked = part.Bake(); + stringBuilder.Append(baked); + } + + return stringBuilder.ToString(); + } } } \ No newline at end of file