You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.7 KiB
106 lines
3.7 KiB
using DocumentFormat.OpenXml.Office2016.Drawing.Command; |
|
using Microsoft.CodeAnalysis; |
|
using Microsoft.CodeAnalysis.CSharp.Scripting; |
|
using Microsoft.CodeAnalysis.CSharp.Syntax; |
|
using Microsoft.CodeAnalysis.Scripting; |
|
using ReZero.Common; |
|
using ReZero.TextTemplate; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Reflection; |
|
using System.Text; |
|
using System.Text.RegularExpressions; |
|
namespace ReZero.TextTemplate |
|
{ |
|
public class TextTemplateManager |
|
{ |
|
IRender? customRenderer = null; |
|
public TextTemplateManager(IRender? customRenderer=null) |
|
{ |
|
this.customRenderer = customRenderer; |
|
} |
|
public string RenderTemplate(string template, object data) |
|
{ |
|
if (this.customRenderer != null) |
|
{ |
|
return CustomRender(template, data, this.customRenderer); |
|
} |
|
else |
|
{ |
|
return DefaultRender(template, data); |
|
} |
|
} |
|
|
|
private string CustomRender(string template, object data, IRender renderer) |
|
{ |
|
var result = new StringBuilder(); |
|
renderer.Render(template, data, result); |
|
return result.ToString(); |
|
} |
|
|
|
private string DefaultRender(string template, object data) |
|
{ |
|
var engine = new TemplateEngine(); |
|
engine.AddDirective("root", new RootDirective()); |
|
engine.AddDirective("default", new DefaultDirective()); |
|
engine.AddDirective("member", new MemberDirective()); |
|
var output = new StringBuilder(); |
|
engine.Render(template, data, output); |
|
var options = GetOptions(); |
|
try |
|
{ |
|
output.AppendLine("result"); |
|
var result = CSharpScript.EvaluateAsync<string>(output.ToString(), options, data).GetAwaiter().GetResult(); |
|
output.Clear(); |
|
output.Append(result); |
|
} |
|
catch (CompilationErrorException e) |
|
{ |
|
throw new Exception(string.Join(Environment.NewLine, e.Diagnostics)); |
|
} |
|
return output.ToString(); |
|
} |
|
private static ScriptOptions? scriptOptions; |
|
private static object objLock = new object(); |
|
private static ScriptOptions GetOptions() |
|
{ |
|
if (scriptOptions != null) |
|
return scriptOptions; |
|
lock (objLock) |
|
{ |
|
var namespaces = new[] |
|
{ |
|
// System命名空间 |
|
"System", |
|
"System.Collections", |
|
"System.Collections.Generic", |
|
"System.IO", |
|
"System.Linq", |
|
"System.Text", |
|
"System.Text.RegularExpressions" |
|
}; |
|
|
|
// 获取当前域内的程序集,并排除不含位置的程序集 |
|
var ass = AppDomain.CurrentDomain.GetAssemblies() |
|
.Where(it => |
|
it.FullName.StartsWith("System.Linq")|| |
|
it.FullName.StartsWith("System.text")|| |
|
it.FullName.StartsWith("System.Collections")|| |
|
it.FullName.StartsWith("System.IO")).ToList(); |
|
|
|
var isSingleFile =!FileSugar.IsExistFile("".GetType().Assembly.Location); |
|
if (isSingleFile) |
|
{ |
|
throw new Exception("该功能暂时还不支持单文件发布,发布时不能勾选文件合并,合并方案还在研究中"); |
|
} |
|
|
|
var result = ScriptOptions.Default.AddReferences(ass) |
|
.WithImports(namespaces); |
|
scriptOptions = result; |
|
|
|
return result; |
|
} |
|
} |
|
} |
|
} |