xn/Program.cs
Dominic Höglinger 6f94002cf4 Fix comment handling
Clanker: claude-sonnet_v4.6
2026-04-24 20:11:08 +02:00

55 lines
2.0 KiB
C#

using System;
using System.Xml;
using System.Xml.Linq;
using CommandLine;
using Sprache;
using XNeedle.Parser;
using XNeedle.Parser.Elements;
using XNeedle.Transformation;
using XNeedle.Formats;
namespace XNeedle
{
class Program
{
public class Options
{
[Value(0, MetaName = "xn", Required = true, HelpText = "XN transformation definition")]
public string XnDefinition { get; set; }
[Option('i', "input", HelpText = "Input XML file", Required = true)]
public string Input { get; set; }
[Option('o', "output", HelpText = "Output XML file", Required = true)]
public string Output { get; set; }
[Option('v', "verbose", Required = false, HelpText = "Set output to verbose messages.")]
public bool Verbose { get; set; }
}
static void Main(string[] args)
{
CommandLine.Parser.Default.ParseArguments<Options>(args)
.WithParsed(RunOptions)
.WithNotParsed(HandleParseError);
}
static void RunOptions(Options opts)
{
// Auto-discover operations via reflection
BangOperation.RegisterAll();
var xnSource = XnParser.StripComments(File.ReadAllText(opts.XnDefinition));
Console.WriteLine(xnSource);
var masterRule = (Rule)XnParser.RuleObject.Parse(xnSource);
var doc = XDocument.Load(opts.Input, LoadOptions.PreserveWhitespace);
var encoding = XmlRoundtripWriter.DetectEncoding(File.ReadAllBytes(opts.Input));
var sloc = new SourceLocation(opts.Input, encoding);
masterRule.Transform(doc, sloc);
using var writer = XmlRoundtripWriter.Create(opts.Input, opts.Output);
doc.WriteTo(writer);
Console.WriteLine($"Applied \"{opts.XnDefinition}\" to \"{opts.Input}\" and saved result to \"{opts.Output}\"");
}
static void HandleParseError(IEnumerable<Error> errs) {}
}
}