Skip to content

Commit

Permalink
DefaultWktOutputFormatter now working
Browse files Browse the repository at this point in the history
Also reparsing in unit test ParseAllWKTs from SRID csv => Works!
  • Loading branch information
driekus77 committed Jul 21, 2024
1 parent 0539e85 commit b982745
Show file tree
Hide file tree
Showing 21 changed files with 910 additions and 13 deletions.
198 changes: 198 additions & 0 deletions src/ProjNet/Wkt/DefaultWktOutputFormatter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
using System;
using System.Globalization;
using System.Text;

namespace ProjNet.Wkt
{
/// <summary>
/// DefaultWktOutputFormatter - Keeping output compact with original delimiters.
/// </summary>
public class DefaultWktOutputFormatter : IWktOutputFormatter
{
private int indentCounter = 0;

/// <inheritdoc/>
public string Newline { get; } = null;
/// <inheritdoc/>
public char? LeftDelimiter { get; } = null;
/// <inheritdoc/>
public char? RightDelimiter { get; } = null;

/// <inheritdoc/>
public string Separator { get; } = null;

/// <summary>
/// Indent chars. E.g. tab or spaces. Default null.
/// </summary>
public string Indent { get; } = null;

/// <inheritdoc/>
public string ExtraWhitespace { get; } = null;


/// <summary>
/// Constructor with support for optional overriding the settings.
/// </summary>
/// <param name="newline"></param>
/// <param name="leftDelimiter"></param>
/// <param name="rightDelimiter"></param>
/// <param name="indent"></param>
/// <param name="extraWhitespace"></param>
public DefaultWktOutputFormatter(
string newline = null,
char? leftDelimiter = null,
char? rightDelimiter = null,
string indent = null,
string extraWhitespace = null)
{
Newline = newline;
LeftDelimiter = leftDelimiter;
RightDelimiter = rightDelimiter;
Indent = indent;
ExtraWhitespace = extraWhitespace;
}


/// <inheritdoc/>
public IWktOutputFormatter AppendKeyword(string text, StringBuilder result, bool indent = true)
{
if (indent)
this.AppendIndent(result);

result.Append(text);

this.IncreaseIndentCounter();

return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendSeparator(StringBuilder result, bool keepInside = false)
{
string s = Separator ?? ",";
result.Append(s);
if (!keepInside)
{
this.AppendNewline(result);
}

return this;
}


/// <inheritdoc/>
public IWktOutputFormatter Append(string text, StringBuilder result)
{
result.Append(text);
return this;
}

/// <inheritdoc/>
public IWktOutputFormatter Append(long l, StringBuilder result)
{
result.Append(l);
return this;
}

/// <inheritdoc/>
public IWktOutputFormatter Append(double d, StringBuilder result)
{
result.Append(d.ToString(CultureInfo.InvariantCulture));
return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendNewline(StringBuilder result)
{
if (!string.IsNullOrEmpty(Newline))
{
result.Append(Newline);
}

return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendQuotedText(string text, StringBuilder result)
{
result.Append($"\"{text}\"");
return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendLeftDelimiter(char original, StringBuilder result)
{
if (LeftDelimiter != null)
result.Append(LeftDelimiter);
else
result.Append(original);
return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendRightDelimiter(char original, StringBuilder result)
{
//this.AppendIndent(result);

if (RightDelimiter != null)
result.Append(RightDelimiter);
else
result.Append(original);

this.DecreaseIndentCounter();
//this.AppendNewline(result);

return this;
}

/// <inheritdoc/>
public IWktOutputFormatter AppendExtraWhitespace(StringBuilder result)
{
if (!string.IsNullOrEmpty(ExtraWhitespace))
{
result.Append(ExtraWhitespace);
}

return this;
}

/// <summary>
/// Increasing the indentCounter.
/// </summary>
/// <returns></returns>
public IWktOutputFormatter IncreaseIndentCounter()
{
indentCounter++;
return this;
}

/// <summary>
/// Decreasing the indentCounter.
/// </summary>
/// <returns></returns>
public IWktOutputFormatter DecreaseIndentCounter()
{
indentCounter--;
return this;
}


/// <summary>
/// AppendIndent repeat Indent according to internal indentCounter.
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
public IWktOutputFormatter AppendIndent(StringBuilder result)
{
if (!string.IsNullOrEmpty(Indent))
{
for (int i = 1; i <= indentCounter; i++)
{
result.Append(Indent);
}
}

return this;
}
}
}
139 changes: 139 additions & 0 deletions src/ProjNet/Wkt/IWktOutputFormatter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
using System;
using System.Text;

namespace ProjNet.Wkt
{

/// <summary>
/// IWktOutputFormatter interface for customizing ToString(...) support.
/// </summary>
public interface IWktOutputFormatter
{
/// <summary>
/// Newline char or empty string. Default empty.
/// </summary>
string Newline { get; }

/// <summary>
/// LeftDelimiter if empty use original. Default empty.
/// </summary>
char? LeftDelimiter { get; }
/// <summary>
/// RightDelimiter if empty use original. Default empty.
/// </summary>
char? RightDelimiter { get; }

/// <summary>
/// Separator to use. Default comma ,
/// </summary>
string Separator { get; }

/// <summary>
/// ExtraWhitespace. Default empty.
/// </summary>
string ExtraWhitespace { get; }


/// <summary>
/// Changeable Append method for Keywords. Optional extra indent is written.
/// </summary>
/// <param name="text"></param>
/// <param name="result"></param>
/// <param name="indent"></param>
/// <returns></returns>
IWktOutputFormatter AppendKeyword(string text, StringBuilder result, bool indent = true);


/// <summary>
/// Changeable Append method for Separator. Optional extra newline afterward.
/// </summary>
/// <param name="result"></param>
/// <param name="keepInside"></param>
/// <returns></returns>
IWktOutputFormatter AppendSeparator(StringBuilder result, bool keepInside = false);

/// <summary>
/// Changeable Append method for string.
/// </summary>
/// <param name="text"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter Append(string text, StringBuilder result);

/// <summary>
/// Changeable Append method for long.
/// </summary>
/// <param name="l"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter Append(long l, StringBuilder result);

/// <summary>
/// Changeable Append method for double.
/// </summary>
/// <param name="d"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter Append(double d, StringBuilder result);


/// <summary>
/// Changeable AppendNewline method applying Newline.
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendNewline(StringBuilder result);

/// <summary>
/// Changeable AppendQuotedText method applying text surrounded by double quotes.
/// </summary>
/// <param name="text"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendQuotedText(string text, StringBuilder result);

/// <summary>
/// Changeable AppendLeftDelimiter applying LeftDelimiter or original.
/// </summary>
/// <param name="original"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendLeftDelimiter(char original, StringBuilder result);

/// <summary>
/// Changeable AppendRightDelimiter applying RightDelimiter or original.
/// </summary>
/// <param name="original"></param>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendRightDelimiter(char original, StringBuilder result);


/// <summary>
/// Changeable AppendExtraWhitespace optionally applying extr whitespace.
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendExtraWhitespace(StringBuilder result);

/// <summary>
/// IncreaseIndentCounter
/// </summary>
/// <returns></returns>
IWktOutputFormatter IncreaseIndentCounter();

/// <summary>
/// DecreaseIndentCounter
/// </summary>
/// <returns></returns>
IWktOutputFormatter DecreaseIndentCounter();


/// <summary>
/// AppendIndent
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
IWktOutputFormatter AppendIndent(StringBuilder result);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using ProjNet.Wkt.Tree;

namespace ProjNet.Wkt.Tree
namespace ProjNet.Wkt
{
/// <summary>
/// IWktTraverseHandler interface for traveling a WktObject tree.
Expand Down
9 changes: 9 additions & 0 deletions src/ProjNet/Wkt/Tree/IWktObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,14 @@ public interface IWktObject
/// </summary>
/// <param name="handler"></param>
void Traverse(IWktTraverseHandler handler);


/// <summary>
/// Ouput this WktObject to string using the provided formatter.
/// If formatter is null the DefaultWktOutputFormatter is used.
/// </summary>
/// <param name="formatter"></param>
/// <returns></returns>
string ToString(IWktOutputFormatter formatter);
}
}
22 changes: 22 additions & 0 deletions src/ProjNet/Wkt/Tree/WktAuthority.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Globalization;
using System.Linq;
using System.Text;

namespace ProjNet.Wkt.Tree
{
Expand Down Expand Up @@ -92,5 +94,25 @@ public override void Traverse(IWktTraverseHandler handler)
{
handler.Handle(this);
}

/// <inheritdoc/>
public override string ToString(IWktOutputFormatter formatter)
{
formatter = formatter ?? new DefaultWktOutputFormatter();

var result = new StringBuilder();

formatter
.AppendKeyword(Keyword, result, false)
.AppendLeftDelimiter(LeftDelimiter, result)
.AppendQuotedText(Name, result)
.AppendSeparator(result, keepInside: true)
.AppendExtraWhitespace(result)
.AppendQuotedText(Code.ToString(CultureInfo.InvariantCulture), result)
.AppendRightDelimiter(RightDelimiter, result);

return result.ToString();
}

}
}
Loading

0 comments on commit b982745

Please sign in to comment.