aboutsummaryrefslogtreecommitdiff
path: root/src/Enmarcha.Backend/Helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/Enmarcha.Backend/Helpers')
-rw-r--r--src/Enmarcha.Backend/Helpers/ContrastHelper.cs48
-rw-r--r--src/Enmarcha.Backend/Helpers/SortingHelper.cs35
2 files changed, 83 insertions, 0 deletions
diff --git a/src/Enmarcha.Backend/Helpers/ContrastHelper.cs b/src/Enmarcha.Backend/Helpers/ContrastHelper.cs
new file mode 100644
index 0000000..abc3dba
--- /dev/null
+++ b/src/Enmarcha.Backend/Helpers/ContrastHelper.cs
@@ -0,0 +1,48 @@
+namespace Enmarcha.Backend.Helpers;
+
+using System;
+using System.Globalization;
+
+public static class ContrastHelper
+{
+ public static string GetBestTextColour(string backgroundHex)
+ {
+ // Strip #
+ backgroundHex = backgroundHex.TrimStart('#');
+
+ if (backgroundHex.Length != 6)
+ throw new ArgumentException("Hex colour must be 6 characters (RRGGBB)");
+
+ // Parse RGB
+ int r = int.Parse(backgroundHex.Substring(0, 2), NumberStyles.HexNumber);
+ int g = int.Parse(backgroundHex.Substring(2, 2), NumberStyles.HexNumber);
+ int b = int.Parse(backgroundHex.Substring(4, 2), NumberStyles.HexNumber);
+
+ // Convert to relative luminance
+ double luminance = GetRelativeLuminance(r, g, b);
+
+ // Contrast ratios
+ double contrastWithWhite = (1.0 + 0.05) / (luminance + 0.05);
+ double contrastWithBlack = (luminance + 0.05) / 0.05;
+
+ if (contrastWithWhite >= 2.5)
+ {
+ return "#FFFFFF";
+ }
+
+ return "#000000";
+ }
+
+ private static double GetRelativeLuminance(int r, int g, int b)
+ {
+ double rs = r / 255.0;
+ double gs = g / 255.0;
+ double bs = b / 255.0;
+
+ rs = rs <= 0.03928 ? rs / 12.92 : Math.Pow((rs + 0.055) / 1.055, 2.4);
+ gs = gs <= 0.03928 ? gs / 12.92 : Math.Pow((gs + 0.055) / 1.055, 2.4);
+ bs = bs <= 0.03928 ? bs / 12.92 : Math.Pow((bs + 0.055) / 1.055, 2.4);
+
+ return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
+ }
+}
diff --git a/src/Enmarcha.Backend/Helpers/SortingHelper.cs b/src/Enmarcha.Backend/Helpers/SortingHelper.cs
new file mode 100644
index 0000000..c70dab2
--- /dev/null
+++ b/src/Enmarcha.Backend/Helpers/SortingHelper.cs
@@ -0,0 +1,35 @@
+namespace Enmarcha.Backend.Helpers;
+
+public class SortingHelper
+{
+ public static int SortRouteShortNames(string? a, string? b)
+ {
+ if (a == null && b == null) return 0;
+ if (a == null) return 1;
+ if (b == null) return -1;
+
+ var aDigits = new string(a.Where(char.IsDigit).ToArray());
+ var bDigits = new string(b.Where(char.IsDigit).ToArray());
+
+ bool aHasDigits = int.TryParse(aDigits, out int aNumber);
+ bool bHasDigits = int.TryParse(bDigits, out int bNumber);
+
+ if (aHasDigits != bHasDigits)
+ {
+ // Non-numeric routes (like "A" or "-") go to the beginning
+ return aHasDigits ? 1 : -1;
+ }
+
+ if (aHasDigits && bHasDigits)
+ {
+ if (aNumber != bNumber)
+ {
+ return aNumber.CompareTo(bNumber);
+ }
+ }
+
+ // If both are non-numeric, or numeric parts are equal, use alphabetical
+ return string.Compare(a, b, StringComparison.OrdinalIgnoreCase);
+ }
+
+}