| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HybridCLR.Editor.Template{    public class FileRegionReplace    {        private readonly string _tplCode;        private readonly Dictionary<string, string> _regionReplaceContents = new Dictionary<string, string>();        public FileRegionReplace(string tplCode)        {            _tplCode = tplCode;        }        public void Replace(string regionName, string regionContent)        {            _regionReplaceContents.Add(regionName, regionContent);        }        public string GenFinalString()        {            string originContent = _tplCode;            string resultContent = originContent;            foreach (var c in _regionReplaceContents)            {                resultContent = ReplaceRegion(resultContent, c.Key, c.Value);            }            return resultContent;        }        public void Commit(string outputFile)        {            string dir = Path.GetDirectoryName(outputFile);            Directory.CreateDirectory(dir);            string resultContent = GenFinalString();            var utf8WithoutBOM = new System.Text.UTF8Encoding(false);            File.WriteAllText(outputFile, resultContent, utf8WithoutBOM);        }        public static string ReplaceRegion(string resultText, string region, string replaceContent)        {            int startIndex = resultText.IndexOf("//!!!{{" + region);            if (startIndex == -1)            {                throw new Exception($"region:{region} start not find");            }            int endIndex = resultText.IndexOf("//!!!}}" + region);            if (endIndex == -1)            {                throw new Exception($"region:{region} end not find");            }            int replaceStart = resultText.IndexOf('\n', startIndex);            int replaceEnd = resultText.LastIndexOf('\n', endIndex);            if (replaceStart == -1 || replaceEnd == -1)            {                throw new Exception($"region:{region} not find");            }            if (resultText.Substring(replaceStart, replaceEnd - replaceStart) == replaceContent)            {                return resultText;            }            resultText = resultText.Substring(0, replaceStart) + "\n" + replaceContent + "\n" + resultText.Substring(replaceEnd);            return resultText;        }    }}
 |