summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-08-06 18:22:16 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-08-07 08:14:49 +0000
commitc978ce3b0774912ec0979b6cfec02927d8837a3e (patch)
tree10a8ee46910e042b0fda604b47c00d9daa9cc142
parent207edc05ceadda49e311758cae67be1ea2d0e49d (diff)
Resolves: tdf#93080 short day name and month name may interfere
Change-Id: I088633e4cff278e1add8eeea8828f9ba9c9fb140 (cherry picked from commit c7d66949beecab92dc8f1380c54751710aa0b7a2) Reviewed-on: https://gerrit.libreoffice.org/17545 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--svl/source/numbers/zforfind.cxx57
-rw-r--r--svl/source/numbers/zforfind.hxx1
2 files changed, 52 insertions, 6 deletions
diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index 36dd18e607d7..f7dd8b0e1ca7 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -110,6 +110,7 @@ void ImpSvNumberInputScan::Reset()
{
nMonth = 0;
nMonthPos = 0;
+ nDayOfWeek = 0;
nTimePos = 0;
nSign = 0;
nESign = 0;
@@ -2100,6 +2101,33 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
{
const sal_Int32 nMonthStart = nPos;
short nTempMonth = GetMonth(rString, nPos);
+ if (nTempMonth < 0)
+ {
+ // Short month and day names may be identical in some locales, e.g.
+ // "mar" for "martes" or "marzo" in Spanish.
+ // Do not let a month name immediately take precedence if a day
+ // name was meant instead. Assume that both could be valid, until
+ // encountered differently or the final evaluation in
+ // IsNumberFormat() checks, but continue with weighing the month
+ // name higher unless we have both day of week and month name here.
+ sal_Int32 nTempPos = nMonthStart;
+ nDayOfWeek = GetDayOfWeek( rString, nTempPos);
+ if (nDayOfWeek < 0)
+ {
+ SkipChar( '.', rString, nTempPos ); // abbreviated
+ SkipString( pFormatter->GetLocaleData()->getLongDateDayOfWeekSep(), rString, nTempPos );
+ SkipBlanks( rString, nTempPos);
+ short nTempTempMonth = GetMonth( rString, nTempPos);
+ if (nTempTempMonth)
+ {
+ // Fall into the else branch below that handles both.
+ nTempMonth = 0;
+ nPos = nMonthStart;
+ nDayOfWeek = 0;
+ // Do not set nDayOfWeek hereafter, anywhere.
+ }
+ }
+ }
if ( nTempMonth ) // month (Jan 1)?
{
// Jan1 without separator is not a date, unless it is followed by a
@@ -2122,14 +2150,14 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
}
else
{
- int nDayOfWeek = GetDayOfWeek( rString, nPos );
- if ( nDayOfWeek )
+ int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
+ if ( nTempDayOfWeek )
{
// day of week is just parsed away
eScannedType = css::util::NumberFormat::DATE; // !!! it IS a date !!!
if ( nPos < rString.getLength() )
{
- if ( nDayOfWeek < 0 )
+ if ( nTempDayOfWeek < 0 )
{
// abbreviated
if ( rString[ nPos ] == (sal_Unicode)'.' )
@@ -2805,12 +2833,12 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString,
nPos = nPos + rSep.getLength();
SkipBlanks(rString, nPos);
}
- int nDayOfWeek = GetDayOfWeek( rString, nPos );
- if ( nDayOfWeek )
+ int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
+ if ( nTempDayOfWeek )
{
if ( nPos < rString.getLength() )
{
- if ( nDayOfWeek < 0 )
+ if ( nTempDayOfWeek < 0 )
{ // short
if ( rString[ nPos ] == (sal_Unicode)'.' )
{
@@ -3501,6 +3529,14 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break;
case css::util::NumberFormat::DATE:
+ if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums == 3)
+ {
+ // If both, short month name and day of week name were
+ // detected, and also numbers for full date, assume that we
+ // have a day of week instead of month name.
+ nMonth = 0;
+ nMonthPos = 0;
+ }
if (nMonth)
{ // month name and numbers
if (nAnzNums > 2)
@@ -3547,6 +3583,15 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break;
case css::util::NumberFormat::DATETIME:
+ if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums >= 5)
+ {
+ // If both, abbreviated month name and day of week name
+ // were detected, and also at least numbers for full date
+ // plus time including minutes, assume that we have a day
+ // of week instead of month name.
+ nMonth = 0;
+ nMonthPos = 0;
+ }
if (nMonth)
{ // month name and numbers
if (nDecPos)
diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx
index c9f260a37c42..4afe81dfd9b4 100644
--- a/svl/source/numbers/zforfind.hxx
+++ b/svl/source/numbers/zforfind.hxx
@@ -108,6 +108,7 @@ private:
// negative => short format
short nMonthPos; // 1 = front, 2 = middle
// 3 = end
+ int nDayOfWeek; // Temporary (!) day of week (1..7,-1..-7) if date
sal_uInt16 nTimePos; // Index of first time separator (+1)
short nDecPos; // Index of substring containing "," (+1)
short nNegCheck; // '( )' for negative