diff --git a/include/lrglobal.cpp b/include/lrglobal.cpp index 5b2cdff..b4eb854 100644 --- a/include/lrglobal.cpp +++ b/include/lrglobal.cpp @@ -67,4 +67,13 @@ QString replaceHTMLSymbols(const QString &value) return result; } +QVector normalizeCaptures(const QRegExp& reg){ + QVector result; + foreach (QString cap, reg.capturedTexts()) { + if (!cap.isEmpty()) + result.append(cap); + } + return result; +} + } //namespace LimeReport diff --git a/include/lrglobal.h b/include/lrglobal.h index 421f8d7..f59d0fb 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -90,7 +90,8 @@ namespace Const{ //const int VALUE_INDEX = 2; //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:((?:(?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"?\\$S\\s*\\{\\s*)|(?:\\\"))((?:\\w+\\.?\\w+)|(?:\\w+))(?:(?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,)|(?:))\\s*\\\"(\\w+)\\\"\\s*\\)"; - const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),|(?:))(?:\\\"(\\w+)\\\")\\)"; + //const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),(.+))|(?:\\\"(\\w+)\\\")\\)"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)"; const int DATASOURCE_INDEX = 3;//4; const int VALUE_INDEX = 2; //2; const int EXPRESSION_ARGUMENT_INDEX = 1;//3; @@ -103,6 +104,7 @@ namespace Const{ QString extractClassName(QString className); QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); + QVector normalizeCaptures(const QRegExp ®); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; enum RenderPass {FirstPass, SecondPass}; diff --git a/limereport/lrglobal.cpp b/limereport/lrglobal.cpp index 5b2cdff..b4eb854 100644 --- a/limereport/lrglobal.cpp +++ b/limereport/lrglobal.cpp @@ -67,4 +67,13 @@ QString replaceHTMLSymbols(const QString &value) return result; } +QVector normalizeCaptures(const QRegExp& reg){ + QVector result; + foreach (QString cap, reg.capturedTexts()) { + if (!cap.isEmpty()) + result.append(cap); + } + return result; +} + } //namespace LimeReport diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 421f8d7..f59d0fb 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -90,7 +90,8 @@ namespace Const{ //const int VALUE_INDEX = 2; //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:((?:(?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"?\\$S\\s*\\{\\s*)|(?:\\\"))((?:\\w+\\.?\\w+)|(?:\\w+))(?:(?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,)|(?:))\\s*\\\"(\\w+)\\\"\\s*\\)"; - const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),|(?:))(?:\\\"(\\w+)\\\")\\)"; + //const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),(.+))|(?:\\\"(\\w+)\\\")\\)"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)"; const int DATASOURCE_INDEX = 3;//4; const int VALUE_INDEX = 2; //2; const int EXPRESSION_ARGUMENT_INDEX = 1;//3; @@ -103,6 +104,7 @@ namespace Const{ QString extractClassName(QString className); QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); + QVector normalizeCaptures(const QRegExp ®); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; enum RenderPass {FirstPass, SecondPass}; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index d439276..36f7961 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -367,15 +367,19 @@ void ReportRender::extractGroupsFunction(BandDesignIntf *band) if (rx.indexIn(contentItem->content())>=0){ int pos = 0; while ( (pos = rx.indexIn(contentItem->content(),pos)) != -1){ - BandDesignIntf* dataBand = m_patternPageItem->bandByName(rx.cap(Const::DATASOURCE_INDEX)); - if (dataBand){ - GroupFunction* gf = datasources()->addGroupFunction(functionName,rx.cap(Const::VALUE_INDEX),band->objectName(),dataBand->objectName()); - if (gf){ - connect(dataBand,SIGNAL(bandRendered(BandDesignIntf*)),gf,SLOT(slotBandRendered(BandDesignIntf*))); + QVector captures = normalizeCaptures(rx); + if (captures.size()>=3){ + int dsIndex = captures.size() == 3 ? Const::DATASOURCE_INDEX - 1 : Const::DATASOURCE_INDEX; + BandDesignIntf* dataBand = m_patternPageItem->bandByName(captures.at(dsIndex)); + if (dataBand){ + GroupFunction* gf = datasources()->addGroupFunction(functionName,captures.at(Const::VALUE_INDEX),band->objectName(),dataBand->objectName()); + if (gf){ + connect(dataBand,SIGNAL(bandRendered(BandDesignIntf*)),gf,SLOT(slotBandRendered(BandDesignIntf*))); + } + } else { + GroupFunction* gf = datasources()->addGroupFunction(functionName,captures.at(Const::VALUE_INDEX),band->objectName(),captures.at(dsIndex)); + gf->setInvalid(tr("Databand \"%1\" not found").arg(captures.at(dsIndex))); } - } else { - GroupFunction* gf = datasources()->addGroupFunction(functionName,rx.cap(Const::VALUE_INDEX),band->objectName(),rx.cap(Const::DATASOURCE_INDEX)); - gf->setInvalid(tr("Databand \"%1\" not found").arg(rx.cap(Const::DATASOURCE_INDEX))); } pos += rx.matchedLength(); } @@ -388,6 +392,7 @@ void ReportRender::extractGroupsFunction(BandDesignIntf *band) } } + void ReportRender::replaceGroupsFunction(BandDesignIntf *band) { foreach(BaseDesignIntf* item,band->childBaseItems()){ @@ -399,8 +404,11 @@ void ReportRender::replaceGroupsFunction(BandDesignIntf *band) if (rx.indexIn(content)>=0){ int pos = 0; while ( (pos = rx.indexIn(content,pos))!= -1 ){ - QString expressionIndex = datasources()->putGroupFunctionsExpressions(rx.cap(Const::VALUE_INDEX)); - content.replace(rx.capturedTexts().at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); + QVector captures = normalizeCaptures(rx); + if (captures.size() >= 3){ + QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); + content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); + } pos += rx.matchedLength(); } contentItem->setContent(content);