From 411edebf289e216dcad8837c0f366076e2b5df9c Mon Sep 17 00:00:00 2001 From: Serghei Cebotari Date: Sat, 19 Apr 2025 11:11:25 +0300 Subject: Refactor diameter handling to normalize values across fittings and pipes --- RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs | 7 +++++-- .../DrinkingWaterHeatingFittings/BendFormerHeating.cs | 2 +- .../DrinkingWaterHeatingFittings/BendFormerSanitary.cs | 2 +- .../DrinkingWaterHeatingFittings/ConnectionBend.cs | 2 +- .../DrinkingWaterHeatingFittings/Coupling.cs | 8 ++++---- .../DrinkingWaterHeatingFitting.cs | 10 +++++++++- RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs | 2 +- .../DrinkingWaterHeatingFittings/Eurocone.cs | 2 +- .../DrinkingWaterHeatingFittings/EuroconeAdapter.cs | 2 +- .../DrinkingWaterHeatingFittings/ProtectivePipe.cs | 2 +- .../DrinkingWaterHeatingFittings/SupportingClip.cs | 2 +- RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs | 4 ++-- .../ThreadElbowDoubleWallInternal.cs | 3 ++- .../DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs | 2 +- .../DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs | 2 +- .../DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs | 3 ++- .../DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs | 3 ++- .../DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs | 13 +++++++++++-- RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs | 2 +- RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs | 2 +- RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs | 2 +- 21 files changed, 50 insertions(+), 27 deletions(-) (limited to 'RhSolutions.Parsers') diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs index 3600cc8..b60a543 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs @@ -22,6 +22,9 @@ public abstract class Adapter : DrinkingWaterHeatingFitting { return false; } + string[] normalizedDiameters = diameters.Select(d => NormalizeDiameter(d.Groups["Diameter"].Value)) + .ToArray(); + Match thread = _thread.Match(input); string threadValue; if (!thread.Success && diameters.Count >= 2) @@ -37,13 +40,13 @@ public abstract class Adapter : DrinkingWaterHeatingFitting } else if (!thread.Success) { - threadValue = _defaultThreads[diameters[0].Groups["Diameter"].Value]; + threadValue = _defaultThreads[normalizedDiameters[0]]; } else { threadValue = thread.Groups["Thread"].Value; } - output = $"{_title} {diameters[0].Groups["Diameter"]} {threadValue}"; + output = $"{_title} {normalizedDiameters[0]} {threadValue}"; return true; } } diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs index 6a578fb..f6bf045 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs @@ -12,7 +12,7 @@ public class BendFormerHeating : DrinkingWaterHeatingFitting { return false; } - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); if (diameter == "16") { diameter += "/17"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs index 334f3fe..ef93b3c 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs @@ -13,7 +13,7 @@ public class BendFormerSanitary : DrinkingWaterHeatingFitting { return false; } - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); var angleMatch = _angle.Match(input); string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; output = $"{_title} {angle}° {diameter}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs index f161041..2aaec3d 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs @@ -18,7 +18,7 @@ public class ConnectionBend : DrinkingWaterHeatingFitting { return false; } - string diameter = match.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(match.Groups["Diameter"].Value); int length = int.Parse(match.Groups["Length"].Value); int nearest = lengths.OrderBy(x => Math.Abs(x - length)).First(); output = $"{_title} {diameter}/{nearest}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs index 79ed7b4..b71b3b7 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs @@ -8,15 +8,15 @@ public class Coupling : DrinkingWaterHeatingFitting public override bool TryParse(string input, out string output) { output = string.Empty; - var diametersMatches = _diameter.Matches(input); - if (diametersMatches.Count == 0) + var diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) { return false; } - var diameters = diametersMatches.Select(x => x.Groups["Diameter"].Value) + var diameters = diametersMatches.Select(x => NormalizeDiameter(x.Groups["Diameter"].Value)) .Take(2) .OrderByDescending(x => int.Parse(x)) - .ToArray(); + .ToArray(); if (diameters.Length == 1 || diameters[0] == diameters[1]) { output = $"{_title} равнопроходная {diameters[0]}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs index fcd2544..7dba12c 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs @@ -5,7 +5,7 @@ namespace RhSolutions.Parsers.Fittings; public abstract class DrinkingWaterHeatingFitting : IProductParser { protected static readonly Regex _diameter = - new(@"(?16|20|25|32|40|50|63|15)[\b\D]?"); + new(@"(?16|20|25|32|40|50|63|15|26)[\b\D]?"); protected static readonly Regex _angle = new(@"(?45|90)([\b\D]|$)"); protected static readonly Regex _thread = @@ -27,4 +27,12 @@ public abstract class DrinkingWaterHeatingFitting : IProductParser return false; } } + protected string NormalizeDiameter(string diameter) + { + return diameter switch + { + "26" => "25", + _ => diameter + }; + } } diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs index ccfb7d5..5153979 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs @@ -13,7 +13,7 @@ public class Elbow : DrinkingWaterHeatingFitting { return false; } - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); var angleMatch = _angle.Match(input); string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; output = $"{_title} {angle} {diameter}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs index e82533a..735e867 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs @@ -10,7 +10,7 @@ public abstract class Eurocone : DrinkingWaterHeatingFitting var diameterMatch = _diameter.Match(input); if (diameterMatch.Success) { - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); if (_titles.TryGetValue(diameter, out string? title)) { output = title; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs index 909bb14..208ffee 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs @@ -11,7 +11,7 @@ public class EuroconeAdapter : DrinkingWaterHeatingFitting var diameterMatch = _diameter.Match(input); if (diameterMatch.Success) { - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); output = $"{_title} {diameter}-G 3/4"; return true; } diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs index 36f028d..0aea919 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs @@ -11,7 +11,7 @@ public class ProtectivePipe : DrinkingWaterHeatingFitting var diameterMatch = _diameter.Match(input); if (diameterMatch.Success) { - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); if (diameter == "16") { diameter += "/17"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs index 8dd4a21..42bb354 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs @@ -11,7 +11,7 @@ public class SupportingClip : DrinkingWaterHeatingFitting var diameterMatch = _diameter.Match(input); if (diameterMatch.Success) { - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); if (diameter == "16") { diameter += "/17"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs index 8a80808..28b556e 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs @@ -9,8 +9,8 @@ public class TPiece : DrinkingWaterHeatingFitting { output = string.Empty; var diameters = _diameter.Matches(input) - .Select(match => match.Groups["Diameter"].Value) - .Select(d => int.Parse(d)) + .Select(match => NormalizeDiameter(match.Groups["Diameter"].Value)) + .Select(int.Parse) .ToArray(); if (diameters.Length == 1) { diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs index f45bc1f..b52ebee 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs @@ -22,7 +22,8 @@ public class ThreadElbowDoubleWallInternal : DrinkingWaterHeatingFitting return false; } var typeMatch = _type.Match(input); - string[] diameters = diameterMatches.Select(x => x.Groups["Diameter"].Value).ToArray(); + string[] diameters = diameterMatches.Select(x => NormalizeDiameter(x.Groups["Diameter"].Value)) + .ToArray(); string thread = threadMatch.Groups["Thread"].Value; string type = typeMatch.Success ? "длинный" : "короткий"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs index 3f9a66a..7cd0bb8 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs @@ -18,7 +18,7 @@ public class ThreadElbowWallExternal : DrinkingWaterHeatingFitting { return false; } - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); string thread = threadMatch.Groups["Thread"].Value; output = $"{_title} {diameter}-R {thread}"; return true; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs index 7729304..4bb6db6 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs @@ -22,7 +22,7 @@ public class ThreadElbowWallInternal : DrinkingWaterHeatingFitting return false; } var typeMatch = _type.Match(input); - string diameter = diameterMatch.Groups["Diameter"].Value; + string diameter = NormalizeDiameter(diameterMatch.Groups["Diameter"].Value); string thread = threadMatch.Groups["Thread"].Value; output = $"{_title} {(typeMatch.Success ? "длинный " : string.Empty)}{diameter}-Rp {thread}"; return true; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs index 0a75865..81cc734 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs @@ -16,7 +16,8 @@ public class ThreadTPieceExternal : DrinkingWaterHeatingFitting return false; } string thread = _thread.Match(input).Groups["Thread"].Value; - int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + int[] diameters = diametersMatches.Select(match => int.Parse(NormalizeDiameter(match.Groups["Diameter"].Value))) + .ToArray(); if (diameters.Length == 1) { output = $"{_title} {diameters[0]}-{diameters[0]}-R {thread}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs index c0d939f..27faa8a 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs @@ -14,7 +14,8 @@ public class ThreadTPieceInternal : DrinkingWaterHeatingFitting return false; } string thread = _thread.Match(input).Groups["Thread"].Value; - int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + int[] diameters = diametersMatches.Select(match => int.Parse(NormalizeDiameter(match.Groups["Diameter"].Value))) + .ToArray(); if (diameters.Length == 1) { if (diameters[0] < 25) diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs index c6ebda6..250d129 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs @@ -5,7 +5,7 @@ namespace RhSolutions.Parsers.Pipes; public abstract class DrinkingWaterHeatingPipe : IProductParser { protected static readonly Regex _diameter = - new(@"([\b\D]|^)?(?16|20|25|32|40|50|63)([\b\D]|$)"); + new(@"([\b\D]|^)?(?16|20|25|32|40|50|63|26)([\b\D]|$)"); protected static readonly Regex _type = new(@"([\b\W])(?бухт|отр|штанг)([\b\w\.\s])"); protected virtual string _title { get; } = string.Empty; @@ -36,7 +36,7 @@ public abstract class DrinkingWaterHeatingPipe : IProductParser { return false; } - var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var diameter = int.Parse(NormalizeDiameter(diameterMatch.Groups["Diameter"].Value)); var typeMatch = _type.Match(input); if (typeMatch.Success) { @@ -53,4 +53,13 @@ public abstract class DrinkingWaterHeatingPipe : IProductParser } return true; } + + protected string NormalizeDiameter(string diameter) + { + return diameter switch + { + "26" => "25", + _ => diameter + }; + } } diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs index aaf5dfc..768d86c 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs @@ -13,7 +13,7 @@ public class FlexPipe : DrinkingWaterHeatingPipe { return false; } - var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var diameter = int.Parse(NormalizeDiameter(diameterMatch.Groups["Diameter"].Value)); output = $"Труба {_title} {_diameterNames[diameter]}"; return true; } diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs index e182747..14bf939 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs @@ -30,7 +30,7 @@ public class PinkPipe : DrinkingWaterHeatingPipe { return false; } - var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var diameter = int.Parse(NormalizeDiameter(diameterMatch.Groups["Diameter"].Value)); if (diameter < 40) { output = $"Труба {_title} {_diameterNames[diameter]}"; diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs index f2c714d..4303daf 100644 --- a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs @@ -22,7 +22,7 @@ public class StabilPipe : DrinkingWaterHeatingPipe { return false; } - var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var diameter = int.Parse(NormalizeDiameter(diameterMatch.Groups["Diameter"].Value)); var typeMatch = _type.Match(input); if (diameter > 40) { -- cgit v1.2.3