starmath/inc/symbol.hxx    |    8 +++-----
 starmath/source/dialog.cxx |    8 ++++----
 starmath/source/node.cxx   |    6 ++----
 starmath/source/parse5.cxx |   18 ++++++++++++++----
 starmath/source/symbol.cxx |   35 ++++++++++++++++++++++++-----------
 5 files changed, 47 insertions(+), 28 deletions(-)

New commits:
commit 7de4c6b95da7d187c403ee478786bb74467c1eb5
Author:     Khaled Hosny <[email protected]>
AuthorDate: Thu Sep 21 12:20:07 2023 +0300
Commit:     خالد حسني <[email protected]>
CommitDate: Thu Sep 21 12:33:19 2023 +0200

    tdf#62174: Fix saving of localized iGreek symbols
    
    When saving symbols we use the non-localized name, but iGreek symbols
    are a bit of a hack since they are added at runtime and don’t have
    localizations of there own but use the Greek symbols names with an “i”
    prefix.
    
    Instead of looking directly for localized names, we now go through the
    symbol manager that already knows about iGreek and use the export name
    of the symbol. We have to also make sure the iGreek symbols has
    non-localized export name.
    
    Change-Id: Ia3e38579abba56ae12ade126f564f8c6f9c3229a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157137
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <[email protected]>

diff --git a/starmath/inc/symbol.hxx b/starmath/inc/symbol.hxx
index 321dbb500e03..a7d5bcad6697 100644
--- a/starmath/inc/symbol.hxx
+++ b/starmath/inc/symbol.hxx
@@ -93,11 +93,9 @@ public:
     bool                    AddOrReplaceSymbol( const SmSym & rSymbol, bool 
bForceChange = false );
     void                    RemoveSymbol( const OUString & rSymbolName );
 
-    SmSym       *   GetSymbolByName(const OUString& rSymbolName);
-    const SmSym *   GetSymbolByName(const OUString& rSymbolName) const
-    {
-        return const_cast<SmSymbolManager 
*>(this)->GetSymbolByName(rSymbolName);
-    }
+    SmSym* GetSymbolByName(std::u16string_view rSymbolName);
+    SmSym* GetSymbolByUiName(std::u16string_view rSymbolName);
+    SmSym* GetSymbolByExportName(std::u16string_view rSymbolName);
 
     bool        IsModified() const          { return m_bModified; }
     void        SetModified(bool bModify)   { m_bModified = bModify; }
diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx
index 8625072c90e8..c5e38f6cb684 100644
--- a/starmath/source/dialog.cxx
+++ b/starmath/source/dialog.cxx
@@ -1544,7 +1544,7 @@ void SmSymDefineDialog::FillStyles()
 SmSym* SmSymDefineDialog::GetSymbol(const weld::ComboBox& rComboBox)
 {
     assert((&rComboBox == m_xOldSymbols.get() || &rComboBox == 
m_xSymbols.get()) && "Sm : wrong combobox");
-    return m_aSymbolMgrCopy.GetSymbolByName(rComboBox.get_active_text());
+    return m_aSymbolMgrCopy.GetSymbolByUiName(rComboBox.get_active_text());
 }
 
 IMPL_LINK(SmSymDefineDialog, OldSymbolChangeHdl, weld::ComboBox&, rComboBox, 
void)
@@ -1652,7 +1652,7 @@ IMPL_LINK( SmSymDefineDialog, AddClickHdl, weld::Button&, 
rButton, void )
     // add symbol
     const SmSym aNewSymbol(m_xSymbols->get_active_text(), 
m_xCharsetDisplay->GetFont(),
             m_xCharsetDisplay->GetSelectCharacter(), 
m_xSymbolSets->get_active_text());
-    //OSL_ENSURE( m_aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, 
"symbol already exists" );
+    //OSL_ENSURE( m_aSymbolMgrCopy.GetSymbolByUiName(aTmpSymbolName) == NULL, 
"symbol already exists" );
     m_aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol );
 
     // update display of new symbol
@@ -1750,7 +1750,7 @@ void SmSymDefineDialog::UpdateButtons()
                     && m_xCharsetDisplay->GetSelectCharacter() == 
m_xOrigSymbol->GetCharacter();
 
         // only add it if there isn't already a symbol with the same name
-        bAdd    = m_aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == nullptr;
+        bAdd    = m_aSymbolMgrCopy.GetSymbolByUiName(aTmpSymbolName) == 
nullptr;
 
         // only delete it if all settings are equal
         bDelete = bool(m_xOrigSymbol);
@@ -1982,7 +1982,7 @@ bool SmSymDefineDialog::SelectSymbol(weld::ComboBox& 
rComboBox,
         OUString     aTmpOldSymbolSetName;
         if (nPos != -1)
         {
-            pOldSymbol        = m_aSymbolMgrCopy.GetSymbolByName(aNormName);
+            pOldSymbol        = m_aSymbolMgrCopy.GetSymbolByUiName(aNormName);
             aTmpOldSymbolSetName = m_xOldSymbolSets->get_active_text();
         }
         SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName);
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 01b14c177e43..b0b91dabe99e 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -2155,8 +2155,7 @@ static bool lcl_IsFromGreekSymbolSet( std::u16string_view 
aTokenText )
     // valid symbol name needs to have a '%' at pos 0 and at least an 
