Fixed issue #776. Valentina cannot recognize translated functions.
(grafted from 5b89c34d11eea52b32e9fb60b87820ecc5187c31) --HG-- branch : develop
This commit is contained in:
parent
cf727e0365
commit
a4df5612d9
|
@ -72,6 +72,7 @@
|
||||||
- [#767] Valentina produces wrong main path.
|
- [#767] Valentina produces wrong main path.
|
||||||
- Fix issue. Curves look too wavy.
|
- Fix issue. Curves look too wavy.
|
||||||
- [#773] Tool Point intersection curve and axis cannot find desired intersection point.
|
- [#773] Tool Point intersection curve and axis cannot find desired intersection point.
|
||||||
|
- [#776] Valentina cannot recognize translated functions.
|
||||||
|
|
||||||
# Version 0.5.0 May 9, 2017
|
# Version 0.5.0 May 9, 2017
|
||||||
- [#581] User can now filter input lists by keyword in function wizard.
|
- [#581] User can now filter input lists by keyword in function wizard.
|
||||||
|
|
|
@ -65,12 +65,12 @@ QmuParserBase::QmuParserBase()
|
||||||
: m_locale(QLocale::c()),
|
: m_locale(QLocale::c()),
|
||||||
m_decimalPoint(QLocale::c().decimalPoint()),
|
m_decimalPoint(QLocale::c().decimalPoint()),
|
||||||
m_thousandsSeparator(QLocale::c().groupSeparator()),
|
m_thousandsSeparator(QLocale::c().groupSeparator()),
|
||||||
|
m_FunDef(),
|
||||||
m_pParseFormula(&QmuParserBase::ParseString),
|
m_pParseFormula(&QmuParserBase::ParseString),
|
||||||
m_vRPN(),
|
m_vRPN(),
|
||||||
m_vStringBuf(),
|
m_vStringBuf(),
|
||||||
m_vStringVarBuf(),
|
m_vStringVarBuf(),
|
||||||
m_pTokenReader(),
|
m_pTokenReader(),
|
||||||
m_FunDef(),
|
|
||||||
m_PostOprtDef(),
|
m_PostOprtDef(),
|
||||||
m_InfixOprtDef(),
|
m_InfixOprtDef(),
|
||||||
m_OprtDef(),
|
m_OprtDef(),
|
||||||
|
@ -101,12 +101,12 @@ QmuParserBase::QmuParserBase(const QmuParserBase &a_Parser)
|
||||||
: m_locale(a_Parser.getLocale()),
|
: m_locale(a_Parser.getLocale()),
|
||||||
m_decimalPoint(a_Parser.getDecimalPoint()),
|
m_decimalPoint(a_Parser.getDecimalPoint()),
|
||||||
m_thousandsSeparator(a_Parser.getThousandsSeparator()),
|
m_thousandsSeparator(a_Parser.getThousandsSeparator()),
|
||||||
|
m_FunDef(),
|
||||||
m_pParseFormula(&QmuParserBase::ParseString),
|
m_pParseFormula(&QmuParserBase::ParseString),
|
||||||
m_vRPN(),
|
m_vRPN(),
|
||||||
m_vStringBuf(),
|
m_vStringBuf(),
|
||||||
m_vStringVarBuf(),
|
m_vStringVarBuf(),
|
||||||
m_pTokenReader(),
|
m_pTokenReader(),
|
||||||
m_FunDef(),
|
|
||||||
m_PostOprtDef(),
|
m_PostOprtDef(),
|
||||||
m_InfixOprtDef(),
|
m_InfixOprtDef(),
|
||||||
m_OprtDef(),
|
m_OprtDef(),
|
||||||
|
|
|
@ -138,8 +138,11 @@ protected:
|
||||||
QLocale m_locale;///< The locale used by the parser
|
QLocale m_locale;///< The locale used by the parser
|
||||||
QChar m_decimalPoint;
|
QChar m_decimalPoint;
|
||||||
QChar m_thousandsSeparator;
|
QChar m_thousandsSeparator;
|
||||||
|
funmap_type m_FunDef; ///< Map of function names and pointers.
|
||||||
static bool g_DbgDumpCmdCode;
|
static bool g_DbgDumpCmdCode;
|
||||||
static bool g_DbgDumpStack;
|
static bool g_DbgDumpStack;
|
||||||
|
void AddCallback(const QString &a_strName, const QmuParserCallback &a_Callback, funmap_type &a_Storage,
|
||||||
|
const QString &a_szCharSet );
|
||||||
void Init();
|
void Init();
|
||||||
virtual void InitCharSets() = 0;
|
virtual void InitCharSets() = 0;
|
||||||
virtual void InitFun() = 0;
|
virtual void InitFun() = 0;
|
||||||
|
@ -228,7 +231,6 @@ private:
|
||||||
|
|
||||||
std::unique_ptr<token_reader_type> m_pTokenReader; ///< Managed pointer to the token reader object.
|
std::unique_ptr<token_reader_type> m_pTokenReader; ///< Managed pointer to the token reader object.
|
||||||
|
|
||||||
funmap_type m_FunDef; ///< Map of function names and pointers.
|
|
||||||
funmap_type m_PostOprtDef; ///< Postfix operator callbacks
|
funmap_type m_PostOprtDef; ///< Postfix operator callbacks
|
||||||
funmap_type m_InfixOprtDef; ///< unary infix operator.
|
funmap_type m_InfixOprtDef; ///< unary infix operator.
|
||||||
funmap_type m_OprtDef; ///< Binary operator callbacks
|
funmap_type m_OprtDef; ///< Binary operator callbacks
|
||||||
|
@ -255,8 +257,6 @@ private:
|
||||||
void Assign(const QmuParserBase &a_Parser);
|
void Assign(const QmuParserBase &a_Parser);
|
||||||
void InitTokenReader();
|
void InitTokenReader();
|
||||||
void ReInit() const;
|
void ReInit() const;
|
||||||
void AddCallback(const QString &a_strName, const QmuParserCallback &a_Callback,
|
|
||||||
funmap_type &a_Storage, const QString &a_szCharSet );
|
|
||||||
void ApplyRemainingOprt(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
void ApplyRemainingOprt(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
||||||
void ApplyBinOprt(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
void ApplyBinOprt(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
||||||
void ApplyIfElse(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
void ApplyIfElse(QStack<token_type> &a_stOpt, QStack<token_type> &a_stVal) const;
|
||||||
|
|
|
@ -86,7 +86,6 @@ QmuParserCallback::QmuParserCallback ( fun_type3 a_pFun, bool a_bAllowOpti )
|
||||||
m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti )
|
m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__extension__
|
__extension__
|
||||||
|
@ -96,7 +95,6 @@ QmuParserCallback::QmuParserCallback ( fun_type4 a_pFun, bool a_bAllowOpti )
|
||||||
m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti )
|
m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__extension__
|
__extension__
|
||||||
|
|
|
@ -53,8 +53,10 @@ QmuTokenParser::QmuTokenParser()
|
||||||
*
|
*
|
||||||
* @param formula string with formula.
|
* @param formula string with formula.
|
||||||
* @param fromUser true if we parse formula from user
|
* @param fromUser true if we parse formula from user
|
||||||
|
* @param translatedFunctions
|
||||||
*/
|
*/
|
||||||
QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser)
|
QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator,
|
||||||
|
bool fromUser, const QMap<QString, QString> &translatedFunctions)
|
||||||
:QmuFormulaBase()
|
:QmuFormulaBase()
|
||||||
{
|
{
|
||||||
InitCharSets();
|
InitCharSets();
|
||||||
|
@ -63,16 +65,26 @@ QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, bool fr
|
||||||
|
|
||||||
SetSepForTr(osSeparator, fromUser);
|
SetSepForTr(osSeparator, fromUser);
|
||||||
|
|
||||||
|
// Fix for issue #776. Valentina cannot recognize translated functions.
|
||||||
|
QMap<QString, QString>::const_iterator i = translatedFunctions.constBegin();
|
||||||
|
while (i != translatedFunctions.constEnd())
|
||||||
|
{
|
||||||
|
if (i.key() != i.value())
|
||||||
|
{
|
||||||
|
auto search = m_FunDef.find(i.value());
|
||||||
|
if(search != m_FunDef.end())
|
||||||
|
{
|
||||||
|
AddCallback(i.key(), search->second, m_FunDef, ValidNameChars());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
SetExpr(formula);
|
SetExpr(formula);
|
||||||
//Need run for making tokens. Don't catch exception here, because we want know if formula has error.
|
//Need run for making tokens. Don't catch exception here, because we want know if formula has error.
|
||||||
Eval();
|
Eval();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
QmuTokenParser::~QmuTokenParser()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief IsSingle test formula and return true if it contain only one number.
|
* @brief IsSingle test formula and return true if it contain only one number.
|
||||||
|
|
|
@ -36,8 +36,9 @@ namespace qmu
|
||||||
class QMUPARSERSHARED_EXPORT QmuTokenParser : public QmuFormulaBase
|
class QMUPARSERSHARED_EXPORT QmuTokenParser : public QmuFormulaBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser = true);
|
QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser = true,
|
||||||
virtual ~QmuTokenParser() Q_DECL_OVERRIDE;
|
const QMap<QString, QString> &translatedFunctions = QMap<QString, QString>());
|
||||||
|
virtual ~QmuTokenParser() = default;
|
||||||
|
|
||||||
static bool IsSingle(const QString &formula);
|
static bool IsSingle(const QString &formula);
|
||||||
|
|
||||||
|
|
|
@ -55,13 +55,16 @@ VTranslateVars::VTranslateVars()
|
||||||
functions(QMap<QString, qmu::QmuTranslation>()),
|
functions(QMap<QString, qmu::QmuTranslation>()),
|
||||||
postfixOperators(QMap<QString, qmu::QmuTranslation>()),
|
postfixOperators(QMap<QString, qmu::QmuTranslation>()),
|
||||||
placeholders(QMap<QString, qmu::QmuTranslation>()),
|
placeholders(QMap<QString, qmu::QmuTranslation>()),
|
||||||
stDescriptions(QMap<QString, qmu::QmuTranslation>())
|
stDescriptions(QMap<QString, qmu::QmuTranslation>()),
|
||||||
|
translatedFunctions(QMap<QString, QString>())
|
||||||
{
|
{
|
||||||
InitPatternMakingSystems();
|
InitPatternMakingSystems();
|
||||||
InitVariables();
|
InitVariables();
|
||||||
InitFunctions();
|
InitFunctions();
|
||||||
InitPostfixOperators();
|
InitPostfixOperators();
|
||||||
InitPlaceholder();
|
InitPlaceholder();
|
||||||
|
|
||||||
|
PrepareFunctionTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -493,6 +496,22 @@ void VTranslateVars::InitPlaceholder()
|
||||||
|
|
||||||
#undef translate
|
#undef translate
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VTranslateVars::PrepareFunctionTranslations()
|
||||||
|
{
|
||||||
|
translatedFunctions.clear();
|
||||||
|
QMap<QString, qmu::QmuTranslation>::const_iterator i = functions.constBegin();
|
||||||
|
while (i != functions.constEnd())
|
||||||
|
{
|
||||||
|
const QString translated = i.value().translate();
|
||||||
|
if (i.key() != translated)
|
||||||
|
{
|
||||||
|
translatedFunctions.insert(translated, i.key());
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VTranslateVars::InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author,
|
void VTranslateVars::InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author,
|
||||||
const qmu::QmuTranslation &book)
|
const qmu::QmuTranslation &book)
|
||||||
|
@ -837,7 +856,9 @@ QString VTranslateVars::FormulaFromUser(const QString &formula, bool osSeparator
|
||||||
}
|
}
|
||||||
QString newFormula = formula;// Local copy for making changes
|
QString newFormula = formula;// Local copy for making changes
|
||||||
|
|
||||||
QScopedPointer<qmu::QmuTokenParser> cal(new qmu::QmuTokenParser(formula, osSeparator));// Eval formula
|
// Eval formula
|
||||||
|
QScopedPointer<qmu::QmuTokenParser> cal(new qmu::QmuTokenParser(formula, osSeparator, true,
|
||||||
|
qApp->TrVars()->GetTranslatedFunctions()));
|
||||||
QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
|
QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
|
||||||
QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
|
||||||
delete cal.take();
|
delete cal.take();
|
||||||
|
@ -1107,6 +1128,14 @@ void VTranslateVars::Retranslate()
|
||||||
InitFunctions();
|
InitFunctions();
|
||||||
InitPostfixOperators();
|
InitPostfixOperators();
|
||||||
InitPlaceholder();
|
InitPlaceholder();
|
||||||
|
|
||||||
|
PrepareFunctionTranslations();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QMap<QString, QString> VTranslateVars::GetTranslatedFunctions() const
|
||||||
|
{
|
||||||
|
return translatedFunctions;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -68,6 +68,7 @@ public:
|
||||||
|
|
||||||
virtual void Retranslate() Q_DECL_OVERRIDE;
|
virtual void Retranslate() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
QMap<QString, QString> GetTranslatedFunctions() const;
|
||||||
QMap<QString, qmu::QmuTranslation> GetFunctions() const;
|
QMap<QString, qmu::QmuTranslation> GetFunctions() const;
|
||||||
|
|
||||||
static void BiasTokens(int position, int bias, QMap<int, QString> &tokens);
|
static void BiasTokens(int position, int bias, QMap<int, QString> &tokens);
|
||||||
|
@ -82,6 +83,7 @@ private:
|
||||||
QMap<QString, qmu::QmuTranslation> postfixOperators;
|
QMap<QString, qmu::QmuTranslation> postfixOperators;
|
||||||
QMap<QString, qmu::QmuTranslation> placeholders;
|
QMap<QString, qmu::QmuTranslation> placeholders;
|
||||||
QMap<QString, qmu::QmuTranslation> stDescriptions;
|
QMap<QString, qmu::QmuTranslation> stDescriptions;
|
||||||
|
QMap<QString, QString> translatedFunctions;
|
||||||
|
|
||||||
void InitPatternMakingSystems();
|
void InitPatternMakingSystems();
|
||||||
void InitVariables();
|
void InitVariables();
|
||||||
|
@ -89,6 +91,8 @@ private:
|
||||||
void InitPostfixOperators();
|
void InitPostfixOperators();
|
||||||
void InitPlaceholder();
|
void InitPlaceholder();
|
||||||
|
|
||||||
|
void PrepareFunctionTranslations();
|
||||||
|
|
||||||
void InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author,
|
void InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author,
|
||||||
const qmu::QmuTranslation &book);
|
const qmu::QmuTranslation &book);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user