Tidy up macToQtFormat() in Darwin system locale backend

Impose standard Qt indent.
Within each set of cases grouped together, impose alphabetic order.
Made formatting of ranges in comments terser, for two-value ranges.
Fix errors:
* the 'j' field should not arise and has a 'J' partner
* The 'c', 'e' and 'E' forms' numeric variants are still day of the
  week, so should not be mapped to 'd' or 'dd', which are day of the
  month. Qt date formats only actually support long and short, not
  narrow, despite the QLocale::Format having a NarrowFormat.

Other errors and infelicities shall be addressed in later work, in
tandem with changes to dateconverter.py that are coming.

Task-number: QTBUG-123872
Change-Id: I61bf363d2598502f8bfc0d67245eae1b41858147
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit e04f7d0d2779a7ee47f7cea2d3b6f6f93fd286c8)
This commit is contained in:
Edward Welbourne 2024-04-03 17:12:39 +02:00
parent febed4c265
commit e78b7e7010

View File

@ -323,99 +323,96 @@ static QVariant macToQtFormat(QStringView sys_fmt)
} }
QChar c = sys_fmt.at(i); QChar c = sys_fmt.at(i);
qsizetype repeat = qt_repeatCount(sys_fmt.mid(i)); qsizetype repeat = qt_repeatCount(sys_fmt.sliced(i));
switch (c.unicode()) { switch (c.unicode()) {
// Qt does not support the following options // Qt does not support the following options
case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow case 'A': // Milliseconds in Day (1..n): 1..n = padded number
case 'Y': // Year of Week (1..n): 1..n = padded number case 'C': // Input skeleton symbol.
case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow case 'D': // Day of Year (1..3): 1..3 = padded number
case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number case 'F': // Day of Week in Month (1): 1 = number
case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number case 'g': // Modified Julian Day (1..n): 1..n = padded number
case 'w': // Week of Year (1..2): 1..2 = padded number case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
case 'W': // Week of Month (1): 1 = number case 'j': // Input skeleton symbol.
case 'D': // Day of Year (1..3): 1..3 = padded number case 'J': // Input skeleton symbol.
case 'F': // Day of Week in Month (1): 1 = number case 'l': // Deprecated Chinese leap month indicator.
case 'g': // Modified Julian Day (1..n): 1..n = padded number case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
case 'A': // Milliseconds in Day (1..n): 1..n = padded number case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1,2 = padded number
break; case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
case 'w': // Week of Year (1,2): 1,2 = padded number
case 'W': // Week of Month (1): 1 = number
case 'Y': // Year for Week-of-year calendars (1..n): 1..n = padded number
break;
case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number case 'u': // Extended Year (1..n): 2 = short year, 1 & 3..n = padded number
case 'u': // Extended Year (1..n): 2 = short year, 1 & 3..n = padded number case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
// Qt only supports long (4) or short (2) year, use long for all others // Qt only supports long (4) or short (2) year, use long for all others
if (repeat == 2) if (repeat == 2)
result += "yy"_L1; result += "yy"_L1;
else else
result += "yyyy"_L1; result += "yyyy"_L1;
break; break;
case 'M': // Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow case 'M': // Month (1..5): 4 = long, 3 = short, 1,2 = number, 5 = narrow
// Qt only supports long, short and number, use short for narrow // Qt only supports long, short and number, use short for narrow
if (repeat == 5) if (repeat == 5)
result += "MMM"_L1; result += "MMM"_L1;
else else
result += QString(repeat, u'M'); result += QString(repeat, u'M');
break; break;
case 'd': // Day of Month (1..2): 1..2 padded number case 'd': // Day of Month (1,2): 1,2 padded number
result += QString(repeat, c);
break;
case 'c': // Standalone version of 'e'
case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5,6 = narrow, 1,2 padded number
// "Local" only affects numeric form: depends on locale's start-day of the week.
case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5,6 = narrow
// Qt only supports long, short: use short for narrow and padded number.
if (repeat == 4)
result += "dddd"_L1;
else
result += "ddd"_L1;
break;
case 'a': // AM/PM (1): 1 = short
// Translate to Qt uppercase AM/PM
result += "AP"_L1;
break;
case 'h': // Hour [1..12] (1,2): 1,2 = padded number
case 'K': // Hour [0..11] (1,2): 1,2 = padded number
result += QString(repeat, 'h'_L1);
break;
case 'H': // Hour [0..23] (1,2): 1,2 = padded number
case 'k': // Hour [1..24] (1,2): 1,2 = padded number
// Qt H is 0..23 hour
result += QString(repeat, 'H'_L1);
break;
case 'm': // Minutes (1,2): 1,2 = padded number
case 's': // Seconds (1,2): 1,2 = padded number
result += QString(repeat, c);
break;
case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
// Qt uses msecs either unpadded or padded to 3 places
if (repeat < 3)
result += u'z';
else
result += "zzz"_L1;
break;
case 'O': // Time Zone (1, 4)
case 'v': // Time Zone (1, 4)
case 'V': // Time Zone (1..4)
case 'x': // Time Zone (1..5)
case 'X': // Time Zone (1..5)
case 'z': // Time Zone (1..4)
case 'Z': // Time Zone (1..5)
result += u't';
break;
default:
// a..z and A..Z are reserved for format codes, so any occurrence of these not
// already processed are not known and so unsupported formats to be ignored.
// All other chars are allowed as literals.
if (c < u'A' || c > u'z' || (c > u'Z' && c < u'a'))
result += QString(repeat, c); result += QString(repeat, c);
break; break;
case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5..6 = narrow
// Qt only supports long, short and padded number, use short for narrow
if (repeat == 4)
result += "dddd"_L1;
else
result += "ddd"_L1;
break;
case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
case 'c': // Standalone Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
// Qt only supports long, short and padded number, use short for narrow
if (repeat >= 5)
result += "ddd"_L1;
else
result += QString(repeat, 'd'_L1);
break;
case 'a': // AM/PM (1): 1 = short
// Translate to Qt uppercase AM/PM
result += "AP"_L1;
break;
case 'h': // Hour [1..12] (1..2): 1..2 = padded number
case 'K': // Hour [0..11] (1..2): 1..2 = padded number
case 'j': // Local Hour [12 or 24] (1..2): 1..2 = padded number
// Qt h is local hour
result += QString(repeat, 'h'_L1);
break;
case 'H': // Hour [0..23] (1..2): 1..2 = padded number
case 'k': // Hour [1..24] (1..2): 1..2 = padded number
// Qt H is 0..23 hour
result += QString(repeat, 'H'_L1);
break;
case 'm': // Minutes (1..2): 1..2 = padded number
case 's': // Seconds (1..2): 1..2 = padded number
result += QString(repeat, c);
break;
case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
// Qt uses msecs either unpadded or padded to 3 places
if (repeat < 3)
result += u'z';
else
result += "zzz"_L1;
break;
case 'z': // Time Zone (1..4)
case 'Z': // Time Zone (1..5)
case 'O': // Time Zone (1, 4)
case 'v': // Time Zone (1, 4)
case 'V': // Time Zone (1..4)
case 'X': // Time Zone (1..5)
case 'x': // Time Zone (1..5)
result += u't';
break;
default:
// a..z and A..Z are reserved for format codes, so any occurrence of these not
// already processed are not known and so unsupported formats to be ignored.
// All other chars are allowed as literals.
if (c < u'A' || c > u'z' || (c > u'Z' && c < u'a'))
result += QString(repeat, c);
break;
} }
i += repeat; i += repeat;