Merge MVP features #1
@ -4,11 +4,11 @@ namespace XNeedle.Parser.Elements
|
|||||||
{
|
{
|
||||||
public class ExpressionPart : Part
|
public class ExpressionPart : Part
|
||||||
{
|
{
|
||||||
public required Expression<Func<string>> Expr { get; set; }
|
public required Expression<Func<Context, string>> Expr { get; set; }
|
||||||
|
|
||||||
public override void Operate(Context xtx)
|
public override void Operate(Context ctx)
|
||||||
{
|
{
|
||||||
Expr.Compile()();
|
Expr.Compile()(ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -13,6 +13,8 @@ namespace XNeedle.Parser
|
|||||||
{
|
{
|
||||||
public class XnParser
|
public class XnParser
|
||||||
{
|
{
|
||||||
|
static readonly ParameterExpression CtxParam = Expression.Parameter(typeof(Context), "ctx");
|
||||||
|
|
||||||
static Parser<ExpressionType> Operator(string op, ExpressionType opType)
|
static Parser<ExpressionType> Operator(string op, ExpressionType opType)
|
||||||
{
|
{
|
||||||
return Parse.String(op).Token().Return(opType);
|
return Parse.String(op).Token().Return(opType);
|
||||||
@ -46,7 +48,7 @@ namespace XNeedle.Parser
|
|||||||
var ctxMethodInfo = typeof(ContextFunctions).GetTypeInfo().GetMethod(name, parameters.Select(e => e.Type).Prepend(typeof(Context)).ToArray());
|
var ctxMethodInfo = typeof(ContextFunctions).GetTypeInfo().GetMethod(name, parameters.Select(e => e.Type).Prepend(typeof(Context)).ToArray());
|
||||||
if (ctxMethodInfo != null)
|
if (ctxMethodInfo != null)
|
||||||
{
|
{
|
||||||
return Expression.Call(ctxMethodInfo, parameters.Prepend(Expression.Constant(ctx)).ToArray());
|
return Expression.Call(ctxMethodInfo, parameters.Prepend(CtxParam).ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ParseException(string.Format("Function '{0}({1})' does not exist.", name,
|
throw new ParseException(string.Format("Function '{0}({1})' does not exist.", name,
|
||||||
@ -114,7 +116,13 @@ namespace XNeedle.Parser
|
|||||||
|
|
||||||
static Parser<ExpressionPart> ExprPart(Context ctx)
|
static Parser<ExpressionPart> ExprPart(Context ctx)
|
||||||
{
|
{
|
||||||
return Expr(ctx).Select(body => new ExpressionPart{Expr = Expression.Lambda<Func<string>>(body)});
|
return Expr(ctx).Select(body =>
|
||||||
|
{
|
||||||
|
Expression stringBody = body.Type == typeof(string)
|
||||||
|
? body
|
||||||
|
: Expression.Call(body, typeof(object).GetMethod("ToString", Type.EmptyTypes)!);
|
||||||
|
return new ExpressionPart { Expr = Expression.Lambda<Func<Context, string>>(stringBody, CtxParam) };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static readonly Parser<string> XPath =
|
static readonly Parser<string> XPath =
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using System.Xml;
|
|
||||||
using Sprache;
|
using Sprache;
|
||||||
using XNeedle.Parser;
|
using XNeedle.Parser;
|
||||||
using XNeedle.Parser.Elements;
|
using XNeedle.Parser.Elements;
|
||||||
@ -16,13 +13,12 @@ namespace XNeedle.Transformation
|
|||||||
return $"#x{v:X8}";
|
return $"#x{v:X8}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetLevel(XmlNode node)
|
public static double GetLevel(Context ctx)
|
||||||
{
|
{
|
||||||
int level = 0;
|
int level = 0;
|
||||||
XmlNode? currentNode = node;
|
System.Xml.Linq.XElement? n = ctx.Node;
|
||||||
while (null != (currentNode = currentNode.ParentNode))
|
while (null != (n = n?.Parent))
|
||||||
level++;
|
level++;
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
}
|
}
|
||||||
public static double crc(Context ctx)
|
public static double crc(Context ctx)
|
||||||
@ -51,7 +47,7 @@ namespace XNeedle.Transformation
|
|||||||
|
|
||||||
public static string attr(Context ctx, string name, string value)
|
public static string attr(Context ctx, string name, string value)
|
||||||
{
|
{
|
||||||
if (ctx.Node is null || !ctx.Node.HasAttributes) return "";
|
if (ctx.Node is null) return "";
|
||||||
var attr = ctx.Node.Attribute(name);
|
var attr = ctx.Node.Attribute(name);
|
||||||
if (attr != null)
|
if (attr != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user