diff options
Diffstat (limited to 'linguistic/source')
-rw-r--r-- | linguistic/source/dicimp.cxx | 38 | ||||
-rw-r--r-- | linguistic/source/dicimp.hxx | 2 | ||||
-rw-r--r-- | linguistic/source/dlistimp.cxx | 11 |
3 files changed, 43 insertions, 8 deletions
diff --git a/linguistic/source/dicimp.cxx b/linguistic/source/dicimp.cxx index 911735ce3815..42147866991c 100644 --- a/linguistic/source/dicimp.cxx +++ b/linguistic/source/dicimp.cxx @@ -63,8 +63,26 @@ using namespace linguistic; #define MAX_HEADER_LENGTH 16 // XML-header to query SPELLML support +// to handle user words with "Grammar By" model words #define SPELLML_SUPPORT "<?xml?>" +// User dictionaries can contain optional "title:" tags +// to support custom titles with space and other characters. +// (old mechanism stores the title of the user dictionary +// only in its file name, but special characters are +// problem for user dictionaries shipped with LibreOffice). +// +// The following fake file name extension will be +// added to the text of the title: field for correct +// text stripping and dictionary saving. +// +// TODO: add translation support? +// tdf#50827 language dependent wordlists are already in +// the appropriate dict packages. +// Note: Also name of the special run-time dictionary +// "IgnoreAllList" hasn't been localized yet. +#define EXTENSION_FOR_TITLE_TEXT "." + static const sal_Char* const pVerStr2 = "WBSWG2"; static const sal_Char* const pVerStr5 = "WBSWG5"; static const sal_Char* const pVerStr6 = "WBSWG6"; @@ -96,7 +114,7 @@ static bool getTag(const OString &rLine, const sal_Char *pTagName, } -sal_Int16 ReadDicVersion( SvStreamPtr const &rpStream, LanguageType &nLng, bool &bNeg ) +sal_Int16 ReadDicVersion( SvStreamPtr const &rpStream, LanguageType &nLng, bool &bNeg, OUString &aDicName ) { // Sniff the header sal_Int16 nDicVersion = DIC_VERSION_DONTKNOW; @@ -146,6 +164,16 @@ sal_Int16 ReadDicVersion( SvStreamPtr const &rpStream, LanguageType &nLng, bool bNeg = aTagValue == "negative"; } + // lang: title + if (getTag(aLine, "title: ", aTagValue)) + { + aDicName = OStringToOUString( aTagValue, RTL_TEXTENCODING_UTF8) + + // recent title text preparation in GetDicInfoStr() waits for an + // extension, so we add it to avoid bad stripping at final dot + // of the title text + EXTENSION_FOR_TITLE_TEXT; + } + if (aLine.indexOf("---") != -1) // end of header break; } @@ -274,7 +302,7 @@ ErrCode DictionaryNeo::loadEntries(const OUString &rMainURL) // read header bool bNegativ; LanguageType nLang; - nDicVersion = ReadDicVersion(pStream, nLang, bNegativ); + nDicVersion = ReadDicVersion(pStream, nLang, bNegativ, aDicName); ErrCode nErr = pStream->GetError(); if (nErr != ERRCODE_NONE) return nErr; @@ -429,6 +457,12 @@ ErrCode DictionaryNeo::saveEntries(const OUString &rURL) pStream->WriteLine(OString("type: positive")); else pStream->WriteLine(OString("type: negative")); + if (aDicName.endsWith(EXTENSION_FOR_TITLE_TEXT)) + { + pStream->WriteLine(OUStringToOString("title: " + + // strip EXTENSION_FOR_TITLE_TEXT + aDicName.copy(0, aDicName.lastIndexOf(EXTENSION_FOR_TITLE_TEXT)), eEnc)); + } if (ERRCODE_NONE != (nErr = pStream->GetError())) return nErr; pStream->WriteLine(OString("---")); diff --git a/linguistic/source/dicimp.hxx b/linguistic/source/dicimp.hxx index 6833d3f94235..99560ff8898a 100644 --- a/linguistic/source/dicimp.hxx +++ b/linguistic/source/dicimp.hxx @@ -34,7 +34,7 @@ #define DIC_MAX_ENTRIES 30000 -sal_Int16 ReadDicVersion( SvStreamPtr const &rpStream, LanguageType &nLng, bool &bNeg ); +sal_Int16 ReadDicVersion( SvStreamPtr const &rpStream, LanguageType &nLng, bool &bNeg, OUString &aDicName ); class DictionaryNeo : public ::cppu::WeakImplHelper diff --git a/linguistic/source/dlistimp.cxx b/linguistic/source/dlistimp.cxx index b2a63d6e9480..cdace82de2c6 100644 --- a/linguistic/source/dlistimp.cxx +++ b/linguistic/source/dlistimp.cxx @@ -52,7 +52,7 @@ using namespace com::sun::star::linguistic2; using namespace linguistic; -static bool IsVers2OrNewer( const OUString& rFileURL, LanguageType& nLng, bool& bNeg ); +static bool IsVers2OrNewer( const OUString& rFileURL, LanguageType& nLng, bool& bNeg, OUString& aDicName ); static void AddInternal( const uno::Reference< XDictionary > &rDic, const OUString& rNew ); @@ -294,8 +294,9 @@ void DicList::SearchForDictionaries( OUString aURL( pDirCnt[i] ); LanguageType nLang = LANGUAGE_NONE; bool bNeg = false; + OUString aDicTitle = ""; - if(!::IsVers2OrNewer( aURL, nLang, bNeg )) + if(!::IsVers2OrNewer( aURL, nLang, bNeg, aDicTitle )) { // When not sal_Int32 nPos = aURL.indexOf('.'); @@ -335,7 +336,7 @@ void DicList::SearchForDictionaries( DictionaryType eType = bNeg ? DictionaryType_NEGATIVE : DictionaryType_POSITIVE; uno::Reference< XDictionary > xDic = - new DictionaryNeo( aDicName, nLang, eType, aURL, bIsWriteablePath ); + new DictionaryNeo( aDicTitle.isEmpty() ? aDicName : aDicTitle, nLang, eType, aURL, bIsWriteablePath ); addDictionary( xDic ); nCount++; @@ -794,7 +795,7 @@ static void AddUserData( const uno::Reference< XDictionary > &rDic ) } } -static bool IsVers2OrNewer( const OUString& rFileURL, LanguageType& nLng, bool& bNeg ) +static bool IsVers2OrNewer( const OUString& rFileURL, LanguageType& nLng, bool& bNeg, OUString& aDicName ) { if (rFileURL.isEmpty()) return false; @@ -826,7 +827,7 @@ static bool IsVers2OrNewer( const OUString& rFileURL, LanguageType& nLng, bool& SvStreamPtr pStream = SvStreamPtr( utl::UcbStreamHelper::CreateStream( xStream ) ); - int nDicVersion = ReadDicVersion(pStream, nLng, bNeg); + int nDicVersion = ReadDicVersion(pStream, nLng, bNeg, aDicName); return 2 == nDicVersion || nDicVersion >= 5; } |