- Add SourceLocation struct (XNeedle namespace) with FilePath, Encoding, and LineNumber (-1 sentinel when unavailable) - Add SLoc property to Context; Clone() propagates it for free - Expose XmlRoundtripWriter.DetectEncoding as internal static - Add XmlRoundtripWriter.CreateToString(filePath, encoding) returning a (writer, StringBuilder) tuple for in-memory style-preserving rendering - Update XmlFragParser.ChecksumData to accept tagName only; use OpeningTagAnchor to skip the opening tag robustly, and AnyChar.Until() to non-greedily capture content through the closing tag - Thread SourceLocation from Program.cs through Rule.Transform/Operate, refreshing LineNumber per node via IXmlLineInfo - Implement ContextFunctions.crc: render node via CreateToString, extract digest slice via ChecksumData, encode with SLoc.Encoding, return CRC32 as double for arithmetic compatibility Clanker: claude-sonnet_4.6
30 lines
925 B
C#
30 lines
925 B
C#
using System.Text;
|
|
|
|
namespace XNeedle
|
|
{
|
|
/// <summary>
|
|
/// Carries the origin information for a loaded XML document:
|
|
/// the file path, the detected encoding, and the line number of the
|
|
/// associated node (-1 when line information is unavailable).
|
|
/// </summary>
|
|
public struct SourceLocation
|
|
{
|
|
public string FilePath { get; set; }
|
|
public Encoding Encoding { get; set; }
|
|
/// <summary>
|
|
/// 1-based line number of the associated node, or -1 if unknown.
|
|
/// </summary>
|
|
public int LineNumber { get; set; }
|
|
|
|
public SourceLocation(string filePath, Encoding encoding, int lineNumber = -1)
|
|
{
|
|
FilePath = filePath;
|
|
Encoding = encoding;
|
|
LineNumber = lineNumber;
|
|
}
|
|
|
|
public SourceLocation WithLineNumber(int lineNumber) =>
|
|
new SourceLocation(FilePath, Encoding, lineNumber);
|
|
}
|
|
}
|