|
1 | 1 | using System; |
2 | | -using System.Collections.Generic; |
3 | | -using System.Linq; |
4 | 2 | using System.Threading.Tasks; |
5 | 3 | using Microsoft.AspNetCore.Html; |
6 | 4 | using Microsoft.AspNetCore.Mvc.Rendering; |
@@ -29,42 +27,36 @@ public override async Task ProcessAsync(TagHelperContext context, TagHelperOutpu |
29 | 27 | output.Content.SetHtmlContent(code); |
30 | 28 | } |
31 | 29 |
|
32 | | - private string TrimPreceding(string value, char character) |
| 30 | + private static string TrimPreceding(string value, char character) |
33 | 31 | { |
34 | 32 | var lines = value.Split(Environment.NewLine); |
35 | 33 | var preceding = CountPreceding(lines, character); |
36 | | - var trimmedLines = from line in lines |
37 | | - select TrimPrecedingLine(line, character, preceding); |
| 34 | + for (var i = 0; i < lines.Length; ++i) |
| 35 | + { |
| 36 | + var line = lines[i]; |
| 37 | + lines[i] = line.Length >= preceding ? line[preceding..] : string.Empty; |
| 38 | + } |
38 | 39 |
|
39 | | - return string.Join(Environment.NewLine, trimmedLines); |
| 40 | + return string.Join(Environment.NewLine, lines); |
40 | 41 | } |
41 | 42 |
|
42 | | - private int CountPreceding(IEnumerable<string> lines, char leadingCharacter) |
| 43 | + private static int CountPreceding(string[] lines, char leadingCharacter) |
43 | 44 | { |
| 45 | + var min = int.MaxValue; |
44 | 46 | foreach (var line in lines) |
45 | 47 | { |
46 | | - // Make sure that the line actually starts with the leading character |
47 | | - if (line.StartsWith(leadingCharacter) == false) |
48 | | - continue; |
49 | | - |
50 | | - // Determine last index of leading character, return if something else is found |
51 | | - for (var i = 0; i < line.Length; i++) |
| 48 | + var lineSpan = line.AsSpan(); |
| 49 | + for (var i = 0; i < lineSpan.Length; ++i) |
52 | 50 | { |
53 | | - var character = line[i]; |
54 | | - if (character != leadingCharacter) |
55 | | - return i; |
| 51 | + if (lineSpan[i] != leadingCharacter) |
| 52 | + { |
| 53 | + min = i < min ? i : min; |
| 54 | + break; |
| 55 | + } |
56 | 56 | } |
57 | | - |
58 | | - // Assume that this line is the template for trimming |
59 | | - return line.Length; |
60 | 57 | } |
61 | 58 |
|
62 | | - throw new ArgumentException("No lines match the target leading character.", nameof(lines)); |
63 | | - } |
64 | | - |
65 | | - private string TrimPrecedingLine(string line, char character, int amount) |
66 | | - { |
67 | | - return line.StartsWith(character) ? new string(line.Skip(amount).ToArray()) : line; |
| 59 | + return min; |
68 | 60 | } |
69 | 61 | } |
70 | 62 | } |
0 commit comments