diff options
| author | 2019-03-23 11:28:22 +0100 | |
|---|---|---|
| committer | 2019-03-23 11:28:22 +0100 | |
| commit | 10d0da1c22c94b5361c0a6c76e008c328671ad81 (patch) | |
| tree | de786f9b2abf5c206146c9ae2eeca1e8ddcc964a | |
| parent | 9d8bb500131d3db603bacbdb91440c62f54f72de (diff) | |
| download | OneRoll-10d0da1c22c94b5361c0a6c76e008c328671ad81.tar.gz OneRoll-10d0da1c22c94b5361c0a6c76e008c328671ad81.zip | |
Add new way to replace pattern in string result.
| -rw-r--r-- | parsingtoolbox.cpp | 132 | ||||
| -rw-r--r-- | parsingtoolbox.h | 32 |
2 files changed, 139 insertions, 25 deletions
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<int> 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<int>(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<int>(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<QString, BooleanCondition::LogicOperator>* m_logicOp; QMap<QString, CompositeValidator::LogicOperation>* m_logicOperation; |