diff options
| author | 2019-03-23 11:33:15 +0100 | |
|---|---|---|
| committer | 2019-03-23 11:33:15 +0100 | |
| commit | 8aac692215539f3de44f1f5ee1cb8cdca76068fa (patch) | |
| tree | 976130b3dfbc8878521cb15fc1c1141906667a79 | |
| parent | 489661ca4599a84033a57a5645e150e4129a70a0 (diff) | |
| parent | f42d6ce2ffe9e53e2ac1723e14e8797dc7b2fffd (diff) | |
| download | OneRoll-8aac692215539f3de44f1f5ee1cb8cdca76068fa.tar.gz OneRoll-8aac692215539f3de44f1f5ee1cb8cdca76068fa.zip | |
Merge pull request #37 from Rolisteam/stringParsing
String parsing
| -rw-r--r-- | cli/main.cpp | 10 | ||||
| -rw-r--r-- | parsingtoolbox.cpp | 122 | ||||
| -rw-r--r-- | parsingtoolbox.h | 32 |
3 files changed, 160 insertions, 4 deletions
diff --git a/cli/main.cpp b/cli/main.cpp index e261d63..2f0d8e4 100644 --- a/cli/main.cpp +++ b/cli/main.cpp @@ -352,18 +352,20 @@ int startDiceParsing(QStringList& cmds, QString& treeFile, bool withColor, EXPOR bool ok; QStringList allStringlist= parser.getAllStringResult(ok); QString stringResult= allStringlist.join(" ; "); + stringResult.replace("%1", scalarText); stringResult.replace("%2", listOfDiceResult.join(",").trimmed()); stringResult.replace("%3", lastScalarText); stringResult.replace("\\n", "\n"); - int i= strLst.size(); - for(auto it= strLst.rbegin(); it != strLst.rend(); ++it) + stringResult= ParsingToolBox::replaceVariableToValue(stringResult, strLst); + /*for(auto it= strLst.rbegin(); it != strLst.rend(); ++it) { stringResult.replace(QStringLiteral("$%1").arg(i), (*it)); --i; - } - i= listFull.size(); + }*/ + + int i= strLst.size(); for(auto it= strLst.rbegin(); it != strLst.rend(); ++it) { stringResult.replace(QStringLiteral("µ%1").arg(i), (*it)); diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp index e85a855..2b77fe2 100644 --- a/parsingtoolbox.cpp +++ b/parsingtoolbox.cpp @@ -794,3 +794,125 @@ bool ParsingToolBox::readComment(QString& str, QString& result, QString& comment } return false; } + +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; +} + +void ParsingToolBox::readSubtitutionParameters(SubtituteInfo& info, QString& rest) +{ + auto sizeS= rest.size(); + if(rest.startsWith("{")) + { + rest= rest.remove(0, 1); + qint64 number; + if(readNumber(rest, 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)) + { + readSubtitutionParameters(info, rest); + 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; |