From 155d942a033d464d741f4c8fa92d827481f5d9e8 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Tue, 25 Mar 2025 20:00:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BB=D0=BE=D0=BD=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA.CodegenTools/DefineTemplateSection.cs | 5 +++++ mROA.CodegenTools/ITemplateSection.cs | 4 +++- mROA.CodegenTools/InnerTemplateSection.cs | 5 +++++ mROA.CodegenTools/InsertTemplatePart.cs | 5 +++++ mROA.CodegenTools/LinkTemplateSection.cs | 5 +++++ mROA.CodegenTools/LiteralTemplateSection.cs | 5 +++++ mROA.CodegenTools/ProgrammableTextSection.cs | 5 +++++ mROA.CodegenTools/TemplateDocument.cs | 21 ++++++++++++++++++-- 8 files changed, 52 insertions(+), 3 deletions(-) diff --git a/mROA.CodegenTools/DefineTemplateSection.cs b/mROA.CodegenTools/DefineTemplateSection.cs index 5226cac..fcc926e 100644 --- a/mROA.CodegenTools/DefineTemplateSection.cs +++ b/mROA.CodegenTools/DefineTemplateSection.cs @@ -23,5 +23,10 @@ namespace mROA.CodegenTools { return StoredText; } + + public object Clone() + { + return new DefineTemplateSection(StoredText, _tag, Context); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/ITemplateSection.cs b/mROA.CodegenTools/ITemplateSection.cs index 6aaa7dd..7712282 100644 --- a/mROA.CodegenTools/ITemplateSection.cs +++ b/mROA.CodegenTools/ITemplateSection.cs @@ -1,6 +1,8 @@ +using System; + namespace mROA.CodegenTools { - public interface ITemplateSection + public interface ITemplateSection : ICloneable { TemplateDocument Context { get; set; } int TargetLength { get; } diff --git a/mROA.CodegenTools/InnerTemplateSection.cs b/mROA.CodegenTools/InnerTemplateSection.cs index b7db33b..f347086 100644 --- a/mROA.CodegenTools/InnerTemplateSection.cs +++ b/mROA.CodegenTools/InnerTemplateSection.cs @@ -16,5 +16,10 @@ namespace mROA.CodegenTools Context = context; InnerTemplate = innerTemplate; } + + public object Clone() + { + return new InnerTemplateSection(_tag, InnerTemplate, Context); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/InsertTemplatePart.cs b/mROA.CodegenTools/InsertTemplatePart.cs index ecc58b2..fbc8f53 100644 --- a/mROA.CodegenTools/InsertTemplatePart.cs +++ b/mROA.CodegenTools/InsertTemplatePart.cs @@ -65,5 +65,10 @@ namespace mROA.CodegenTools return ((ITemplateSection)_insertedValue).ToString(); } } + + public object Clone() + { + return new InsertTemplatePart(_tag, Context, Parameters.ToArray()); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/LinkTemplateSection.cs b/mROA.CodegenTools/LinkTemplateSection.cs index 0e883ff..8870674 100644 --- a/mROA.CodegenTools/LinkTemplateSection.cs +++ b/mROA.CodegenTools/LinkTemplateSection.cs @@ -34,5 +34,10 @@ namespace mROA.CodegenTools { return $"{nameof(LinkedTag)}: {_linkedTag}"; } + + public object Clone() + { + return new LinkTemplateSection(_linkedTag, Context); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/LiteralTemplateSection.cs b/mROA.CodegenTools/LiteralTemplateSection.cs index e8e9704..b28fe72 100644 --- a/mROA.CodegenTools/LiteralTemplateSection.cs +++ b/mROA.CodegenTools/LiteralTemplateSection.cs @@ -22,5 +22,10 @@ namespace mROA.CodegenTools { return _internalText; } + + public object Clone() + { + return new LiteralTemplateSection(_internalText, Context); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/ProgrammableTextSection.cs b/mROA.CodegenTools/ProgrammableTextSection.cs index 99909d0..5d91bd5 100644 --- a/mROA.CodegenTools/ProgrammableTextSection.cs +++ b/mROA.CodegenTools/ProgrammableTextSection.cs @@ -20,5 +20,10 @@ namespace mROA.CodegenTools { return _bakeFunc(Context.AdditionalContext); } + + public object Clone() + { + return new ProgrammableTextSection(_bakeFunc, Context); + } } } \ No newline at end of file diff --git a/mROA.CodegenTools/TemplateDocument.cs b/mROA.CodegenTools/TemplateDocument.cs index cb00d52..6ce384e 100644 --- a/mROA.CodegenTools/TemplateDocument.cs +++ b/mROA.CodegenTools/TemplateDocument.cs @@ -1,14 +1,16 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mROA.CodegenTools { - public class TemplateDocument + public class TemplateDocument : ICloneable { public List Parts { get; set; } = new List(); public object AdditionalContext { get; set; } public ITagged this[string tag] => Parts.OfType().FirstOrDefault(i => i.Tag == tag); + public void Insert(string tag, object value) { var selectedPart = this[tag]; @@ -22,7 +24,7 @@ namespace mROA.CodegenTools { var approximatelyLength = Parts.Sum(i => i.TargetLength); var stringBuilder = new StringBuilder(approximatelyLength); - + foreach (var part in Parts.OfType()) { var baked = part.Bake(); @@ -31,5 +33,20 @@ namespace mROA.CodegenTools return stringBuilder.ToString(); } + + public object Clone() + { + var cloneDoc = new TemplateDocument(); + cloneDoc.AdditionalContext = AdditionalContext is ICloneable c ? c.Clone() : AdditionalContext; + + cloneDoc.Parts = Parts.Select(i => + { + var clone = i.Clone() as ITemplateSection; + clone.Context = cloneDoc; + return clone; + }).ToList(); + + return cloneDoc; + } } } \ No newline at end of file