diff options
author | Serghei Cebotari <serghei@cebotari.ru> | 2024-02-08 17:11:11 +0300 |
---|---|---|
committer | Serghei Cebotari <serghei@cebotari.ru> | 2024-02-08 17:11:11 +0300 |
commit | 69db707d6803ada3891e4e71b8660ad095392973 (patch) | |
tree | d188676a0a5c40816fc6fa73955e883ea1f8c206 /RhSolutions.Parsers | |
parent | a9ce0c1785ce7c220ff953db7a21cf33535c6d26 (diff) |
Rename Parser projects
Diffstat (limited to 'RhSolutions.Parsers')
41 files changed, 800 insertions, 0 deletions
diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs new file mode 100644 index 0000000..59da412 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs @@ -0,0 +1,23 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +public abstract class Adapter : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = string.Empty; + Match diameter = _diameter.Match(input); + if (!diameter.Success) + { + return false; + } + Match thread = _thread.Match(input); + if (!thread.Success) + { + return false; + } + output = $"{_title} {diameter.Groups["Diameter"]} {thread.Groups["Thread"]}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs new file mode 100644 index 0000000..af77ee8 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на наружную резьбу")] +public class AdapterExternal : Adapter +{ + protected override string _title => "Переходник с наружной резьбой"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs new file mode 100644 index 0000000..8c1fe92 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на внутреннюю резьбу")] +public class AdapterInternal : Adapter +{ + protected override string _title => "Переходник с внутренней резьбой -угольник-переходник"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs new file mode 100644 index 0000000..8223bb4 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник с накидной гайкой")] +public class AdapterScrewcap : Adapter +{ + protected override string _title => "Переходник с накидной гайкой"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs new file mode 100644 index 0000000..6a578fb --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs @@ -0,0 +1,25 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Фиксатор поворота отопление")] +public class BendFormerHeating : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксатор поворота"; + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {diameter}/{angle}°"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs new file mode 100644 index 0000000..334f3fe --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Фиксатор поворота водоснабжение")] +public class BendFormerSanitary : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксатор поворота с кольцами"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {angle}° {diameter}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs new file mode 100644 index 0000000..af54329 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs @@ -0,0 +1,27 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Трубка Г-образная")] +public class ConnectionBend : DrinkingWaterHeatingFitting +{ + private static readonly int[] lengths = [250, 500, 1000]; + private static readonly Regex _pattern = + new(@"([\b\D]|^)?(?<Diameter>16|20|25)(\D+|.*15.*)(?<Length>\b\d{3,4})([\b\D]|$)"); + protected override string _title => "Трубка Г-образная"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var match = _pattern.Match(input); + if (!match.Success) + { + return false; + } + string diameter = 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}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs new file mode 100644 index 0000000..72f2015 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Трубка Т-образная")] +public class ConnectionTee : ConnectionBend +{ + protected override string _title => "Трубка Т-образная"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs new file mode 100644 index 0000000..79ed7b4 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs @@ -0,0 +1,30 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Муфта соединительная")] +public class Coupling : DrinkingWaterHeatingFitting +{ + protected override string _title => "Муфта соединительная"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + var diameters = diametersMatches.Select(x => x.Groups["Diameter"].Value) + .Take(2) + .OrderByDescending(x => int.Parse(x)) + .ToArray(); + if (diameters.Length == 1 || diameters[0] == diameters[1]) + { + output = $"{_title} равнопроходная {diameters[0]}"; + } + else + { + output = $"{_title} переходная {diameters[0]}-{diameters[1]}"; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs new file mode 100644 index 0000000..218e9e0 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +public abstract class DrinkingWaterHeatingFitting : IProductParser +{ + protected static readonly Regex _diameter = + new(@"([\b\D]|^)?(?<Diameter>16|20|25|32|40|50|63)([\b\D]|$)"); + protected static readonly Regex _angle = + new(@"([\b\D])(?<Angle>45|90)([\b\D]|$)"); + protected static readonly Regex _thread = + new(@"([\b\D])(?<Thread>1\s+1/4|1\s+1/2|1/2|3/4|2|1)([\b\D]|$)"); + + protected virtual string _title { get; } = string.Empty; + + public virtual bool TryParse(string input, out string output) + { + var match = _diameter.Match(input); + if (match.Success) + { + output = $"{_title} {match.Groups["Diameter"]}"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs new file mode 100644 index 0000000..cf7ec22 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Заглушка труб RAUTITAN")] +public class DummyPlug : DrinkingWaterHeatingFitting +{ + protected override string _title => "Заглушка для полимерн. трубы"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs new file mode 100644 index 0000000..ccfb7d5 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник RAUTITAN")] +public class Elbow : DrinkingWaterHeatingFitting +{ + protected override string _title { get; } = "Угольник -PLATINUM"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {angle} {diameter}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs new file mode 100644 index 0000000..e82533a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +public abstract class Eurocone : DrinkingWaterHeatingFitting +{ + protected virtual Dictionary<string, string> _titles { get; } = new(); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (_titles.TryGetValue(diameter, out string? title)) + { + output = title; + return true; + } + } + return false; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs new file mode 100644 index 0000000..909bb14 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs @@ -0,0 +1,20 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на евроконус")] +public class EuroconeAdapter : DrinkingWaterHeatingFitting +{ + protected override string _title => "Переходник на евроконус"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + output = $"{_title} {diameter}-G 3/4"; + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs new file mode 100644 index 0000000..a683fef --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное для трубки")] +public class EuroconeConnectionBend : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = "Резьбозажимное соединение для металлической трубки G 3/4 -15"; + return true; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs new file mode 100644 index 0000000..7bc1738 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное flex")] +public class EuroconeFlex : Eurocone +{ + protected override Dictionary<string, string> _titles => new() + { + ["16"] = "Резьбозажимное соединение flex/pink 16х2,2xG3/4", + ["20"] = "Резьбозажимное соединение flex/pink 20х2,8xG3/4" + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs new file mode 100644 index 0000000..bab3765 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное stabil")] +public class EuroconeStabil : Eurocone +{ + protected override Dictionary<string, string> _titles => new() + { + ["16"] = "Резьбозажимное соединение stabil 16,2x2,6xG3/4", + ["20"] = "Резьбозажимное соединение stabil 20x2,9xG3/4" + }; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs new file mode 100644 index 0000000..2ac2cf1 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs @@ -0,0 +1,27 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Коллектор G1")] +public class ManifoldG1 : DrinkingWaterHeatingFitting +{ + private static readonly Regex _portsCount = + new(@"\s(?<Ports>\d{1})\s"); + + protected override string _title => "Распределительный коллектор G1"; + + public override bool TryParse(string input, out string output) + { + var match = _portsCount.Match(input); + if (match.Success) + { + output = $"{_title} {match.Groups["Ports"]}"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs new file mode 100644 index 0000000..f4a4d48 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs @@ -0,0 +1,26 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Коллектор HLV")] +public class ManifoldHLV : DrinkingWaterHeatingFitting +{ private static readonly Regex _portsCount = + new(@"\s(?<Ports>\d{1,2})\s"); + + protected override string _title => "Распределительный коллектор HLV"; + + public override bool TryParse(string input, out string output) + { + var match = _portsCount.Match(input); + if (match.Success) + { + output = $"{_title} на {match.Groups["Ports"]} групп"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs new file mode 100644 index 0000000..9a0b3bf --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Ниппель")] +public class Nippel : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = "К-т двух резьбозажим. нипелей с нар.резьбой 1/2х3/4"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs new file mode 100644 index 0000000..36f028d --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Гофротруба RAUTITAN")] +public class ProtectivePipe : DrinkingWaterHeatingFitting +{ + protected override string _title => "Гофротруба защитн.для ПЭ-трубы"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + output = $"{_title} {diameter}"; + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs new file mode 100644 index 0000000..3a735bc --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с накидной гайкой")] +public class ScrewcapElbow : Adapter +{ + protected override string _title => "Угольник-переходник с накидной гайкой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs new file mode 100644 index 0000000..f821829 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Монтажная гильза")] +public class Sleeve : DrinkingWaterHeatingFitting +{ + protected override string _title => "Монтажная гильза"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs new file mode 100644 index 0000000..8dd4a21 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Желоб")] +public class SupportingClip : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксирующий желоб для ПЭ-трубы"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + output = $"{_title} {diameter}"; + return true; + } + return false; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs new file mode 100644 index 0000000..8a80808 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs @@ -0,0 +1,36 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN")] +public class TPiece : DrinkingWaterHeatingFitting +{ + protected override string _title => "Тройник -PLATINUM"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameters = _diameter.Matches(input) + .Select(match => match.Groups["Diameter"].Value) + .Select(d => int.Parse(d)) + .ToArray(); + if (diameters.Length == 1) + { + output = $"{_title} {diameters[0]}-{diameters[0]}-{diameters[0]}"; + } + else if (diameters.Length >= 3) + { + if (diameters[2] > diameters[0]) + { + output = $"{_title} {diameters[2]}-{diameters[1]}-{diameters[0]}"; + } + else + { + output = $"{_title} {diameters[0]}-{diameters[1]}-{diameters[2]}"; + } + } + else + { + return false; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs new file mode 100644 index 0000000..f45bc1f --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs @@ -0,0 +1,32 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Проточный настенный угольник")] +public class ThreadElbowDoubleWallInternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Проточный настенный угольник"; + private Regex _type = new(@"([\b\Wу])(?<Type>длин)([\b\w\.\s])"); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatches = _diameter.Matches(input); + if (diameterMatches.Count == 0) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + var typeMatch = _type.Match(input); + string[] diameters = diameterMatches.Select(x => x.Groups["Diameter"].Value).ToArray(); + string thread = threadMatch.Groups["Thread"].Value; + string type = typeMatch.Success ? "длинный" : "короткий"; + + output = $"{_title} {diameters[0]}/{(diameters.Length > 1 ? diameters[1] : diameters[0])}-Rp {thread} {type}"; + return true; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs new file mode 100644 index 0000000..78741ef --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с наружной резьбой")] +public class ThreadElbowExternal : Adapter +{ + protected override string _title => "Угольник-переходник с наружной резьбой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs new file mode 100644 index 0000000..2246ec6 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с внутренней резьбой")] +public class ThreadElbowInternal : Adapter +{ + protected override string _title => "Угольник-переходник с внутренней резьбой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs new file mode 100644 index 0000000..3f9a66a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs @@ -0,0 +1,26 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник настенный наружный")] +public class ThreadElbowWallExternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Угольник настенный с наружной резьбой"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + string diameter = 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 new file mode 100644 index 0000000..7729304 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник настенный внутренний")] +public class ThreadElbowWallInternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Угольник настенный внутр. резьба"; + private Regex _type = new(@"([\b\Wу])(?<Type>длин)([\b\w\.\s])"); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + var typeMatch = _type.Match(input); + string diameter = diameterMatch.Groups["Diameter"].Value; + string thread = threadMatch.Groups["Thread"].Value; + output = $"{_title} {(typeMatch.Success ? "длинный " : string.Empty)}{diameter}-Rp {thread}"; + return true; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs new file mode 100644 index 0000000..0a75865 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN резьбовой наружный")] +public class ThreadTPieceExternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Тройник с наружной резьбой"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + MatchCollection diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + string thread = _thread.Match(input).Groups["Thread"].Value; + int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + if (diameters.Length == 1) + { + output = $"{_title} {diameters[0]}-{diameters[0]}-R {thread}"; + } + else + { + output = $"{_title} {diameters[0]}-{diameters[1]}-R {thread}"; + } + return true; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs new file mode 100644 index 0000000..c0d939f --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs @@ -0,0 +1,42 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN резьбовой внутренний")] +public class ThreadTPieceInternal : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = string.Empty; + MatchCollection diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + string thread = _thread.Match(input).Groups["Thread"].Value; + int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + if (diameters.Length == 1) + { + if (diameters[0] < 25) + { + output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[0]}"; + } + else + { + output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[0]}"; + } + } + else + { + if (diameters[0] < 25) + { + output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[1]}"; + } + else + { + output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[1]}"; + } + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs new file mode 100644 index 0000000..ca94117 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs @@ -0,0 +1,17 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Black")] +public class BlackPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Black"; + protected override Dictionary<int, string> _diameterNames => new() + { + [16] = "16х2,2", + [20] = "20х2,8", + [25] = "25х3,5", + [32] = string.Empty, + [40] = string.Empty, + [50] = string.Empty, + [63] = string.Empty + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs new file mode 100644 index 0000000..f3e0fc2 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs @@ -0,0 +1,56 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Pipes; + +public abstract class DrinkingWaterHeatingPipe : IProductParser +{ + protected static readonly Regex _diameter = + new(@"([\b\D]|^)?(?<Diameter>16|20|25|32|40|50|63)([\b\D]|$)"); + protected static readonly Regex _type = + new(@"([\b\W])(?<Type>бухт|отр|штанг)([\b\w\.\s])"); + protected virtual string _title { get; } = string.Empty; + + protected virtual Dictionary<int, string> _diameterNames { get; } = new() + { + [16] = "16x2,2", + [20] = "20x2,8", + [25] = "25x3,5", + [32] = "32x4,4", + [40] = "40x5,5", + [50] = "50x6,9", + [63] = "63x8,6" + }; + + protected virtual Dictionary<string, string> _makeUp { get; } = new() + { + ["бухт"] = "бухта", + ["штанг"] = "прям.отрезки", + ["отр"] = "прям.отрезки" + }; + + public bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var typeMatch = _type.Match(input); + if (typeMatch.Success) + { + var type = typeMatch.Groups["Type"].Value; + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp[type]}"; + } + else if (diameter < 32) + { + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["бухт"]}"; + } + else + { + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["отр"]}"; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs new file mode 100644 index 0000000..4a98634 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Flex")] +public class FlexPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Flex"; +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs new file mode 100644 index 0000000..d40483a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Pink")] +public class PinkPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Pink+"; + + protected override Dictionary<string, string> _makeUp => new() + { + ["бухт"] = "бухта", + ["штанг"] = "прямые отрезки", + ["отр"] = "прямые отрезки" + }; + protected override Dictionary<int, string> _diameterNames => new() + { + [16] = "16х2,2", + [20] = "20х2,8", + [25] = "25х3,5", + [32] = "32х4,4", + [40] = "40х5,5", + [50] = "50х6,9", + [63] = "63х8,7" + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs new file mode 100644 index 0000000..1a52562 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs @@ -0,0 +1,17 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Stabil")] +public class StabilPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Stabil -PLATINUM"; + protected override Dictionary<int, string> _diameterNames => new() + { + [16] = "16,2х2,6", + [20] = "20х2,9", + [25] = "25х3,7", + [32] = "32х4,7", + [40] = "40х6,0", + [50] = "50x6,9", + [63] = "63x8,6" + }; +} diff --git a/RhSolutions.Parsers/IProductParser.cs b/RhSolutions.Parsers/IProductParser.cs new file mode 100644 index 0000000..485ff7e --- /dev/null +++ b/RhSolutions.Parsers/IProductParser.cs @@ -0,0 +1,6 @@ +namespace RhSolutions.Parsers; + +public interface IProductParser +{ + public bool TryParse(string input, out string output); +} diff --git a/RhSolutions.Parsers/ParserKey.cs b/RhSolutions.Parsers/ParserKey.cs new file mode 100644 index 0000000..3bf4513 --- /dev/null +++ b/RhSolutions.Parsers/ParserKey.cs @@ -0,0 +1,10 @@ +namespace RhSolutions.Parsers; + +public class ParserKey : Attribute +{ + public string Value { get; private set; } + public ParserKey(string value) + { + Value = value; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/ParsersRegistration.cs b/RhSolutions.Parsers/ParsersRegistration.cs new file mode 100644 index 0000000..54f34be --- /dev/null +++ b/RhSolutions.Parsers/ParsersRegistration.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; + +namespace RhSolutions.Parsers; + +public static class ParsersRegistration +{ + public static void AddModifiers(this IServiceCollection services) + { + var types = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(s => s.GetTypes()) + .Where(p => p.IsDefined(typeof(ParserKey), true)); + + foreach (Type t in types) + { + string key = GetModifierKey(t); + services.AddKeyedTransient(typeof(IProductParser), key, t); + } + } + + private static string GetModifierKey(Type t) + { + return t.GetCustomAttribute<ParserKey>()?.Value ?? string.Empty; + } +}
\ No newline at end of file diff --git a/RhSolutions.Parsers/RhSolutions.Parsers.csproj b/RhSolutions.Parsers/RhSolutions.Parsers.csproj new file mode 100644 index 0000000..e20e8ff --- /dev/null +++ b/RhSolutions.Parsers/RhSolutions.Parsers.csproj @@ -0,0 +1,13 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <FrameworkReference Include="Microsoft.AspNetCore.App" /> + </ItemGroup> + +</Project> |