aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--cli/main.cpp10
-rw-r--r--parsingtoolbox.cpp122
-rw-r--r--parsingtoolbox.h32
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;