in src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs [903:1126]
private static RuleResult LB25(ReadOnlySpan<char> text, LineBreakState state)
{
switch (state.Next(text).LineBreakClass)
{
// [25.06] NU(SY|IS)* x PR
case LineBreakClass.PrefixNumeric:
{
switch (state.Current.LineBreakClass)
{
// [25.04] NU(SY|IS)* CP × PR
case LineBreakClass.CloseParenthesis:
{
switch (state.Previous.LineBreakClass)
{
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (LineBreakState.Before(text, state.Previous).LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
break;
}
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (state.Previous.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
// [25.03] NU(SY|IS)* CL × PR
case LineBreakClass.ClosePunctuation:
{
switch (state.Previous.LineBreakClass)
{
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (state.Previous.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
break;
}
}
break;
}
// [25.15] NU(SY|IS)* × NU
case LineBreakClass.Numeric:
{
switch (state.Current.LineBreakClass)
{
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (state.Previous.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
break;
}
case LineBreakClass.PostfixNumeric:
{
switch (state.Current.LineBreakClass)
{
// [25.01] NU(SY|IS)* CL × PO
case LineBreakClass.ClosePunctuation:
{
switch (state.Previous.LineBreakClass)
{
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (state.Previous.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
break;
}
// [25.05] NU(SY|IS)* × PO
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
case LineBreakClass.BreakSymbols:
case LineBreakClass.InfixNumeric:
{
if (state.Previous.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
break;
}
}
if (state.Current.LineBreakClass == LineBreakClass.PrefixNumeric)
{
switch (state.Next(text).LineBreakClass)
{
case LineBreakClass.OpenPunctuation:
{
var afterNext = LineBreakState.After(text, state.Next(text));
// [25.1] PR × OP NU
if (afterNext.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
// PR × OP IS NU
if (afterNext.LineBreakClass == LineBreakClass.InfixNumeric && LineBreakState.After(text, afterNext).LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
// PR × NU
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
}
}
if (state.Current.LineBreakClass == LineBreakClass.PostfixNumeric)
{
switch (state.Next(text).LineBreakClass)
{
case LineBreakClass.OpenPunctuation:
{
var afterNext = LineBreakState.After(text, state.Next(text));
// PO × OP NU
if (afterNext.LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
// PO × OP IS NU
if (afterNext.LineBreakClass == LineBreakClass.InfixNumeric && LineBreakState.After(text, afterNext).LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
// PO × NU
case LineBreakClass.Numeric:
{
return RuleResult.NoBreak;
}
}
}
switch (state.Current.LineBreakClass)
{
// HY × NU
// [25.14] IS × NU
case LineBreakClass.Hyphen:
case LineBreakClass.InfixNumeric:
{
if (state.Next(text).LineBreakClass == LineBreakClass.Numeric)
{
return RuleResult.NoBreak;
}
break;
}
}
return RuleResult.Pass;
}