From aab29ed828f548288b9c04c75aed8325d715c4ba Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 24 Feb 2022 19:08:35 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E5=A4=8D=E3=80=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AF=BC=E5=87=BAlua=E6=95=B0=E6=8D=AE=E6=9C=AA?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E6=8D=A2=E8=A1=8C=E7=AC=A6?= =?UTF-8?q?=E4=B9=8B=E7=B1=BB=E7=9A=84escape=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataVisitors/ToLuaLiteralVisitor.cs | 7 +++- src/Luban.Job.Cfg/Source/Utils/DataUtil.cs | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/ToLuaLiteralVisitor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/ToLuaLiteralVisitor.cs index 5148012..f6cff99 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/ToLuaLiteralVisitor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/ToLuaLiteralVisitor.cs @@ -10,9 +10,14 @@ namespace Luban.Job.Cfg.DataVisitors { public static ToLuaLiteralVisitor Ins { get; } = new(); + public override string Accept(DString type) + { + return DataUtil.EscapeLuaStringWithQuote(type.Value); + } + public override string Accept(DText type) { - return $"{{{DText.KEY_NAME}='{type.Key}',{DText.TEXT_NAME}=\"{DataUtil.EscapeString(type.TextOfCurrentAssembly)}\"}}"; + return $"{{{DText.KEY_NAME}='{type.Key}',{DText.TEXT_NAME}={DataUtil.EscapeLuaStringWithQuote(type.TextOfCurrentAssembly)}}}"; } public override string Accept(DBean type) diff --git a/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs index 0303dff..8cb5105 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; namespace Luban.Job.Cfg.Utils { @@ -111,6 +112,38 @@ namespace Luban.Job.Cfg.Utils return s.Replace("\\", "\\\\").Replace("\"", "\\\""); } + public static string EscapeLuaStringWithQuote(string s) + { + if (!s.Contains('\"') && !s.Contains('\\') && !s.Contains('\n')) + { + return "\"" + s + "\""; + } + + var multiEqaulChars = new StringBuilder(); + var result = new StringBuilder(); + for(int i = 0; i < 100 ;i++) + { + if (i > 0) + { + multiEqaulChars.Append('='); + } + var multiEqualStr = multiEqaulChars.ToString(); + if (i == 0 || s.Contains(multiEqualStr)) + { + if (s.Contains("[" + multiEqualStr + "[") || s.Contains("]" + multiEqualStr + "]")) + { + continue; + } + } + result.Clear(); + result.Append('[').Append(multiEqualStr).Append('['); + result.Append(s); + result.Append(']').Append(multiEqualStr).Append(']'); + return result.ToString(); + } + throw new Exception($"too complex string:'{s}'"); + } + //public static string EscapeStringWithQuote(string s) //{ // return "\"" + s.Replace("\\", "\\\\") + "\"";