diff --git a/public/VisualCard/CardTools.cs b/public/VisualCard/CardTools.cs index 5f673f3..ecabc92 100644 --- a/public/VisualCard/CardTools.cs +++ b/public/VisualCard/CardTools.cs @@ -103,12 +103,12 @@ public static Card[] GetCards(StreamReader stream) var prop = new PropertyInfo(CardLine); prefix = prop.Prefix; value = prop.Value; - while (prop.Continue) + while (prop.CanContinueMultiline()) { string nextLine = stream.ReadLine(); + prop.rawValue.Append(nextLine); - prop.AddLine(nextLine); - //Add it to the current line for later processing + // Add it to the current line for later processing CardLine += nextLine; } } diff --git a/public/VisualCard/Parsers/Arguments/PropertyInfo.cs b/public/VisualCard/Parsers/Arguments/PropertyInfo.cs index 3d14d48..9074885 100644 --- a/public/VisualCard/Parsers/Arguments/PropertyInfo.cs +++ b/public/VisualCard/Parsers/Arguments/PropertyInfo.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Text; using Textify.General; using VisualCard.Parts.Comparers; @@ -32,17 +33,17 @@ namespace VisualCard.Parsers.Arguments [DebuggerDisplay("Property: {Arguments.Length} args, {Prefix} [G: {Group}] = {Value}")] public class PropertyInfo : IEquatable { - private readonly string rawValue = ""; - private string tailValue = ""; + internal readonly StringBuilder rawValue = new(); private readonly string prefix = ""; private readonly string group = ""; private readonly ArgumentInfo[] arguments = []; + private readonly bool printableMultiline; /// /// Raw value /// public string Value => - rawValue + tailValue; + rawValue.ToString(); /// /// Property prefix @@ -68,11 +69,6 @@ public class PropertyInfo : IEquatable public ArgumentInfo[] Arguments => arguments; - /// - /// Specifies if this property spans multiple lines - /// - public bool Multiline { get; set; } - /// /// Checks to see if both the property info instances are equal /// @@ -123,18 +119,11 @@ public override int GetHashCode() public static bool operator !=(PropertyInfo? left, PropertyInfo? right) => !(left == right); - internal static string Encoding(ArgumentInfo[] args) - => VcardCommonTools.GetValuesString(args, "", VcardConstants._encodingArgumentSpecifier); - - /// - public bool Continue - => Multiline ? (0 < Value?.Length ? '=' == Value[Value.Length - 1] : false) : false; + internal string Encoding() + => VcardCommonTools.GetValuesString(arguments, "", VcardConstants._encodingArgumentSpecifier); - /// - public void AddLine(string line) - { - tailValue += line; - } + internal bool CanContinueMultiline() + => printableMultiline && 0 < Value?.Length && '=' == Value[Value.Length - 1]; internal PropertyInfo(string line) { @@ -158,13 +147,10 @@ internal PropertyInfo(string line) prefix = xNonstandard ? VcardConstants._xSpecifier : prefix; // Install values - this.rawValue = value; + this.rawValue.Append(value); this.prefix = prefix; this.arguments = finalArgs; - if (VcardConstants._quotedPrintable == Encoding(this.arguments)) - Multiline = true; - else - Multiline = false; + printableMultiline = Encoding() == VcardConstants._quotedPrintable; this.group = group.Trim(); } } diff --git a/public/VisualCard/Parsers/VcardCommonTools.cs b/public/VisualCard/Parsers/VcardCommonTools.cs index 458e4b2..fce73c5 100644 --- a/public/VisualCard/Parsers/VcardCommonTools.cs +++ b/public/VisualCard/Parsers/VcardCommonTools.cs @@ -505,7 +505,7 @@ internal static string GetFirstValue(ArgumentInfo[] args, string @default, strin return argString; } - internal static string MakeStringBlock(string target, int firstLength = 0, bool writeSpace = true) + internal static string MakeStringBlock(string target, int firstLength = 0, bool writeSpace = true, string encoding = "") { const int maxChars = 74; int maxCharsFirst = maxChars - firstLength; @@ -522,7 +522,7 @@ internal static string MakeStringBlock(string target, int firstLength = 0, bool selectedMax = writeSpace ? maxChars - 1 : maxChars; processed = 0; block.Append("\n"); - if (writeSpace) + if (writeSpace && encoding != VcardConstants._quotedPrintable) block.Append(" "); } if (target[currCharNum] != '\n' && target[currCharNum] != '\r') diff --git a/public/VisualCard/Parsers/VcardConstants.cs b/public/VisualCard/Parsers/VcardConstants.cs index 55e1386..2d67eb7 100644 --- a/public/VisualCard/Parsers/VcardConstants.cs +++ b/public/VisualCard/Parsers/VcardConstants.cs @@ -35,7 +35,7 @@ internal static class VcardConstants internal const string _spaceBreak = " "; internal const string _tabBreak = "\x0009"; - //Encodings + // Encodings internal const string _quotedPrintable = "QUOTED-PRINTABLE"; // Available in vCard 2.1, 3.0, 4.0, and 5.0 diff --git a/public/VisualCard/Parts/Card.cs b/public/VisualCard/Parts/Card.cs index e925640..06cbd07 100644 --- a/public/VisualCard/Parts/Card.cs +++ b/public/VisualCard/Parts/Card.cs @@ -241,7 +241,7 @@ public string SaveToString() cardBuilder.Append($"{group}."); partBuilder.Append($"{prefix}"); partBuilder.Append($"{partArguments}"); - partBuilder.Append($"{VcardCommonTools.MakeStringBlock(part.Value, partArgumentsLines[partArgumentsLines.Length - 1].Length + prefix.Length)}"); + partBuilder.Append($"{VcardCommonTools.MakeStringBlock(part.Value, partArgumentsLines[partArgumentsLines.Length - 1].Length + prefix.Length, encoding: part.Property?.Encoding() ?? "")}"); cardBuilder.AppendLine($"{partBuilder}"); } } @@ -276,7 +276,7 @@ public string SaveToString() cardBuilder.Append($"{group}."); partBuilder.Append($"{prefix}"); partBuilder.Append($"{partArguments}"); - partBuilder.Append($"{VcardCommonTools.MakeStringBlock(partRepresentation, partArgumentsLines[partArgumentsLines.Length - 1].Length + prefix.Length, !(partsArrayEnum == PartsArrayEnum.Agents && version.Major == 2))}"); + partBuilder.Append($"{VcardCommonTools.MakeStringBlock(partRepresentation, partArgumentsLines[partArgumentsLines.Length - 1].Length + prefix.Length, !(partsArrayEnum == PartsArrayEnum.Agents && version.Major == 2), part.Property?.Encoding() ?? "")}"); cardBuilder.AppendLine($"{partBuilder}"); } }