summaryrefslogtreecommitdiff
path: root/RhSolutions.Parsers
diff options
context:
space:
mode:
authorSerghei Cebotari <serghei@cebotari.ru>2024-02-08 17:11:11 +0300
committerSerghei Cebotari <serghei@cebotari.ru>2024-02-08 17:11:11 +0300
commit69db707d6803ada3891e4e71b8660ad095392973 (patch)
treed188676a0a5c40816fc6fa73955e883ea1f8c206 /RhSolutions.Parsers
parenta9ce0c1785ce7c220ff953db7a21cf33535c6d26 (diff)
Rename Parser projects
Diffstat (limited to 'RhSolutions.Parsers')
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs23
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs25
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs22
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs27
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs30
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs30
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs22
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs22
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs20
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs11
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs11
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs11
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs27
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs26
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs11
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs24
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs24
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs36
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs32
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs26
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs30
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs30
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs42
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs17
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs56
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs7
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs24
-rw-r--r--RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs17
-rw-r--r--RhSolutions.Parsers/IProductParser.cs6
-rw-r--r--RhSolutions.Parsers/ParserKey.cs10
-rw-r--r--RhSolutions.Parsers/ParsersRegistration.cs25
-rw-r--r--RhSolutions.Parsers/RhSolutions.Parsers.csproj13
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>