From 9d8bb500131d3db603bacbdb91440c62f54f72de Mon Sep 17 00:00:00 2001 From: Renaud Guezennec Date: Fri, 22 Mar 2019 10:51:10 +0100 Subject: save draft about string parsing --- parsingtoolbox.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'parsingtoolbox.cpp') diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp index e85a855..a88b97b 100644 --- a/parsingtoolbox.cpp +++ b/parsingtoolbox.cpp @@ -794,3 +794,43 @@ bool ParsingToolBox::readComment(QString& str, QString& result, QString& comment } return false; } + +QString ParsingToolBox::replaceVariableToValue(const QString& source, QVector values) +{ + QString result = source; + + int start = source.size(); + do { + auto ref = readVariableFromString(source, start); + if(ref.isValid()) + { + result.remove(ref.index(), ref.length()); + result.insert(ref.index(), values[ref.valueIndex()]); + } + }while(start >= 0) + + return result; +} + +SubtituteInfo ParsingToolBox::readVariableFromString(const QString& source, int start) +{ + bool found = false; + for(int i = start; i >= 0 && !found; --i) + { + if(source.at(i) == "%") + { + auto rest = source.mid(i, start-i); + int number; + if(readNumber(rest, number)) + { + SubtituteInfo info; + readSubtitutionParameters(info, rest); + info.setIndex(number); + info.setPosition(i); + + } + + } + + } +} -- cgit v1.2.3-70-g09d2 From 10d0da1c22c94b5361c0a6c76e008c328671ad81 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Sat, 23 Mar 2019 11:28:22 +0100 Subject: Add new way to replace pattern in string result. --- parsingtoolbox.cpp | 132 +++++++++++++++++++++++++++++++++++++++++++---------- parsingtoolbox.h | 32 +++++++++++++ 2 files changed, 139 insertions(+), 25 deletions(-) (limited to 'parsingtoolbox.cpp') diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp index a88b97b..2b77fe2 100644 --- a/parsingtoolbox.cpp +++ b/parsingtoolbox.cpp @@ -795,42 +795,124 @@ bool ParsingToolBox::readComment(QString& str, QString& result, QString& comment return false; } -QString ParsingToolBox::replaceVariableToValue(const QString& source, QVector values) -{ - QString result = source; - - int start = source.size(); - do { - auto ref = readVariableFromString(source, start); - if(ref.isValid()) - { - result.remove(ref.index(), ref.length()); - result.insert(ref.index(), values[ref.valueIndex()]); - } - }while(start >= 0) - +QString ParsingToolBox::replaceVariableToValue(const QString& source, QStringList values) +{ + QString result= source; + + int start= source.size() - 1; + bool valid= true; + do + { + auto ref= readVariableFromString(source, start); + if(ref.isValid()) + { + result.remove(ref.position(), ref.length()); + auto val= values[ref.resultIndex() - 1]; + if(ref.digitNumber() != 0) + { + auto realVal= QString("%1").arg(val, ref.digitNumber(), QChar('0')); + result.insert(ref.position(), realVal); + } + else + { + result.insert(ref.position(), val); + } + } + else + { + valid= false; + } + } while(valid); + return result; } -SubtituteInfo ParsingToolBox::readVariableFromString(const QString& source, int start) +void ParsingToolBox::readSubtitutionParameters(SubtituteInfo& info, QString& rest) { - bool found = false; - for(int i = start; i >= 0 && !found; --i) + auto sizeS= rest.size(); + if(rest.startsWith("{")) { - if(source.at(i) == "%") + rest= rest.remove(0, 1); + qint64 number; + if(readNumber(rest, number)) { - auto rest = source.mid(i, start-i); - int number; + if(rest.startsWith("}")) + { + rest= rest.remove(0, 1); + info.setDigitNumber(static_cast(number)); + } + } + } + info.setLength(info.length() + sizeS - rest.size()); +} + +SubtituteInfo ParsingToolBox::readVariableFromString(const QString& source, int& start) +{ + bool found= false; + SubtituteInfo info; + int i= start; + for(; i >= 0 && !found; --i) + { + if(source.at(i) == "$") + { + auto rest= source.mid(i + 1, 1 + start - i); + qint64 number; if(readNumber(rest, number)) { - SubtituteInfo info; readSubtitutionParameters(info, rest); - info.setIndex(number); + info.setResultIndex(static_cast(number)); info.setPosition(i); - + found= true; } - } - } + start= i; + return info; +} + +SubtituteInfo::SubtituteInfo() {} + +bool SubtituteInfo::isValid() const +{ + return !(m_position + m_resultIndex < 2); +} + +int SubtituteInfo::length() const +{ + return m_length; +} + +void SubtituteInfo::setLength(int length) +{ + m_length= length; +} + +int SubtituteInfo::resultIndex() const +{ + return m_resultIndex; +} + +void SubtituteInfo::setResultIndex(int valueIndex) +{ + m_resultIndex= valueIndex; +} + +int SubtituteInfo::position() const +{ + return m_position; +} + +void SubtituteInfo::setPosition(int position) +{ + m_position= position; +} + +int SubtituteInfo::digitNumber() const +{ + return m_digitNumber; +} + +void SubtituteInfo::setDigitNumber(int digitNumber) +{ + m_digitNumber= digitNumber; } diff --git a/parsingtoolbox.h b/parsingtoolbox.h index d7d5943..4b50b6d 100644 --- a/parsingtoolbox.h +++ b/parsingtoolbox.h @@ -34,6 +34,32 @@ #include "operationcondition.h" #include "range.h" +class SubtituteInfo +{ +public: + SubtituteInfo(); + + bool isValid() const; + + int length() const; + void setLength(int length); + + int resultIndex() const; + void setResultIndex(int valueIndex); + + int position() const; + void setPosition(int position); + + int digitNumber() const; + void setDigitNumber(int digitNumber); + +private: + int m_length= 2; + int m_digitNumber= 0; + int m_resultIndex= -1; + int m_position= -1; +}; + /** * @brief The ParsingToolBox is gathering many useful methods for dice parsing. * Its goal is to make the diceparser a bit lighter. @@ -200,6 +226,12 @@ public: static bool readOperand(QString& str, ExecutionNode*& node); static int findClosingCharacterIndexOf(QChar open, QChar closing, const QString& str, int offset); + static QString replaceVariableToValue(const QString& source, QStringList values); + + static SubtituteInfo readVariableFromString(const QString& source, int& start); + + static void readSubtitutionParameters(SubtituteInfo& info, QString& rest); + private: QMap* m_logicOp; QMap* m_logicOperation; -- cgit v1.2.3-70-g09d2