additional char
     if (aTokenText.size() > 2 && aTokenText[0] == u'%')
     {
-        OUString aName( aTokenText.substr(1) );
-        SmSym *pSymbol = SM_MOD()->GetSymbolManager().GetSymbolByName( aName );
+        SmSym *pSymbol = 
SM_MOD()->GetSymbolManager().GetSymbolByName(aTokenText.substr(1));
         if (pSymbol && 
SmLocalizedSymbolData::GetExportSymbolSetName(pSymbol->GetSymbolSetName()) == 
"Greek")
             bRes = true;
     }
@@ -2186,8 +2185,7 @@ void SmSpecialNode::Prepare(const SmFormat &rFormat, 
const SmDocShell &rDocShell
     const SmSym   *pSym;
     SmModule  *pp = SM_MOD();
 
-    OUString aName(GetToken().aText.copy(1));
-    if (nullptr != (pSym = pp->GetSymbolManager().GetSymbolByName( aName )))
+    if (nullptr != (pSym = 
pp->GetSymbolManager().GetSymbolByName(GetToken().aText.subView(1))))
     {
         sal_UCS4 cChar = pSym->GetCharacter();
         OUString aTmp( &cChar, 1 );
diff --git a/starmath/source/parse5.cxx b/starmath/source/parse5.cxx
index 04c4702683b1..27c2471e7418 100644
--- a/starmath/source/parse5.cxx
+++ b/starmath/source/parse5.cxx
@@ -29,6 +29,7 @@
 #include <parse5.hxx>
 #include <strings.hrc>
 #include <smmod.hxx>
+#include <symbol.hxx>
 #include <cfgitem.hxx>
 #include <starmathdatabase.hxx>
 
@@ -2632,13 +2633,22 @@ std::unique_ptr<SmSpecialNode> SmParser5::DoSpecial()
     {
         if (IsImportSymbolNames())
         {
-            aNewName = 
SmLocalizedSymbolData::GetUiSymbolName(rName.subView(1));
-            bReplace = true;
+            const SmSym* pSym
+                = 
SM_MOD()->GetSymbolManager().GetSymbolByExportName(rName.subView(1));
+            if (pSym)
+            {
+                aNewName = pSym->GetName();
+                bReplace = true;
+            }
         }
         else if (IsExportSymbolNames())
         {
-            aNewName = 
SmLocalizedSymbolData::GetExportSymbolName(rName.subView(1));
-            bReplace = true;
+            const SmSym* pSym = 
SM_MOD()->GetSymbolManager().GetSymbolByUiName(rName.subView(1));
+            if (pSym)
+            {
+                aNewName = pSym->GetExportName();
+                bReplace = true;
+            }
         }
     }
     if (!aNewName.isEmpty())
diff --git a/starmath/source/symbol.cxx b/starmath/source/symbol.cxx
index a75b6a912670..5f81d0151d9a 100644
--- a/starmath/source/symbol.cxx
+++ b/starmath/source/symbol.cxx
@@ -120,23 +120,35 @@ SmSymbolManager& SmSymbolManager::operator = (const 
SmSymbolManager& rSymbolSetM
     return *this;
 }
 
+SmSym* SmSymbolManager::GetSymbolByName(std::u16string_view rSymbolName)
+{
+    SmSym* pRes = GetSymbolByUiName(rSymbolName);
+    if (!pRes)
+        pRes = GetSymbolByExportName(rSymbolName);
+    return pRes;
+}
 
-SmSym *SmSymbolManager::GetSymbolByName(const OUString& rSymbolName)
+SmSym *SmSymbolManager::GetSymbolByUiName(std::u16string_view rSymbolName)
 {
+    OUString aSymbolName(rSymbolName);
     SmSym *pRes = nullptr;
-    SymbolMap_t::iterator aIt( m_aSymbols.find( rSymbolName ) );
+    SymbolMap_t::iterator aIt( m_aSymbols.find( aSymbolName ) );
     if (aIt != m_aSymbols.end())
         pRes = &aIt->second;
-    else
+    return pRes;
+}
+
+SmSym* SmSymbolManager::GetSymbolByExportName(std::u16string_view rSymbolName)
+{
+    OUString aSymbolName(rSymbolName);
+    SmSym* pRes = nullptr;
+    for (auto& rPair : m_aSymbols)
     {
-        for (auto& rPair : m_aSymbols)
+        SmSym& rSymbol = rPair.second;
+        if (rSymbol.GetExportName() == aSymbolName)
         {
-            SmSym& rSymbol = rPair.second;
-            if (rSymbol.GetExportName() == rSymbolName)
-            {
-                pRes = &rSymbol;
-                break;
-            }
+            pRes = &rSymbol;
+            break;
         }
     }
     return pRes;
@@ -161,7 +173,7 @@ bool SmSymbolManager::AddOrReplaceSymbol( const SmSym 
&rSymbol, bool bForceChang
     const OUString& aSymbolName( rSymbol.GetName() );
     if (!aSymbolName.isEmpty() && !rSymbol.GetSymbolSetName().isEmpty())
     {
-        const SmSym *pFound = GetSymbolByName( aSymbolName );
+        const SmSym *pFound = GetSymbolByUiName( aSymbolName );
         const bool bSymbolConflict = pFound && !pFound->IsEqualInUI( rSymbol );
 
         // avoid having the same symbol name twice but with different symbols 
in use
@@ -263,6 +275,7 @@ void SmSymbolManager::Load()
         OUString aSymbolName = "i" + rSym.GetName();
         SmSym aSymbol( aSymbolName, aFont, rSym.GetCharacter(),
                 aSymbolSetName, true /*bIsPredefined*/ );
+        aSymbol.SetExportName("i" + rSym.GetExportName());
 
         AddOrReplaceSymbol( aSymbol );
     }

Reply via email to