Files
2024-10-07 16:17:27 +08:00

85 lines
2.5 KiB
C#

using System;
using PDFPatcher.Common;
namespace PDFPatcher.Model.PdfPath
{
public static class PathValue
{
public static double ToNumber(DocumentObject source, IPathValue value) {
double d;
switch (value.ValueType) {
case PathValueType.Expression:
var p = (value as IPathExpression).SelectObject(source);
if (p == null) {
return Double.NaN;
}
return Double.TryParse(p.FriendlyValue ?? p.LiteralValue, out d) ? d : Double.NaN;
case PathValueType.String:
return Double.TryParse((value as PathStringValue).Value, out d) ? d : Double.NaN;
case PathValueType.Number:
return (value as PathNumberValue).Value;
case PathValueType.Boolean:
return (value as PathBooleanValue).Value ? 1 : 0;
default:
return Double.NaN;
}
}
public static string ToString(DocumentObject source, IPathValue value) {
switch (value.ValueType) {
case PathValueType.Expression:
var p = (value as IPathExpression).SelectObject(source);
if (p == null) {
return String.Empty;
}
return p.FriendlyValue ?? p.LiteralValue ?? String.Empty;
case PathValueType.String:
return (value as PathStringValue).Value;
case PathValueType.Number:
return (value as PathNumberValue).Value.ToText();
case PathValueType.Boolean:
return (value as PathBooleanValue).ToString();
default:
return String.Empty;
}
}
public static bool ToBoolean(DocumentObject source, IPathValue value) {
return value.ValueType switch {
PathValueType.Expression => ((IPathExpression)value).SelectObject(source) != null,
PathValueType.String => ((PathStringValue)value).Value.Length > 0,
PathValueType.Number => ((PathNumberValue)value).Value != 0,
PathValueType.Boolean => ((PathBooleanValue)value).Value,
_ => false,
};
}
sealed class PathStringValue(string value) : IConstantPathValue
{
public PathValueType ValueType => PathValueType.String;
public string Value { get; } = value;
public string LiteralValue => Value;
}
sealed class PathNumberValue(double value) : IConstantPathValue
{
public PathValueType ValueType => PathValueType.Number;
public double Value { get; } = value;
public string LiteralValue => Value.ToText();
}
sealed class PathBooleanValue(bool value) : IConstantPathValue
{
public PathValueType ValueType => PathValueType.Boolean;
public bool Value { get; } = value;
public string LiteralValue => Value.ToString();
}
}
}