mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 17:02:51 +08:00
Fix ArgumentOutOfRangeException when rendering a table
When rendering a table with East Asia characters (take 2 English alphabets width) will throw ArgumentOutOfRangeException.
This commit is contained in:
parent
d96817dc9c
commit
d306ad82d1
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Wcwidth;
|
||||||
|
|
||||||
namespace Spectre.Console.Rendering
|
namespace Spectre.Console.Rendering
|
||||||
{
|
{
|
||||||
@ -329,23 +330,10 @@ namespace Spectre.Console.Rendering
|
|||||||
|
|
||||||
if (overflow == Overflow.Fold)
|
if (overflow == Overflow.Fold)
|
||||||
{
|
{
|
||||||
var totalLength = segment.Text.CellLength();
|
var splitted = SplitSegment(segment.Text, maxWidth);
|
||||||
var lengthLeft = totalLength;
|
foreach (var str in splitted)
|
||||||
while (lengthLeft > 0)
|
|
||||||
{
|
{
|
||||||
var index = totalLength - lengthLeft;
|
result.Add(new Segment(str, segment.Style));
|
||||||
|
|
||||||
// How many characters should we take?
|
|
||||||
var take = Math.Min(maxWidth, totalLength - index);
|
|
||||||
if (take <= 0)
|
|
||||||
{
|
|
||||||
// This shouldn't really occur, but I don't like
|
|
||||||
// never ending loops if it does...
|
|
||||||
return new List<Segment>();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.Add(new Segment(segment.Text.Substring(index, take), segment.Style));
|
|
||||||
lengthLeft -= take;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (overflow == Overflow.Crop)
|
else if (overflow == Overflow.Crop)
|
||||||
@ -567,5 +555,29 @@ namespace Spectre.Console.Rendering
|
|||||||
|
|
||||||
return cells;
|
return cells;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static List<string> SplitSegment(string text, int maxCellLength)
|
||||||
|
{
|
||||||
|
var list = new List<string>();
|
||||||
|
|
||||||
|
var length = 0;
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
foreach (var ch in text)
|
||||||
|
{
|
||||||
|
if (length + UnicodeCalculator.GetWidth(ch) > maxCellLength)
|
||||||
|
{
|
||||||
|
list.Add(sb.ToString());
|
||||||
|
sb.Clear();
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
length += UnicodeCalculator.GetWidth(ch);
|
||||||
|
sb.Append(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Add(sb.ToString());
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user