Fix variable name regular expression.
Forbid characters "." and ",". --HG-- branch : develop
This commit is contained in:
parent
842d21016e
commit
f9f241ac25
|
@ -647,7 +647,7 @@
|
|||
</xs:element>
|
||||
<xs:simpleType name="shortName">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="^([^\p{Nd}\p{Zs}*/&|!<>^\-()–+−=?:;'\"]){1,1}([^\p{Zs}*/&|!<>^\-()–+−=?:;\"]){0,}$"/>
|
||||
<xs:pattern value="^([^\p{Nd}\p{Zs}*/&|!<>^\()\-−+.,٫, ٬.'’=?:;'\"]){1,1}([^\p{Zs}*/&|!<>^\()\-−+.,٫, ٬.'’=?:;\"]){0,}$"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="units">
|
||||
|
|
|
@ -77,6 +77,8 @@ static QChar EatWhiteSpace(const QString &formula, int &index)
|
|||
static int CheckChar(QChar &c, const QLocale &locale, const QChar &decimal, const QChar &thousand)
|
||||
{
|
||||
INIT_LOCALE_VARIABLES(locale);
|
||||
Q_UNUSED(decimalPoint)
|
||||
Q_UNUSED(groupSeparator)
|
||||
|
||||
if (c == positiveSign)
|
||||
{
|
||||
|
@ -175,6 +177,8 @@ int ReadVal(const QString &formula, qreal &val, const QLocale &locale, const QCh
|
|||
}
|
||||
|
||||
INIT_LOCALE_VARIABLES(locale);
|
||||
Q_UNUSED(decimalPoint)
|
||||
Q_UNUSED(groupSeparator)
|
||||
|
||||
QSet<QChar> reserved;
|
||||
reserved << positiveSign
|
||||
|
@ -272,3 +276,54 @@ int ReadVal(const QString &formula, qreal &val, const QLocale &locale, const QCh
|
|||
|
||||
return -1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString NameRegExp()
|
||||
{
|
||||
static QString regex;
|
||||
|
||||
if (regex.isEmpty())
|
||||
{
|
||||
const QList<QLocale> allLocales =
|
||||
QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
|
||||
|
||||
QString positiveSigns;
|
||||
QString negativeSigns;
|
||||
QString decimalPoints;
|
||||
QString groupSeparators;
|
||||
|
||||
for(int i = 0; i < allLocales.size(); ++i)
|
||||
{
|
||||
if (not positiveSigns.contains(allLocales.at(i).positiveSign()))
|
||||
{
|
||||
positiveSigns.append(allLocales.at(i).positiveSign());
|
||||
}
|
||||
|
||||
if (not negativeSigns.contains(allLocales.at(i).negativeSign()))
|
||||
{
|
||||
negativeSigns.append(allLocales.at(i).negativeSign());
|
||||
}
|
||||
|
||||
if (not decimalPoints.contains(allLocales.at(i).decimalPoint()))
|
||||
{
|
||||
decimalPoints.append(allLocales.at(i).decimalPoint());
|
||||
}
|
||||
|
||||
if (not groupSeparators.contains(allLocales.at(i).groupSeparator()))
|
||||
{
|
||||
groupSeparators.append(allLocales.at(i).groupSeparator());
|
||||
}
|
||||
}
|
||||
|
||||
negativeSigns.replace('-', "\\-");
|
||||
|
||||
//Same regexp in pattern.xsd shema file. Don't forget to synchronize.
|
||||
// \p{Nd} - \p{Decimal_Digit_Number}
|
||||
// \p{Zs} - \p{Space_Separator}
|
||||
regex = QString("^([^\\p{Nd}\\p{Zs}*/&|!<>^\\()%1%2%3%4=?:;'\"]){1,1}"
|
||||
"([^\\p{Zs}*/&|!<>^\\()%1%2%3%4=?:;\"]){0,}$")
|
||||
.arg(negativeSigns).arg(positiveSigns).arg(decimalPoints).arg(groupSeparators);
|
||||
}
|
||||
|
||||
return regex;
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@
|
|||
|
||||
#include "qmuparser_global.h"
|
||||
|
||||
#include <QString>
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
|
||||
|
||||
/*
|
||||
|
@ -92,32 +90,27 @@ QT_WARNING_DISABLE_GCC("-Wattributes")
|
|||
#endif /* Q_CC_MSVC */
|
||||
|
||||
class QLocale;
|
||||
class QChar;
|
||||
|
||||
#define INIT_LOCALE_VARIABLES(locale) \
|
||||
const QChar positiveSign = (locale).positiveSign(); \
|
||||
const QChar negativeSign = (locale).negativeSign(); \
|
||||
const QChar sign0 = (locale).toString(0).at(0); \
|
||||
const QChar sign1 = (locale).toString(1).at(0); \
|
||||
const QChar sign2 = (locale).toString(2).at(0); \
|
||||
const QChar sign3 = (locale).toString(3).at(0); \
|
||||
const QChar sign4 = (locale).toString(4).at(0); \
|
||||
const QChar sign5 = (locale).toString(5).at(0); \
|
||||
const QChar sign6 = (locale).toString(6).at(0); \
|
||||
const QChar sign7 = (locale).toString(7).at(0); \
|
||||
const QChar sign8 = (locale).toString(8).at(0); \
|
||||
const QChar sign9 = (locale).toString(9).at(0); \
|
||||
const QChar expUpper = (locale).exponential().toUpper(); \
|
||||
const QChar expLower = (locale).exponential().toLower() \
|
||||
#define INIT_LOCALE_VARIABLES(locale) \
|
||||
const QChar positiveSign = (locale).positiveSign(); \
|
||||
const QChar negativeSign = (locale).negativeSign(); \
|
||||
const QChar sign0 = (locale).toString(0).at(0); \
|
||||
const QChar sign1 = (locale).toString(1).at(0); \
|
||||
const QChar sign2 = (locale).toString(2).at(0); \
|
||||
const QChar sign3 = (locale).toString(3).at(0); \
|
||||
const QChar sign4 = (locale).toString(4).at(0); \
|
||||
const QChar sign5 = (locale).toString(5).at(0); \
|
||||
const QChar sign6 = (locale).toString(6).at(0); \
|
||||
const QChar sign7 = (locale).toString(7).at(0); \
|
||||
const QChar sign8 = (locale).toString(8).at(0); \
|
||||
const QChar sign9 = (locale).toString(9).at(0); \
|
||||
const QChar expUpper = (locale).exponential().toUpper(); \
|
||||
const QChar expLower = (locale).exponential().toLower(); \
|
||||
const QChar decimalPoint = (locale).decimalPoint(); \
|
||||
const QChar groupSeparator = (locale).groupSeparator() \
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
inline QString NameRegExp()
|
||||
{
|
||||
//Same regexp in pattern.xsd shema file. Don't forget to synchronize.
|
||||
// \p{Nd} - \p{Decimal_Digit_Number}
|
||||
// \p{Zs} - \p{Space_Separator}
|
||||
// Note. All three minus characters are different!
|
||||
return QStringLiteral("^([^\\p{Nd}\\p{Zs}*/&|!<>^\\-()–+−=?:;'\"]){1,1}([^\\p{Zs}*/&|!<>^\\-()–+−=?:;\"]){0,}$");
|
||||
}
|
||||
QString NameRegExp();
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
|
|
|
@ -71,6 +71,8 @@ void QmuFormulaBase::InitCharSets()
|
|||
INIT_LOCALE_VARIABLES(m_locale);
|
||||
Q_UNUSED(expUpper)
|
||||
Q_UNUSED(expLower)
|
||||
Q_UNUSED(decimalPoint)
|
||||
Q_UNUSED(groupSeparator)
|
||||
|
||||
// Defining identifier character sets
|
||||
const QString nameChars = QString() + sign0 + sign1 + sign2 + sign3 + sign4 + sign5 + sign6 + sign7 + sign8 +
|
||||
|
|
|
@ -90,8 +90,20 @@ void TST_NameRegExp::TestNameRegExp_data()
|
|||
tag = localeName+QLatin1String(". First character can't be \"")+negativeSign+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << negativeSign+QLatin1String("a") << false;
|
||||
|
||||
tag = localeName+QLatin1String(". First character can't be \"")+decimalPoint+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << decimalPoint+QLatin1String("a") << false;
|
||||
|
||||
tag = localeName+QLatin1String(". First character can't be \"")+groupSeparator+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << groupSeparator+QLatin1String("a") << false;
|
||||
|
||||
tag = localeName+QLatin1String(". Any next character can't be \"")+negativeSign+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << QLatin1String("a")+negativeSign << false;
|
||||
|
||||
tag = localeName+QLatin1String(". Any next character can't be \"")+decimalPoint+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << QLatin1String("a")+decimalPoint << false;
|
||||
|
||||
tag = localeName+QLatin1String(". Any next character can't be \"")+groupSeparator+QLatin1String("\"");
|
||||
QTest::newRow(qUtf8Printable(tag)) << QLatin1String("a")+groupSeparator << false;
|
||||
}
|
||||
|
||||
QTest::newRow("First character can't be \"+\"") << "+a" << false;
|
||||
|
|
Loading…
Reference in New Issue
Block a user