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
3 weeks ago
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|