aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmmpui')
-rw-r--r--src/qmmpui/metadataformatter.cpp54
-rw-r--r--src/qmmpui/metadataformatter.h1
2 files changed, 46 insertions, 9 deletions
diff --git a/src/qmmpui/metadataformatter.cpp b/src/qmmpui/metadataformatter.cpp
index 708888de8..05f0d8380 100644
--- a/src/qmmpui/metadataformatter.cpp
+++ b/src/qmmpui/metadataformatter.cpp
@@ -166,20 +166,36 @@ bool MetaDataFormatter::parseIf(QList<MetaDataFormatter::Node> *nodes, QString::
} state = STARTING;
+ bool escaped = false;
+
while((*i) != end)
{
- if((**i) == QChar('('))
+ if((**i) == QChar('\\'))
+ {
+ (*i)++;
+ escaped = true;
+ continue;
+ }
+
+ if(escaped) //ignore escaped brackets
+ {
+ escaped = false;
+ }
+ else
{
- brackets_tracker++;
- if(state == STARTING)
+ if((**i) == QChar('('))
{
- state = READING_VAR1;
- (*i)++;
- continue;
+ brackets_tracker++;
+ if(state == STARTING)
+ {
+ state = READING_VAR1;
+ (*i)++;
+ continue;
+ }
}
+ else if((**i) == QChar(')'))
+ brackets_tracker--;
}
- else if((**i) == QChar(')'))
- brackets_tracker--;
switch (state)
{
@@ -265,6 +281,20 @@ void MetaDataFormatter::parseText(QList<MetaDataFormatter::Node> *nodes, QString
nodes->append(node);
}
+void MetaDataFormatter::parseEscape(QList<MetaDataFormatter::Node> *nodes, QString::const_iterator *i, QString::const_iterator end)
+{
+ if((*i) == end)
+ return;
+
+ Node node;
+ node.command = Node::PRINT_TEXT;
+ Param param;
+ param.type = Param::TEXT;
+ node.params.append(param);
+ node.params[0].text.append(**i);
+ nodes->append(node);
+}
+
QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length) const
{
QString out;
@@ -301,7 +331,7 @@ QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::Me
{
QString var2 = printParam(&node.params[1], metaData, length);
if(!var2.isEmpty())
- out += "1";
+ out.append("1");
}
}
}
@@ -432,6 +462,12 @@ QList<MetaDataFormatter::Node> MetaDataFormatter::compile(const QString &expr)
node.command = Node::OR_OPERATOR;
nodes.append(node);
}
+ else if((*i) == QChar('\\'))
+ {
+ i++;
+ parseEscape(&nodes, &i, expr.constEnd());
+ i++;
+ }
else
{
parseText(&nodes, &i, expr.constEnd());
diff --git a/src/qmmpui/metadataformatter.h b/src/qmmpui/metadataformatter.h
index 7ad0649ec..b2a3baee6 100644
--- a/src/qmmpui/metadataformatter.h
+++ b/src/qmmpui/metadataformatter.h
@@ -115,6 +115,7 @@ private:
bool parseField(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
bool parseIf(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
void parseText(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
+ void parseEscape(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
QString evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length) const;
QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length) const;