| | 1 | | using System; |
| | 2 | | using System.Collections.Generic; |
| | 3 | | using System.Text; |
| | 4 | |
|
| | 5 | | namespace MUNity.Extensions.Conversion |
| | 6 | | { |
| | 7 | |
|
| | 8 | | /// <summary> |
| | 9 | | /// Extension Methods to Convert the Index of preamble Paragraphs or operative paragraphs to the default |
| | 10 | | /// Schemas for example: 1.a.i, 1.a.ii. |
| | 11 | | /// You could also use this Extensions to get all roman letters or numbers. |
| | 12 | | /// </summary> |
| | 13 | | public static class IndexConversion |
| | 14 | | { |
| | 15 | |
|
| | 16 | | /// <summary> |
| | 17 | | /// Converts a given number between 1 and 3999 to the roman code. |
| | 18 | | /// </summary> |
| | 19 | | /// <param name="number">Integer between 1 and 3999</param> |
| | 20 | | /// <returns></returns> |
| | 21 | | public static string ToRoman(this int number) |
| 0 | 22 | | { |
| 0 | 23 | | if ((number < 0) || (number > 3999)) return "?"; |
| 0 | 24 | | if (number < 1) return string.Empty; |
| 0 | 25 | | if (number >= 1000) return "M" + ToRoman(number - 1000); |
| 0 | 26 | | if (number >= 900) return "CM" + ToRoman(number - 900); |
| 0 | 27 | | if (number >= 500) return "D" + ToRoman(number - 500); |
| 0 | 28 | | if (number >= 400) return "CD" + ToRoman(number - 400); |
| 0 | 29 | | if (number >= 100) return "C" + ToRoman(number - 100); |
| 0 | 30 | | if (number >= 90) return "XC" + ToRoman(number - 90); |
| 0 | 31 | | if (number >= 50) return "L" + ToRoman(number - 50); |
| 0 | 32 | | if (number >= 40) return "XL" + ToRoman(number - 40); |
| 0 | 33 | | if (number >= 10) return "X" + ToRoman(number - 10); |
| 0 | 34 | | if (number >= 9) return "IX" + ToRoman(number - 9); |
| 0 | 35 | | if (number >= 5) return "V" + ToRoman(number - 5); |
| 0 | 36 | | if (number >= 4) return "IV" + ToRoman(number - 4); |
| 0 | 37 | | if (number >= 1) return "I" + ToRoman(number - 1); |
| 0 | 38 | | return "?"; // Unreachable Code? |
| 0 | 39 | | } |
| | 40 | |
|
| | 41 | | /// <summary> |
| | 42 | | /// Returns a given array of numbers to the path of operative amendments. |
| | 43 | | /// For example: 1, 1.a, 1.a.i 1.a.ii, 1.a.ii.1 etc. |
| | 44 | | /// </summary> |
| | 45 | | /// <param name="input"></param> |
| | 46 | | /// <returns></returns> |
| | 47 | | public static string ToPathname(this int[] input) |
| 0 | 48 | | { |
| 0 | 49 | | var path = ""; |
| | 50 | |
|
| 0 | 51 | | if (input.Length == 0) |
| 0 | 52 | | return ""; |
| | 53 | |
|
| 0 | 54 | | for (int i = 0; i < input.Length; i++) |
| 0 | 55 | | { |
| | 56 | | // [1].a.ii |
| 0 | 57 | | if (i == 0 || i % 3 == 0) |
| 0 | 58 | | { |
| 0 | 59 | | path += "." + (input[i] + 1).ToString(); |
| 0 | 60 | | } |
| 0 | 61 | | else if (i == 1 || i % 3 == 1) |
| 0 | 62 | | { |
| 0 | 63 | | path += "." + input[i].ToLetter(); |
| 0 | 64 | | } |
| | 65 | | else |
| 0 | 66 | | { |
| 0 | 67 | | path += "." + (input[i] + 1).ToRoman().ToLower(); |
| 0 | 68 | | } |
| 0 | 69 | | } |
| 0 | 70 | | if (path.StartsWith(".")) |
| 0 | 71 | | path = path.Substring(1); |
| | 72 | |
|
| 0 | 73 | | return path; |
| 0 | 74 | | } |
| | 75 | |
|
| | 76 | | /// <summary> |
| | 77 | | /// returns a given number into a letter for example 0 = a, 1=b, 26=aa, 27=ab... |
| | 78 | | /// </summary> |
| | 79 | | /// <param name="number">The input number that should be converted it has to be zero or higher</param> |
| | 80 | | /// <returns></returns> |
| | 81 | | public static string ToLetter(this int number) |
| 0 | 82 | | { |
| 0 | 83 | | return NumberAsLetter(number); |
| 0 | 84 | | } |
| | 85 | |
|
| | 86 | | private static string NumberAsLetter(int index) |
| 0 | 87 | | { |
| 0 | 88 | | int quotient = index / 26; |
| 0 | 89 | | if (quotient > 0) |
| 0 | 90 | | return NumberAsLetter(quotient - 1) + chars[index % chars.Length].ToString(); |
| | 91 | | else |
| 0 | 92 | | return chars[index % chars.Length].ToString(); |
| 0 | 93 | | } |
| | 94 | |
|
| 0 | 95 | | private static readonly char[] chars = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', ' |
| | 96 | | } |
| | 97 | | } |