using System; using System.Linq; using Sprache; using XNeedle.Parser; using XNeedle.Parser.Elements; namespace XNeedle.Transformation { public class ContextFunctions { public static string hex(Context ctx, double value) { uint v = (uint)value; return $"#x{v:X8}"; } public static double GetLevel(Context ctx) { int level = 0; System.Xml.Linq.XElement? n = ctx.Node; while (null != (n = n?.Parent)) level++; return level; } public static double crc(Context ctx) { if (ctx.Node is null) { return 0; } int crc = 0xAFFE; return (double)crc; } public static string text(Context ctx) { if (ctx.Node is null) return ""; return ctx.Node.Value; } public static string text(Context ctx, string txt) { if (ctx.Node is null) return ""; ctx.Node.SetValue(txt); return txt; } public static string cdata(Context ctx) { if (ctx.Node is null) return ""; var cdataNode = ctx.Node.Nodes().OfType().FirstOrDefault(); return cdataNode?.Value ?? ""; } public static string cdata(Context ctx, string txt) { if (ctx.Node is null) return ""; var cdataNode = ctx.Node.Nodes().OfType().FirstOrDefault(); if (cdataNode != null) { cdataNode.Value = txt; } else { ctx.Node.Add(new System.Xml.Linq.XCData(txt)); } return txt; } public static string attr(Context ctx, string name, string value) { if (ctx.Node is null) return ""; var attr = ctx.Node.Attribute(name); if (attr != null) { attr.Value = value; } else { ctx.Node.SetAttributeValue(name, value); } return ""; } public static string attr(Context ctx, string name) { var attr = ctx.Node?.Attribute(name); if (attr != null) { return attr.Value; } return ""; } } }