diff options
| -rw-r--r-- | src/qmmpui/metadataformatter.cpp | 54 | ||||
| -rw-r--r-- | src/qmmpui/metadataformatter.h | 1 |
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; |
