summaryrefslogtreecommitdiff
path: root/linguistic
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2012-11-25 00:30:27 +0100
committerNémeth László <nemeth@numbertext.org>2012-11-26 09:07:14 +0000
commit4d160f28b510ce9277b5d6f85eb83b87beb717fe (patch)
tree8ce2990b5b1a26c3fc4e63b3cfa3833242dc0289 /linguistic
parentcf71223c328025efe60215c7774fd87f7941a7b3 (diff)
fdo#37954, #i18737# accept capitalized lowercase custom words
Change-Id: I3f8a7d1912952730151e2444f426aff8b2ba4c97 Reviewed-on: https://gerrit.libreoffice.org/1162 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com> Reviewed-by: Németh László <nemeth@numbertext.org>
Diffstat (limited to 'linguistic')
-rw-r--r--linguistic/source/spelldsp.cxx69
-rw-r--r--linguistic/source/spelldsp.hxx10
2 files changed, 76 insertions, 3 deletions
diff --git a/linguistic/source/spelldsp.cxx b/linguistic/source/spelldsp.cxx
index 03e156e74f63..5c3c9742c274 100644
--- a/linguistic/source/spelldsp.cxx
+++ b/linguistic/source/spelldsp.cxx
@@ -37,6 +37,13 @@
#include "lngsvcmgr.hxx"
#include "linguistic/lngprops.hxx"
+// values asigned to capitalization types
+#define CAPTYPE_UNKNOWN 0
+#define CAPTYPE_NOCAP 1
+#define CAPTYPE_INITCAP 2
+#define CAPTYPE_ALLCAP 3
+#define CAPTYPE_MIXED 4
+
using namespace osl;
using namespace com::sun::star;
using namespace com::sun::star::beans;
@@ -180,6 +187,7 @@ SpellCheckerDispatcher::SpellCheckerDispatcher( LngSvcMgr &rLngSvcMgr ) :
rMgr (rLngSvcMgr)
{
pCache = NULL;
+ pCharClass = NULL;
}
@@ -187,6 +195,7 @@ SpellCheckerDispatcher::~SpellCheckerDispatcher()
{
ClearSvcList();
delete pCache;
+ delete pCharClass;
}
@@ -428,8 +437,18 @@ sal_Bool SpellCheckerDispatcher::isValid_Impl(
GetDicList().is() && IsUseDicList( rProperties, GetPropSet() ))
{
Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( aChkWord, nLanguage ) );
- if (xTmp.is())
+ if (xTmp.is()) {
bRes = !xTmp->isNegative();
+ } else {
+ setCharClass(LanguageTag(nLanguage));
+ sal_uInt16 ct = capitalType(aChkWord, pCharClass);
+ if (ct == CAPTYPE_INITCAP || ct == CAPTYPE_ALLCAP) {
+ Reference< XDictionaryEntry > xTmp2( lcl_GetRulingDictionaryEntry( makeLowerCase(aChkWord, pCharClass), nLanguage ) );
+ if (xTmp2.is()) {
+ bRes = !xTmp2->isNegative();
+ }
+ }
+ }
}
}
@@ -811,4 +830,52 @@ void SpellCheckerDispatcher::FlushSpellCache()
pCache->Flush();
}
+void SpellCheckerDispatcher::setCharClass(const LanguageTag& rLanguageTag)
+{
+ if (!pCharClass)
+ pCharClass = new CharClass(rLanguageTag);
+ pCharClass->setLanguageTag(rLanguageTag);
+}
+
+sal_uInt16 SAL_CALL SpellCheckerDispatcher::capitalType(const OUString& aTerm, CharClass * pCC)
+{
+ sal_Int32 tlen = aTerm.getLength();
+ if ((pCC) && (tlen))
+ {
+ String aStr(aTerm);
+ sal_Int32 nc = 0;
+ for (sal_uInt16 tindex = 0; tindex < tlen; tindex++)
+ {
+ if (pCC->getCharacterType(aStr,tindex) &
+ ::com::sun::star::i18n::KCharacterType::UPPER) nc++;
+ }
+
+ if (nc == 0)
+ return (sal_uInt16) CAPTYPE_NOCAP;
+ if (nc == tlen)
+ return (sal_uInt16) CAPTYPE_ALLCAP;
+ if ((nc == 1) && (pCC->getCharacterType(aStr,0) &
+ ::com::sun::star::i18n::KCharacterType::UPPER))
+ return (sal_uInt16) CAPTYPE_INITCAP;
+
+ return (sal_uInt16) CAPTYPE_MIXED;
+ }
+ return (sal_uInt16) CAPTYPE_UNKNOWN;
+}
+
+
+
+OUString SAL_CALL SpellCheckerDispatcher::makeLowerCase(const OUString& aTerm, CharClass * pCC)
+{
+ if (pCC)
+ return pCC->lowercase(aTerm);
+ return aTerm;
+}
+
+#undef CAPTYPE_UNKNOWN
+#undef CAPTYPE_NOCAP
+#undef CAPTYPE_INITCAP
+#undef CAPTYPE_ALLCAP
+#undef CAPTYPE_MIXED
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/linguistic/source/spelldsp.hxx b/linguistic/source/spelldsp.hxx
index 2e24ade3121f..e68bc5b9be07 100644
--- a/linguistic/source/spelldsp.hxx
+++ b/linguistic/source/spelldsp.hxx
@@ -41,6 +41,7 @@
#include <boost/shared_ptr.hpp>
#include <map>
+#include <unotools/charclass.hxx>
class LngSvcMgr;
@@ -65,6 +66,7 @@ class SpellCheckerDispatcher :
LngSvcMgr &rMgr;
mutable linguistic::SpellCache *pCache; // Spell Cache (holds known words)
+ CharClass * pCharClass;
// disallow copy-constructor and assignment-operator for now
SpellCheckerDispatcher(const SpellCheckerDispatcher &);
@@ -119,8 +121,13 @@ public:
virtual DspType GetDspType() const;
void FlushSpellCache();
-};
+private:
+ void setCharClass(const LanguageTag& rLanguageTag);
+ sal_uInt16 SAL_CALL capitalType(const OUString&, CharClass *);
+ OUString SAL_CALL makeLowerCase(const OUString&, CharClass *);
+
+};
inline linguistic::SpellCache & SpellCheckerDispatcher::GetCache() const
{
@@ -148,7 +155,6 @@ inline ::com::sun::star::uno::Reference<
}
-
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */